From 347c164c35eddab388009470e6848cb361ac93f8 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 18 May 2024 15:22:53 +0200 Subject: Merging upstream version 1:10.11.8. Signed-off-by: Daniel Baumann --- .clang-format | 1 - .gitlab-ci.yml | 4 +- BUILD/SETUP.sh | 6 + CMakeLists.txt | 20 +- Docs/INFO_SRC | 8 + README.md | 19 +- VERSION | 2 +- client/CMakeLists.txt | 2 +- client/client_priv.h | 77 +- client/mysql.cc | 373 +- client/mysql_upgrade.c | 10 +- client/mysqladmin.cc | 20 +- client/mysqlbinlog.cc | 34 +- client/mysqlcheck.c | 31 +- client/mysqldump.c | 327 +- client/mysqlimport.c | 30 +- client/mysqlshow.c | 14 +- client/mysqlslap.c | 61 +- client/mysqltest.cc | 190 +- cmake/FindPMEM.cmake | 18 - cmake/libutils.cmake | 6 + cmake/mariadb_connector_c.cmake | 7 + cmake/os/AIX.cmake | 3 - cmake/os/SunOS.cmake | 4 - cmake/os/WindowsCache.cmake | 1 - cmake/pcre.cmake | 17 +- cmake/plugin.cmake | 2 +- cmake/ssl.cmake | 5 +- cmake/zlib.cmake | 18 +- config.h.cmake | 2 +- configure.cmake | 15 +- extra/CMakeLists.txt | 2 +- extra/mariabackup/CMakeLists.txt | 15 +- extra/mariabackup/aria_backup_client.cc | 1016 + extra/mariabackup/aria_backup_client.h | 38 + extra/mariabackup/backup_copy.cc | 495 +- extra/mariabackup/backup_copy.h | 32 +- extra/mariabackup/backup_debug.h | 21 +- extra/mariabackup/backup_mysql.cc | 356 +- extra/mariabackup/backup_mysql.h | 24 +- extra/mariabackup/changed_page_bitmap.cc | 1040 - extra/mariabackup/changed_page_bitmap.h | 85 - extra/mariabackup/common.h | 3 +- extra/mariabackup/common_engine.cc | 512 + extra/mariabackup/common_engine.h | 39 + extra/mariabackup/datasink.cc | 28 +- extra/mariabackup/datasink.h | 17 +- extra/mariabackup/ddl_log.cc | 553 + extra/mariabackup/ddl_log.h | 15 + extra/mariabackup/ds_buffer.cc | 9 +- extra/mariabackup/ds_compress.cc | 9 +- extra/mariabackup/ds_local.cc | 105 +- extra/mariabackup/ds_stdout.cc | 8 +- extra/mariabackup/ds_tmpfile.cc | 8 +- extra/mariabackup/ds_xbstream.cc | 61 +- extra/mariabackup/encryption_plugin.cc | 249 + extra/mariabackup/encryption_plugin.h | 7 + extra/mariabackup/fil_cur.cc | 19 +- extra/mariabackup/fil_cur.h | 1 + extra/mariabackup/innobackupex.cc | 78 +- extra/mariabackup/read_filt.cc | 142 +- extra/mariabackup/read_filt.h | 29 +- extra/mariabackup/thread_pool.cc | 50 + extra/mariabackup/thread_pool.h | 62 + extra/mariabackup/write_filt.cc | 12 + extra/mariabackup/wsrep.cc | 48 +- extra/mariabackup/xb_plugin.cc | 229 - extra/mariabackup/xb_plugin.h | 5 - extra/mariabackup/xbstream.cc | 64 +- extra/mariabackup/xbstream.h | 19 +- extra/mariabackup/xbstream_read.cc | 107 +- extra/mariabackup/xbstream_write.cc | 152 +- extra/mariabackup/xtrabackup.cc | 1005 +- extra/mariabackup/xtrabackup.h | 57 +- extra/wolfssl/CMakeLists.txt | 184 +- extra/wolfssl/user_settings.h.in | 18 +- extra/wolfssl/wolfssl/.github/workflows/async.yml | 2 +- extra/wolfssl/wolfssl/.github/workflows/curl.yml | 8 +- .../wolfssl/.github/workflows/docker-Espressif.yml | 6 +- .../wolfssl/.github/workflows/docker-OpenWrt.yml | 16 +- .../wolfssl/wolfssl/.github/workflows/haproxy.yml | 4 +- extra/wolfssl/wolfssl/.github/workflows/hitch.yml | 10 +- extra/wolfssl/wolfssl/.github/workflows/hostap.yml | 14 +- extra/wolfssl/wolfssl/.github/workflows/krb5.yml | 20 +- .../wolfssl/wolfssl/.github/workflows/libssh2.yml | 58 + extra/wolfssl/wolfssl/.github/workflows/main.yml | 5 + .../wolfssl/.github/workflows/memcached.yml | 10 +- .../wolfssl/.github/workflows/multi-arch.yml | 2 +- .../wolfssl/.github/workflows/multi-compiler.yml | 2 +- extra/wolfssl/wolfssl/.github/workflows/nginx.yml | 18 +- .../wolfssl/wolfssl/.github/workflows/openssh.yml | 68 + .../wolfssl/wolfssl/.github/workflows/openvpn.yml | 14 +- .../wolfssl/wolfssl/.github/workflows/os-check.yml | 7 +- .../wolfssl/.github/workflows/packaging.yml | 2 +- .../wolfssl/wolfssl/.github/workflows/stunnel.yml | 8 +- extra/wolfssl/wolfssl/.github/workflows/zephyr.yml | 8 +- extra/wolfssl/wolfssl/.gitignore | 40 +- extra/wolfssl/wolfssl/CMakeLists.txt | 227 +- extra/wolfssl/wolfssl/ChangeLog.md | 94 + extra/wolfssl/wolfssl/Docker/Dockerfile | 5 +- .../wolfssl/Docker/Dockerfile.cross-compiler | 2 +- extra/wolfssl/wolfssl/Docker/yocto/Dockerfile | 27 + extra/wolfssl/wolfssl/Docker/yocto/buildAndPush.sh | 27 + .../wolfssl/IDE/ARDUINO/Arduino_README_prepend.md | 13 + extra/wolfssl/wolfssl/IDE/ARDUINO/README.md | 185 +- extra/wolfssl/wolfssl/IDE/ARDUINO/include.am | 9 + extra/wolfssl/wolfssl/IDE/ARDUINO/keywords.txt | 21 + .../IDE/ARDUINO/library.properties.template | 9 + .../wolfssl/wolfssl/IDE/ARDUINO/sketches/README.md | 12 + .../IDE/ARDUINO/sketches/wolfssl_client/README.md | 22 + .../sketches/wolfssl_client/wolfssl_client.ino | 928 +- .../IDE/ARDUINO/sketches/wolfssl_server/README.md | 134 + .../sketches/wolfssl_server/wolfssl_server.ino | 913 +- .../IDE/ARDUINO/sketches/wolfssl_version/README.md | 3 + .../sketches/wolfssl_version/wolfssl_version.ino | 24 + .../wolfssl/wolfssl/IDE/ARDUINO/wolfssl-arduino.sh | 347 +- extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl.h | 39 + .../template/components/wolfssl/CMakeLists.txt | 6 +- .../components/wolfssl/CMakeLists.txt | 6 +- .../ESP-IDF/examples/wolfssl_benchmark/main/main.c | 33 +- .../ESP-IDF/examples/wolfssl_client/Makefile | 128 +- .../ESP-IDF/examples/wolfssl_client/README.md | 122 +- .../VisualGDB/wolfssl_client_IDF_v5_ESP32.sln | 5 + .../components/wolfssl/CMakeLists.txt | 10 +- .../wolfssl_client/components/wolfssl/component.mk | 230 +- .../components/wolfssl/include/user_settings.h | 199 +- .../examples/wolfssl_client/main/client-tls.c | 122 +- .../examples/wolfssl_client/main/component.mk | 6 +- .../wolfssl_client/main/include/client-tls.h | 26 +- .../examples/wolfssl_client/main/include/main.h | 4 +- .../wolfssl_client/main/include/time_helper.h | 15 +- .../wolfssl_client/main/include/wifi_connect.h | 58 +- .../ESP-IDF/examples/wolfssl_client/main/main.c | 114 +- .../examples/wolfssl_client/main/time_helper.c | 162 +- .../examples/wolfssl_client/main/wifi_connect.c | 136 +- .../examples/wolfssl_client/sdkconfig.defaults | 29 +- .../wolfssl_client/wolfssl_client_ESP8266.vgdbproj | 292 + .../components/wolfssl/CMakeLists.txt | 6 +- .../wolfssl_test/components/wolfssl/CMakeLists.txt | 6 +- .../ESP-IDF/examples/wolfssl_test/main/main.c | 20 +- extra/wolfssl/wolfssl/IDE/Espressif/README.md | 43 +- extra/wolfssl/wolfssl/IDE/Espressif/include.am | 1 + .../wolfssl/IDE/IAR-EWARM/Projects/user_settings.h | 52 +- .../settings/wolfcrypt_benchmark_Debug.jlink | 39 - .../wolfcrypt_benchmark.ewt | 2382 - .../wolfcrypt_lib.ewt | 2400 - .../settings/wolfcrypt_test_Debug.jlink | 39 - .../wolfcrypt_test.ewt | 2382 - .../wolfssl/wolfssl/IDE/LINUX-SGX/sgx_t_static.mk | 1 + extra/wolfssl/wolfssl/IDE/MPLABX16/README.md | 62 + extra/wolfssl/wolfssl/IDE/MPLABX16/include.am | 8 + extra/wolfssl/wolfssl/IDE/MPLABX16/main.c | 39 + extra/wolfssl/wolfssl/IDE/MPLABX16/user_settings.h | 414 + .../wolfssl/IDE/MPLABX16/wolfcrypt_test.X/Makefile | 113 + .../wolfcrypt_test.X/nbproject/configurations.xml | 285 + .../MPLABX16/wolfcrypt_test.X/nbproject/include.am | 8 + .../nbproject/private/configurations.xml | 25 + .../wolfcrypt_test.X/nbproject/private/private.xml | 7 + .../wolfcrypt_test.X/nbproject/project.xml | 33 + .../wolfssl/IDE/MPLABX16/wolfssl.X/Makefile | 113 + .../wolfssl.X/nbproject/configurations.xml | 290 + .../IDE/MPLABX16/wolfssl.X/nbproject/include.am | 7 + .../IDE/MPLABX16/wolfssl.X/nbproject/project.xml | 34 + .../wolfssl/IDE/MSVS-2019-AZSPHERE/shared/util.h | 1 + .../Renesas/e2studio/RA6M4/common/user_settings.h | 3 +- .../IDE/Renesas/e2studio/RA6M4/test/.cproject | 4 +- .../wolfssl/IDE/STM32Cube/STM32_Benchmarks.md | 75 + .../wolfssl/wolfssl/IDE/STM32Cube/default_conf.ftl | 47 +- extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.rc | 8 +- extra/wolfssl/wolfssl/IDE/include.am | 3 + extra/wolfssl/wolfssl/IDE/iotsafe/memory-tls.c | 5 +- extra/wolfssl/wolfssl/IDE/iotsafe/user_settings.h | 16 +- extra/wolfssl/wolfssl/IPP/.gitkeep | 0 extra/wolfssl/wolfssl/Makefile.am | 4 - extra/wolfssl/wolfssl/README | 140 +- extra/wolfssl/wolfssl/README.md | 187 +- extra/wolfssl/wolfssl/autogen.sh | 28 - extra/wolfssl/wolfssl/certs/crl/caEcc384Crl.pem | 12 +- extra/wolfssl/wolfssl/certs/crl/caEccCrl.pem | 12 +- extra/wolfssl/wolfssl/certs/crl/cliCrl.pem | 54 +- extra/wolfssl/wolfssl/certs/crl/crl.der | Bin 520 -> 520 bytes extra/wolfssl/wolfssl/certs/crl/crl.pem | 52 +- extra/wolfssl/wolfssl/certs/crl/crl.revoked | 56 +- extra/wolfssl/wolfssl/certs/crl/crl2.der | Bin 520 -> 520 bytes extra/wolfssl/wolfssl/certs/crl/crl2.pem | 102 +- extra/wolfssl/wolfssl/certs/crl/crl_rsapss.pem | 53 + extra/wolfssl/wolfssl/certs/crl/eccCliCRL.pem | 22 +- extra/wolfssl/wolfssl/certs/crl/eccSrvCRL.pem | 22 +- .../certs/crl/extra-crls/ca-int-cert-revoked.pem | 16 +- .../certs/crl/extra-crls/general-server-crl.pem | 16 +- extra/wolfssl/wolfssl/certs/crl/gencrls.sh | 17 + extra/wolfssl/wolfssl/certs/crl/include.am | 3 +- extra/wolfssl/wolfssl/certs/include.am | 1 + extra/wolfssl/wolfssl/certs/renewcerts.sh | 5 + extra/wolfssl/wolfssl/certs/test-stream-sign.p7b | Bin 0 -> 6228 bytes extra/wolfssl/wolfssl/cmake/config.in | 6 + extra/wolfssl/wolfssl/cmake/functions.cmake | 30 +- extra/wolfssl/wolfssl/configure.ac | 465 +- .../doc/dox_comments/header_files-ja/cmac.h | 54 +- .../dox_comments/header_files-ja/doxygen_groups.h | 1 + .../dox_comments/header_files-ja/doxygen_pages.h | 1 + .../wolfssl/doc/dox_comments/header_files-ja/rsa.h | 2 - .../wolfssl/doc/dox_comments/header_files/aes.h | 22 +- .../wolfssl/doc/dox_comments/header_files/cmac.h | 5 +- .../wolfssl/doc/dox_comments/header_files/ecc.h | 8 +- .../wolfssl/doc/dox_comments/header_files/hmac.h | 439 + .../doc/dox_comments/header_files/iotsafe.h | 8 +- .../wolfssl/doc/dox_comments/header_files/rsa.h | 51 +- .../wolfssl/doc/dox_comments/header_files/ssl.h | 208 +- extra/wolfssl/wolfssl/examples/asn1/asn1.c | 4 +- extra/wolfssl/wolfssl/examples/client/client.c | 18 + extra/wolfssl/wolfssl/examples/configs/include.am | 2 + .../examples/configs/user_settings_arduino.h | 486 + .../wolfssl/examples/configs/user_settings_tls12.h | 158 + extra/wolfssl/wolfssl/examples/pem/pem.c | 4 +- extra/wolfssl/wolfssl/examples/server/server.c | 37 +- extra/wolfssl/wolfssl/fips-check.sh | 40 +- extra/wolfssl/wolfssl/lib/dummy | 2 - extra/wolfssl/wolfssl/linuxkm/Kbuild | 21 +- extra/wolfssl/wolfssl/linuxkm/Makefile | 4 + extra/wolfssl/wolfssl/linuxkm/include.am | 3 +- extra/wolfssl/wolfssl/linuxkm/linuxkm_memory.c | 124 +- extra/wolfssl/wolfssl/linuxkm/linuxkm_wc_port.h | 280 +- extra/wolfssl/wolfssl/linuxkm/lkcapi_glue.c | 2739 + extra/wolfssl/wolfssl/linuxkm/module_hooks.c | 144 +- extra/wolfssl/wolfssl/pre-commit.sh | 45 - extra/wolfssl/wolfssl/pre-push.sh | 19 - extra/wolfssl/wolfssl/rpm/spec.in | 1 - extra/wolfssl/wolfssl/scripts/makedistsmall.sh | 1 - extra/wolfssl/wolfssl/scripts/openssl.test | 2 +- extra/wolfssl/wolfssl/src/bio.c | 69 +- extra/wolfssl/wolfssl/src/crl.c | 64 +- extra/wolfssl/wolfssl/src/dtls.c | 8 + extra/wolfssl/wolfssl/src/dtls13.c | 1 + extra/wolfssl/wolfssl/src/include.am | 59 +- extra/wolfssl/wolfssl/src/internal.c | 880 +- extra/wolfssl/wolfssl/src/pk.c | 93 +- extra/wolfssl/wolfssl/src/quic.c | 13 + extra/wolfssl/wolfssl/src/sniffer.c | 19 +- extra/wolfssl/wolfssl/src/ssl.c | 852 +- extra/wolfssl/wolfssl/src/ssl_bn.c | 3 +- extra/wolfssl/wolfssl/src/ssl_certman.c | 87 +- extra/wolfssl/wolfssl/src/tls.c | 328 +- extra/wolfssl/wolfssl/src/tls13.c | 934 +- extra/wolfssl/wolfssl/src/wolfio.c | 53 + extra/wolfssl/wolfssl/src/x509.c | 152 +- extra/wolfssl/wolfssl/src/x509_str.c | 10 +- extra/wolfssl/wolfssl/support/wolfssl.pc.in | 1 + extra/wolfssl/wolfssl/tests/api.c | 2731 +- extra/wolfssl/wolfssl/tests/srp.c | 2 + extra/wolfssl/wolfssl/tests/suites.c | 2 +- extra/wolfssl/wolfssl/tests/test-dtls.conf | 14 + extra/wolfssl/wolfssl/tests/test.conf | 12 + extra/wolfssl/wolfssl/tests/unit.h | 3 +- extra/wolfssl/wolfssl/tests/utils.h | 70 +- extra/wolfssl/wolfssl/testsuite/testsuite.c | 4 +- .../wolfssl/wolfcrypt/benchmark/benchmark.c | 2552 +- .../wolfssl/wolfcrypt/benchmark/benchmark.h | 2 +- extra/wolfssl/wolfssl/wolfcrypt/src/aes.c | 251 +- extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.S | 6 +- .../wolfssl/wolfcrypt/src/aes_gcm_x86_asm.S | 300 +- extra/wolfssl/wolfssl/wolfcrypt/src/asn.c | 1298 +- extra/wolfssl/wolfssl/wolfcrypt/src/chacha.c | 9 +- .../wolfssl/wolfcrypt/src/chacha20_poly1305.c | 52 +- extra/wolfssl/wolfssl/wolfcrypt/src/cmac.c | 162 +- extra/wolfssl/wolfssl/wolfcrypt/src/cpuid.c | 1 + extra/wolfssl/wolfssl/wolfcrypt/src/cryptocb.c | 314 +- extra/wolfssl/wolfssl/wolfcrypt/src/curve25519.c | 8 + extra/wolfssl/wolfssl/wolfcrypt/src/dh.c | 18 +- extra/wolfssl/wolfssl/wolfcrypt/src/dilithium.c | 206 +- extra/wolfssl/wolfssl/wolfcrypt/src/dsa.c | 8 + extra/wolfssl/wolfssl/wolfcrypt/src/ecc.c | 284 +- extra/wolfssl/wolfssl/wolfcrypt/src/eccsi.c | 8 + extra/wolfssl/wolfssl/wolfcrypt/src/ed25519.c | 26 + extra/wolfssl/wolfssl/wolfcrypt/src/ed448.c | 36 +- extra/wolfssl/wolfssl/wolfcrypt/src/error.c | 3 + extra/wolfssl/wolfssl/wolfcrypt/src/evp.c | 92 +- extra/wolfssl/wolfssl/wolfcrypt/src/ext_kyber.c | 76 +- extra/wolfssl/wolfssl/wolfcrypt/src/ext_xmss.c | 64 + extra/wolfssl/wolfssl/wolfcrypt/src/falcon.c | 190 +- .../wolfssl/wolfssl/wolfcrypt/src/fe_x25519_asm.S | 36 +- extra/wolfssl/wolfssl/wolfcrypt/src/ge_448.c | 46 +- extra/wolfssl/wolfssl/wolfcrypt/src/hash.c | 305 +- extra/wolfssl/wolfssl/wolfcrypt/src/hmac.c | 27 +- extra/wolfssl/wolfssl/wolfcrypt/src/include.am | 6 +- extra/wolfssl/wolfssl/wolfcrypt/src/integer.c | 3 + extra/wolfssl/wolfssl/wolfcrypt/src/kdf.c | 121 +- extra/wolfssl/wolfssl/wolfcrypt/src/logging.c | 13 +- extra/wolfssl/wolfssl/wolfcrypt/src/md5.c | 5 +- extra/wolfssl/wolfssl/wolfcrypt/src/memory.c | 57 +- extra/wolfssl/wolfssl/wolfcrypt/src/misc.c | 62 + extra/wolfssl/wolfssl/wolfcrypt/src/pkcs12.c | 2 +- extra/wolfssl/wolfssl/wolfcrypt/src/pkcs7.c | 2181 +- .../wolfcrypt/src/port/Espressif/esp32_mp.c | 10 +- .../wolfcrypt/src/port/Espressif/esp32_sha.c | 36 +- .../wolfcrypt/src/port/Espressif/esp32_util.c | 17 +- .../wolfssl/wolfcrypt/src/port/aria/aria-crypt.c | 5 + .../wolfcrypt/src/port/aria/aria-cryptocb.c | 28 +- .../wolfssl/wolfcrypt/src/port/arm/armv8-aes.c | 76 +- .../wolfssl/wolfcrypt/src/port/arm/armv8-chacha.c | 34 +- .../wolfssl/wolfcrypt/src/port/arm/armv8-sha256.c | 198 +- .../wolfcrypt/src/port/arm/thumb2-aes-asm.S | 29 +- .../wolfcrypt/src/port/arm/thumb2-aes-asm_c.c | 104 +- .../wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c | 5 +- .../wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c | 3 +- .../wolfssl/wolfcrypt/src/port/autosar/README.md | 45 + .../wolfssl/wolfcrypt/src/port/autosar/cryif.c | 103 + .../wolfssl/wolfcrypt/src/port/autosar/crypto.c | 495 + .../wolfssl/wolfcrypt/src/port/autosar/csm.c | 298 + .../wolfssl/wolfcrypt/src/port/autosar/include.am | 23 + .../wolfssl/wolfcrypt/src/port/autosar/test.c | 430 + .../wolfssl/wolfcrypt/src/port/iotsafe/iotsafe.c | 44 +- .../wolfssl/wolfcrypt/src/port/liboqs/liboqs.c | 132 + .../wolfssl/wolfssl/wolfcrypt/src/port/st/stm32.c | 52 +- .../wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-aes.c | 1066 +- .../wolfssl/wolfcrypt/src/port/ti/ti-hash.c | 39 +- .../wolfssl/wolfcrypt/src/port/xilinx/xil-aesgcm.c | 33 +- extra/wolfssl/wolfssl/wolfcrypt/src/random.c | 359 +- extra/wolfssl/wolfssl/wolfcrypt/src/rsa.c | 93 +- extra/wolfssl/wolfssl/wolfcrypt/src/sakke.c | 9 +- extra/wolfssl/wolfssl/wolfcrypt/src/sha.c | 66 +- extra/wolfssl/wolfssl/wolfcrypt/src/sha256.c | 407 +- extra/wolfssl/wolfssl/wolfcrypt/src/sha256_asm.S | 942 +- extra/wolfssl/wolfssl/wolfcrypt/src/sha512.c | 83 +- extra/wolfssl/wolfssl/wolfcrypt/src/siphash.c | 12 +- extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm32.c | 48 +- extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm64.c | 42 +- extra/wolfssl/wolfssl/wolfcrypt/src/sp_armthumb.c | 48 +- extra/wolfssl/wolfssl/wolfcrypt/src/sp_c32.c | 24 +- extra/wolfssl/wolfssl/wolfcrypt/src/sp_c64.c | 24 +- extra/wolfssl/wolfssl/wolfcrypt/src/sp_cortexm.c | 48 +- extra/wolfssl/wolfssl/wolfcrypt/src/sp_dsp32.c | 6 +- extra/wolfssl/wolfssl/wolfcrypt/src/sp_int.c | 59 +- extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64.c | 32 +- extra/wolfssl/wolfssl/wolfcrypt/src/sphincs.c | 23 +- extra/wolfssl/wolfssl/wolfcrypt/src/tfm.c | 24 +- extra/wolfssl/wolfssl/wolfcrypt/src/wc_dsp.c | 6 +- extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber.c | 1247 +- extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_asm.S | 27812 +++++++++- .../wolfssl/wolfssl/wolfcrypt/src/wc_kyber_poly.c | 3020 +- extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms.c | 2 +- extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms_impl.c | 26 + extra/wolfssl/wolfssl/wolfcrypt/src/wc_port.c | 78 +- extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss_impl.c | 26 + extra/wolfssl/wolfssl/wolfcrypt/test/test.c | 1393 +- .../wolfssl/wolfcrypt/user-crypto/Makefile.am | 9 - .../wolfssl/wolfcrypt/user-crypto/README.txt | 78 - .../wolfssl/wolfcrypt/user-crypto/autogen.sh | 23 - .../wolfssl/wolfcrypt/user-crypto/configure.ac | 44 - .../wolfssl/wolfcrypt/user-crypto/include.am | 13 - .../wolfcrypt/user-crypto/include/user_rsa.h | 137 - .../wolfssl/wolfcrypt/user-crypto/lib/.gitkeep | 0 .../wolfssl/wolfcrypt/user-crypto/src/rsa.c | 2797 - extra/wolfssl/wolfssl/wolfssl.rc | Bin 4918 -> 4918 bytes extra/wolfssl/wolfssl/wolfssl/internal.h | 121 +- extra/wolfssl/wolfssl/wolfssl/openssl/bio.h | 1 + extra/wolfssl/wolfssl/wolfssl/openssl/crypto.h | 8 +- extra/wolfssl/wolfssl/wolfssl/openssl/opensslv.h | 9 +- extra/wolfssl/wolfssl/wolfssl/openssl/ssl.h | 3 + extra/wolfssl/wolfssl/wolfssl/quic.h | 11 + extra/wolfssl/wolfssl/wolfssl/ssl.h | 58 +- extra/wolfssl/wolfssl/wolfssl/test.h | 147 +- extra/wolfssl/wolfssl/wolfssl/version.h | 4 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/aes.h | 14 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn.h | 76 +- .../wolfssl/wolfssl/wolfssl/wolfcrypt/asn_public.h | 30 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cmac.h | 14 + extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cpuid.h | 2 + extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cryptocb.h | 106 + .../wolfssl/wolfssl/wolfssl/wolfcrypt/dilithium.h | 41 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ecc.h | 6 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed25519.h | 2 - extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed448.h | 2 +- .../wolfssl/wolfssl/wolfcrypt/error-crypt.h | 11 + .../wolfssl/wolfssl/wolfssl/wolfcrypt/ext_kyber.h | 10 + extra/wolfssl/wolfssl/wolfssl/wolfcrypt/falcon.h | 42 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_448.h | 2 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hash.h | 33 + extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hmac.h | 8 + extra/wolfssl/wolfssl/wolfssl/wolfcrypt/include.am | 12 + extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kdf.h | 11 + extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kyber.h | 6 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/logging.h | 5 + extra/wolfssl/wolfssl/wolfssl/wolfcrypt/memory.h | 47 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/misc.h | 3 + extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs7.h | 21 + .../wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h | 38 +- .../wolfssl/wolfssl/wolfcrypt/port/autosar/CryIf.h | 49 + .../wolfssl/wolfcrypt/port/autosar/Crypto.h | 55 + .../wolfssl/wolfssl/wolfcrypt/port/autosar/Csm.h | 295 + .../wolfssl/wolfcrypt/port/autosar/StandardTypes.h | 66 + .../wolfssl/wolfcrypt/port/iotsafe/iotsafe.h | 5 + .../wolfssl/wolfssl/wolfcrypt/port/liboqs/liboqs.h | 62 + .../wolfssl/wolfssl/wolfcrypt/port/psa/psa.h | 7 - extra/wolfssl/wolfssl/wolfssl/wolfcrypt/random.h | 5 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/rsa.h | 9 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/settings.h | 310 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha.h | 66 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha256.h | 6 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha512.h | 2 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp_int.h | 2 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sphincs.h | 5 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/tfm.h | 5 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/types.h | 332 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_kyber.h | 280 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_lms.h | 2 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_port.h | 127 +- extra/wolfssl/wolfssl/wolfssl/wolfcrypt/xmss.h | 95 +- extra/wolfssl/wolfssl/wolfssl/wolfio.h | 12 +- extra/wolfssl/wolfssl/zephyr/CMakeLists.txt | 4 + .../zephyr/samples/wolfssl_benchmark/prj.conf | 1 + include/my_attribute.h | 14 + include/my_base.h | 7 + include/my_bitmap.h | 67 +- include/my_global.h | 2 + include/my_rdtsc.h | 12 +- include/my_sys.h | 3 +- include/mysql/service_print_check_msg.h | 44 + include/mysql_com.h | 1 + include/service_versions.h | 1 + include/source_revision.h | 1 + include/sslopt-longopts.h | 10 +- include/violite.h | 8 + libmariadb/.gitattributes | 9 + libmariadb/.gitignore | 116 + libmariadb/CMakeLists.txt | 4 +- libmariadb/include/CMakeLists.txt | 1 - libmariadb/include/errmsg.h | 3 +- libmariadb/include/ma_hash.h | 22 + libmariadb/include/mariadb_com.h | 8 +- libmariadb/include/mysql/client_plugin.h | 2 +- libmariadb/include/mysql/plugin_auth_common.h | 110 - libmariadb/libmariadb/ma_default.c | 1 + libmariadb/libmariadb/ma_errmsg.c | 3 +- libmariadb/libmariadb/mariadb_async.c | 2 +- libmariadb/libmariadb/mariadb_lib.c | 17 +- libmariadb/libmariadb/secure/openssl.c | 2 +- libmariadb/plugins/io/remote_io.c | 4 +- libmariadb/plugins/pvio/pvio_socket.c | 2 +- libmariadb/plugins/trace/trace_example.c | 2 +- libmariadb/unittest/libmariadb/bulk1.c | 4 +- libmariadb/unittest/libmariadb/connection.c | 26 + libmariadb/unittest/libmariadb/ps_bugs.c | 4 +- libmysqld/CMakeLists.txt | 4 +- libmysqld/embedded_priv.h | 2 + libmysqld/lib_sql.cc | 26 +- libmysqld/libmysqld.c | 4 +- libservices/CMakeLists.txt | 1 + libservices/print_check_msg_service.c | 18 + man/CMakeLists.txt | 3 +- man/my_print_defaults.1 | 18 +- man/wsrep_sst_backup.1 | 16 + mysql-test/collections/buildbot_suites.bat | 2 +- mysql-test/dgcov.pl | 3 +- mysql-test/include/aria_log_control_load.inc | 11 + mysql-test/include/check-testcase.test | 12 +- mysql-test/include/commit.inc | 20 +- mysql-test/include/crash_mysqld.inc | 2 +- mysql-test/include/deadlock.inc | 1 - mysql-test/include/default_mysqld.cnf | 4 +- mysql-test/include/expect_crash.inc | 2 +- mysql-test/include/have_innodb.combinations | 39 - mysql-test/include/have_innodb.inc | 5 + mysql-test/include/have_innodb.opt | 17 + mysql-test/include/innodb_rollback_on_timeout.inc | 2 - mysql-test/include/kill_and_restart_mysqld.inc | 2 +- mysql-test/include/kill_galera.inc | 2 +- mysql-test/include/kill_mysqld.inc | 2 +- mysql-test/include/rpl_change_topology.inc | 7 +- .../rpl_clone_slave_using_mariadb-backup.inc | 297 + mysql-test/include/rpl_start_server.inc | 2 +- mysql-test/include/rpl_stop_server.inc | 2 +- mysql-test/include/search_pattern_in_file.inc | 64 +- mysql-test/include/shutdown_mysqld.inc | 9 +- mysql-test/include/slow_environ.inc | 9 + mysql-test/include/start_mysqld.inc | 4 +- mysql-test/include/stop_slave_io.inc | 11 +- mysql-test/include/sync_slave_sql_with_io.inc | 7 +- mysql-test/include/sync_with_master_gtid.inc | 7 +- mysql-test/include/wait_for_pattern_in_file.inc | 13 +- mysql-test/include/wait_for_slave_param.inc | 7 +- mysql-test/include/wait_until_connected_again.inc | 2 +- mysql-test/lib/My/Debugger.pm | 1 + mysql-test/lib/My/Platform.pm | 10 +- mysql-test/lib/mtr_report.pm | 4 + mysql-test/main/alter_table.result | 8 + mysql-test/main/alter_table.test | 9 + mysql-test/main/bootstrap.test | 2 +- mysql-test/main/column_compression_parts.result | 1 - mysql-test/main/commit_1innodb.result | 13 +- mysql-test/main/constraints.result | 13 + mysql-test/main/constraints.test | 15 + mysql-test/main/crash_commit_before.test | 2 +- mysql-test/main/create.result | 2 +- mysql-test/main/ctype_collate.result | 24 + mysql-test/main/ctype_collate.test | 15 + mysql-test/main/ctype_ucs.result | 20 + mysql-test/main/ctype_ucs.test | 17 + mysql-test/main/ddl_i18n_koi8r.result | 6 + mysql-test/main/ddl_i18n_utf8.result | 6 + mysql-test/main/deadlock_innodb.result | 5 - mysql-test/main/derived_split_innodb.result | 57 + mysql-test/main/derived_split_innodb.test | 42 + mysql-test/main/derived_view.result | 66 + mysql-test/main/derived_view.test | 72 + mysql-test/main/distinct_notembedded.result | 322 + mysql-test/main/distinct_notembedded.test | 109 + mysql-test/main/dyncol.result | 28 +- mysql-test/main/dyncol.test | 21 + mysql-test/main/empty_server_name-8224.test | 4 +- mysql-test/main/empty_string_literal.result | 26 +- mysql-test/main/empty_string_literal.test | 15 + mysql-test/main/func_encrypt_nossl.result | 42 +- mysql-test/main/func_extract.result | 882 + mysql-test/main/func_extract.test | 251 + mysql-test/main/func_gconcat.result | 95 + mysql-test/main/func_gconcat.test | 56 + mysql-test/main/func_hybrid_type.result | 25 + mysql-test/main/func_hybrid_type.test | 23 + mysql-test/main/func_in.result | 78 + mysql-test/main/func_in.test | 60 + mysql-test/main/func_json.result | 29 +- mysql-test/main/func_json.test | 51 +- mysql-test/main/func_json_notembedded.result | 3 + mysql-test/main/func_json_notembedded.test | 4 + mysql-test/main/func_math.result | 15 + mysql-test/main/func_math.test | 10 + mysql-test/main/func_regexp.result | 52 +- mysql-test/main/func_regexp.test | 47 +- mysql-test/main/func_sformat.result | 38 +- mysql-test/main/func_sformat.test | 56 +- mysql-test/main/func_str.result | 36 +- mysql-test/main/func_str.test | 22 + mysql-test/main/func_time.result | 74 +- mysql-test/main/func_time.test | 39 + mysql-test/main/function_defaults.result | 25 + mysql-test/main/function_defaults.test | 23 + mysql-test/main/gis.result | 32 +- mysql-test/main/host_cache_size_functionality.test | 8 +- mysql-test/main/information_schema2.result | 18 + mysql-test/main/information_schema2.test | 23 +- mysql-test/main/init_file_set_password-7656.test | 4 +- .../main/innodb_ext_key,covering,innodb,on.rdiff | 20 - mysql-test/main/innodb_ext_key,covering,on.rdiff | 20 + .../innodb_ext_key,innodb,on,unoptimized.rdiff | 20 - mysql-test/main/innodb_ext_key,off.rdiff | 6 +- .../main/innodb_ext_key,on,unoptimized.rdiff | 20 + mysql-test/main/innodb_ext_key.result | 28 +- mysql-test/main/innodb_ext_key.test | 30 +- mysql-test/main/insert_select.result | 8 +- mysql-test/main/join.result | 58 +- mysql-test/main/join.test | 46 + mysql-test/main/join_cache.result | 22 + mysql-test/main/join_cache.test | 21 + mysql-test/main/join_outer.test | 18 - mysql-test/main/kill_processlist-6619.test | 14 +- ...d_timezones_with_alter_algorithm_inplace.result | 18 + ...oad_timezones_with_alter_algorithm_inplace.test | 40 + mysql-test/main/lock_sync.result | 24 +- mysql-test/main/lock_sync.test | 27 +- mysql-test/main/lock_view.result | 2 + mysql-test/main/log_errchk.test | 4 +- mysql-test/main/long_unique_bugs.result | 55 +- mysql-test/main/long_unique_bugs.test | 47 +- mysql-test/main/lowercase_fs_on.test | 4 +- mysql-test/main/lowercase_table2.result | 0 mysql-test/main/mdl_sync.result | 4 + mysql-test/main/mdl_sync.test | 7 + mysql-test/main/myisam.result | 1 - mysql-test/main/myisam.test | 3 - .../main/myisam_crash_before_flush_keys.test | 4 +- mysql-test/main/mysql-interactive.test | 2 + mysql-test/main/mysql.result | 32 +- mysql-test/main/mysql.test | 44 +- mysql-test/main/mysql_client_test.result | 1 + mysql-test/main/mysql_client_test.test | 8 +- mysql-test/main/mysql_client_test_comp.test | 2 +- mysql-test/main/mysql_client_test_nonblock.test | 2 +- mysql-test/main/mysql_connector_net.test | 2 +- mysql-test/main/mysql_install_db_win_admin.result | 6 - mysql-test/main/mysql_install_db_win_admin.test | 5 +- mysql-test/main/mysql_tzinfo_to_sql_symlink.result | 12 + mysql-test/main/mysqlbinlog_row_compressed.result | 194 +- mysql-test/main/mysqlbinlog_row_compressed.test | 5 +- mysql-test/main/mysqlbinlog_row_minimal.result | 2 +- mysql-test/main/mysqlbinlog_stmt_compressed.result | 128 +- mysql-test/main/mysqlbinlog_stmt_compressed.test | 3 +- mysql-test/main/mysqld--help.result | 22 +- mysql-test/main/mysqld_option_err.result | 11 + mysql-test/main/mysqld_option_err.test | 34 +- mysql-test/main/mysqldump-compat-102.result | 1 + mysql-test/main/mysqldump-max.result | 24 +- mysql-test/main/mysqldump-nl.result | 2 + mysql-test/main/mysqldump-no-binlog.result | 1 + mysql-test/main/mysqldump-order-by-size.result | 1 + mysql-test/main/mysqldump-system.result | 23 +- mysql-test/main/mysqldump-timing.result | 2 + mysql-test/main/mysqldump-utf8mb4.result | 1 + mysql-test/main/mysqldump.result | 130 +- mysql-test/main/mysqldump.test | 31 +- mysql-test/main/openssl_1.result | 3 + mysql-test/main/openssl_1.test | 2 +- mysql-test/main/opt_trace.result | 37 + mysql-test/main/opt_trace.test | 10 + mysql-test/main/partition.result | 1 - mysql-test/main/partition_binlog.result | 1 - mysql-test/main/plugin_auth.result | 1 + mysql-test/main/plugin_loaderr.test | 4 +- mysql-test/main/ps.result | 181 + mysql-test/main/ps.test | 185 + mysql-test/main/ps_2myisam.result | 4 +- mysql-test/main/ps_3innodb.result | 4 +- mysql-test/main/ps_4heap.result | 4 +- mysql-test/main/ps_5merge.result | 8 +- mysql-test/main/query_cache.result | 33 +- mysql-test/main/query_cache.test | 43 +- mysql-test/main/read_only_innodb.result | 25 +- mysql-test/main/read_only_innodb.test | 28 +- mysql-test/main/rowid_filter_innodb.result | 102 +- mysql-test/main/rowid_filter_innodb.test | 80 +- mysql-test/main/rpl_mysqldump_slave.result | 179 +- mysql-test/main/rpl_mysqldump_slave.test | 73 +- mysql-test/main/secondary_key_costs.result | 35 + mysql-test/main/secondary_key_costs.test | 21 + .../main/selectivity_innodb_notembedded.result | 131 +- mysql-test/main/selectivity_notembedded.result | 131 +- mysql-test/main/selectivity_notembedded.test | 102 +- mysql-test/main/show_analyze.result | 8 +- mysql-test/main/show_analyze.test | 12 +- mysql-test/main/show_explain_json.result | 8 +- mysql-test/main/show_explain_json.test | 12 +- mysql-test/main/shutdown.test | 4 +- mysql-test/main/skip_grants.test | 4 +- mysql-test/main/sp.result | 3 +- mysql-test/main/sp.test | 2 - mysql-test/main/ssl_and_innodb.test | 2 +- mysql-test/main/ssl_crl.result | 2 +- mysql-test/main/ssl_crl.test | 4 +- mysql-test/main/ssl_timeout.result | 2 +- mysql-test/main/ssl_timeout.test | 3 +- mysql-test/main/stat_tables_partition.result | 3 +- mysql-test/main/stat_tables_rbr.result | 1 - mysql-test/main/subselect4.result | 79 +- mysql-test/main/subselect4.test | 15 + mysql-test/main/subselect_elimination.result | 268 + mysql-test/main/subselect_elimination.test | 242 + mysql-test/main/subselect_sj_mat.test | 9 - mysql-test/main/system_mysql_db_fix50030.result | 2 +- mysql-test/main/system_mysql_db_fix50117.result | 2 +- mysql-test/main/system_mysql_db_fix50568.result | 2 +- mysql-test/main/table_value_constr.result | 4 +- mysql-test/main/table_value_constr.test | 4 +- mysql-test/main/temp_table.result | 49 + mysql-test/main/temp_table.test | 54 + mysql-test/main/trigger.result | 6 - mysql-test/main/trigger.test | 9 - mysql-test/main/trigger_wl3253.result | 2 + mysql-test/main/type_decimal.result | 173 + mysql-test/main/type_decimal.test | 90 + mysql-test/main/type_json.result | 2 +- mysql-test/main/type_timestamp.result | 116 + mysql-test/main/type_timestamp.test | 92 + mysql-test/main/type_varchar_mysql41.result | 149 + mysql-test/main/type_varchar_mysql41.test | 85 + mysql-test/main/udf.result | 64 + mysql-test/main/udf.test | 34 + mysql-test/mariadb-test-run.pl | 19 +- mysql-test/std_data/autoinc_import_101.frm | Bin 0 -> 922 bytes mysql-test/std_data/autoinc_import_57.frm | Bin 0 -> 8556 bytes mysql-test/std_data/mdev-25731.dat | 6 + mysql-test/suite.pm | 9 +- mysql-test/suite/archive/archive.test | 2 +- mysql-test/suite/archive/archive_bitfield.result | 1 + mysql-test/suite/atomic/alter_table.test | 7 +- mysql-test/suite/binlog/include/binlog_index.inc | 12 +- .../binlog/include/print_optional_metadata.inc | 3 +- .../binlog/r/binlog_mysqlbinlog_row_innodb.result | 119 +- .../binlog/r/binlog_mysqlbinlog_row_myisam.result | 119 +- .../suite/binlog/r/binlog_row_annotate.result | 12 +- .../binlog/r/binlog_row_mysqlbinlog_options.result | 4 +- .../binlog/t/binlog_autocommit_off_no_hang.test | 4 +- mysql-test/suite/binlog/t/binlog_rotate_perf.test | 4 +- .../binlog_encryption/binlog_row_annotate.result | 6 +- .../suite/binlog_encryption/restart_server.inc | 4 +- .../suite/binlog_encryption/rpl_gtid_basic.result | 6 - .../suite/binlog_encryption/rpl_packet.result | 2 + .../rpl_parallel_slave_bgc_kill.result | 8 +- .../rpl_parallel_stop_slave.result | 4 +- .../compat/oracle/r/empty_string_literal.result | 6 +- mysql-test/suite/compat/oracle/r/gis.result | 32 +- .../r/mysqldump_restore_func_qualified.result | 1 + .../compat/oracle/r/sp-package-mysqldump.result | 1 + .../encryption/r/corrupted_during_recovery.result | 2 +- .../encryption/r/innodb-bad-key-change.result | 24 +- .../encryption/r/innodb-bad-key-change2.result | 18 +- .../encryption/r/innodb-bad-key-change4.result | 6 +- .../encryption/r/innodb-compressed-blob.result | 6 +- .../encryption/r/innodb-encryption-disable.result | 7 +- .../suite/encryption/r/innodb-force-corrupt.result | 6 +- .../suite/encryption/r/innodb-missing-key.result | 6 +- .../suite/encryption/r/innodb-redo-nokeys.result | 11 +- .../encryption/t/corrupted_during_recovery.test | 2 +- .../suite/encryption/t/encrypt_and_grep.test | 6 +- .../suite/encryption/t/innodb-bad-key-change.test | 4 +- .../suite/encryption/t/innodb-bad-key-change2.test | 6 +- .../suite/encryption/t/innodb-bad-key-change3.test | 12 +- .../suite/encryption/t/innodb-compressed-blob.test | 6 +- .../encryption/t/innodb-encryption-disable.test | 7 +- .../suite/encryption/t/innodb-force-corrupt.test | 6 +- .../suite/encryption/t/innodb-missing-key.test | 2 +- .../suite/encryption/t/innodb-redo-nokeys.test | 4 +- .../suite/encryption/t/innodb_encrypt_freed.test | 2 +- .../suite/engines/funcs/r/rpl_change_master.result | 5 - .../suite/engines/funcs/r/rpl_get_lock.result | 3 +- .../engines/funcs/r/tc_partition_analyze.result | 1 - mysql-test/suite/federated/federatedx.result | 1 + .../federated/federatedx_create_handlers.result | 65 + .../federated/federatedx_create_handlers.test | 61 +- mysql-test/suite/galera/disabled.def | 6 +- mysql-test/suite/galera/galera_4nodes.cnf | 4 + mysql-test/suite/galera/include/kill_galera.inc | 2 +- .../suite/galera/include/shutdown_mysqld.inc | 18 - mysql-test/suite/galera/include/start_mysqld.inc | 4 +- mysql-test/suite/galera/r/MDEV-22232.result | 12 +- mysql-test/suite/galera/r/MDEV-24143.result | 2 +- mysql-test/suite/galera/r/MDEV-25731.result | 47 + mysql-test/suite/galera/r/MDEV-26499.result | 6 + mysql-test/suite/galera/r/MDEV-27276.result | 6 +- mysql-test/suite/galera/r/MDEV-27806.result | 2 +- mysql-test/suite/galera/r/MDEV-33136.result | 21 + mysql-test/suite/galera/r/MDEV-33828.result | 41 + mysql-test/suite/galera/r/MW-336.result | 46 +- mysql-test/suite/galera/r/MW-369.result | 126 +- mysql-test/suite/galera/r/MW-402.result | 108 +- .../galera/r/galera_bf_abort_mariabackup.result | 24 +- mysql-test/suite/galera/r/galera_load_data.result | 305 +- mysql-test/suite/galera/r/galera_mdl_race.result | 50 +- .../suite/galera/r/galera_myisam_autocommit.result | 37 +- .../r/galera_parallel_apply_lock_table.result | 2 +- .../galera/r/galera_query_cache_invalidate.result | 2 - .../suite/galera/r/galera_sequence_engine.result | 12 + .../suite/galera/r/galera_shutdown_nonprim.result | 7 +- .../galera/r/galera_sst_mariabackup,debug.rdiff | 11 +- .../suite/galera/r/galera_sst_mariabackup.result | 20 + .../suite/galera/r/galera_table_with_hyphen.result | 52 + .../suite/galera/r/galera_vote_rejoin_ddl.result | 5 +- .../suite/galera/r/galera_wan_restart_sst.result | 9 +- mysql-test/suite/galera/r/mdev-22063.result | 241 + mysql-test/suite/galera/r/mdev-31285.result | 21 +- mysql-test/suite/galera/r/mysql-wsrep#332.result | 12 - ...mariadb_clone_slave_using_mariadb-backup.result | 211 + mysql-test/suite/galera/r/versioning_trx_id.result | 6 +- mysql-test/suite/galera/suite.pm | 2 + mysql-test/suite/galera/t/MDEV-22232.test | 26 +- mysql-test/suite/galera/t/MDEV-24143.test | 6 +- mysql-test/suite/galera/t/MDEV-25731.test | 34 + mysql-test/suite/galera/t/MDEV-26499.test | 20 + mysql-test/suite/galera/t/MDEV-26597.test | 2 +- mysql-test/suite/galera/t/MDEV-27276.test | 43 +- mysql-test/suite/galera/t/MDEV-29142.test | 4 +- mysql-test/suite/galera/t/MDEV-33136.test | 44 + mysql-test/suite/galera/t/MDEV-33828.cnf | 4 + mysql-test/suite/galera/t/MDEV-33828.test | 45 + mysql-test/suite/galera/t/MW-336.cnf | 2 + mysql-test/suite/galera/t/MW-336.test | 62 +- mysql-test/suite/galera/t/MW-369.inc | 40 +- mysql-test/suite/galera/t/MW-369.test | 1 - .../galera/t/galera_bf_abort_mariabackup.test | 15 +- .../galera/t/galera_ist_mariabackup_verify_ca.cnf | 2 + .../suite/galera/t/galera_ist_restart_joiner.test | 2 +- mysql-test/suite/galera/t/galera_load_data.test | 304 +- mysql-test/suite/galera/t/galera_mdl_race.test | 60 +- .../suite/galera/t/galera_myisam_autocommit.test | 26 +- .../galera/t/galera_parallel_apply_lock_table.test | 2 +- .../suite/galera/t/galera_parallel_simple.test | 2 +- mysql-test/suite/galera/t/galera_pc_recovery.test | 8 +- .../galera/t/galera_restart_on_unknown_option.test | 4 +- .../suite/galera/t/galera_sequence_engine.test | 16 + .../suite/galera/t/galera_shutdown_nonprim.test | 16 +- .../suite/galera/t/galera_sst_mariabackup.cnf | 5 + .../suite/galera/t/galera_sst_mariabackup.test | 27 + .../suite/galera/t/galera_table_with_hyphen.inc | 48 + .../suite/galera/t/galera_table_with_hyphen.test | 34 + .../suite/galera/t/galera_vote_rejoin_ddl.cnf | 6 - .../suite/galera/t/galera_vote_rejoin_ddl.test | 18 +- .../suite/galera/t/galera_wan_restart_sst.test | 36 +- .../suite/galera/t/galera_wsrep_new_cluster.test | 2 +- mysql-test/suite/galera/t/mdev-22063.test | 184 + mysql-test/suite/galera/t/mdev-22543.test | 2 +- mysql-test/suite/galera/t/mdev-30013.test | 1 + mysql-test/suite/galera/t/mdev-31285.test | 33 +- mysql-test/suite/galera/t/mysql-wsrep#332.test | 113 +- ...to_mariadb_clone_slave_using_mariadb-backup.cnf | 10 + ...o_mariadb_clone_slave_using_mariadb-backup.test | 9 + mysql-test/suite/galera/t/versioning_trx_id.test | 12 +- mysql-test/suite/galera_3nodes/disabled.def | 1 + mysql-test/suite/galera_3nodes/r/MDEV-29171.result | 20 + .../suite/galera_3nodes/r/galera_allowlist.result | 3 + .../r/galera_ist_gcache_rollover.result | 27 +- .../galera_3nodes/r/galera_join_with_cc_B.result | 4 + mysql-test/suite/galera_3nodes/t/MDEV-29171.test | 37 + .../suite/galera_3nodes/t/galera_allowlist.test | 9 + .../galera_3nodes/t/galera_gtid_consistency.cnf | 3 + .../galera_3nodes/t/galera_ist_gcache_rollover.cnf | 14 +- .../t/galera_ist_gcache_rollover.test | 33 +- .../galera_3nodes/t/galera_join_with_cc_B.test | 5 + mysql-test/suite/galera_3nodes_sr/r/GCF-336.result | 2 + mysql-test/suite/galera_3nodes_sr/r/GCF-832.result | 10 +- .../r/galera_sr_kill_slave_before_apply.result | 17 +- mysql-test/suite/galera_3nodes_sr/t/GCF-336.test | 6 + mysql-test/suite/galera_3nodes_sr/t/GCF-832.test | 19 +- .../t/galera_sr_kill_slave_before_apply.test | 16 +- .../galera_sr/r/galera_sr_bf_abort_idle.result | 33 + mysql-test/suite/galera_sr/t/MDEV-25718.test | 5 +- .../suite/galera_sr/t/galera_sr_bf_abort_idle.test | 68 + .../galera_sr/t/galera_sr_kill_all_norecovery.test | 4 +- mysql-test/suite/gcol/inc/innodb_v_large_col.inc | 2 - .../suite/gcol/r/innodb_virtual_debug_purge.result | 10 +- .../suite/gcol/t/innodb_virtual_debug_purge.test | 8 +- .../include/innodb_merge_threshold_delete.inc | 3 - .../include/innodb_merge_threshold_secondary.inc | 3 - .../include/innodb_merge_threshold_update.inc | 3 - .../suite/innodb/include/no_checkpoint_start.inc | 23 + mysql-test/suite/innodb/r/alter_copy.result | 2 +- mysql-test/suite/innodb/r/alter_kill.result | 4 +- .../innodb/r/alter_not_null,COPY,NON-STRICT.rdiff | 121 +- .../innodb/r/alter_not_null,COPY,STRICT.rdiff | 181 +- .../innodb/r/alter_not_null,INPLACE,STRICT.rdiff | 164 +- mysql-test/suite/innodb/r/autoinc_debug.result | 57 + mysql-test/suite/innodb/r/autoinc_import.result | 232 + .../suite/innodb/r/check_ibd_filesize,32k.rdiff | 6 +- .../suite/innodb/r/check_ibd_filesize,4k.rdiff | 6 +- .../suite/innodb/r/check_ibd_filesize,64k.rdiff | 6 +- .../suite/innodb/r/check_ibd_filesize,8k.rdiff | 6 +- .../suite/innodb/r/check_ibd_filesize.result | 2 +- .../innodb/r/cursor-restore-unique-null.result | 24 + mysql-test/suite/innodb/r/foreign_key.result | 21 +- mysql-test/suite/innodb/r/full_crc32_import.result | 20 +- mysql-test/suite/innodb/r/import_bugs.result | 52 + mysql-test/suite/innodb/r/import_hidden_fts.result | 45 + .../suite/innodb/r/import_hidden_fts_debug.result | 76 + mysql-test/suite/innodb/r/index_length.result | 8 + .../suite/innodb/r/innodb-alter-debug.result | 15 +- .../innodb/r/innodb-lru-force-no-free-page.result | 10 - .../suite/innodb/r/innodb-wl5522,crc32.rdiff | 5 - .../innodb/r/innodb-wl5522,strict_crc32.rdiff | 17 +- .../suite/innodb/r/innodb_bug30113362.result | 6 +- mysql-test/suite/innodb/r/innodb_mysql.result | 12 - .../innodb/r/innodb_skip_innodb_is_tables.result | 2 - .../suite/innodb/r/innodb_stats_fetch.result | 7 + .../suite/innodb/r/innodb_timeout_rollback.result | 6 +- .../suite/innodb/r/innodb_ut_format_name.result | 5 - .../suite/innodb/r/insert_into_empty,4k.rdiff | 12 +- mysql-test/suite/innodb/r/insert_into_empty.result | 53 + .../suite/innodb/r/instant_alter_crash.result | 24 - .../innodb/r/instant_alter_debug,redundant.rdiff | 4 +- .../suite/innodb/r/instant_alter_debug.result | 53 +- .../suite/innodb/r/instant_alter_extend.result | Bin 9115 -> 9503 bytes .../suite/innodb/r/instant_alter_import.result | 1 + .../suite/innodb/r/lock_insert_into_empty.result | 5 + mysql-test/suite/innodb/r/lock_isolation.result | 136 + .../suite/innodb/r/log_upgrade_101_flags.result | 12 + .../r/max_record_size,16k,compact,innodb.rdiff | 80 - .../innodb/r/max_record_size,16k,compact.rdiff | 80 + .../r/max_record_size,16k,dynamic,innodb.rdiff | 224 - .../innodb/r/max_record_size,16k,dynamic.rdiff | 224 + .../r/max_record_size,16k,innodb,redundant.rdiff | 80 - .../innodb/r/max_record_size,16k,redundant.rdiff | 80 + .../r/max_record_size,32k,compact,innodb.rdiff | 121 - .../innodb/r/max_record_size,32k,compact.rdiff | 121 + .../r/max_record_size,32k,dynamic,innodb.rdiff | 366 - .../innodb/r/max_record_size,32k,dynamic.rdiff | 366 + .../r/max_record_size,32k,innodb,redundant.rdiff | 121 - .../innodb/r/max_record_size,32k,redundant.rdiff | 121 + .../r/max_record_size,4k,compact,innodb.rdiff | 62 - .../innodb/r/max_record_size,4k,compact.rdiff | 62 + .../r/max_record_size,4k,dynamic,innodb.rdiff | 128 - .../innodb/r/max_record_size,4k,dynamic.rdiff | 128 + .../r/max_record_size,4k,innodb,redundant.rdiff | 62 - .../innodb/r/max_record_size,4k,redundant.rdiff | 62 + .../r/max_record_size,64k,compact,innodb.rdiff | 203 - .../innodb/r/max_record_size,64k,compact.rdiff | 203 + .../r/max_record_size,64k,dynamic,innodb.rdiff | 501 - .../innodb/r/max_record_size,64k,dynamic.rdiff | 501 + .../r/max_record_size,64k,innodb,redundant.rdiff | 121 - .../innodb/r/max_record_size,64k,redundant.rdiff | 121 + .../r/max_record_size,8k,compact,innodb.rdiff | 35 - .../innodb/r/max_record_size,8k,compact.rdiff | 35 + .../r/max_record_size,8k,dynamic,innodb.rdiff | 134 - .../innodb/r/max_record_size,8k,dynamic.rdiff | 134 + mysql-test/suite/innodb/r/monitor.result | 56 +- mysql-test/suite/innodb/r/rename_table.result | 10 +- mysql-test/suite/innodb/r/restart,16k,innodb.rdiff | 16 - mysql-test/suite/innodb/r/restart,16k.rdiff | 16 + mysql-test/suite/innodb/r/restart,32k,innodb.rdiff | 16 - mysql-test/suite/innodb/r/restart,32k.rdiff | 16 + mysql-test/suite/innodb/r/restart,4k,innodb.rdiff | 16 - mysql-test/suite/innodb/r/restart,4k.rdiff | 16 + mysql-test/suite/innodb/r/restart,64k,innodb.rdiff | 16 - mysql-test/suite/innodb/r/restart,64k.rdiff | 16 + mysql-test/suite/innodb/r/restart,8k,innodb.rdiff | 16 - mysql-test/suite/innodb/r/restart,8k.rdiff | 16 + .../r/row_size_error_log_warnings_3,4k.rdiff | 2 + .../innodb/r/row_size_error_log_warnings_3.result | 8 + mysql-test/suite/innodb/r/undo_space_dblwr.result | 9 +- mysql-test/suite/innodb/r/undo_truncate.result | 3 + mysql-test/suite/innodb/t/alter_copy.test | 2 +- mysql-test/suite/innodb/t/alter_crash.test | 6 +- mysql-test/suite/innodb/t/alter_kill.test | 2 +- .../suite/innodb/t/alter_rename_existing.test | 2 +- mysql-test/suite/innodb/t/autoinc_debug.test | 66 + mysql-test/suite/innodb/t/autoinc_import.test | 168 + .../suite/innodb/t/corrupted_during_recovery.test | 2 +- .../suite/innodb/t/cursor-restore-unique-null.test | 36 + mysql-test/suite/innodb/t/doublewrite_debug.test | 4 +- mysql-test/suite/innodb/t/foreign_key.test | 21 +- mysql-test/suite/innodb/t/full_crc32_import.test | 12 + mysql-test/suite/innodb/t/group_commit_crash.test | 2 +- .../t/group_commit_crash_no_optimize_thread.test | 2 +- mysql-test/suite/innodb/t/import_bugs.test | 62 + mysql-test/suite/innodb/t/import_hidden_fts.test | 46 + .../suite/innodb/t/import_hidden_fts_debug.test | 101 + mysql-test/suite/innodb/t/index_length.test | 8 + .../suite/innodb/t/index_merge_threshold.test | 1 + mysql-test/suite/innodb/t/innodb-alter-debug.test | 22 +- .../suite/innodb/t/innodb-alter-tempfile.test | 2 +- .../suite/innodb/t/innodb-corrupted-table.test | 4 +- .../innodb/t/innodb-lru-force-no-free-page.test | 24 - mysql-test/suite/innodb/t/innodb-wl5522-debug.test | 6 +- mysql-test/suite/innodb/t/innodb_bug60196.test | 4 +- mysql-test/suite/innodb/t/innodb_defrag_stats.test | 2 +- mysql-test/suite/innodb/t/innodb_stats_fetch.test | 8 + .../suite/innodb/t/innodb_timeout_rollback.test | 3 +- .../suite/innodb/t/innodb_ut_format_name.test | 17 - mysql-test/suite/innodb/t/insert_into_empty.test | 61 + mysql-test/suite/innodb/t/instant_alter_crash.test | 26 - mysql-test/suite/innodb/t/instant_alter_debug.test | 53 +- .../suite/innodb/t/instant_alter_extend.test | 13 + .../suite/innodb/t/instant_alter_import.test | 1 + .../suite/innodb/t/lock_insert_into_empty.test | 4 +- mysql-test/suite/innodb/t/lock_isolation.test | 149 + mysql-test/suite/innodb/t/log_file_name.test | 2 +- .../suite/innodb/t/log_upgrade_101_flags.test | 91 + mysql-test/suite/innodb/t/monitor.test | 62 +- mysql-test/suite/innodb/t/purge_secondary.test | 4 - mysql-test/suite/innodb/t/rename_table.test | 9 +- .../innodb/t/row_size_error_log_warnings_3.test | 16 + mysql-test/suite/innodb/t/temporary_table.test | 2 +- mysql-test/suite/innodb/t/undo_space_dblwr.test | 12 +- mysql-test/suite/innodb/t/undo_truncate.test | 5 +- .../suite/innodb/t/undo_truncate_recover.test | 2 +- mysql-test/suite/innodb_fts/r/create,orig.rdiff | 11 + mysql-test/suite/innodb_fts/r/create.result | 2 +- .../suite/innodb_fts/r/foreign_key_update.result | 12 + .../suite/innodb_fts/r/innodb-fts-ddl,vers.rdiff | 57 + .../innodb_fts/r/innodb-fts-ddl,vers_trx.rdiff | 57 + .../suite/innodb_fts/r/innodb-fts-fic,vers.rdiff | 10 + .../innodb_fts/r/innodb-fts-fic,vers_trx.rdiff | 10 + .../suite/innodb_fts/r/misc_debug,vers.rdiff | 66 + .../suite/innodb_fts/r/misc_debug,vers_trx.rdiff | 66 + mysql-test/suite/innodb_fts/r/sync_ddl,vers.rdiff | 12 + .../suite/innodb_fts/r/sync_ddl,vers_trx.rdiff | 12 + mysql-test/suite/innodb_fts/r/sync_ddl.result | 5 +- mysql-test/suite/innodb_fts/t/create.test | 6 + .../suite/innodb_fts/t/foreign_key_update.test | 13 + mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test | 33 +- mysql-test/suite/innodb_fts/t/innodb-fts-fic.test | 5 + mysql-test/suite/innodb_fts/t/misc_debug.test | 16 + mysql-test/suite/innodb_fts/t/sync.test | 2 +- mysql-test/suite/innodb_fts/t/sync_ddl.test | 5 +- mysql-test/suite/innodb_gis/t/rollback.test | 2 +- mysql-test/suite/innodb_zip/t/innochecksum_2.test | 5 - mysql-test/suite/innodb_zip/t/restart.test | 18 +- .../suite/innodb_zip/t/wl5522_debug_zip.test | 6 +- mysql-test/suite/json/r/json_no_table.result | 20 +- mysql-test/suite/json/r/type_json.result | 8 + mysql-test/suite/json/t/type_json.test | 9 + .../large_tests/r/maria_recover_encrypted.result | 2 +- .../large_tests/t/maria_recover_encrypted.test | 8 +- mysql-test/suite/maria/alter.result | 26 + mysql-test/suite/maria/alter.test | 28 + mysql-test/suite/maria/bulk_insert_crash.test | 2 +- mysql-test/suite/maria/encrypt-no-key.test | 8 +- mysql-test/suite/maria/encrypt-wrong-key.test | 12 +- mysql-test/suite/maria/ps_maria.result | 4 +- mysql-test/suite/maria/repair.result | 23 + mysql-test/suite/maria/repair.test | 19 + .../suite/mariabackup/absolute_ibdata_paths.test | 2 +- .../suite/mariabackup/alter_copy_race.result | 2 +- mysql-test/suite/mariabackup/alter_copy_race.test | 4 +- .../suite/mariabackup/apply-log-only-incr.test | 4 +- mysql-test/suite/mariabackup/apply-log-only.test | 2 +- mysql-test/suite/mariabackup/aria_backup.opt | 1 + mysql-test/suite/mariabackup/aria_backup.result | 780 + mysql-test/suite/mariabackup/aria_backup.test | 425 + mysql-test/suite/mariabackup/aria_log.opt | 1 + .../suite/mariabackup/aria_log_dir_path.result | 1 - .../suite/mariabackup/aria_log_dir_path.test | 6 +- .../suite/mariabackup/aria_log_dir_path_rel.result | 1 - .../mariabackup/aria_log_rotate_during_backup.opt | 2 + .../aria_log_rotate_during_backup.result | 58 + .../mariabackup/aria_log_rotate_during_backup.test | 82 + mysql-test/suite/mariabackup/auth_plugin_win.test | 2 +- mysql-test/suite/mariabackup/backup_grants.result | 4 +- mysql-test/suite/mariabackup/backup_grants.test | 34 +- mysql-test/suite/mariabackup/backup_ssl.test | 2 +- mysql-test/suite/mariabackup/binlog.test | 2 +- mysql-test/suite/mariabackup/compress_qpress.test | 2 +- .../suite/mariabackup/create_during_backup.test | 2 +- .../create_with_data_directory_during_backup.test | 2 +- mysql-test/suite/mariabackup/data_directory.test | 5 +- .../suite/mariabackup/ddl_for_common_engine.result | 67 + .../suite/mariabackup/ddl_for_common_engine.test | 79 + mysql-test/suite/mariabackup/disabled.def | 2 + mysql-test/suite/mariabackup/encrypted_export.opt | 6 + .../suite/mariabackup/encrypted_export.result | 14 + mysql-test/suite/mariabackup/encrypted_export.test | 29 + .../mariabackup/encrypted_page_compressed.test | 2 +- .../mariabackup/encrypted_page_corruption.test | 4 +- mysql-test/suite/mariabackup/extra_lsndir.test | 2 +- mysql-test/suite/mariabackup/full_backup.test | 2 +- mysql-test/suite/mariabackup/huge_lsn.test | 2 +- .../suite/mariabackup/incremental_encrypted.test | 10 +- .../innodb_ddl_on_intermediate_table.result | 5 + .../innodb_ddl_on_intermediate_table.test | 18 + .../suite/mariabackup/lock_ddl_per_table.test | 2 +- .../suite/mariabackup/log_checksum_mismatch.test | 2 +- ...log_file_unexpected_large_number_in_name.result | 20 + .../log_file_unexpected_large_number_in_name.test | 47 + mysql-test/suite/mariabackup/log_tables.result | 24 + mysql-test/suite/mariabackup/log_tables.test | 49 + mysql-test/suite/mariabackup/mdev-14447.test | 2 +- mysql-test/suite/mariabackup/missing_ibd.test | 2 +- .../mariabackup/nolock_ddl_during_backup_end.test | 2 +- mysql-test/suite/mariabackup/partial.result | 8 + mysql-test/suite/mariabackup/partial.test | 21 +- mysql-test/suite/mariabackup/partial_exclude.test | 2 +- .../suite/mariabackup/partition_datadir.test | 2 +- .../suite/mariabackup/partition_partial.test | 2 +- .../suite/mariabackup/rename_during_backup.result | 12 + .../suite/mariabackup/rename_during_backup.test | 27 + .../suite/mariabackup/rename_during_mdl_lock.test | 2 +- .../suite/mariabackup/rpl_clone_slave.result | 202 + mysql-test/suite/mariabackup/rpl_clone_slave.test | 17 + mysql-test/suite/mariabackup/small_ibd.test | 2 +- .../std_data/ment1587_aria_log.00000004 | 0 mysql-test/suite/mariabackup/suite.opt | 2 +- .../suite/mariabackup/system_versioning.test | 4 +- .../suite/mariabackup/truncate_during_backup.test | 2 +- mysql-test/suite/mariabackup/undo_space_id.result | 7 + mysql-test/suite/mariabackup/undo_space_id.test | 21 +- .../mariabackup/unencrypted_page_compressed.test | 2 +- mysql-test/suite/mariabackup/unsupported_redo.test | 8 +- .../suite/mariabackup/xb_aws_key_management.test | 2 +- .../suite/mariabackup/xb_file_key_management.test | 2 +- mysql-test/suite/mariabackup/xb_history.test | 2 +- mysql-test/suite/mariabackup/xb_page_compress.test | 2 +- mysql-test/suite/mariabackup/xb_partition.test | 2 +- mysql-test/suite/mariabackup/xb_rocksdb.test | 4 +- .../suite/mariabackup/xb_rocksdb_datadir.test | 2 +- mysql-test/suite/mariabackup/xbstream.test | 2 +- .../multi_source/gtid_ignore_duplicates.result | 108 +- .../suite/multi_source/gtid_ignore_duplicates.test | 68 +- mysql-test/suite/multi_source/info_logs.result | 12 +- .../multi_source_slave_alias_replica.result | 4 +- mysql-test/suite/multi_source/reset_slave.result | 8 +- mysql-test/suite/multi_source/simple.result | 14 +- mysql-test/suite/multi_source/syntax.result | 6 +- mysql-test/suite/parts/inc/partition_crash.inc | 4 +- mysql-test/suite/parts/r/alter_table.result | 12 + mysql-test/suite/parts/r/mdev_21007.result | 5 + .../suite/parts/r/partition_alter4_innodb.result | 24 - .../suite/parts/r/partition_alter4_myisam.result | 24 - .../suite/parts/r/partition_alter_myisam.result | 22 + .../suite/parts/r/partition_mgm_lc0_innodb.result | 1 - .../suite/parts/r/partition_mgm_lc0_memory.result | 1 - .../suite/parts/r/partition_mgm_lc0_myisam.result | 1 - .../suite/parts/r/partition_mgm_lc1_innodb.result | 1 - .../suite/parts/r/partition_mgm_lc1_memory.result | 1 - .../suite/parts/r/partition_mgm_lc1_myisam.result | 1 - .../suite/parts/r/partition_recover_myisam.result | 3 + mysql-test/suite/parts/t/alter_table.test | 30 +- mysql-test/suite/parts/t/mdev_21007.test | 9 + .../suite/parts/t/partition_alter_myisam.test | 15 + .../parts/t/partition_recover_myisam-master.opt | 1 - .../suite/parts/t/partition_recover_myisam.opt | 1 + .../suite/parts/t/partition_recover_myisam.test | 8 - .../perfschema/include/memory_aggregate_load.inc | 3 +- .../suite/perfschema/include/program_execution.inc | 2 +- .../suite/perfschema/include/stage_setup.inc | 23 +- .../suite/perfschema/r/alter_table_progress.result | 3 +- .../suite/perfschema/r/event_aggregate.result | 378 +- .../suite/perfschema/r/event_aggregate_no_a.result | 266 +- .../perfschema/r/event_aggregate_no_a_no_h.result | 228 +- .../perfschema/r/event_aggregate_no_a_no_u.result | 146 +- .../r/event_aggregate_no_a_no_u_no_h.result | 108 +- .../suite/perfschema/r/event_aggregate_no_h.result | 340 +- .../suite/perfschema/r/event_aggregate_no_u.result | 258 +- .../perfschema/r/event_aggregate_no_u_no_h.result | 220 +- .../suite/perfschema/r/max_program_zero.result | 4 +- .../suite/perfschema/r/memory_aggregate.result | 2 +- .../perfschema/r/memory_aggregate_32bit.result | 2 +- .../perfschema/r/memory_aggregate_no_a.result | 2 +- .../perfschema/r/memory_aggregate_no_a_no_h.result | 2 +- .../perfschema/r/memory_aggregate_no_a_no_u.result | 2 +- .../r/memory_aggregate_no_a_no_u_no_h.result | 2 +- .../perfschema/r/memory_aggregate_no_h.result | 2 +- .../perfschema/r/memory_aggregate_no_u.result | 2 +- .../perfschema/r/memory_aggregate_no_u_no_h.result | 2 +- mysql-test/suite/perfschema/r/misc.result | 2 +- mysql-test/suite/perfschema/r/nesting.result | 56 +- mysql-test/suite/perfschema/r/ortho_iter.result | 4 +- .../suite/perfschema/r/privilege_table_io.result | 4 +- .../suite/perfschema/r/stage_mdl_global.result | 4 +- .../suite/perfschema/r/stage_mdl_table.result | 2 +- .../perfschema/r/start_server_disable_idle.result | 4 +- .../r/start_server_disable_stages.result | 4 +- .../r/start_server_disable_statements.result | 4 +- .../r/start_server_disable_transactions.result | 4 +- .../perfschema/r/start_server_disable_waits.result | 4 +- .../suite/perfschema/r/start_server_innodb.result | 4 +- .../perfschema/r/start_server_low_index.result | 4 +- .../r/start_server_low_table_lock.result | 4 +- .../perfschema/r/start_server_no_account.result | 4 +- .../perfschema/r/start_server_no_cond_class.result | 4 +- .../perfschema/r/start_server_no_cond_inst.result | 2 +- .../perfschema/r/start_server_no_file_class.result | 4 +- .../perfschema/r/start_server_no_file_inst.result | 4 +- .../suite/perfschema/r/start_server_no_host.result | 4 +- .../perfschema/r/start_server_no_index.result | 4 +- .../suite/perfschema/r/start_server_no_mdl.result | 4 +- .../r/start_server_no_memory_class.result | 4 +- .../r/start_server_no_mutex_class.result | 4 +- .../perfschema/r/start_server_no_mutex_inst.result | 4 +- ...start_server_no_prepared_stmts_instances.result | 4 +- .../r/start_server_no_rwlock_class.result | 4 +- .../r/start_server_no_rwlock_inst.result | 4 +- .../r/start_server_no_setup_actors.result | 4 +- .../r/start_server_no_setup_objects.result | 4 +- .../r/start_server_no_socket_class.result | 4 +- .../r/start_server_no_socket_inst.result | 4 +- .../r/start_server_no_stage_class.result | 4 +- .../r/start_server_no_stages_history.result | 4 +- .../r/start_server_no_stages_history_long.result | 4 +- .../r/start_server_no_statement_class.result | 4 +- .../r/start_server_no_statements_history.result | 4 +- .../start_server_no_statements_history_long.result | 4 +- .../perfschema/r/start_server_no_table_hdl.result | 4 +- .../perfschema/r/start_server_no_table_inst.result | 4 +- .../perfschema/r/start_server_no_table_lock.result | 4 +- .../r/start_server_no_thread_class.result | 4 +- .../r/start_server_no_thread_inst.result | 2 +- .../r/start_server_no_transactions_history.result | 4 +- ...tart_server_no_transactions_history_long.result | 4 +- .../suite/perfschema/r/start_server_no_user.result | 4 +- .../r/start_server_no_waits_history.result | 4 +- .../r/start_server_no_waits_history_long.result | 4 +- .../suite/perfschema/r/start_server_off.result | 4 +- .../suite/perfschema/r/start_server_on.result | 4 +- .../perfschema/r/start_server_variables.result | 8 +- .../r/statement_program_lost_inst.result | 4 +- .../r/statement_program_nesting_event_check.result | 4 +- .../r/statement_program_non_nested.result | 6 +- .../suite/perfschema/r/threads_history.result | 428 +- mysql-test/suite/perfschema/t/bad_option.test | 4 +- mysql-test/suite/perfschema/t/misc.test | 1 + mysql-test/suite/perfschema/t/processlist_57.test | 10 +- .../perfschema/t/setup_instruments_defaults.test | 4 +- .../perfschema/t/statement_program_lost_inst.test | 4 +- mysql-test/suite/perfschema/t/threads_history.test | 494 +- mysql-test/suite/period/r/overlaps.result | 82 + mysql-test/suite/period/t/overlaps.test | 77 + .../suite/plugins/r/compression,innodb-lz4.rdiff | 4 +- .../suite/plugins/r/compression,innodb-lzma.rdiff | 4 +- .../suite/plugins/r/compression,innodb-lzo.rdiff | 4 +- .../plugins/r/compression,innodb-snappy.rdiff | 4 +- .../suite/plugins/r/compression,mroonga-lz4.rdiff | 4 +- mysql-test/suite/plugins/r/compression.result | 4 +- mysql-test/suite/plugins/t/compression.test | 2 +- mysql-test/suite/roles/definer.result | 1 + .../suite/rpl/include/rpl_extra_col_master.test | 4 + mysql-test/suite/rpl/r/parallel_backup.result | 4 +- .../suite/rpl/r/parallel_backup_lsu_off.result | 4 +- .../rpl/r/parallel_backup_slave_binlog_off.result | 4 +- mysql-test/suite/rpl/r/rpl_auditing.result | 64 + .../r/rpl_binlog_dump_slave_gtid_state_info.result | 3 +- mysql-test/suite/rpl/r/rpl_change_master.result | 5 - .../suite/rpl/r/rpl_change_master_demote.result | 17 + .../rpl/r/rpl_domain_id_filter_io_crash.result | 27 + .../rpl/r/rpl_domain_id_filter_master_crash.result | 3 - .../rpl/r/rpl_domain_id_filter_restart.result | 3 +- .../suite/rpl/r/rpl_extra_col_master_innodb.result | 10 +- .../suite/rpl/r/rpl_extra_col_master_myisam.result | 10 +- mysql-test/suite/rpl/r/rpl_get_lock.result | 3 +- mysql-test/suite/rpl/r/rpl_gtid_basic.result | 6 - mysql-test/suite/rpl/r/rpl_gtid_crash.result | 1 + .../suite/rpl/r/rpl_gtid_errorhandling.result | 2 - mysql-test/suite/rpl/r/rpl_gtid_grouping.result | 1 - .../suite/rpl/r/rpl_gtid_header_valid.result | 146 + mysql-test/suite/rpl/r/rpl_gtid_mdev4820.result | 4 - mysql-test/suite/rpl/r/rpl_gtid_stop_start.result | 4 + mysql-test/suite/rpl/r/rpl_heartbeat.result | 7 +- mysql-test/suite/rpl/r/rpl_heartbeat_debug.result | 2 - .../suite/rpl/r/rpl_mark_optimize_tbl_ddl.result | 1 - mysql-test/suite/rpl/r/rpl_mdev33798.result | 143 + .../rpl/r/rpl_mysql_manager_race_condition.result | 31 + mysql-test/suite/rpl/r/rpl_packet.result | 2 + .../rpl/r/rpl_parallel_multi_domain_xa.result | 58 + .../suite/rpl/r/rpl_parallel_optimistic.result | 3 +- .../suite/rpl/r/rpl_parallel_optimistic_xa.result | 1 - .../r/rpl_parallel_optimistic_xa_lsu_off.result | 1 - mysql-test/suite/rpl/r/rpl_parallel_retry.result | 22 + mysql-test/suite/rpl/r/rpl_parallel_sbm.result | 9 +- mysql-test/suite/rpl/r/rpl_parallel_seq.result | 10 + .../suite/rpl/r/rpl_parallel_slave_bgc_kill.result | 8 +- .../suite/rpl/r/rpl_parallel_stop_slave.result | 4 +- .../suite/rpl/r/rpl_parallel_temptable.result | 18 + .../rpl/r/rpl_perfschema_connect_config.result | 2 - .../suite/rpl/r/rpl_rewrite_db_sys_vars.result | 20 +- .../suite/rpl/r/rpl_row_find_row_debug.result | 1 - .../rpl/r/rpl_semi_sync_cond_var_per_thd.result | 32 + .../suite/rpl/r/rpl_semi_sync_fail_over.result | 54 +- .../rpl/r/rpl_semi_sync_master_shutdown.result | 3 +- .../rpl/r/rpl_semi_sync_shutdown_await_ack.result | 267 +- .../rpl_semi_sync_slave_enabled_consistent.result | 3 + .../suite/rpl/r/rpl_show_slave_status.result | 75 + mysql-test/suite/rpl/r/rpl_shutdown_sighup.result | 50 + mysql-test/suite/rpl/r/rpl_skip_error.result | 25 + .../suite/rpl/r/rpl_start_alter_options.result | 14 - .../rpl/r/rpl_temporary_error2_skip_all.result | 64 + .../suite/rpl/r/rpl_using_gtid_default.result | 2 - .../rpl/r/show_status_stop_slave_race-7126.result | 1 - mysql-test/suite/rpl/t/parallel_backup_xa.inc | 2 +- mysql-test/suite/rpl/t/rpl_auditing.test | 77 + .../t/rpl_binlog_dump_slave_gtid_state_info.test | 3 +- mysql-test/suite/rpl/t/rpl_change_master.test | 5 - .../suite/rpl/t/rpl_change_master_demote.test | 34 + .../suite/rpl/t/rpl_domain_id_filter_io_crash.test | 66 +- .../rpl/t/rpl_domain_id_filter_master_crash.test | 7 +- .../suite/rpl/t/rpl_domain_id_filter_restart.test | 3 +- .../rpl/t/rpl_dump_request_retry_warning.test | 4 + mysql-test/suite/rpl/t/rpl_get_lock.test | 15 + mysql-test/suite/rpl/t/rpl_gtid_crash-slave.opt | 2 +- mysql-test/suite/rpl/t/rpl_gtid_crash.test | 1 + mysql-test/suite/rpl/t/rpl_gtid_crash_myisam.test | 4 + mysql-test/suite/rpl/t/rpl_gtid_grouping.test | 1 - mysql-test/suite/rpl/t/rpl_gtid_header_valid.test | 213 + mysql-test/suite/rpl/t/rpl_gtid_stop_start.test | 18 + mysql-test/suite/rpl/t/rpl_heartbeat.test | 8 +- mysql-test/suite/rpl/t/rpl_heartbeat_debug.test | 11 +- mysql-test/suite/rpl/t/rpl_mdev33798.cnf | 17 + mysql-test/suite/rpl/t/rpl_mdev33798.test | 182 + .../rpl/t/rpl_mysql_manager_race_condition.test | 64 + mysql-test/suite/rpl/t/rpl_packet.test | 3 + .../suite/rpl/t/rpl_parallel_gco_wait_kill.test | 2 +- .../suite/rpl/t/rpl_parallel_multi_domain_xa.test | 181 + .../suite/rpl/t/rpl_parallel_optimistic.test | 3 +- .../suite/rpl/t/rpl_parallel_optimistic_xa.test | 1 - mysql-test/suite/rpl/t/rpl_parallel_retry.test | 38 + mysql-test/suite/rpl/t/rpl_parallel_sbm.test | 16 +- mysql-test/suite/rpl/t/rpl_parallel_seq.test | 18 + .../suite/rpl/t/rpl_parallel_slave_bgc_kill.test | 10 +- .../suite/rpl/t/rpl_parallel_stop_slave.test | 23 +- mysql-test/suite/rpl/t/rpl_parallel_temptable.test | 24 + .../suite/rpl/t/rpl_relay_max_extension.test | 4 +- .../suite/rpl/t/rpl_rewrite_db_sys_vars.test | 23 +- mysql-test/suite/rpl/t/rpl_row_find_row_debug.test | 2 + .../suite/rpl/t/rpl_semi_sync_cond_var_per_thd.cnf | 10 + .../rpl/t/rpl_semi_sync_cond_var_per_thd.test | 77 + mysql-test/suite/rpl/t/rpl_semi_sync_crash.inc | 28 +- .../suite/rpl/t/rpl_semi_sync_fail_over.test | 11 +- .../suite/rpl/t/rpl_semi_sync_master_shutdown.test | 9 +- .../rpl/t/rpl_semi_sync_shutdown_await_ack.cnf | 6 +- .../rpl/t/rpl_semi_sync_shutdown_await_ack.inc | 104 +- .../rpl/t/rpl_semi_sync_shutdown_await_ack.test | 187 +- .../t/rpl_semi_sync_slave_enabled_consistent.test | 3 + mysql-test/suite/rpl/t/rpl_show_slave_status.test | 27 + mysql-test/suite/rpl/t/rpl_shutdown_sighup.test | 154 + mysql-test/suite/rpl/t/rpl_skip_error.test | 42 +- mysql-test/suite/rpl/t/rpl_sync.test | 4 +- mysql-test/suite/rpl/t/rpl_temporary_error2.test | 9 +- .../rpl/t/rpl_temporary_error2_skip_all-slave.opt | 1 + .../suite/rpl/t/rpl_temporary_error2_skip_all.test | 3 + mysql-test/suite/rpl/t/rpl_using_gtid_default.test | 3 +- .../rpl/t/show_status_stop_slave_race-7126.test | 3 + mysql-test/suite/s3/mysqldump.result | 2 + mysql-test/suite/s3/partition.result | 2 - mysql-test/suite/sql_sequence/mysqldump.result | 5 + .../suite/sys_vars/r/debug_dbug_utf16le.result | 31 + .../innodb_fil_make_page_dirty_debug_basic.result | 5 +- .../r/innodb_saved_page_number_debug_basic.result | 1 + .../suite/sys_vars/r/replicate_rewrite_db.result | 8 +- .../r/slave_transaction_retry_errors.result | 10 +- .../suite/sys_vars/r/sysvars_innodb,32bit.rdiff | 77 +- mysql-test/suite/sys_vars/r/sysvars_innodb.result | 28 +- .../sys_vars/r/sysvars_server_embedded.result | 12 +- .../sys_vars/r/sysvars_server_notembedded.result | 12 +- .../suite/sys_vars/t/allow_suspicious_udfs.test | 4 +- .../suite/sys_vars/t/debug_dbug_utf16le.test | 29 + .../t/innodb_fil_make_page_dirty_debug_basic.test | 4 +- .../t/innodb_saved_page_number_debug_basic.test | 1 + .../suite/sys_vars/t/replicate_rewrite_db.test | 7 +- .../suite/sysschema/t/fn_ps_thread_trx_info.test | 2 +- mysql-test/suite/vcol/r/func_regexp.result | 24 + mysql-test/suite/vcol/t/func_regexp.test | 30 + mysql-test/suite/versioning/r/alter.result | 13 +- mysql-test/suite/versioning/r/data.result | 6 + mysql-test/suite/versioning/r/partition.result | 23 + mysql-test/suite/versioning/t/alter.test | 15 +- mysql-test/suite/versioning/t/partition.test | 38 + mysys/CMakeLists.txt | 34 +- mysys/crc32/crc32_arm64.c | 338 +- mysys/crc32/crc32_x86.c | 16 +- mysys/crc32/crc32c.cc | 261 +- mysys/crc32/crc32c_amd64.cc | 8 + mysys/crc32/crc32c_ppc.h | 3 +- mysys/crc32/crc32c_x86.cc | 457 + mysys/crc32/crc_ppc64.h | 7 +- mysys/crc32ieee.cc | 19 +- mysys/errors.c | 9 +- mysys/lf_alloc-pin.c | 7 +- mysys/mf_tempfile.c | 37 +- mysys/my_bitmap.c | 645 +- mysys/my_getopt.c | 84 +- mysys/my_thr_init.c | 8 +- plugin/auth_ed25519/ref10/fe_mul.c | 21 +- plugin/auth_ed25519/ref10/fe_sq.c | 21 +- plugin/auth_ed25519/ref10/fe_sq2.c | 21 +- plugin/auth_ed25519/ref10/fe_tobytes.c | 37 +- plugin/auth_ed25519/ref10/ge_scalarmult_base.c | 2 +- plugin/auth_ed25519/ref10/sc_muladd.c | 46 +- plugin/auth_ed25519/ref10/sc_reduce.c | 34 +- plugin/auth_gssapi/README.md | 10 +- plugin/auth_pam/auth_pam_base.c | 2 +- plugin/cracklib_password_check/CMakeLists.txt | 3 +- plugin/feedback/feedback.cc | 4 + plugin/feedback/feedback.h | 1 + plugin/feedback/url_http.cc | 18 +- plugin/hashicorp_key_management/CMakeLists.txt | 7 +- .../hashicorp_key_management_plugin.cc | 80 +- .../mysql-test/vault/suite.pm | 4 + .../vault/t/hashicorp_cache_after_recreate.test | 2 +- .../vault/t/hashicorp_check_kv_version.test | 6 +- .../vault/t/hashicorp_key_migration.test | 2 +- .../vault/t/hashicorp_key_rotation_age.test | 2 +- .../mysql-test/vault/t/hashicorp_mariabackup.opt | 1 + .../mysql-test/vault/t/hashicorp_mariabackup.test | 6 +- .../mysql-test/vault/t/hashicorp_url_prefix.test | 4 +- plugin/test_sql_service/test_sql_service.c | 3 +- .../mysql-test/type_inet/type_inet6.result | 12 + .../type_inet/mysql-test/type_inet/type_inet6.test | 11 + plugin/type_inet/sql_type_inet.cc | 2 +- plugin/type_mysql_timestamp/plugin.cc | 14 +- .../type_uuid/type_uuid_mariadb101104.result | 422 + .../type_uuid/type_uuid_mariadb101104.test | 110 + plugin/type_uuid/plugin.cc | 8 + plugin/type_uuid/sql_type_uuid.h | 3 + plugin/versioning/versioning.cc | 8 +- scripts/mysql_install_db.sh | 34 +- scripts/mysql_system_tables_fix.sql | 9 +- scripts/wsrep_sst_common.sh | 220 +- scripts/wsrep_sst_mariabackup.sh | 26 +- scripts/wsrep_sst_rsync.sh | 23 +- sql/CMakeLists.txt | 2 +- sql/backup.cc | 60 +- sql/debug_sync.cc | 2 +- sql/des_key_file.cc | 4 +- sql/des_key_file.h | 4 +- sql/field.cc | 62 +- sql/field.h | 12 +- sql/ha_partition.cc | 112 +- sql/ha_partition.h | 12 +- sql/handler.cc | 182 +- sql/handler.h | 34 +- sql/item.cc | 250 +- sql/item.h | 50 +- sql/item_cmpfunc.cc | 46 +- sql/item_cmpfunc.h | 8 +- sql/item_func.cc | 129 +- sql/item_func.h | 30 +- sql/item_jsonfunc.cc | 143 +- sql/item_strfunc.cc | 55 +- sql/item_subselect.cc | 8 +- sql/item_sum.cc | 18 +- sql/item_sum.h | 15 + sql/item_timefunc.cc | 20 +- sql/item_timefunc.h | 33 +- sql/lex.h | 1 + sql/log.cc | 22 +- sql/log.h | 11 + sql/log_event.cc | 70 +- sql/log_event.h | 15 +- sql/log_event_client.cc | 25 +- sql/log_event_old.cc | 60 +- sql/log_event_old.h | 4 +- sql/log_event_server.cc | 151 +- sql/mdl.cc | 11 +- sql/multi_range_read.h | 10 +- sql/mysqld.cc | 229 +- sql/mysqld.h | 20 +- sql/net_serv.cc | 54 +- sql/opt_range.cc | 189 +- sql/opt_split.cc | 5 +- sql/rpl_parallel.cc | 286 +- sql/rpl_parallel.h | 59 +- sql/rpl_rli.cc | 6 +- sql/rpl_rli.h | 13 +- sql/semisync_master.cc | 291 +- sql/semisync_master.h | 117 +- sql/semisync_master_ack_receiver.cc | 13 +- sql/semisync_master_ack_receiver.h | 12 +- sql/semisync_slave.cc | 18 +- sql/service_wsrep.cc | 26 +- sql/share/errmsg-utf8.txt | 36 +- sql/slave.cc | 50 +- sql/sp.cc | 22 +- sql/sp.h | 16 +- sql/sp_cache.cc | 18 + sql/sp_head.cc | 3 + sql/sp_head.h | 18 +- sql/sql_acl.cc | 24 +- sql/sql_admin.cc | 8 +- sql/sql_base.cc | 60 +- sql/sql_base.h | 3 +- sql/sql_bootstrap.cc | 31 +- sql/sql_cache.cc | 9 +- sql/sql_class.cc | 116 +- sql/sql_class.h | 96 +- sql/sql_connect.cc | 2 +- sql/sql_delete.cc | 3 + sql/sql_derived.cc | 12 +- sql/sql_expression_cache.cc | 3 +- sql/sql_insert.cc | 38 +- sql/sql_join_cache.cc | 1 + sql/sql_lex.cc | 23 +- sql/sql_lex.h | 2 +- sql/sql_load.cc | 41 +- sql/sql_manager.cc | 33 +- sql/sql_parse.cc | 146 +- sql/sql_partition.cc | 13 +- sql/sql_plugin.cc | 5 +- sql/sql_plugin_services.inl | 7 + sql/sql_priv.h | 7 + sql/sql_reload.cc | 25 +- sql/sql_repl.cc | 16 +- sql/sql_select.cc | 297 +- sql/sql_select.h | 2 + sql/sql_sequence.cc | 6 +- sql/sql_show.cc | 23 +- sql/sql_statistics.cc | 12 + sql/sql_string.cc | 47 +- sql/sql_string.h | 36 + sql/sql_table.cc | 192 +- sql/sql_table.h | 4 - sql/sql_type.cc | 124 +- sql/sql_type.h | 64 +- sql/sql_type_fixedbin.h | 11 + sql/sql_udf.h | 14 + sql/sql_union.cc | 37 +- sql/sql_update.cc | 8 +- sql/sql_yacc.yy | 3 + sql/sys_vars.cc | 25 +- sql/sys_vars.inl | 17 +- sql/table.cc | 79 +- sql/table.h | 16 + sql/temporary_tables.cc | 11 +- sql/threadpool_generic.cc | 4 +- sql/threadpool_win.cc | 9 +- sql/transaction.cc | 33 + sql/tztime.cc | 5 + sql/unireg.cc | 10 +- sql/unireg.h | 2 +- sql/winmain.cc | 20 + sql/wsrep_applier.cc | 13 +- sql/wsrep_client_service.h | 4 + sql/wsrep_high_priority_service.cc | 2 + sql/wsrep_mysqld.cc | 131 +- sql/wsrep_notify.cc | 2 +- sql/wsrep_schema.cc | 301 +- sql/wsrep_server_service.cc | 1 - sql/yy_mariadb.cc | 52206 ++++++++++++++++++ sql/yy_mariadb.hh | 981 + sql/yy_oracle.cc | 52289 +++++++++++++++++++ sql/yy_oracle.hh | 981 + storage/archive/CMakeLists.txt | 2 +- storage/archive/ha_archive.cc | 18 + storage/columnstore/CMakeLists.txt | 3 +- storage/columnstore/columnstore/CMakeLists.txt | 1 + storage/columnstore/columnstore/VERSION | 2 +- .../columnstore/datatypes/mcs_datatype.cpp | 1 - .../columnstore/datatypes/mcs_datatype.h | 4 +- .../columnstore/datatypes/mcs_datatype_basic.h | 1 - .../columnstore/columnstore/datatypes/mcs_double.h | 3 +- .../columnstore/datatypes/mcs_float128.h | 3 +- .../columnstore/datatypes/mcs_int128.cpp | 1 - .../columnstore/columnstore/datatypes/mcs_int128.h | 1 - .../columnstore/columnstore/datatypes/mcs_int64.h | 3 +- .../columnstore/datatypes/mcs_longdouble.h | 3 +- .../columnstore/dbcon/ddlpackage/CMakeLists.txt | 2 +- .../dbcon/ddlpackageproc/altertableprocessor.cpp | 1 - .../dbcon/ddlpackageproc/createtableprocessor.cpp | 1 - .../dbcon/ddlpackageproc/ddlpackageprocessor.cpp | 1 - .../dbcon/ddlpackageproc/ddlpackageprocessor.h | 5 +- .../dbcon/ddlpackageproc/droptableprocessor.cpp | 1 - .../columnstore/dbcon/dmlpackage/CMakeLists.txt | 2 +- .../dbcon/dmlpackageproc/autoincrementdata.cpp | 1 - .../dbcon/dmlpackageproc/autoincrementdata.h | 3 +- .../dbcon/dmlpackageproc/dmlpackageprocessor.cpp | 1 - .../dmlpackageproc/insertpackageprocessor.cpp | 1 - .../dbcon/dmlpackageproc/tablelockdata.cpp | 1 - .../dbcon/dmlpackageproc/tablelockdata.h | 3 +- .../dbcon/execplan/calpontselectexecutionplan.h | 3 +- .../dbcon/execplan/calpontsystemcatalog.h | 3 +- .../columnstore/dbcon/execplan/clientrotator.cpp | 1 - .../columnstore/dbcon/execplan/clientrotator.h | 3 +- .../columnstore/dbcon/execplan/constantcolumn.cpp | 1 - .../columnstore/dbcon/execplan/constantfilter.cpp | 1 - .../columnstore/dbcon/execplan/sessionmanager.h | 5 +- .../columnstore/dbcon/joblist/anydatalist.cpp | 1 - .../dbcon/joblist/batchprimitiveprocessor-jl.h | 5 +- .../columnstore/dbcon/joblist/columncommand-jl.h | 3 +- .../columnstore/dbcon/joblist/crossenginestep.cpp | 1 - .../columnstore/dbcon/joblist/crossenginestep.h | 4 +- .../columnstore/dbcon/joblist/diskjoinstep.cpp | 4 +- .../dbcon/joblist/distributedenginecomm.cpp | 1 - .../columnstore/dbcon/joblist/elementtype.h | 17 +- .../columnstore/dbcon/joblist/errorinfo.h | 3 +- .../columnstore/dbcon/joblist/expressionstep.cpp | 1 - .../columnstore/columnstore/dbcon/joblist/fifo.h | 3 +- .../columnstore/dbcon/joblist/groupconcat.cpp | 1 - .../columnstore/dbcon/joblist/jlf_common.cpp | 1 - .../dbcon/joblist/jlf_execplantojoblist.cpp | 1 - .../columnstore/dbcon/joblist/jlf_graphics.cpp | 1 - .../columnstore/dbcon/joblist/jlf_subquery.cpp | 1 - .../columnstore/dbcon/joblist/jlf_tuplejoblist.cpp | 1 - .../columnstore/dbcon/joblist/joblist.cpp | 1 - .../columnstore/dbcon/joblist/joblist.h | 3 +- .../columnstore/dbcon/joblist/joblistfactory.cpp | 1 - .../columnstore/dbcon/joblist/jobstep.cpp | 1 - .../columnstore/dbcon/joblist/jobstep.h | 3 +- .../columnstore/dbcon/joblist/lbidlist.cpp | 1 - .../columnstore/dbcon/joblist/limitedorderby.cpp | 1 - .../dbcon/joblist/passthrucommand-jl.cpp | 1 - .../columnstore/dbcon/joblist/pcolscan.cpp | 1 - .../columnstore/dbcon/joblist/pcolstep.cpp | 1 - .../columnstore/dbcon/joblist/pdictionaryscan.cpp | 1 - .../columnstore/dbcon/joblist/primitivemsg.h | 3 +- .../columnstore/dbcon/joblist/primitivestep.h | 41 +- .../columnstore/dbcon/joblist/rowestimator.cpp | 4 +- .../columnstore/dbcon/joblist/subquerystep.cpp | 1 - .../columnstore/dbcon/joblist/subquerystep.h | 3 +- .../dbcon/joblist/subquerytransformer.cpp | 1 - .../columnstore/dbcon/joblist/tuple-bps.cpp | 1 - .../dbcon/joblist/tupleaggregatestep.cpp | 1 - .../columnstore/dbcon/joblist/tupleaggregatestep.h | 4 +- .../columnstore/dbcon/joblist/tupleannexstep.cpp | 1 - .../columnstore/dbcon/joblist/tupleannexstep.h | 4 +- .../dbcon/joblist/tupleconstantstep.cpp | 1 - .../columnstore/dbcon/joblist/tupleconstantstep.h | 4 +- .../columnstore/dbcon/joblist/tuplehashjoin.cpp | 1 - .../columnstore/dbcon/joblist/tuplehashjoin.h | 3 +- .../columnstore/dbcon/joblist/tuplehavingstep.cpp | 1 - .../columnstore/dbcon/joblist/tuplehavingstep.h | 2 - .../columnstore/dbcon/joblist/virtualtable.cpp | 1 - .../dbcon/joblist/windowfunctionstep.cpp | 1 - .../columnstore/dbcon/joblist/windowfunctionstep.h | 4 +- .../columnstore/dbcon/mysql/ha_autoi.cpp | 1 - .../columnstore/dbcon/mysql/ha_mcs_datatype.h | 4 +- .../columnstore/dbcon/mysql/ha_mcs_ddl.cpp | 1 - .../columnstore/dbcon/mysql/ha_mcs_dml.cpp | 1 - .../columnstore/dbcon/mysql/ha_mcs_execplan.cpp | 1 - .../columnstore/dbcon/mysql/ha_pseudocolumn.cpp | 1 - .../columnstore/dbcon/mysql/idb_mysql.h | 7 +- .../columnstore/columnstore/ddlproc/ddlproc.cpp | 1 - .../columnstore/ddlproc/ddlprocessor.cpp | 1 - .../columnstore/dmlproc/batchinsertprocessor.cpp | 1 - .../columnstore/dmlproc/batchinsertprocessor.h | 3 +- .../columnstore/columnstore/dmlproc/dmlproc.cpp | 10 +- .../columnstore/dmlproc/dmlprocessor.cpp | 1 - .../columnstore/columnstore/dmlproc/dmlprocessor.h | 3 +- .../columnstore/exemgr/activestatementcounter.cpp | 1 - .../columnstore/exemgr/activestatementcounter.h | 3 +- storage/columnstore/columnstore/exemgr/main.cpp | 1 - .../columnstore/oam/oamcpp/liboamcpp.cpp | 1 - .../columnstore/columnstore/oam/oamcpp/liboamcpp.h | 3 +- .../oamapps/columnstoreDB/columnstoreDB.cpp | 2 +- .../oamapps/postConfigure/mycnfUpgrade.cpp | 1 - .../oamapps/sessionWalker/sessionwalker.cpp | 1 - .../primitives/blockcache/blockcacheclient.h | 3 +- .../primitives/blockcache/blockrequestprocessor.h | 3 +- .../primitives/blockcache/filerequest.h | 3 +- .../primitives/blockcache/iomanager.cpp | 1 - .../columnstore/primitives/blockcache/iomanager.h | 5 +- .../columnstore/primitives/linux-port/column.cpp | 9 +- .../primitives/linux-port/dictionary.cpp | 1 - .../columnstore/primitives/linux-port/index.cpp | 1 - .../primitives/linux-port/primitiveprocessor.h | 3 +- .../primproc/batchprimitiveprocessor.cpp | 1 - .../primitives/primproc/columncommand.cpp | 1 - .../primitives/primproc/columncommand.h | 3 +- .../primitives/primproc/primitiveserver.cpp | 1 - .../columnstore/primitives/primproc/primproc.cpp | 1 - .../columnstore/primitives/primproc/udf.cpp | 1 - .../columnstore/storage-manager/src/smcat.cpp | 2 +- .../columnstore/storage-manager/src/unit_tests.cpp | 4 +- .../tests/primitives_column_scan_and_filter.cpp | 1 - .../columnstore/tests/primitives_scan_bench.cpp | 1 - .../columnstore/tools/bincvt/li2bin.cpp | 1 - .../columnstore/tools/clearShm/main.cpp | 1 - .../columnstore/tools/dbbuilder/dbbuilder.cpp | 1 - .../columnstore/tools/ddlcleanup/ddlcleanup.cpp | 1 - .../columnstore/tools/editem/editem.cpp | 1 - .../columnstore/columnstore/tools/qfe/server.cpp | 1 - .../columnstore/tools/sendPlan/sendplan.cpp | 1 - .../columnstore/tools/setConfig/main.cpp | 1 - .../columnstore/utils/cacheutils/cacheutils.cpp | 1 - .../columnstore/utils/cacheutils/cacheutils.h | 2 - .../columnstore/utils/common/hashfamily.h | 3 +- .../columnstore/utils/common/mcs_basic_types.h | 3 +- .../columnstore/utils/common/simd_sse.h | 1 - .../columnstore/utils/compress/idbcompress.cpp | 1 - .../columnstore/utils/configcpp/configcpp.cpp | 1 - .../columnstore/utils/configcpp/configcpp.h | 3 +- .../columnstore/utils/configcpp/configstream.cpp | 1 - .../columnstore/utils/configcpp/configstream.h | 3 +- .../columnstore/utils/configcpp/xmlparser.cpp | 1 - .../columnstore/utils/configcpp/xmlparser.h | 3 +- .../columnstore/utils/dataconvert/dataconvert.cpp | 3 +- .../utils/ddlcleanup/ddlcleanuputil.cpp | 1 - .../columnstore/utils/ddlcleanup/ddlcleanuputil.h | 2 - .../columnstore/utils/funcexp/func_abs.cpp | 1 - .../columnstore/utils/funcexp/func_add_time.cpp | 1 - .../columnstore/utils/funcexp/func_ascii.cpp | 1 - .../columnstore/utils/funcexp/func_between.cpp | 1 - .../columnstore/utils/funcexp/func_bitwise.cpp | 1 - .../columnstore/utils/funcexp/func_case.cpp | 1 - .../columnstore/utils/funcexp/func_cast.cpp | 1 - .../columnstore/utils/funcexp/func_ceil.cpp | 1 - .../columnstore/utils/funcexp/func_char.cpp | 1 - .../columnstore/utils/funcexp/func_char_length.cpp | 1 - .../columnstore/utils/funcexp/func_coalesce.cpp | 1 - .../columnstore/utils/funcexp/func_concat.cpp | 1 - .../utils/funcexp/func_concat_oracle.cpp | 1 - .../columnstore/utils/funcexp/func_concat_ws.cpp | 1 - .../columnstore/utils/funcexp/func_conv.cpp | 1 - .../columnstore/utils/funcexp/func_convert_tz.cpp | 1 - .../columnstore/utils/funcexp/func_crc32.cpp | 1 - .../columnstore/utils/funcexp/func_date.cpp | 1 - .../columnstore/utils/funcexp/func_date_add.cpp | 1 - .../columnstore/utils/funcexp/func_date_format.cpp | 1 - .../columnstore/utils/funcexp/func_day.cpp | 1 - .../columnstore/utils/funcexp/func_dayname.cpp | 1 - .../columnstore/utils/funcexp/func_dayofweek.cpp | 1 - .../columnstore/utils/funcexp/func_dayofyear.cpp | 1 - .../columnstore/utils/funcexp/func_div.cpp | 1 - .../columnstore/utils/funcexp/func_elt.cpp | 1 - .../columnstore/utils/funcexp/func_exp.cpp | 1 - .../columnstore/utils/funcexp/func_extract.cpp | 1 - .../columnstore/utils/funcexp/func_find_in_set.cpp | 1 - .../columnstore/utils/funcexp/func_floor.cpp | 1 - .../columnstore/utils/funcexp/func_from_days.cpp | 1 - .../utils/funcexp/func_from_unixtime.cpp | 1 - .../columnstore/utils/funcexp/func_get_format.cpp | 1 - .../columnstore/utils/funcexp/func_greatest.cpp | 1 - .../columnstore/utils/funcexp/func_hex.cpp | 1 - .../columnstore/utils/funcexp/func_hour.cpp | 1 - .../utils/funcexp/func_idbpartition.cpp | 1 - .../columnstore/utils/funcexp/func_if.cpp | 1 - .../columnstore/utils/funcexp/func_ifnull.cpp | 1 - .../columnstore/utils/funcexp/func_in.cpp | 1 - .../columnstore/utils/funcexp/func_insert.cpp | 1 - .../columnstore/utils/funcexp/func_instr.cpp | 1 - .../columnstore/utils/funcexp/func_isnull.cpp | 1 - .../columnstore/utils/funcexp/func_last_day.cpp | 1 - .../columnstore/utils/funcexp/func_lcase.cpp | 1 - .../columnstore/utils/funcexp/func_least.cpp | 1 - .../columnstore/utils/funcexp/func_left.cpp | 1 - .../columnstore/utils/funcexp/func_length.cpp | 1 - .../columnstore/utils/funcexp/func_lpad.cpp | 1 - .../columnstore/utils/funcexp/func_ltrim.cpp | 1 - .../utils/funcexp/func_ltrim_oracle.cpp | 1 - .../columnstore/utils/funcexp/func_makedate.cpp | 1 - .../columnstore/utils/funcexp/func_maketime.cpp | 1 - .../columnstore/utils/funcexp/func_math.cpp | 1 - .../columnstore/utils/funcexp/func_md5.cpp | 1 - .../columnstore/utils/funcexp/func_microsecond.cpp | 1 - .../columnstore/utils/funcexp/func_minute.cpp | 1 - .../columnstore/utils/funcexp/func_mod.cpp | 1 - .../columnstore/utils/funcexp/func_month.cpp | 1 - .../columnstore/utils/funcexp/func_monthname.cpp | 1 - .../columnstore/utils/funcexp/func_nullif.cpp | 3 +- .../columnstore/utils/funcexp/func_period_add.cpp | 1 - .../columnstore/utils/funcexp/func_period_diff.cpp | 1 - .../columnstore/utils/funcexp/func_pow.cpp | 1 - .../columnstore/utils/funcexp/func_quarter.cpp | 1 - .../columnstore/utils/funcexp/func_quote.cpp | 1 - .../columnstore/utils/funcexp/func_rand.cpp | 1 - .../columnstore/utils/funcexp/func_regexp.cpp | 1 - .../columnstore/utils/funcexp/func_repeat.cpp | 1 - .../columnstore/utils/funcexp/func_replace.cpp | 1 - .../utils/funcexp/func_replace_oracle.cpp | 1 - .../columnstore/utils/funcexp/func_reverse.cpp | 1 - .../columnstore/utils/funcexp/func_right.cpp | 1 - .../columnstore/utils/funcexp/func_round.cpp | 3 +- .../columnstore/utils/funcexp/func_rpad.cpp | 1 - .../columnstore/utils/funcexp/func_rtrim.cpp | 1 - .../utils/funcexp/func_rtrim_oracle.cpp | 1 - .../columnstore/utils/funcexp/func_sec_to_time.cpp | 1 - .../columnstore/utils/funcexp/func_second.cpp | 1 - .../columnstore/utils/funcexp/func_sha.cpp | 1 - .../columnstore/utils/funcexp/func_sign.cpp | 1 - .../columnstore/utils/funcexp/func_space.cpp | 1 - .../columnstore/utils/funcexp/func_str_to_date.cpp | 1 - .../columnstore/utils/funcexp/func_strcmp.cpp | 1 - .../columnstore/utils/funcexp/func_substr.cpp | 1 - .../utils/funcexp/func_substring_index.cpp | 1 - .../columnstore/utils/funcexp/func_sysdate.cpp | 1 - .../columnstore/utils/funcexp/func_time.cpp | 1 - .../columnstore/utils/funcexp/func_time_format.cpp | 1 - .../columnstore/utils/funcexp/func_time_to_sec.cpp | 1 - .../columnstore/utils/funcexp/func_timediff.cpp | 1 - .../utils/funcexp/func_timestampdiff.cpp | 1 - .../columnstore/utils/funcexp/func_to_days.cpp | 1 - .../columnstore/utils/funcexp/func_trim.cpp | 1 - .../columnstore/utils/funcexp/func_trim_oracle.cpp | 1 - .../columnstore/utils/funcexp/func_truncate.cpp | 5 +- .../columnstore/utils/funcexp/func_ucase.cpp | 1 - .../columnstore/utils/funcexp/func_unhex.cpp | 1 - .../utils/funcexp/func_unix_timestamp.cpp | 1 - .../columnstore/utils/funcexp/func_week.cpp | 1 - .../columnstore/utils/funcexp/func_weekday.cpp | 1 - .../columnstore/utils/funcexp/func_year.cpp | 1 - .../columnstore/utils/funcexp/func_yearweek.cpp | 1 - .../columnstore/utils/funcexp/functor.cpp | 1 - .../utils/libmysql_client/libmysql_client.h | 1 - .../columnstore/utils/loggingcpp/errorcodes.cpp | 1 - .../columnstore/utils/loggingcpp/exceptclasses.h | 3 +- .../utils/messageqcpp/inetstreamsocket.cpp | 12 +- .../columnstore/utils/messageqcpp/messagequeue.h | 3 +- .../columnstore/utils/multicast/multicast.cpp | 1 - .../columnstore/utils/regr/regrmysql.cpp | 1 - .../columnstore/utils/rowgroup/rowgroup.cpp | 1 - .../columnstore/utils/rowgroup/rowgroup.h | 9 +- .../columnstore/utils/rwlock/rwlock.cpp | 1 - .../columnstore/columnstore/utils/rwlock/rwlock.h | 15 +- .../columnstore/utils/startup/installdir.cpp | 1 - .../columnstore/utils/startup/installdir.h | 3 +- .../columnstore/utils/testbc/iomanager.cpp | 1 - .../columnstore/utils/testbc/iomanager.h | 3 +- .../utils/threadpool/prioritythreadpool.cpp | 1 - .../columnstore/utils/udfsdk/udfmysql.cpp | 1 - .../columnstore/utils/udfsdk/udfsdk.cpp | 1 - .../columnstore/columnstore/utils/udfsdk/udfsdk.h | 1 - .../utils/windowfunction/framebound.cpp | 1 - .../columnstore/utils/windowfunction/framebound.h | 4 +- .../utils/windowfunction/frameboundrange.cpp | 1 - .../utils/windowfunction/frameboundrange.h | 4 +- .../utils/windowfunction/frameboundrow.cpp | 1 - .../utils/windowfunction/frameboundrow.h | 2 - .../utils/windowfunction/idborderby.cpp | 1 - .../columnstore/utils/windowfunction/wf_count.cpp | 1 - .../columnstore/utils/windowfunction/wf_count.h | 2 - .../utils/windowfunction/wf_lead_lag.cpp | 1 - .../columnstore/utils/windowfunction/wf_lead_lag.h | 2 - .../utils/windowfunction/wf_min_max.cpp | 1 - .../columnstore/utils/windowfunction/wf_min_max.h | 2 - .../utils/windowfunction/wf_nth_value.cpp | 1 - .../utils/windowfunction/wf_nth_value.h | 2 - .../columnstore/utils/windowfunction/wf_ntile.cpp | 1 - .../columnstore/utils/windowfunction/wf_ntile.h | 2 - .../utils/windowfunction/wf_percentile.cpp | 1 - .../utils/windowfunction/wf_percentile.h | 2 - .../utils/windowfunction/wf_ranking.cpp | 1 - .../columnstore/utils/windowfunction/wf_ranking.h | 2 - .../utils/windowfunction/wf_row_number.cpp | 1 - .../utils/windowfunction/wf_row_number.h | 2 - .../columnstore/utils/windowfunction/wf_stats.cpp | 1 - .../columnstore/utils/windowfunction/wf_stats.h | 2 - .../utils/windowfunction/wf_sum_avg.cpp | 1 - .../columnstore/utils/windowfunction/wf_sum_avg.h | 4 +- .../columnstore/utils/windowfunction/wf_udaf.cpp | 1 - .../columnstore/utils/windowfunction/wf_udaf.h | 4 +- .../utils/windowfunction/windowframe.cpp | 1 - .../columnstore/utils/windowfunction/windowframe.h | 2 - .../utils/windowfunction/windowfunction.cpp | 1 - .../utils/windowfunction/windowfunction.h | 2 - .../utils/windowfunction/windowfunctiontype.cpp | 1 - .../utils/windowfunction/windowfunctiontype.h | 2 - .../columnstore/versioning/BRM/brmshmimpl.cpp | 1 - .../columnstore/versioning/BRM/load_brm.cpp | 1 - .../columnstore/versioning/BRM/slavecomm.cpp | 1 - .../columnstore/versioning/BRM/vbbm.cpp | 5 +- .../columnstore/writeengine/client/we_clients.cpp | 1 - .../columnstore/writeengine/client/we_clients.h | 5 +- .../writeengine/redistribute/we_redistribute.cpp | 1 - .../writeengine/redistribute/we_redistribute.h | 4 +- .../redistribute/we_redistributecontrol.cpp | 1 - .../redistribute/we_redistributecontrol.h | 2 - .../redistribute/we_redistributecontrolthread.cpp | 1 - .../redistribute/we_redistributecontrolthread.h | 2 - .../redistribute/we_redistributeworkerthread.cpp | 1 - .../redistribute/we_redistributeworkerthread.h | 4 +- .../writeengine/server/we_ddlcommandproc.cpp | 1 - .../columnstore/writeengine/shared/we_brm.cpp | 1 - .../writeengine/shared/we_chunkmanager.cpp | 1 - .../writeengine/splitter/we_splitterapp.cpp | 1 - .../columnstore/writeengine/wrapper/we_colop.cpp | 1 - .../writeengine/wrapper/we_tablemetadata.cpp | 1 - .../writeengine/wrapper/we_tablemetadata.h | 3 +- .../writeengine/wrapper/writeengine.cpp | 1 - storage/connect/CMakeLists.txt | 2 +- storage/connect/ha_connect.cc | 9 + storage/connect/ioapi.h | 2 +- storage/connect/libdoc.cpp | 39 +- .../mysql-test/connect/r/drop-open-error.result | 2 +- storage/connect/mysql-test/connect/r/mysql.result | 1 + .../mysql-test/connect/t/drop-open-error.test | 3 +- storage/connect/tabmul.cpp | 6 +- storage/connect/unzip.c | 12 +- storage/connect/unzip.h | 2 +- storage/connect/zip.c | 73 +- storage/connect/zip.h | 4 +- storage/heap/ha_heap.cc | 32 +- storage/heap/ha_heap.h | 4 +- storage/innobase/CMakeLists.txt | 28 +- storage/innobase/btr/btr0btr.cc | 183 +- storage/innobase/btr/btr0bulk.cc | 2 +- storage/innobase/btr/btr0cur.cc | 107 +- storage/innobase/btr/btr0pcur.cc | 209 +- storage/innobase/buf/buf0block_hint.cc | 59 - storage/innobase/buf/buf0buf.cc | 264 +- storage/innobase/buf/buf0flu.cc | 208 +- storage/innobase/buf/buf0lru.cc | 184 +- storage/innobase/buf/buf0rea.cc | 2 +- storage/innobase/dict/dict0dict.cc | 136 +- storage/innobase/dict/dict0stats.cc | 4 + storage/innobase/fil/fil0crypt.cc | 2 +- storage/innobase/fil/fil0fil.cc | 86 +- storage/innobase/fsp/fsp0file.cc | 7 +- storage/innobase/fsp/fsp0fsp.cc | 299 +- storage/innobase/fts/fts0fts.cc | 62 +- storage/innobase/fts/fts0opt.cc | 2 +- storage/innobase/fts/fts0que.cc | 47 +- storage/innobase/fut/fut0lst.cc | 135 +- storage/innobase/gis/gis0sea.cc | 117 +- storage/innobase/handler/ha_innodb.cc | 806 +- storage/innobase/handler/ha_innodb.h | 7 + storage/innobase/handler/handler0alter.cc | 71 +- storage/innobase/ibuf/ibuf0ibuf.cc | 61 +- storage/innobase/include/btr0btr.h | 17 +- storage/innobase/include/btr0pcur.h | 8 +- storage/innobase/include/buf0block_hint.h | 76 - storage/innobase/include/buf0buf.h | 50 +- storage/innobase/include/buf0buf.inl | 14 - storage/innobase/include/buf0flu.h | 10 - storage/innobase/include/cache.h | 33 + storage/innobase/include/data0data.h | 13 +- storage/innobase/include/data0data.inl | 30 +- storage/innobase/include/db0err.h | 12 +- storage/innobase/include/dict0dict.h | 67 +- storage/innobase/include/dict0mem.h | 5 +- storage/innobase/include/dict0mem.inl | 1 - storage/innobase/include/dyn0buf.h | 9 +- storage/innobase/include/dyn0types.h | 3 - storage/innobase/include/fil0fil.h | 60 +- storage/innobase/include/fsp0fsp.h | 20 +- storage/innobase/include/fts0fts.h | 6 + storage/innobase/include/fts0priv.h | 21 - storage/innobase/include/fts0priv.inl | 44 - storage/innobase/include/fts0types.h | 38 - storage/innobase/include/fts0types.inl | 47 - storage/innobase/include/fut0lst.h | 50 +- storage/innobase/include/gis0type.h | 6 +- storage/innobase/include/lock0lock.h | 74 +- storage/innobase/include/log0crypt.h | 3 + storage/innobase/include/log0log.h | 171 +- storage/innobase/include/mtr0mtr.h | 28 +- storage/innobase/include/os0file.h | 89 +- storage/innobase/include/os0file.inl | 8 +- storage/innobase/include/row0merge.h | 11 +- storage/innobase/include/row0row.h | 6 + storage/innobase/include/row0sel.h | 4 +- storage/innobase/include/srv0mon.h | 2 - storage/innobase/include/srv0srv.h | 4 - storage/innobase/include/srw_lock.h | 50 +- storage/innobase/include/trx0purge.h | 181 +- storage/innobase/include/trx0rseg.h | 12 +- storage/innobase/include/trx0trx.h | 31 +- storage/innobase/include/trx0undo.inl | 3 +- storage/innobase/include/ut0new.h | 3 +- storage/innobase/include/ut0ut.h | 14 - storage/innobase/include/ut0vec.h | 9 - storage/innobase/include/ut0vec.inl | 13 - storage/innobase/lock/lock0lock.cc | 437 +- storage/innobase/log/log0log.cc | 38 +- storage/innobase/log/log0recv.cc | 32 +- storage/innobase/mtr/mtr0mtr.cc | 525 +- storage/innobase/os/os0file.cc | 805 +- storage/innobase/page/page0zip.cc | 3 +- storage/innobase/rem/rem0rec.cc | 2 +- storage/innobase/row/row0import.cc | 511 +- storage/innobase/row/row0ins.cc | 23 +- storage/innobase/row/row0merge.cc | 92 +- storage/innobase/row/row0mysql.cc | 5 +- storage/innobase/row/row0quiesce.cc | 5 + storage/innobase/row/row0sel.cc | 25 +- storage/innobase/row/row0umod.cc | 2 +- storage/innobase/srv/srv0mon.cc | 10 - storage/innobase/srv/srv0start.cc | 165 +- storage/innobase/sync/cache.cc | 160 + storage/innobase/sync/srw_lock.cc | 121 + storage/innobase/trx/trx0purge.cc | 247 +- storage/innobase/trx/trx0rseg.cc | 62 +- storage/innobase/trx/trx0trx.cc | 24 +- storage/innobase/trx/trx0undo.cc | 42 +- storage/innobase/unittest/CMakeLists.txt | 4 + storage/innobase/unittest/innodb_rbt-t.cc | 83 + storage/innobase/ut/ut0ut.cc | 47 +- storage/maria/CMakeLists.txt | 4 +- storage/maria/aria_chk.c | 3 +- storage/maria/aria_pack.c | 3 +- storage/maria/aria_read_log.c | 2 +- storage/maria/ha_maria.cc | 106 +- storage/maria/ha_maria.h | 4 +- storage/maria/ma_bitmap.c | 2 +- storage/maria/ma_blockrec.c | 12 +- storage/maria/ma_check.c | 42 +- storage/maria/ma_control_file.c | 15 +- storage/maria/ma_control_file.h | 5 +- storage/maria/ma_create.c | 2 +- storage/maria/ma_dynrec.c | 8 +- storage/maria/ma_extra.c | 32 +- storage/maria/ma_loghandler.c | 8 +- storage/maria/ma_loghandler.h | 8 + storage/maria/ma_open.c | 20 +- storage/maria/ma_packrec.c | 8 +- storage/maria/ma_pagecache.c | 2 + storage/maria/ma_recovery.c | 34 +- storage/maria/ma_rt_test.c | 2 +- storage/maria/ma_test1.c | 2 +- storage/maria/ma_test2.c | 2 +- storage/maria/maria_def.h | 6 + storage/maria/test_ma_backup.c | 2 +- storage/maria/unittest/CMakeLists.txt | 2 +- storage/maria/unittest/ma_control_file-t.c | 2 +- storage/maria/unittest/ma_test_loghandler-t.c | 5 +- .../unittest/ma_test_loghandler_first_lsn-t.c | 2 +- .../maria/unittest/ma_test_loghandler_max_lsn-t.c | 2 +- .../unittest/ma_test_loghandler_multigroup-t.c | 4 +- .../unittest/ma_test_loghandler_multithread-t.c | 2 +- .../maria/unittest/ma_test_loghandler_noflush-t.c | 2 +- .../maria/unittest/ma_test_loghandler_nologs-t.c | 4 +- .../unittest/ma_test_loghandler_pagecache-t.c | 2 +- .../maria/unittest/ma_test_loghandler_purge-t.c | 2 +- storage/mroonga/CMakeLists.txt | 5 + storage/mroonga/ha_mroonga.cpp | 356 +- storage/mroonga/ha_mroonga.hpp | 16 +- storage/mroonga/vendor/groonga/CMakeLists.txt | 1 + storage/mroonga/vendor/groonga/lib/db.c | 18 +- storage/mroonga/vendor/groonga/lib/load.c | 5 + storage/mroonga/vendor/groonga/lib/operator.c | 5 + .../vendor/groonga/lib/proc/proc_object_list.c | 4 + .../mroonga/vendor/groonga/lib/proc/proc_schema.c | 9 +- .../mroonga/vendor/groonga/lib/proc/proc_select.c | 20 +- storage/myisam/ft_boolean_search.c | 2 + storage/myisam/ha_myisam.cc | 56 +- storage/myisam/ha_myisam.h | 4 +- storage/myisam/mi_extra.c | 13 +- storage/perfschema/pfs_buffer_container.h | 3 +- storage/perfschema/pfs_instr_class.cc | 2 +- .../perfschema/table_replication_applier_status.cc | 2 +- .../perfschema/table_replication_applier_status.h | 2 +- storage/perfschema/unittest/pfs_instr-t.cc | 3 + storage/perfschema/unittest/pfs_instr_class-t.cc | 1 + storage/rocksdb/CMakeLists.txt | 2 +- storage/rocksdb/build_rocksdb.cmake | 2 +- storage/rocksdb/ha_rocksdb.h | 2 +- .../mysql-test/rocksdb/r/group_min_max.result | 2 +- .../rocksdb/r/innodb_i_s_tables_disabled.result | 2 - .../rocksdb/mysql-test/rocksdb/r/partition.result | 1 - storage/rocksdb/mysql-test/rocksdb/t/disabled.def | 4 + storage/rocksdb/rdb_source_revision.h | 1 + storage/spider/ha_spider.cc | 77 +- storage/spider/ha_spider.h | 27 +- .../mysql-test/spider/bg/r/spider3_fixes.result | 1 + .../spider/bg/r/spider3_fixes_part.result | 1 + .../mysql-test/spider/bg/r/spider_fixes.result | 1 + .../spider/bg/r/spider_fixes_part.result | 1 + .../mysql-test/spider/bg/t/slave_test_init.inc | 2 +- .../r/delete_with_float_column_default.result | 1 + .../r/delete_with_float_column_mariadb.result | 1 + .../bugfix/r/delete_with_float_column_mysql.result | 1 + .../mysql-test/spider/bugfix/r/mdev_19866.result | 2 - .../mysql-test/spider/bugfix/r/mdev_27172.result | 3 - .../mysql-test/spider/bugfix/r/mdev_28856.result | 3 + .../mysql-test/spider/bugfix/r/mdev_30727.result | 24 + .../mysql-test/spider/bugfix/r/mdev_33242.result | 4 + .../mysql-test/spider/bugfix/r/mdev_33434.result | 12 + .../mysql-test/spider/bugfix/r/mdev_33441.result | 7 + .../spider/bugfix/r/mdev_33441_fail.result | 10 + .../mysql-test/spider/bugfix/r/mdev_33494.result | 4 + .../mysql-test/spider/bugfix/r/mdev_33538.result | 12 + .../spider/bugfix/r/mdev_33538_fail_init.result | 10 + .../mysql-test/spider/bugfix/r/mdev_33584.result | 4 + .../mysql-test/spider/bugfix/r/mdev_33679.result | 25 + .../mysql-test/spider/bugfix/r/mdev_33731.result | 10 + .../mysql-test/spider/bugfix/r/mdev_34003.result | 18 + .../spider/bugfix/r/plugin_load_add_all.result | 4 + .../r/slave_transaction_retry_errors_5digit.result | 3 +- .../spider/bugfix/r/slave_trx_isolation.result | 1 + .../bugfix/r/udf_mysql_func_early_init_file.result | 44 +- .../mysql-test/spider/bugfix/t/mdev_28856.test | 4 + .../mysql-test/spider/bugfix/t/mdev_30727.test | 30 + .../mysql-test/spider/bugfix/t/mdev_33242.test | 6 + .../mysql-test/spider/bugfix/t/mdev_33434.test | 15 + .../mysql-test/spider/bugfix/t/mdev_33441.opt | 1 + .../mysql-test/spider/bugfix/t/mdev_33441.test | 10 + .../mysql-test/spider/bugfix/t/mdev_33441_fail.opt | 2 + .../spider/bugfix/t/mdev_33441_fail.test | 10 + .../mysql-test/spider/bugfix/t/mdev_33494.test | 11 + .../mysql-test/spider/bugfix/t/mdev_33538.opt | 2 + .../mysql-test/spider/bugfix/t/mdev_33538.test | 2 + .../spider/bugfix/t/mdev_33538_fail_init.test | 17 + .../mysql-test/spider/bugfix/t/mdev_33584.test | 11 + .../mysql-test/spider/bugfix/t/mdev_33679.test | 29 + .../mysql-test/spider/bugfix/t/mdev_33731.test | 16 + .../mysql-test/spider/bugfix/t/mdev_34003.test | 20 + .../spider/bugfix/t/plugin_load_add_all.test | 1 + .../spider/bugfix/t/self_reference_multi.test | 2 + .../spider/feature/r/pushdown_case.result | 57 + .../feature/r/pushdown_timestamp_diff.result | 111 + .../r/slave_transaction_retry_errors.result | 3 +- .../mysql-test/spider/feature/t/pushdown_case.test | 50 + .../spider/feature/t/pushdown_timestamp_diff.test | 93 + .../mysql-test/spider/include/clean_up_spider.inc | 1 - ...ition_join_pushdown_for_single_partition.result | 2 - .../mysql-test/spider/r/slave_trx_isolation.result | 1 + .../mysql-test/spider/r/spider3_fixes.result | 1 + .../mysql-test/spider/r/spider3_fixes_part.result | 1 + .../spider/mysql-test/spider/r/spider_fixes.result | 1 + .../mysql-test/spider/r/spider_fixes_part.result | 2 + .../spider/mysql-test/spider/t/slave_test_init.inc | 2 +- .../mysql-test/spider/t/spider_fixes_part.opt | 1 + .../mysql-test/spider/t/spider_fixes_part.test | 16 + storage/spider/spd_conn.cc | 4 +- storage/spider/spd_copy_tables.cc | 50 +- storage/spider/spd_db_conn.cc | 14 +- storage/spider/spd_db_include.cc | 16 - storage/spider/spd_db_include.h | 6 - storage/spider/spd_db_mysql.cc | 308 +- storage/spider/spd_db_mysql.h | 5 - storage/spider/spd_direct_sql.cc | 162 +- storage/spider/spd_i_s.cc | 5 + storage/spider/spd_include.h | 2 +- storage/spider/spd_init_query.h | 10 +- storage/spider/spd_ping_table.cc | 134 +- storage/spider/spd_sys_table.cc | 60 +- storage/spider/spd_sys_table.h | 3 +- storage/spider/spd_table.cc | 76 +- storage/spider/spd_trx.cc | 2 +- strings/ctype-uca.c | 6 + support-files/mariadb.service.in | 2 +- support-files/mariadb@.service.in | 2 +- support-files/mini-benchmark.sh | 123 +- support-files/policy/apparmor/usr.sbin.mysqld | 1 + support-files/policy/selinux/mariadb-server.te | 4 +- tests/async_queries.c | 2 + tests/mysql_client_fw.c | 18 +- tests/mysql_client_test.c | 10 +- tpool/tpool_generic.cc | 25 +- unittest/mysys/CMakeLists.txt | 2 +- unittest/mysys/bitmap-t.c | 152 +- unittest/mysys/crc32-t.c | 138 +- unittest/mysys/my_getopt-t.c | 4 +- unittest/sql/mf_iocache-t.cc | 3 + vio/vio.c | 2 + vio/viosocket.c | 53 +- win/packaging/CPackWixConfig.cmake | 2 +- wsrep-lib/dbsim/db_client_service.hpp | 5 + wsrep-lib/include/wsrep/client_service.hpp | 10 + wsrep-lib/include/wsrep/reporter.hpp | 16 +- wsrep-lib/src/client_state.cpp | 3 +- wsrep-lib/src/reporter.cpp | 12 +- wsrep-lib/src/transaction.cpp | 13 +- wsrep-lib/test/mock_client_state.hpp | 5 + zlib/ChangeLog | 10 + zlib/FAQ | 3 +- zlib/README | 6 +- zlib/contrib/nuget/nuget.csproj | 43 + zlib/contrib/nuget/nuget.sln | 22 + zlib/contrib/vstudio/vc17/miniunz.vcxproj | 409 + zlib/contrib/vstudio/vc17/minizip.vcxproj | 405 + zlib/contrib/vstudio/vc17/testzlib.vcxproj | 473 + zlib/contrib/vstudio/vc17/testzlibdll.vcxproj | 409 + zlib/contrib/vstudio/vc17/zlib.rc | 32 + zlib/contrib/vstudio/vc17/zlibstat.vcxproj | 602 + zlib/contrib/vstudio/vc17/zlibvc.def | 158 + zlib/contrib/vstudio/vc17/zlibvc.sln | 179 + zlib/contrib/vstudio/vc17/zlibvc.vcxproj | 875 + zlib/deflate.c | 47 +- zlib/deflate.h | 35 +- zlib/gzguts.h | 8 +- zlib/gzlib.c | 12 +- zlib/inflate.c | 2 +- zlib/inftrees.c | 6 +- zlib/inftrees.h | 4 +- zlib/qnx/package.qpg | 10 +- zlib/treebuild.xml | 4 +- zlib/trees.c | 20 +- zlib/win32/DLL_FAQ.txt | 20 +- zlib/win32/README-WIN32.txt | 8 +- zlib/zconf.h.cmakein | 10 +- zlib/zconf.h.in | 10 +- zlib/zlib.3 | 6 +- zlib/zlib.h | 22 +- zlib/zutil.h | 27 +- 2116 files changed, 214167 insertions(+), 35459 deletions(-) create mode 100644 Docs/INFO_SRC delete mode 100644 cmake/FindPMEM.cmake create mode 100644 extra/mariabackup/aria_backup_client.cc create mode 100644 extra/mariabackup/aria_backup_client.h delete mode 100644 extra/mariabackup/changed_page_bitmap.cc delete mode 100644 extra/mariabackup/changed_page_bitmap.h create mode 100644 extra/mariabackup/common_engine.cc create mode 100644 extra/mariabackup/common_engine.h create mode 100644 extra/mariabackup/ddl_log.cc create mode 100644 extra/mariabackup/ddl_log.h create mode 100644 extra/mariabackup/encryption_plugin.cc create mode 100644 extra/mariabackup/encryption_plugin.h create mode 100644 extra/mariabackup/thread_pool.cc create mode 100644 extra/mariabackup/thread_pool.h delete mode 100644 extra/mariabackup/xb_plugin.cc delete mode 100644 extra/mariabackup/xb_plugin.h create mode 100644 extra/wolfssl/wolfssl/.github/workflows/libssh2.yml create mode 100644 extra/wolfssl/wolfssl/.github/workflows/openssh.yml create mode 100644 extra/wolfssl/wolfssl/Docker/yocto/Dockerfile create mode 100755 extra/wolfssl/wolfssl/Docker/yocto/buildAndPush.sh create mode 100644 extra/wolfssl/wolfssl/IDE/ARDUINO/Arduino_README_prepend.md create mode 100644 extra/wolfssl/wolfssl/IDE/ARDUINO/keywords.txt create mode 100644 extra/wolfssl/wolfssl/IDE/ARDUINO/library.properties.template create mode 100644 extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/README.md create mode 100644 extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/README.md create mode 100644 extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/README.md create mode 100644 extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/README.md create mode 100644 extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino create mode 100644 extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl.h create mode 100644 extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj delete mode 100644 extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/settings/wolfcrypt_benchmark_Debug.jlink delete mode 100644 extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/wolfcrypt_benchmark.ewt delete mode 100644 extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_lib_SAMV71_XULT/wolfcrypt_lib.ewt delete mode 100644 extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/settings/wolfcrypt_test_Debug.jlink delete mode 100644 extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/wolfcrypt_test.ewt create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/README.md create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/include.am create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/main.c create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/user_settings.h create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/Makefile create mode 100755 extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/include.am create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/configurations.xml create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/private.xml create mode 100755 extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/Makefile create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/include.am create mode 100644 extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/project.xml delete mode 100644 extra/wolfssl/wolfssl/IPP/.gitkeep create mode 100644 extra/wolfssl/wolfssl/certs/crl/crl_rsapss.pem create mode 100644 extra/wolfssl/wolfssl/certs/test-stream-sign.p7b create mode 100644 extra/wolfssl/wolfssl/examples/configs/user_settings_arduino.h create mode 100644 extra/wolfssl/wolfssl/examples/configs/user_settings_tls12.h delete mode 100644 extra/wolfssl/wolfssl/lib/dummy create mode 100644 extra/wolfssl/wolfssl/linuxkm/lkcapi_glue.c delete mode 100755 extra/wolfssl/wolfssl/pre-commit.sh delete mode 100755 extra/wolfssl/wolfssl/pre-push.sh create mode 100644 extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/README.md create mode 100644 extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/cryif.c create mode 100644 extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/crypto.c create mode 100644 extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/csm.c create mode 100644 extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/include.am create mode 100644 extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/test.c create mode 100644 extra/wolfssl/wolfssl/wolfcrypt/src/port/liboqs/liboqs.c create mode 100644 extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms_impl.c create mode 100644 extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss_impl.c delete mode 100644 extra/wolfssl/wolfssl/wolfcrypt/user-crypto/Makefile.am delete mode 100644 extra/wolfssl/wolfssl/wolfcrypt/user-crypto/README.txt delete mode 100755 extra/wolfssl/wolfssl/wolfcrypt/user-crypto/autogen.sh delete mode 100644 extra/wolfssl/wolfssl/wolfcrypt/user-crypto/configure.ac delete mode 100644 extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include.am delete mode 100644 extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include/user_rsa.h delete mode 100644 extra/wolfssl/wolfssl/wolfcrypt/user-crypto/lib/.gitkeep delete mode 100644 extra/wolfssl/wolfssl/wolfcrypt/user-crypto/src/rsa.c create mode 100644 extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/CryIf.h create mode 100644 extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Crypto.h create mode 100644 extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Csm.h create mode 100644 extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/StandardTypes.h create mode 100644 extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/liboqs/liboqs.h create mode 100644 include/mysql/service_print_check_msg.h create mode 100644 include/source_revision.h create mode 100644 libmariadb/.gitattributes create mode 100644 libmariadb/.gitignore create mode 100644 libmariadb/include/ma_hash.h delete mode 100644 libmariadb/include/mysql/plugin_auth_common.h create mode 100644 libservices/print_check_msg_service.c create mode 100644 man/wsrep_sst_backup.1 create mode 100644 mysql-test/include/aria_log_control_load.inc delete mode 100644 mysql-test/include/have_innodb.combinations create mode 100644 mysql-test/include/have_innodb.opt create mode 100644 mysql-test/include/rpl_clone_slave_using_mariadb-backup.inc create mode 100644 mysql-test/include/slow_environ.inc create mode 100644 mysql-test/main/distinct_notembedded.result create mode 100644 mysql-test/main/distinct_notembedded.test delete mode 100644 mysql-test/main/innodb_ext_key,covering,innodb,on.rdiff create mode 100644 mysql-test/main/innodb_ext_key,covering,on.rdiff delete mode 100644 mysql-test/main/innodb_ext_key,innodb,on,unoptimized.rdiff create mode 100644 mysql-test/main/innodb_ext_key,on,unoptimized.rdiff create mode 100644 mysql-test/main/load_timezones_with_alter_algorithm_inplace.result create mode 100644 mysql-test/main/load_timezones_with_alter_algorithm_inplace.test mode change 100755 => 100644 mysql-test/main/lowercase_table2.result create mode 100644 mysql-test/main/subselect_elimination.result create mode 100644 mysql-test/main/subselect_elimination.test create mode 100644 mysql-test/std_data/autoinc_import_101.frm create mode 100644 mysql-test/std_data/autoinc_import_57.frm create mode 100644 mysql-test/std_data/mdev-25731.dat delete mode 100644 mysql-test/suite/galera/include/shutdown_mysqld.inc create mode 100644 mysql-test/suite/galera/r/MDEV-25731.result create mode 100644 mysql-test/suite/galera/r/MDEV-26499.result create mode 100644 mysql-test/suite/galera/r/MDEV-33136.result create mode 100644 mysql-test/suite/galera/r/MDEV-33828.result create mode 100644 mysql-test/suite/galera/r/galera_sequence_engine.result create mode 100644 mysql-test/suite/galera/r/galera_table_with_hyphen.result create mode 100644 mysql-test/suite/galera/r/mdev-22063.result create mode 100644 mysql-test/suite/galera/r/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.result create mode 100644 mysql-test/suite/galera/t/MDEV-25731.test create mode 100644 mysql-test/suite/galera/t/MDEV-26499.test create mode 100644 mysql-test/suite/galera/t/MDEV-33136.test create mode 100644 mysql-test/suite/galera/t/MDEV-33828.cnf create mode 100644 mysql-test/suite/galera/t/MDEV-33828.test create mode 100644 mysql-test/suite/galera/t/galera_sequence_engine.test create mode 100644 mysql-test/suite/galera/t/galera_table_with_hyphen.inc create mode 100644 mysql-test/suite/galera/t/galera_table_with_hyphen.test create mode 100644 mysql-test/suite/galera/t/mdev-22063.test create mode 100644 mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.cnf create mode 100644 mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.test create mode 100644 mysql-test/suite/galera_sr/r/galera_sr_bf_abort_idle.result create mode 100644 mysql-test/suite/galera_sr/t/galera_sr_bf_abort_idle.test create mode 100644 mysql-test/suite/innodb/r/autoinc_import.result create mode 100644 mysql-test/suite/innodb/r/cursor-restore-unique-null.result create mode 100644 mysql-test/suite/innodb/r/import_hidden_fts.result create mode 100644 mysql-test/suite/innodb/r/import_hidden_fts_debug.result delete mode 100644 mysql-test/suite/innodb/r/innodb-lru-force-no-free-page.result delete mode 100644 mysql-test/suite/innodb/r/innodb-wl5522,crc32.rdiff delete mode 100644 mysql-test/suite/innodb/r/innodb_ut_format_name.result create mode 100644 mysql-test/suite/innodb/r/lock_isolation.result create mode 100644 mysql-test/suite/innodb/r/log_upgrade_101_flags.result delete mode 100644 mysql-test/suite/innodb/r/max_record_size,16k,compact,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,16k,compact.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,16k,dynamic,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,16k,dynamic.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,16k,innodb,redundant.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,16k,redundant.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,32k,compact,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,32k,compact.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,32k,dynamic,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,32k,dynamic.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,32k,innodb,redundant.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,32k,redundant.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,4k,compact,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,4k,compact.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,4k,dynamic,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,4k,dynamic.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,4k,innodb,redundant.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,4k,redundant.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,64k,compact,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,64k,compact.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,64k,dynamic,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,64k,dynamic.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,64k,innodb,redundant.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,64k,redundant.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,8k,compact,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,8k,compact.rdiff delete mode 100644 mysql-test/suite/innodb/r/max_record_size,8k,dynamic,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/max_record_size,8k,dynamic.rdiff delete mode 100644 mysql-test/suite/innodb/r/restart,16k,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/restart,16k.rdiff delete mode 100644 mysql-test/suite/innodb/r/restart,32k,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/restart,32k.rdiff delete mode 100644 mysql-test/suite/innodb/r/restart,4k,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/restart,4k.rdiff delete mode 100644 mysql-test/suite/innodb/r/restart,64k,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/restart,64k.rdiff delete mode 100644 mysql-test/suite/innodb/r/restart,8k,innodb.rdiff create mode 100644 mysql-test/suite/innodb/r/restart,8k.rdiff create mode 100644 mysql-test/suite/innodb/r/row_size_error_log_warnings_3,4k.rdiff create mode 100644 mysql-test/suite/innodb/t/autoinc_import.test create mode 100644 mysql-test/suite/innodb/t/cursor-restore-unique-null.test create mode 100644 mysql-test/suite/innodb/t/import_hidden_fts.test create mode 100644 mysql-test/suite/innodb/t/import_hidden_fts_debug.test delete mode 100644 mysql-test/suite/innodb/t/innodb-lru-force-no-free-page.test delete mode 100644 mysql-test/suite/innodb/t/innodb_ut_format_name.test create mode 100644 mysql-test/suite/innodb/t/lock_isolation.test create mode 100644 mysql-test/suite/innodb/t/log_upgrade_101_flags.test create mode 100644 mysql-test/suite/innodb_fts/r/create,orig.rdiff create mode 100644 mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers.rdiff create mode 100644 mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers_trx.rdiff create mode 100644 mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers.rdiff create mode 100644 mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers_trx.rdiff create mode 100644 mysql-test/suite/innodb_fts/r/misc_debug,vers.rdiff create mode 100644 mysql-test/suite/innodb_fts/r/misc_debug,vers_trx.rdiff create mode 100644 mysql-test/suite/innodb_fts/r/sync_ddl,vers.rdiff create mode 100644 mysql-test/suite/innodb_fts/r/sync_ddl,vers_trx.rdiff create mode 100644 mysql-test/suite/mariabackup/aria_backup.opt create mode 100644 mysql-test/suite/mariabackup/aria_backup.result create mode 100644 mysql-test/suite/mariabackup/aria_backup.test create mode 100644 mysql-test/suite/mariabackup/aria_log.opt create mode 100644 mysql-test/suite/mariabackup/aria_log_rotate_during_backup.opt create mode 100644 mysql-test/suite/mariabackup/aria_log_rotate_during_backup.result create mode 100644 mysql-test/suite/mariabackup/aria_log_rotate_during_backup.test create mode 100644 mysql-test/suite/mariabackup/ddl_for_common_engine.result create mode 100644 mysql-test/suite/mariabackup/ddl_for_common_engine.test create mode 100644 mysql-test/suite/mariabackup/encrypted_export.opt create mode 100644 mysql-test/suite/mariabackup/encrypted_export.result create mode 100644 mysql-test/suite/mariabackup/encrypted_export.test create mode 100644 mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.result create mode 100644 mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test create mode 100644 mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.result create mode 100644 mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.test create mode 100644 mysql-test/suite/mariabackup/log_tables.result create mode 100644 mysql-test/suite/mariabackup/log_tables.test create mode 100644 mysql-test/suite/mariabackup/rpl_clone_slave.result create mode 100644 mysql-test/suite/mariabackup/rpl_clone_slave.test create mode 100644 mysql-test/suite/mariabackup/std_data/ment1587_aria_log.00000004 create mode 100644 mysql-test/suite/parts/r/mdev_21007.result create mode 100644 mysql-test/suite/parts/t/mdev_21007.test delete mode 100644 mysql-test/suite/parts/t/partition_recover_myisam-master.opt create mode 100644 mysql-test/suite/parts/t/partition_recover_myisam.opt create mode 100644 mysql-test/suite/rpl/r/rpl_auditing.result create mode 100644 mysql-test/suite/rpl/r/rpl_gtid_header_valid.result create mode 100644 mysql-test/suite/rpl/r/rpl_mdev33798.result create mode 100644 mysql-test/suite/rpl/r/rpl_parallel_multi_domain_xa.result create mode 100644 mysql-test/suite/rpl/r/rpl_semi_sync_cond_var_per_thd.result create mode 100644 mysql-test/suite/rpl/r/rpl_show_slave_status.result create mode 100644 mysql-test/suite/rpl/r/rpl_shutdown_sighup.result create mode 100644 mysql-test/suite/rpl/r/rpl_temporary_error2_skip_all.result create mode 100644 mysql-test/suite/rpl/t/rpl_auditing.test create mode 100644 mysql-test/suite/rpl/t/rpl_gtid_header_valid.test create mode 100644 mysql-test/suite/rpl/t/rpl_mdev33798.cnf create mode 100644 mysql-test/suite/rpl/t/rpl_mdev33798.test create mode 100644 mysql-test/suite/rpl/t/rpl_parallel_multi_domain_xa.test create mode 100644 mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.cnf create mode 100644 mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.test create mode 100644 mysql-test/suite/rpl/t/rpl_show_slave_status.test create mode 100644 mysql-test/suite/rpl/t/rpl_shutdown_sighup.test create mode 100644 mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all-slave.opt create mode 100644 mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all.test create mode 100644 mysql-test/suite/sys_vars/r/debug_dbug_utf16le.result create mode 100644 mysql-test/suite/sys_vars/t/debug_dbug_utf16le.test create mode 100644 mysql-test/suite/vcol/r/func_regexp.result create mode 100644 mysql-test/suite/vcol/t/func_regexp.test create mode 100644 mysys/crc32/crc32c_x86.cc create mode 100644 plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.opt create mode 100644 plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.result create mode 100644 plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.test create mode 100644 sql/yy_mariadb.cc create mode 100644 sql/yy_mariadb.hh create mode 100644 sql/yy_oracle.cc create mode 100644 sql/yy_oracle.hh delete mode 100644 storage/innobase/buf/buf0block_hint.cc delete mode 100644 storage/innobase/include/buf0block_hint.h create mode 100644 storage/innobase/include/cache.h create mode 100644 storage/innobase/sync/cache.cc create mode 100644 storage/innobase/unittest/innodb_rbt-t.cc create mode 100644 storage/rocksdb/rdb_source_revision.h create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_33242.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_33434.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_33441.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_33441_fail.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_33494.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_33538.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_33584.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_33679.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_33731.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_34003.result mode change 120000 => 100644 storage/spider/mysql-test/spider/bugfix/r/udf_mysql_func_early_init_file.result create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33242.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33441.opt create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33441.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.opt create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33494.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33538.opt create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33538.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33538_fail_init.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33584.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33679.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_33731.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_34003.test create mode 100644 storage/spider/mysql-test/spider/feature/r/pushdown_case.result create mode 100644 storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.result create mode 100644 storage/spider/mysql-test/spider/feature/t/pushdown_case.test create mode 100644 storage/spider/mysql-test/spider/feature/t/pushdown_timestamp_diff.test create mode 100644 storage/spider/mysql-test/spider/t/spider_fixes_part.opt create mode 100644 zlib/contrib/nuget/nuget.csproj create mode 100644 zlib/contrib/nuget/nuget.sln create mode 100644 zlib/contrib/vstudio/vc17/miniunz.vcxproj create mode 100644 zlib/contrib/vstudio/vc17/minizip.vcxproj create mode 100644 zlib/contrib/vstudio/vc17/testzlib.vcxproj create mode 100644 zlib/contrib/vstudio/vc17/testzlibdll.vcxproj create mode 100644 zlib/contrib/vstudio/vc17/zlib.rc create mode 100644 zlib/contrib/vstudio/vc17/zlibstat.vcxproj create mode 100644 zlib/contrib/vstudio/vc17/zlibvc.def create mode 100644 zlib/contrib/vstudio/vc17/zlibvc.sln create mode 100644 zlib/contrib/vstudio/vc17/zlibvc.vcxproj diff --git a/.clang-format b/.clang-format index 7ce45951..3633507c 100644 --- a/.clang-format +++ b/.clang-format @@ -70,7 +70,6 @@ IndentPPDirectives: None IndentWidth: 2 IndentWrappedFunctionNames: false KeepEmptyLinesAtTheStartOfBlocks: true -Language: Cpp MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b59d5a96..d8a6b810 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -510,9 +510,9 @@ mini-benchmark: - | mariadb --skip-column-names -e "SELECT @@version, @@version_comment" | tee /tmp/version grep $MARIADB_MAJOR_VERSION /tmp/version || echo "MariaDB didn't install properly" - - yum install -y sysbench procps-ng perf util-linux || yum install -y https://kojipkgs.fedoraproject.org//packages/luajit/2.0.4/3.el7/x86_64/luajit-2.0.4-3.el7.x86_64.rpm https://kojipkgs.fedoraproject.org//packages/sysbench/1.0.17/2.el7/x86_64/sysbench-1.0.17-2.el7.x86_64.rpm https://kojipkgs.fedoraproject.org//packages/ck/0.5.2/2.el7/x86_64/ck-0.5.2-2.el7.x86_64.rpm + - yum install -y sysbench procps-ng perf flamegraph flamegraph-stackcollapse-perf util-linux dnf-utils - /usr/share/mysql/mini-benchmark - - cp -av */sysbench-run-*.log */metrics.txt .. # Move files one level down so they can be saved as artifacts + - cp -av */sysbench-run-*.log */metrics.txt . # Move files one level down so they can be saved as artifacts artifacts: when: always paths: diff --git a/BUILD/SETUP.sh b/BUILD/SETUP.sh index 0defa2d4..5b02a8aa 100755 --- a/BUILD/SETUP.sh +++ b/BUILD/SETUP.sh @@ -267,6 +267,12 @@ if test `$CC -v 2>&1 | tail -1 | sed 's/ .*$//'` = 'gcc' ; then fi fi +if test `$CC -v 2>&1 | head -1 | sed 's/ .*$//'` = 'clang' ; then + dbug_cflags="$dbug_cflags -Wframe-larger-than=16384 -fno-inline" + c_warnings="$c_warnings -Wframe-larger-than=16384" + cxx_warnings="$cxx_warnings -Wframe-larger-than=16384" +fi + # If ccache (a compiler cache which reduces build time) # (http://samba.org/ccache) is installed, use it. diff --git a/CMakeLists.txt b/CMakeLists.txt index 49769e2b..93908662 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ ENDIF() # in RPM's: #set(CPACK_RPM_SPEC_MORE_DEFINE "%define __spec_install_post /bin/true") -FOREACH(p CMP0022 CMP0046 CMP0040 CMP0048 CMP0054 CMP0075 CMP0069 CMP0135) +FOREACH(p CMP0022 CMP0046 CMP0040 CMP0048 CMP0054 CMP0074 CMP0075 CMP0069 CMP0135) IF(POLICY ${p}) CMAKE_POLICY(SET ${p} NEW) ENDIF() @@ -187,7 +187,7 @@ ENDIF() OPTION (WITH_UNIT_TESTS "Compile MySQL with unit tests" ON) IF (WITHOUT_SERVER) - SET (SKIP_COMPONENTS "Server|IniFiles|SuportFiles|Readme") + SET (SKIP_COMPONENTS "Server|IniFiles|SupportFiles|Readme") ELSE() SET (SKIP_COMPONENTS "N-O-N-E") ENDIF() @@ -199,8 +199,9 @@ OPTION(NOT_FOR_DISTRIBUTION "Allow linking with GPLv2-incompatible system librar # Can be switched on only for debug build. # OPTION(WITH_PROTECT_STATEMENT_MEMROOT "Enable protection of statement's memory root after first SP/PS execution. Turned into account only for debug build" OFF) -IF (CMAKE_BUILD_TYPE MATCHES "Debug" AND WITH_PROTECT_STATEMENT_MEMROOT) - ADD_DEFINITIONS(-DPROTECT_STATEMENT_MEMROOT) +IF (WITH_PROTECT_STATEMENT_MEMROOT) + SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DPROTECT_STATEMENT_MEMROOT") + SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DPROTECT_STATEMENT_MEMROOT") ENDIF() INCLUDE(check_compiler_flag) @@ -264,8 +265,6 @@ IF(SECURITY_HARDENED AND NOT WITH_ASAN AND NOT WITH_UBSAN AND NOT WITH_TSAN AND MY_CHECK_AND_SET_COMPILER_FLAG("-D_FORTIFY_SOURCE=2" RELEASE RELWITHDEBINFO) ENDIF() -INCLUDE(wsrep) - OPTION(WITH_DBUG_TRACE "Enable DBUG_ENTER()/DBUG_RETURN()/DBUG_PRINT()" ON) IF(WITH_DBUG_TRACE) FOREACH(LANG C CXX) @@ -276,7 +275,12 @@ ENDIF() # Always enable debug sync for debug builds. SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") - + +IF(CMAKE_COMPILER_IS_GNUCC AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "10") + # Enable extra checks when using a recent enough version of GNU libstdc++ + SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG -D_GLIBCXX_ASSERTIONS") +ENDIF() + OPTION(ENABLE_GCOV "Enable gcov (debug, Linux builds only)" OFF) IF (ENABLE_GCOV) MY_CHECK_AND_SET_COMPILER_FLAG("-DHAVE_gcov -fprofile-arcs -ftest-coverage -lgcov" DEBUG) @@ -337,6 +341,8 @@ ELSEIF(TRASH_FREED_MEMORY MATCHES "AUTO" AND NOT WIN32 AND NOT WITH_VALGRIND AND SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DTRASH_FREED_MEMORY") ENDIF() +INCLUDE(wsrep) + # Set commonly used variables IF(WIN32) SET(DEFAULT_MYSQL_HOME "C:/Program Files/MariaDB ${MYSQL_BASE_VERSION}") diff --git a/Docs/INFO_SRC b/Docs/INFO_SRC new file mode 100644 index 00000000..dd90364e --- /dev/null +++ b/Docs/INFO_SRC @@ -0,0 +1,8 @@ +commit: 3a069644682e336e445039e48baae9693f9a08ee +date: 2024-05-10 22:20:49 +0200 +build-date: 2024-05-10 21:03:21 +0000 +short: 3a069644682 +branch: HEAD + + +MariaDB source 10.11.8 diff --git a/README.md b/README.md index 58dbf105..5fe95f46 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Code status: * [![Appveyor CI status](https://ci.appveyor.com/api/projects/status/4u6pexmtpuf8jq66?svg=true)](https://ci.appveyor.com/project/rasmushoj/server) ci.appveyor.com -## MariaDB: The open source relational database +## MariaDB: The innovative open source database MariaDB was designed as a drop-in replacement of MySQL(R) with more features, new storage engines, fewer bugs, and better performance. @@ -33,28 +33,23 @@ https://mariadb.com/kb/en/mariadb-versus-mysql-compatibility/ https://mariadb.com/kb/en/new-and-old-releases/ +Getting the code, building it and testing it +--------------------------------------------------------------- + +Refer to the following guide: https://mariadb.org/get-involved/getting-started-for-developers/get-code-build-test/ which outlines how to correctly build the source code and run the MariaDB testing framework. + Help ----- More help is available from the Maria Discuss mailing list -https://launchpad.net/~maria-discuss, MariaDB's Zulip +https://lists.mariadb.org/postorius/lists/discuss.lists.mariadb.org/ and MariaDB's Zulip instance, https://mariadb.zulipchat.com/ -Live QA for beginner contributors ----- -MariaDB has a dedicated time each week when we answer new contributor questions live on Zulip. -From 8:00 to 10:00 UTC on Mondays, and 10:00 to 12:00 UTC on Thursdays, -anyone can ask any questions they’d like, and a live developer will be available to assist. - -New contributors can ask questions any time, but we will provide immediate feedback during that interval. - Licensing --------- *************************************************************************** -NOTE: - MariaDB is specifically available only under version 2 of the GNU General Public License (GPLv2). (I.e. Without the "any later version" clause.) This is inherited from MySQL. Please see the README file in diff --git a/VERSION b/VERSION index 7dd56698..96bdb06e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=11 -MYSQL_VERSION_PATCH=7 +MYSQL_VERSION_PATCH=8 SERVER_MATURITY=stable diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 4dfce247..a8e80bc8 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -18,7 +18,7 @@ INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include ${PCRE_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/mysys_ssl - ${ZLIB_INCLUDE_DIR} + ${ZLIB_INCLUDE_DIRS} ${SSL_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/sql ${CMAKE_SOURCE_DIR}/strings diff --git a/client/client_priv.h b/client/client_priv.h index 597c074c..eba8a841 100644 --- a/client/client_priv.h +++ b/client/client_priv.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001, 2012, Oracle and/or its affiliates. - Copyright (c) 2009, 2022, MariaDB + Copyright (c) 2009, 2024, MariaDB 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 @@ -38,75 +38,34 @@ enum options_client { OPT_CHARSETS_DIR=256, OPT_DEFAULT_CHARSET, OPT_PAGER, OPT_TEE, - OPT_LOW_PRIORITY, OPT_AUTO_REPAIR, OPT_COMPRESS, - OPT_DROP, OPT_LOCKS, OPT_KEYWORDS, OPT_DELAYED, OPT_OPTIMIZE, - OPT_FTB, OPT_LTB, OPT_ENC, OPT_O_ENC, OPT_ESC, OPT_TABLES, - OPT_MASTER_DATA, OPT_AUTOCOMMIT, OPT_AUTO_REHASH, - OPT_LINE_NUMBERS, OPT_COLUMN_NAMES, OPT_CONNECT_TIMEOUT, - OPT_MAX_ALLOWED_PACKET, OPT_NET_BUFFER_LENGTH, - OPT_SELECT_LIMIT, OPT_MAX_JOIN_SIZE, OPT_SSL_SSL, + OPT_OPTIMIZE, + OPT_TABLES, + OPT_MASTER_DATA, OPT_SSL_KEY, OPT_SSL_CERT, OPT_SSL_CA, OPT_SSL_CAPATH, - OPT_SSL_CIPHER, OPT_TLS_VERSION, OPT_SHUTDOWN_TIMEOUT, OPT_LOCAL_INFILE, - OPT_DELETE_MASTER_LOGS, OPT_COMPACT, - OPT_PROMPT, OPT_IGN_LINES,OPT_TRANSACTION,OPT_MYSQL_PROTOCOL, - OPT_FRM, OPT_SKIP_OPTIMIZATION, - OPT_COMPATIBLE, OPT_RECONNECT, OPT_DELIMITER, OPT_SECURE_AUTH, - OPT_OPEN_FILES_LIMIT, OPT_SET_CHARSET, OPT_SERVER_ARG, - OPT_STOP_POSITION, OPT_START_DATETIME, OPT_STOP_DATETIME, - OPT_SIGINT_IGNORE, OPT_HEXBLOB, OPT_ORDER_BY_PRIMARY, OPT_COUNT, - OPT_FLUSH_TABLES, - OPT_TRIGGERS, - OPT_MYSQL_ONLY_PRINT, - OPT_MYSQL_LOCK_DIRECTORY, - OPT_USE_THREADS, - OPT_IMPORT_USE_THREADS, - OPT_MYSQL_NUMBER_OF_QUERY, + OPT_SSL_CIPHER, OPT_LOCAL_INFILE, + OPT_COMPACT, + OPT_MYSQL_PROTOCOL, + OPT_SKIP_OPTIMIZATION, + OPT_COMPATIBLE, OPT_DELIMITER, + OPT_SERVER_ARG, + OPT_START_DATETIME, OPT_STOP_DATETIME, OPT_IGNORE_DATABASE, - OPT_IGNORE_TABLE,OPT_INSERT_IGNORE,OPT_SHOW_WARNINGS,OPT_DROP_DATABASE, - OPT_TZ_UTC, OPT_CREATE_SLAP_SCHEMA, - OPT_MYSQLDUMP_SLAVE_APPLY, + OPT_IGNORE_TABLE, OPT_MYSQLDUMP_SLAVE_DATA, - OPT_MYSQLDUMP_INCLUDE_MASTER_HOST_PORT, -#ifdef WHEN_FLASHBACK_REVIEW_READY - OPT_REVIEW, - OPT_REVIEW_DBNAME, OPT_REVIEW_TABLENAME, -#endif - OPT_SLAP_CSV, OPT_SLAP_CREATE_STRING, - OPT_SLAP_AUTO_GENERATE_SQL_LOAD_TYPE, OPT_SLAP_AUTO_GENERATE_WRITE_NUM, - OPT_SLAP_AUTO_GENERATE_ADD_AUTO, - OPT_SLAP_AUTO_GENERATE_GUID_PRIMARY, - OPT_SLAP_AUTO_GENERATE_EXECUTE_QUERIES, - OPT_SLAP_AUTO_GENERATE_SECONDARY_INDEXES, - OPT_SLAP_AUTO_GENERATE_UNIQUE_WRITE_NUM, - OPT_SLAP_AUTO_GENERATE_UNIQUE_QUERY_NUM, - OPT_SLAP_PRE_QUERY, - OPT_SLAP_POST_QUERY, - OPT_SLAP_PRE_SYSTEM, - OPT_SLAP_POST_SYSTEM, - OPT_SLAP_COMMIT, - OPT_SLAP_DETACH, - OPT_SLAP_NO_DROP, - OPT_MYSQL_REPLACE_INTO, OPT_BASE64_OUTPUT_MODE, OPT_SERVER_ID, - OPT_FIX_TABLE_NAMES, OPT_FIX_DB_NAMES, OPT_SSL_VERIFY_SERVER_CERT, - OPT_AUTO_VERTICAL_OUTPUT, - OPT_DEBUG_INFO, OPT_DEBUG_CHECK, OPT_COLUMN_TYPES, OPT_ERROR_LOG_FILE, - OPT_WRITE_BINLOG, OPT_DUMP_DATE, - OPT_INIT_COMMAND, + OPT_SLAP_CSV, + OPT_BASE64_OUTPUT_MODE, + OPT_FIX_TABLE_NAMES, OPT_FIX_DB_NAMES, + OPT_WRITE_BINLOG, OPT_PLUGIN_DIR, OPT_DEFAULT_AUTH, - OPT_ABORT_SOURCE_ON_ERROR, OPT_REWRITE_DB, - OPT_REPORT_PROGRESS, - OPT_SKIP_ANNOTATE_ROWS_EVENTS, OPT_SSL_CRL, OPT_SSL_CRLPATH, OPT_IGNORE_DATA, OPT_PRINT_ROW_COUNT, OPT_PRINT_ROW_EVENT_POSITIONS, OPT_CHECK_IF_UPGRADE_NEEDED, OPT_COMPATIBILTY_CLEARTEXT_PLUGIN, - OPT_SHUTDOWN_WAIT_FOR_SLAVES, - OPT_COPY_S3_TABLES, - OPT_PRINT_TABLE_METADATA, - OPT_ASOF_TIMESTAMP, + OPT_STOP_POSITION, + OPT_SERVER_ID, OPT_IGNORE_DOMAIN_IDS, OPT_DO_DOMAIN_IDS, OPT_IGNORE_SERVER_IDS, diff --git a/client/mysql.cc b/client/mysql.cc index ab4c3cd7..d9173cf6 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2018, Oracle and/or its affiliates. - Copyright (c) 2009, 2022, MariaDB Corporation. + Copyright (c) 2009, 2024, MariaDB Corporation. 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 @@ -226,7 +226,7 @@ typedef struct st_status ulong query_start_line; char *file_name; LINE_BUFFER *line_buff; - bool batch,add_to_history; + bool batch, add_to_history, sandbox; } STATUS; @@ -244,7 +244,7 @@ static my_bool ignore_errors=0,wait_flag=0,quick=0, vertical=0, line_numbers=1, column_names=1,opt_html=0, opt_xml=0,opt_nopager=1, opt_outfile=0, named_cmds= 0, tty_password= 0, opt_nobeep=0, opt_reconnect=1, - opt_secure_auth= 0, + opt_secure_auth= 0, default_pager_set= 0, opt_sigint_ignore= 0, auto_vertical_output= 0, show_warnings= 0, executing_query= 0, @@ -324,7 +324,8 @@ static int com_quit(String *str,char*), com_rehash(String *str, char*), com_tee(String *str, char*), com_notee(String *str, char*), com_charset(String *str,char*), com_prompt(String *str, char*), com_delimiter(String *str, char*), - com_warnings(String *str, char*), com_nowarnings(String *str, char*); + com_warnings(String *str, char*), com_nowarnings(String *str, char*), + com_sandbox(String *str, char*); #ifdef USE_POPEN static int com_nopager(String *str, char*), com_pager(String *str, char*), @@ -372,11 +373,12 @@ typedef struct { static COMMANDS commands[] = { { "?", '?', com_help, 1, "Synonym for `help'." }, + { "charset", 'C', com_charset, 1, + "Switch to another charset. Might be needed for processing binlog with multi-byte charsets." }, { "clear", 'c', com_clear, 0, "Clear the current input statement."}, { "connect",'r', com_connect,1, "Reconnect to the server. Optional arguments are db and host." }, - { "delimiter", 'd', com_delimiter, 1, - "Set statement delimiter." }, + { "delimiter", 'd', com_delimiter, 1, "Set statement delimiter." }, #ifdef USE_POPEN { "edit", 'e', com_edit, 0, "Edit command with $EDITOR."}, #endif @@ -389,6 +391,8 @@ static COMMANDS commands[] = { { "nopager",'n', com_nopager,0, "Disable pager, print to stdout." }, #endif { "notee", 't', com_notee, 0, "Don't write into outfile." }, + { "nowarning", 'w', com_nowarnings, 0, + "Don't show warnings after every statement." }, #ifdef USE_POPEN { "pager", 'P', com_pager, 1, "Set PAGER [to_pager]. Print the query results via PAGER." }, @@ -397,6 +401,8 @@ static COMMANDS commands[] = { { "prompt", 'R', com_prompt, 1, "Change your mysql prompt."}, { "quit", 'q', com_quit, 0, "Quit mysql." }, { "rehash", '#', com_rehash, 0, "Rebuild completion hash." }, + { "sandbox", '-', com_sandbox, 0, + "Disallow commands that access the file system (except \\P without an argument and \\e)." }, { "source", '.', com_source, 1, "Execute an SQL script file. Takes a file name as an argument."}, { "status", 's', com_status, 0, "Get status information from the server."}, @@ -407,12 +413,8 @@ static COMMANDS commands[] = { "Set outfile [to_outfile]. Append everything into given outfile." }, { "use", 'u', com_use, 1, "Use another database. Takes database name as argument." }, - { "charset", 'C', com_charset, 1, - "Switch to another charset. Might be needed for processing binlog with multi-byte charsets." }, { "warnings", 'W', com_warnings, 0, "Show warnings after every statement." }, - { "nowarning", 'w', com_nowarnings, 0, - "Don't show warnings after every statement." }, /* Get bash-like expansion for some commands */ { "create table", 0, 0, 0, ""}, { "create database", 0, 0, 0, ""}, @@ -1636,35 +1638,47 @@ static struct my_option my_long_options[] = 0, 0, 0, 0, 0}, {"help", 'I', "Synonym for -?", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"abort-source-on-error", OPT_ABORT_SOURCE_ON_ERROR, + {"abort-source-on-error", 0, "Abort 'source filename' operations in case of errors", &batch_abort_on_error, &batch_abort_on_error, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-rehash", OPT_AUTO_REHASH, + {"auto-rehash", 0, "Enable automatic rehashing. One doesn't need to use 'rehash' to get table " - "and field completion, but startup and reconnecting may take a longer time. " - "Disable with --disable-auto-rehash.", - &opt_rehash, &opt_rehash, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, - 0, 0}, + "and field completion, but startup and reconnecting may take a longer time.", + &opt_rehash, &opt_rehash, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"no-auto-rehash", 'A', "No automatic rehashing. One has to use 'rehash' to get table and field " "completion. This gives a quicker start of mysql and disables rehashing " "on reconnect.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-vertical-output", OPT_AUTO_VERTICAL_OUTPUT, + {"auto-vertical-output", 0, "Automatically switch to vertical output mode if the result is wider " - "than the terminal width.", - &auto_vertical_output, &auto_vertical_output, 0, GET_BOOL, NO_ARG, 0, - 0, 0, 0, 0, 0}, + "than the terminal width.", &auto_vertical_output, &auto_vertical_output, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"batch", 'B', "Don't use history file. Disable interactive behavior. (Enables --silent.)", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"binary-as-hex", 0, "Print binary data as hex", &opt_binhex, &opt_binhex, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"binary-mode", 0, + "Binary mode allows certain character sequences to be processed as data " + "that would otherwise be treated with a special meaning by the parser. " + "Specifically, this switch turns off parsing of all client commands except " + "\\C and DELIMITER in non-interactive mode (i.e., when binary mode is " + "combined with either 1) piped input, 2) the --batch mysql option, or 3) " + "the 'source' command). Also, in binary mode, occurrences of '\\r\\n' and " + "ASCII '\\0' are preserved within strings, whereas by default, '\\r\\n' is " + "translated to '\\n' and '\\0' is disallowed in user input.", + &opt_binary_mode, &opt_binary_mode, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"character-sets-dir", OPT_CHARSETS_DIR, "Directory for character set files.", &charsets_dir, &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"column-type-info", OPT_COLUMN_TYPES, "Display column type information.", + {"column-names", 0, "Write column names in results.", + &column_names, &column_names, 0, GET_BOOL, + NO_ARG, 1, 0, 0, 0, 0, 0}, + {"skip-column-names", 'N', "Don't write column names in results.", 0, 0, 0, + GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"column-type-info", 0, "Display column type information.", &column_types_flag, &column_types_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"comments", 'c', "Preserve comments. Send comments to the server." @@ -1674,6 +1688,16 @@ static struct my_option my_long_options[] = {"compress", 'C', "Use compression in server/client protocol.", &opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"connect-expired-password", 0, + "Notify the server that this client is prepared to handle expired " + "password sandbox mode even if --batch was specified.", + &opt_connect_expired_password, &opt_connect_expired_password, 0, GET_BOOL, + NO_ARG, 0, 0, 0, 0, 0, 0}, + {"connect_timeout", 0, "Number of seconds before connection timeout.", + &opt_connect_timeout, &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, + 0, 0, 3600*12, 0, 0, 0}, + {"database", 'D', "Database to use.", ¤t_db, + ¤t_db, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #ifdef DBUG_OFF {"debug", '#', "This is a non-debug version. Catch this and exit.", 0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0}, @@ -1681,70 +1705,64 @@ static struct my_option my_long_options[] = {"debug", '#', "Output debug log.", &default_dbug_option, &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"debug-info", 'T', "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"database", 'D', "Database to use.", ¤t_db, - ¤t_db, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-auth", 0, "Default authentication client-side plugin to use.", + &opt_default_auth, &opt_default_auth, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"default-character-set", 0, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"delimiter", OPT_DELIMITER, "Delimiter to be used.", &delimiter_str, &delimiter_str, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"enable-cleartext-plugin", OPT_COMPATIBILTY_CLEARTEXT_PLUGIN, + "Obsolete option. Exists only for MySQL compatibility.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"execute", 'e', "Execute command and quit. (Disables --force and history file.)", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"enable-cleartext-plugin", OPT_COMPATIBILTY_CLEARTEXT_PLUGIN, "Obsolete option. Exists only for MySQL compatibility.", - 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"vertical", 'E', "Print the output of a query (rows) vertically.", - &vertical, &vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, - 0}, - {"force", 'f', "Continue even if we get an SQL error. Sets abort-source-on-error to 0", - &ignore_errors, &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0, - 0, 0, 0, 0}, + {"force", 'f', + "Continue even if we get an SQL error. Sets abort-source-on-error to 0", + &ignore_errors, &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"host", 'h', "Connect to host.", ¤t_host, + ¤t_host, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"html", 'H', "Produce HTML output.", &opt_html, &opt_html, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"ignore-spaces", 'i', "Ignore space after function names.", + &ignore_spaces, &ignore_spaces, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"init-command", 0, + "SQL Command to execute when connecting to MariaDB server. Will " + "automatically be re-executed when reconnecting.", &opt_init_command, + &opt_init_command, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"line-numbers", 0, "Write line numbers for errors.", + &line_numbers, &line_numbers, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + {"skip-line-numbers", 'L', "Don't write line number for errors.", 0, 0, 0, + GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"local-infile", OPT_LOCAL_INFILE, "Enable LOAD DATA LOCAL INFILE.", + &opt_local_infile, &opt_local_infile, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0}, + {"max-allowed-packet", 0, + "The maximum packet length to send to or receive from server.", + &opt_max_allowed_packet, &opt_max_allowed_packet, 0, GET_ULONG, + REQUIRED_ARG, 16*1024LL*1024LL, 4096, 2*1024LL*1024LL*1024LL, 0, 1024, 0}, + {"max-join-size", 0, + "Automatic limit for rows in a join when using --safe-updates.", + &max_join_size, &max_join_size, 0, GET_ULONG, REQUIRED_ARG, 1000000L, + 1, ULONG_MAX, 0, 1, 0}, {"named-commands", 'G', "Enable named commands. Named commands mean this program's internal " "commands; see mysql> help . When enabled, the named commands can be " "used from any line of the query, otherwise only from the first line, " "before an enter. Disable with --disable-named-commands. This option " "is disabled by default.", - &named_cmds, &named_cmds, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, - {"ignore-spaces", 'i', "Ignore space after function names.", - &ignore_spaces, &ignore_spaces, 0, GET_BOOL, NO_ARG, 0, 0, - 0, 0, 0, 0}, - {"init-command", OPT_INIT_COMMAND, - "SQL Command to execute when connecting to MariaDB server. Will " - "automatically be re-executed when reconnecting.", - &opt_init_command, &opt_init_command, 0, - GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"local-infile", OPT_LOCAL_INFILE, "Enable/disable LOAD DATA LOCAL INFILE.", - &opt_local_infile, &opt_local_infile, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0}, + &named_cmds, &named_cmds, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"net-buffer-length", 0, + "The buffer size for TCP/IP and socket communication.", + &opt_net_buffer_length, &opt_net_buffer_length, 0, GET_ULONG, + REQUIRED_ARG, 16384, 1024, 512*1024ULL*1024ULL, MALLOC_OVERHEAD, 1024, 0}, {"no-beep", 'b', "Turn off beep on error.", &opt_nobeep, &opt_nobeep, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"host", 'h', "Connect to host.", ¤t_host, - ¤t_host, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"html", 'H', "Produce HTML output.", &opt_html, &opt_html, - 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"xml", 'X', "Produce XML output.", &opt_xml, &opt_xml, 0, - GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"line-numbers", OPT_LINE_NUMBERS, "Write line numbers for errors.", - &line_numbers, &line_numbers, 0, GET_BOOL, - NO_ARG, 1, 0, 0, 0, 0, 0}, - {"skip-line-numbers", 'L', "Don't write line number for errors.", 0, 0, 0, GET_NO_ARG, - NO_ARG, 0, 0, 0, 0, 0, 0}, - {"unbuffered", 'n', "Flush buffer after each query.", &unbuffered, - &unbuffered, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"column-names", OPT_COLUMN_NAMES, "Write column names in results.", - &column_names, &column_names, 0, GET_BOOL, - NO_ARG, 1, 0, 0, 0, 0, 0}, - {"skip-column-names", 'N', - "Don't write column names in results.", - 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"sigint-ignore", OPT_SIGINT_IGNORE, "Ignore SIGINT (CTRL-C).", - &opt_sigint_ignore, &opt_sigint_ignore, 0, GET_BOOL, - NO_ARG, 0, 0, 0, 0, 0, 0}, {"one-database", 'o', "Ignore statements except those that occur while the default " "database is the one named at the command line.", @@ -1765,19 +1783,20 @@ static struct my_option my_long_options[] = {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, #endif + {"plugin-dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, + &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " "order of preference, my.cnf, $MYSQL_TCP_PORT, " #if MYSQL_PORT_DEFAULT == 0 "/etc/services, " #endif - "built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").", - &opt_mysql_port, - &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"progress-reports", OPT_REPORT_PROGRESS, + "built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").", &opt_mysql_port, + &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"progress-reports", 0, "Get progress reports for long running commands (like ALTER TABLE)", &opt_progress_reports, &opt_progress_reports, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"prompt", OPT_PROMPT, "Set the command line prompt to this value.", + {"prompt", 0, "Set the command line prompt to this value.", ¤t_prompt, ¤t_prompt, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"protocol", OPT_MYSQL_PROTOCOL, "The protocol to use for connection (tcp, socket, pipe).", @@ -1788,11 +1807,27 @@ static struct my_option my_long_options[] = "if the output is suspended. Doesn't use history file.", &quick, &quick, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"raw", 'r', "Write fields without conversion. Used with --batch.", - &opt_raw_data, &opt_raw_data, 0, GET_BOOL, NO_ARG, 0, 0, 0, - 0, 0, 0}, - {"reconnect", OPT_RECONNECT, "Reconnect if the connection is lost. Disable " - "with --disable-reconnect. This option is enabled by default.", + &opt_raw_data, &opt_raw_data, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"reconnect", 0, "Reconnect if the connection is lost.", &opt_reconnect, &opt_reconnect, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + {"safe-updates", 'U', "Only allow UPDATE and DELETE that uses keys.", + &safe_updates, &safe_updates, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"i-am-a-dummy", 'U', "Synonym for option --safe-updates, -U.", + &safe_updates, &safe_updates, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"sandbox", 0, "Disallow commands that access the file system (except \\P without an argument and \\e).", + &status.sandbox, &status.sandbox, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"secure-auth", 0, "Refuse client connecting to server if it" + " uses old (pre-4.1.1) protocol.", &opt_secure_auth, + &opt_secure_auth, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"select-limit", 0, + "Automatic limit for SELECT when using --safe-updates.", &select_limit, + &select_limit, 0, GET_ULONG, REQUIRED_ARG, 1000L, 1, ULONG_MAX, 0, 1, 0}, + {"server-arg", OPT_SERVER_ARG, "Send embedded server this as a parameter.", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"show-warnings", 0, "Show warnings after every statement.", + &show_warnings, &show_warnings, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"sigint-ignore", 0, "Ignore SIGINT (CTRL-C).", &opt_sigint_ignore, + &opt_sigint_ignore, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"silent", 's', "Be more silent. Print results with a tab as separator, " "each row on new line.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"socket", 'S', "The socket file to use for connection.", @@ -1806,73 +1841,22 @@ static struct my_option my_long_options[] = "Does not work in batch mode. Disable with --disable-tee. " "This option is disabled by default.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"unbuffered", 'n', "Flush buffer after each query.", &unbuffered, + &unbuffered, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, #ifndef DONT_ALLOW_USER_CHANGE {"user", 'u', "User for login if not current user.", ¤t_user, ¤t_user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"safe-updates", 'U', "Only allow UPDATE and DELETE that uses keys.", - &safe_updates, &safe_updates, 0, GET_BOOL, NO_ARG, 0, 0, - 0, 0, 0, 0}, - {"i-am-a-dummy", 'U', "Synonym for option --safe-updates, -U.", - &safe_updates, &safe_updates, 0, GET_BOOL, NO_ARG, 0, 0, - 0, 0, 0, 0}, {"verbose", 'v', "Write more. (-v -v -v gives the table output format).", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"vertical", 'E', "Print the output of a query (rows) vertically.", + &vertical, &vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"connect_timeout", OPT_CONNECT_TIMEOUT, - "Number of seconds before connection timeout.", - &opt_connect_timeout, &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, - 0, 0, 3600*12, 0, 0, 0}, - {"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, - "The maximum packet length to send to or receive from server.", - &opt_max_allowed_packet, &opt_max_allowed_packet, 0, - GET_ULONG, REQUIRED_ARG, 16 *1024L*1024L, 4096, - (longlong) 2*1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0}, - {"net_buffer_length", OPT_NET_BUFFER_LENGTH, - "The buffer size for TCP/IP and socket communication.", - &opt_net_buffer_length, &opt_net_buffer_length, 0, GET_ULONG, - REQUIRED_ARG, 16384, 1024, 512*1024*1024L, MALLOC_OVERHEAD, 1024, 0}, - {"select_limit", OPT_SELECT_LIMIT, - "Automatic limit for SELECT when using --safe-updates.", - &select_limit, &select_limit, 0, GET_ULONG, REQUIRED_ARG, 1000L, - 1, ULONG_MAX, 0, 1, 0}, - {"max_join_size", OPT_MAX_JOIN_SIZE, - "Automatic limit for rows in a join when using --safe-updates.", - &max_join_size, &max_join_size, 0, GET_ULONG, REQUIRED_ARG, 1000000L, - 1, ULONG_MAX, 0, 1, 0}, - {"secure-auth", OPT_SECURE_AUTH, "Refuse client connecting to server if it" - " uses old (pre-4.1.1) protocol.", &opt_secure_auth, - &opt_secure_auth, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"server-arg", OPT_SERVER_ARG, "Send embedded server this as a parameter.", - 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"show-warnings", OPT_SHOW_WARNINGS, "Show warnings after every statement.", - &show_warnings, &show_warnings, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", - &opt_plugin_dir, &opt_plugin_dir, 0, - GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, - "Default authentication client-side plugin to use.", - &opt_default_auth, &opt_default_auth, 0, - GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"binary-mode", 0, - "Binary mode allows certain character sequences to be processed as data " - "that would otherwise be treated with a special meaning by the parser. " - "Specifically, this switch turns off parsing of all client commands except " - "\\C and DELIMITER in non-interactive mode (i.e., when binary mode is " - "combined with either 1) piped input, 2) the --batch mysql option, or 3) " - "the 'source' command). Also, in binary mode, occurrences of '\\r\\n' and " - "ASCII '\\0' are preserved within strings, whereas by default, '\\r\\n' is " - "translated to '\\n' and '\\0' is disallowed in user input.", - &opt_binary_mode, &opt_binary_mode, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"connect-expired-password", 0, - "Notify the server that this client is prepared to handle expired " - "password sandbox mode even if --batch was specified.", - &opt_connect_expired_password, &opt_connect_expired_password, 0, GET_BOOL, - NO_ARG, 0, 0, 0, 0, 0, 0}, + {"xml", 'X', "Produce XML output.", &opt_xml, &opt_xml, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; @@ -2924,9 +2908,7 @@ static void initialize_readline () array of matches, or NULL if there aren't any. */ -static char **new_mysql_completion(const char *text, - int start __attribute__((unused)), - int end __attribute__((unused))) +static char **new_mysql_completion(const char *text, int, int) { if (!status.batch && !quick) #if defined(USE_NEW_READLINE_INTERFACE) @@ -3249,8 +3231,7 @@ static void print_help_item(MYSQL_ROW *cur, int num_name, int num_cat, char *las } -static int com_server_help(String *buffer __attribute__((unused)), - char *line __attribute__((unused)), char *help_arg) +static int com_server_help(String *buffer, char *, char *help_arg) { MYSQL_ROW cur; const char *server_cmd; @@ -3352,18 +3333,16 @@ err: return error; } -static int -com_help(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_help(String *buffer, char *line) { int i, j; char * help_arg= strchr(line,' '), buff[32], *end; if (help_arg) { - while (my_isspace(charset_info,*help_arg)) + while (my_isspace(charset_info, *help_arg)) help_arg++; if (*help_arg) - return com_server_help(buffer,line,help_arg); + return com_server_help(buffer, line, help_arg); } put_info("\nGeneral information about MariaDB can be found at\n" @@ -3386,9 +3365,7 @@ com_help(String *buffer __attribute__((unused)), } - /* ARGSUSED */ -static int -com_clear(String *buffer,char *line __attribute__((unused))) +static int com_clear(String *buffer,char *) { #ifdef HAVE_READLINE if (status.add_to_history) @@ -3413,9 +3390,7 @@ static void adjust_console_codepage(const char *name __attribute__((unused))) } - /* ARGSUSED */ -static int -com_charset(String *buffer __attribute__((unused)), char *line) +static int com_charset(String *, char *line) { char buff[256], *param; CHARSET_INFO * new_cs; @@ -3448,8 +3423,7 @@ com_charset(String *buffer __attribute__((unused)), char *line) */ -static int -com_go(String *buffer,char *line __attribute__((unused))) +static int com_go(String *buffer, char *) { char buff[200]; /* about 110 chars used so far */ char time_buff[53+3+1]; /* time max + space & parens + NUL */ @@ -4032,9 +4006,7 @@ tee_print_sized_data(const char *data, unsigned int data_length, unsigned int to } - -static void -print_table_data_html(MYSQL_RES *result) +static void print_table_data_html(MYSQL_RES *result) { MYSQL_ROW cur; MYSQL_FIELD *field; @@ -4330,15 +4302,15 @@ print_tab_data(MYSQL_RES *result) } } -static int -com_tee(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_tee(String *, char *line) { char file_name[FN_REFLEN], *end, *param; + if (status.sandbox) + return put_info("Not allowed in the sandbox mode", INFO_ERROR, 0); if (status.batch) return 0; - while (my_isspace(charset_info,*line)) + while (my_isspace(charset_info, *line)) line++; if (!(param = strchr(line, ' '))) // if outfile wasn't given, use the default { @@ -4375,9 +4347,7 @@ com_tee(String *buffer __attribute__((unused)), } -static int -com_notee(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_notee(String *, char *) { if (opt_outfile) end_tee(); @@ -4390,9 +4360,7 @@ com_notee(String *buffer __attribute__((unused)), */ #ifdef USE_POPEN -static int -com_pager(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_pager(String *, char *line) { char pager_name[FN_REFLEN], *end, *param; @@ -4420,6 +4388,8 @@ com_pager(String *buffer __attribute__((unused)), } else { + if (status.sandbox) + return put_info("Not allowed in the sandbox mode", INFO_ERROR, 0); end= strmake_buf(pager_name, param); while (end > pager_name && (my_isspace(charset_info,end[-1]) || my_iscntrl(charset_info,end[-1]))) @@ -4434,9 +4404,7 @@ com_pager(String *buffer __attribute__((unused)), } -static int -com_nopager(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_nopager(String *, char *) { strmov(pager, "stdout"); opt_nopager=1; @@ -4448,7 +4416,7 @@ com_nopager(String *buffer __attribute__((unused)), #ifdef USE_POPEN static int -com_edit(String *buffer,char *line __attribute__((unused))) +com_edit(String *buffer,char *) { char filename[FN_REFLEN],buff[160]; int fd,tmp,error; @@ -4495,17 +4463,15 @@ err: /* If arg is given, exit without errors. This happens on command 'quit' */ -static int -com_quit(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_quit(String *, char *) { status.exit_status=0; return 1; } static int -com_rehash(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +com_rehash(String *, + char *) { #ifdef HAVE_READLINE build_completion_hash(1, 0); @@ -4515,12 +4481,13 @@ com_rehash(String *buffer __attribute__((unused)), #ifdef USE_POPEN -static int -com_shell(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_shell(String *, char *line) { char *shell_cmd; + if (status.sandbox) + return put_info("Not allowed in the sandbox mode", INFO_ERROR, 0); + /* Skip space from line begin */ while (my_isspace(charset_info, *line)) line++; @@ -4543,8 +4510,7 @@ com_shell(String *buffer __attribute__((unused)), #endif -static int -com_print(String *buffer,char *line __attribute__((unused))) +static int com_print(String *buffer,char *) { tee_puts("--------------", stdout); (void) tee_fputs(buffer->c_ptr(), stdout); @@ -4554,9 +4520,8 @@ com_print(String *buffer,char *line __attribute__((unused))) return 0; /* If empty buffer */ } - /* ARGSUSED */ -static int -com_connect(String *buffer, char *line) + +static int com_connect(String *buffer, char *line) { char *tmp, buff[256]; my_bool save_rehash= opt_rehash; @@ -4609,8 +4574,7 @@ com_connect(String *buffer, char *line) } -static int com_source(String *buffer __attribute__((unused)), - char *line) +static int com_source(String *, char *line) { char source_name[FN_REFLEN], *end, *param; LINE_BUFFER *line_buff; @@ -4619,6 +4583,9 @@ static int com_source(String *buffer __attribute__((unused)), FILE *sql_file; my_bool save_ignore_errors; + if (status.sandbox) + return put_info("Not allowed in the sandbox mode", INFO_ERROR, 0); + /* Skip space from file name */ while (my_isspace(charset_info,*line)) line++; @@ -4653,6 +4620,7 @@ static int com_source(String *buffer __attribute__((unused)), bfill((char*) &status,sizeof(status),(char) 0); status.batch=old_status.batch; // Run in batch mode + status.sandbox=old_status.sandbox; status.line_buff=line_buff; status.file_name=source_name; glob_buffer.length(0); // Empty command buffer @@ -4674,9 +4642,7 @@ static int com_source(String *buffer __attribute__((unused)), } - /* ARGSUSED */ -static int -com_delimiter(String *buffer __attribute__((unused)), char *line) +static int com_delimiter(String *, char *line) { char buff[256], *tmp; @@ -4703,9 +4669,7 @@ com_delimiter(String *buffer __attribute__((unused)), char *line) return 0; } - /* ARGSUSED */ -static int -com_use(String *buffer __attribute__((unused)), char *line) +static int com_use(String *, char *line) { char *tmp, buff[FN_REFLEN + 1]; int select_db; @@ -4778,18 +4742,21 @@ com_use(String *buffer __attribute__((unused)), char *line) return 0; } -static int -com_warnings(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_sandbox(String *, char *) +{ + status.sandbox= 1; + put_info("Sandbox mode.", INFO_INFO); + return 0; +} + +static int com_warnings(String *, char *) { show_warnings = 1; put_info("Show warnings enabled.",INFO_INFO); return 0; } -static int -com_nowarnings(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_nowarnings(String *, char *) { show_warnings = 0; put_info("Show warnings disabled.",INFO_INFO); @@ -5041,10 +5008,7 @@ sql_connect(char *host,char *database,char *user,char *password,uint silent) } - -static int -com_status(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_status(String *, char *) { const char *status_str; char buff[40]; @@ -5169,8 +5133,7 @@ select_limit, max_join_size); return 0; } -static const char * -server_version_string(MYSQL *con) +static const char * server_version_string(MYSQL *con) { /* Only one thread calls this, so no synchronization is needed */ if (server_version == NULL) @@ -5295,8 +5258,7 @@ put_info(const char *str,INFO_TYPE info_type, uint error, const char *sqlstate) } -static int -put_error(MYSQL *con) +static int put_error(MYSQL *con) { return put_info(mysql_error(con), INFO_ERROR, mysql_errno(con), mysql_sqlstate(con)); @@ -5362,7 +5324,7 @@ void tee_putc(int c, FILE *file) len("4294967296 days, 23 hours, 59 minutes, 60.000 seconds") -> 53 */ -static void nice_time(double sec,char *buff,bool part_second) +static void nice_time(double sec, char *buff, bool part_second) { ulong tmp; if (sec >= 3600.0*24) @@ -5643,8 +5605,7 @@ static void init_username() } } -static int com_prompt(String *buffer __attribute__((unused)), - char *line) +static int com_prompt(String *, char *line) { char *ptr=strchr(line, ' '); prompt_counter = 0; diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index 7bac797f..fd6e1abc 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -1,6 +1,6 @@ /* Copyright (c) 2006, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2017, MariaDB + Copyright (c) 2010, 2024, MariaDB 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 @@ -87,10 +87,10 @@ static struct my_option my_long_options[]= {"basedir", 'b', "Not used by mysql_upgrade. Only for backward compatibility.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"character-sets-dir", OPT_CHARSETS_DIR, + {"character-sets-dir", 0, "Not used by mysql_upgrade. Only for backward compatibility.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, - {"compress", OPT_COMPRESS, + {"compress", 0, "Not used by mysql_upgrade. Only for backward compatibility.", ¬_used, ¬_used, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"datadir", 'd', @@ -103,12 +103,12 @@ static struct my_option my_long_options[]= {"debug", '#', "Output debug log.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"debug-info", 'T', "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-character-set", 0, "Not used by mysql_upgrade. Only for backward compatibility.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"default_auth", OPT_DEFAULT_AUTH, diff --git a/client/mysqladmin.cc b/client/mysqladmin.cc index 69bd3cd7..01b012d3 100644 --- a/client/mysqladmin.cc +++ b/client/mysqladmin.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2010, 2019, MariaDB + Copyright (c) 2010, 2024, MariaDB 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 @@ -141,10 +141,10 @@ static struct my_option my_long_options[] = {"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"force", 'f', @@ -158,7 +158,7 @@ static struct my_option my_long_options[] = {"character-sets-dir", OPT_CHARSETS_DIR, "Directory for character set files.", &charsets_dir, &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-character-set", 0, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG, @@ -216,21 +216,21 @@ static struct my_option my_long_options[] = 0, 0, 0}, {"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_UINT, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"connect_timeout", OPT_CONNECT_TIMEOUT, "", &opt_connect_timeout, + {"connect_timeout", 0, "", &opt_connect_timeout, &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 3600*12, 0, 3600*12, 0, 1, 0}, - {"shutdown_timeout", OPT_SHUTDOWN_TIMEOUT, "", &opt_shutdown_timeout, + {"shutdown_timeout", 0, "", &opt_shutdown_timeout, &opt_shutdown_timeout, 0, GET_ULONG, REQUIRED_ARG, SHUTDOWN_DEF_TIMEOUT, 0, 3600*12, 0, 1, 0}, - {"wait_for_all_slaves", OPT_SHUTDOWN_WAIT_FOR_SLAVES, + {"wait_for_all_slaves", 0, "Defers shutdown until after all binlogged events have been sent to " "all connected slaves", &opt_shutdown_wait_for_slaves, &opt_shutdown_wait_for_slaves, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -1405,7 +1405,9 @@ static void usage(void) refresh Flush all tables and close and open logfiles\n\ shutdown Take server down\n\ status Gives a short status message from the server\n\ + start-all-slaves Start all slaves\n\ start-slave Start slave\n\ + stop-all-slaves Stop all slaves\n\ stop-slave Stop slave\n\ variables Prints variables available\n\ version Get version info from server"); diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 3d22f091..8caf39b2 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2009, 2020, MariaDB + Copyright (c) 2009, 2024, MariaDB 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 @@ -1682,7 +1682,7 @@ static struct my_option my_options[] = like this: SET @`a`:=_cp850 0x4DFC6C6C6572 COLLATE `cp850_general_ci`; */ - {"character-sets-dir", OPT_CHARSETS_DIR, + {"character-sets-dir", 0, "Directory for character set files.", &charsets_dir, &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"database", 'd', "List entries for just this database (local log only).", @@ -1692,13 +1692,13 @@ static struct my_option my_options[] = {"debug", '#', "Output debug log.", ¤t_dbug_option, ¤t_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit .", + {"debug-check", 0, "Check memory and open file usage at exit .", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -1734,7 +1734,7 @@ static struct my_option my_options[] = 0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"password", 'p', "Password to connect to remote server.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugindir, &opt_plugindir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " @@ -1760,14 +1760,14 @@ static struct my_option my_options[] = &result_file_name, &result_file_name, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #ifdef WHEN_FLASHBACK_REVIEW_READY - {"review", opt_flashback_review, "Print review sql in output file.", + {"review", 0, "Print review sql in output file.", &opt_flashback_review, &opt_flashback_review, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"review-dbname", opt_flashback_flashback_review_dbname, + {"review-dbname", 0, "Writing flashback original row data into this db", &flashback_review_dbname, &flashback_review_dbname, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"review-tablename", opt_flashback_flashback_review_tablename, + {"review-tablename", 0, "Writing flashback original row data into this table", &flashback_review_tablename, &flashback_review_tablename, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -1817,7 +1817,7 @@ static struct my_option my_options[] = "Alias for --do-server-ids.", &server_id_str, &server_id_str, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"set-charset", OPT_SET_CHARSET, + {"set-charset", 0, "Add 'SET NAMES character_set' to the output.", &charset, &charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"short-form", 's', "Just show regular queries: no extra info, no " @@ -1900,7 +1900,7 @@ that may lead to an endless loop.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"open_files_limit", OPT_OPEN_FILES_LIMIT, + {"open_files_limit", 0, "Used to reserve file descriptors for use by this program.", &open_files_limit, &open_files_limit, 0, GET_ULONG, REQUIRED_ARG, MY_NFILE, 8, OS_FILE_LIMIT, 0, 1, 0}, @@ -1926,12 +1926,12 @@ that may lead to an endless loop.", "Updates to a database with a different name than the original. \ Example: rewrite-db='from->to'.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"skip-annotate-row-events", OPT_SKIP_ANNOTATE_ROWS_EVENTS, + {"skip-annotate-row-events", 0, "Don't print Annotate_rows events stored in the binary log.", (uchar**) &opt_skip_annotate_row_events, (uchar**) &opt_skip_annotate_row_events, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"print-table-metadata", OPT_PRINT_TABLE_METADATA, + {"print-table-metadata", 0, "Print metadata stored in Table_map_log_event", &opt_print_table_metadata, &opt_print_table_metadata, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -2362,11 +2362,6 @@ get_one_option(const struct my_option *opt, const char *argument, die(1); } break; -#ifdef WHEN_FLASHBACK_REVIEW_READY - case opt_flashback_review: - opt_flashback_review= 1; - break; -#endif case OPT_START_DATETIME: start_datetime= convert_str_to_timestamp(start_datetime_str); break; @@ -3546,7 +3541,8 @@ int main(int argc, char** argv) { if (!opt_version) { - usage(); + error("Please provide the log file(s). Run with '--help' for usage " + "instructions."); retval= ERROR_STOP; } goto err; diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index 2f366ec0..fc93c416 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2012, MariaDB + Copyright (c) 2010, 2024, MariaDB 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 @@ -82,11 +82,11 @@ static struct my_option my_long_options[] = "Instead of issuing one query for each table, use one query per database, naming all tables in the database in a comma-separated list.", &opt_all_in_1, &opt_all_in_1, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-repair", OPT_AUTO_REPAIR, + {"auto-repair", 0, "If a checked table is corrupted, automatically fix it. Repairing will be done after all tables have been checked, if corrupted ones were found.", &opt_auto_repair, &opt_auto_repair, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"character-sets-dir", OPT_CHARSETS_DIR, + {"character-sets-dir", 0, "Directory for character set files.", (char**) &charsets_dir, (char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"check", 'c', "Check table for errors.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, @@ -97,7 +97,7 @@ static struct my_option my_long_options[] = {"check-upgrade", 'g', "Check tables for version-dependent changes. May be used with --auto-repair to correct tables requiring version-dependent updates.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"compress", OPT_COMPRESS, "Use compression in server/client protocol.", + {"compress", 0, "Use compression in server/client protocol.", &opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"databases", 'B', @@ -111,16 +111,16 @@ static struct my_option my_long_options[] = {"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-character-set", 0, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -140,7 +140,7 @@ static struct my_option my_long_options[] = "If you are using this option with CHECK TABLE, it will ensure that the table is 100 percent consistent, but will take a long time. If you are using this option with REPAIR TABLE, it will force using old slow repair with keycache method, instead of much faster repair by sorting.", &opt_extended, &opt_extended, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"flush", OPT_FLUSH_TABLES, "Flush each table after check. This is useful if you don't want to have the checked tables take up space in the caches after the check", + {"flush", 0, "Flush each table after check. This is useful if you don't want to have the checked tables take up space in the caches after the check", &opt_flush_tables, &opt_flush_tables, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, {"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG, @@ -150,7 +150,7 @@ static struct my_option my_long_options[] = {"medium-check", 'm', "Faster than extended-check, but only finds 99.99 percent of all errors. Should be good enough for most cases.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"write-binlog", OPT_WRITE_BINLOG, + {"write-binlog", 0, "Log ANALYZE, OPTIMIZE and REPAIR TABLE commands. Use --skip-write-binlog " "when commands should not be sent to replication slaves.", &opt_write_binlog, &opt_write_binlog, 0, GET_BOOL, NO_ARG, @@ -168,7 +168,7 @@ static struct my_option my_long_options[] = {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " @@ -199,7 +199,7 @@ static struct my_option my_long_options[] = #include {"tables", OPT_TABLES, "Overrides option --databases (-B).", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"use-frm", OPT_FRM, + {"use-frm", 0, "When used with REPAIR, get table structure from .frm file, so the table can be repaired even if .MYI header is corrupted.", &opt_frm, &opt_frm, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -897,6 +897,7 @@ static int disable_binlog() return run_query("SET SQL_LOG_BIN=0", 0); } + static int handle_request_for_tables(char *tables, size_t length, my_bool view, my_bool dont_quote) { @@ -1028,7 +1029,10 @@ static void insert_table_name(DYNAMIC_ARRAY *arr, char *in, size_t dblen) insert_dynamic(arr, (uchar*) buf); } -static void print_result() +/* Ok as mysqlcheck is not multi threaded */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + +static void __attribute__((noinline)) print_result() { MYSQL_RES *res; MYSQL_ROW row; @@ -1119,6 +1123,7 @@ static void print_result() mysql_free_result(res); DBUG_VOID_RETURN; } +PRAGMA_REENABLE_CHECK_STACK_FRAME static int dbConnect(char *host, char *user, char *passwd) diff --git a/client/mysqldump.c b/client/mysqldump.c index 0a6ebf0e..3ef8b1d6 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2020, MariaDB Corporation. + Copyright (c) 2010, 2024, MariaDB Corporation. 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 @@ -166,7 +166,6 @@ static my_bool server_supports_switching_charsets= TRUE; static ulong opt_compatible_mode= 0; #define MYSQL_OPT_MASTER_DATA_EFFECTIVE_SQL 1 #define MYSQL_OPT_MASTER_DATA_COMMENTED_SQL 2 -#define MYSQL_OPT_MAX_STATEMENT_TIME 0 #define MYSQL_OPT_SLAVE_DATA_EFFECTIVE_SQL 1 #define MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL 2 static uint opt_mysql_port= 0, opt_master_data; @@ -250,41 +249,36 @@ static struct my_option my_long_options[] = { {"all-databases", 'A', "Dump all the databases. This will be same as --databases with all databases selected.", - &opt_alldbs, &opt_alldbs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, + &opt_alldbs, &opt_alldbs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"all-tablespaces", 'Y', "Dump all the tablespaces.", - &opt_alltspcs, &opt_alltspcs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, + &opt_alltspcs, &opt_alltspcs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"no-tablespaces", 'y', "Do not dump any tablespace information.", - &opt_notspcs, &opt_notspcs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, - {"add-drop-database", OPT_DROP_DATABASE, "Add a DROP DATABASE before each create.", + &opt_notspcs, &opt_notspcs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"add-drop-database", 0, "Add a DROP DATABASE before each create.", &opt_drop_database, &opt_drop_database, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"add-drop-table", OPT_DROP, "Add a DROP TABLE before each create.", - &opt_drop, &opt_drop, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, - 0}, + {"add-drop-table", 0, "Add a DROP TABLE before each create.", + &opt_drop, &opt_drop, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"add-drop-trigger", 0, "Add a DROP TRIGGER before each create.", &opt_drop_trigger, &opt_drop_trigger, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"add-locks", OPT_LOCKS, "Add locks around INSERT statements.", - &opt_lock, &opt_lock, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, - 0}, - {"allow-keywords", OPT_KEYWORDS, + {"add-locks", 0, "Add locks around INSERT statements.", + &opt_lock, &opt_lock, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + {"allow-keywords", 0, "Allow creation of column names that are keywords.", &opt_keywords, &opt_keywords, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"apply-slave-statements", OPT_MYSQLDUMP_SLAVE_APPLY, + {"apply-slave-statements", 0, "Adds 'STOP SLAVE' prior to 'CHANGE MASTER' and 'START SLAVE' to bottom of dump.", - &opt_slave_apply, &opt_slave_apply, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, - {"as-of", OPT_ASOF_TIMESTAMP, + &opt_slave_apply, &opt_slave_apply, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"as-of", 0, "Dump system versioned table(s) as of specified timestamp. " "Argument is interpreted according to the --tz-utc setting. " "Table structures are always dumped as of current timestamp.", - &opt_asof_timestamp, &opt_asof_timestamp, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"character-sets-dir", OPT_CHARSETS_DIR, + &opt_asof_timestamp, &opt_asof_timestamp, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"character-sets-dir", 0, "Directory for character set files.", (char **)&charsets_dir, (char **)&charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"comments", 'i', "Write additional information.", @@ -309,21 +303,18 @@ static struct my_option my_long_options[] = &opt_complete_insert, &opt_complete_insert, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"compress", 'C', "Use compression in server/client protocol.", - &opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0, - 0, 0, 0}, - {"copy_s3_tables", OPT_COPY_S3_TABLES, + &opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"copy_s3_tables", 0, "If 'no' S3 tables will be ignored, otherwise S3 tables will be copied as " " Aria tables and then altered to S3", &opt_copy_s3_tables, &opt_copy_s3_tables, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"create-options", 'a', "Include all MariaDB specific create options.", - &create_options, &create_options, 0, GET_BOOL, NO_ARG, 1, - 0, 0, 0, 0, 0}, + &create_options, &create_options, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"databases", 'B', "Dump several databases. Note the difference in usage; in this case no tables are given. All name arguments are regarded as database names. 'USE db_name;' will be included in the output.", - &opt_databases, &opt_databases, 0, GET_BOOL, NO_ARG, 0, 0, - 0, 0, 0, 0}, + &opt_databases, &opt_databases, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, #ifdef DBUG_OFF {"debug", '#', "This is a non-debug version. Catch this and exit.", 0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0}, @@ -331,19 +322,17 @@ static struct my_option my_long_options[] = {"debug", '#', "Output debug log.", (char *)&default_dbug_option, (char *)&default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", - &debug_info_flag, &debug_info_flag, - 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, + &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"default-character-set", OPT_DEFAULT_CHARSET, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"delayed-insert", OPT_DELAYED, "Insert rows with INSERT DELAYED.", - &opt_delayed, &opt_delayed, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, - {"delete-master-logs", OPT_DELETE_MASTER_LOGS, + {"delayed-insert", 0, "Insert rows with INSERT DELAYED.", + &opt_delayed, &opt_delayed, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"delete-master-logs", 0, "Delete logs on master after backup. This automatically enables --master-data.", &opt_delete_master_logs, &opt_delete_master_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -351,9 +340,8 @@ static struct my_option my_long_options[] = "'/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and '/*!40000 ALTER " "TABLE tb_name ENABLE KEYS */; will be put in the output.", &opt_disable_keys, &opt_disable_keys, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"dump-date", OPT_DUMP_DATE, "Put a dump date to the end of the output.", - &opt_dump_date, &opt_dump_date, 0, - GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + {"dump-date", 0, "Put a dump date to the end of the output.", + &opt_dump_date, &opt_dump_date, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"dump-history", 'H', "Dump system-versioned tables with history (only for " "timestamp based versioning)", &opt_dump_history, &opt_dump_history, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -370,24 +358,23 @@ static struct my_option my_long_options[] = "Option automatically turns --lock-tables off.", &opt_slave_data, &opt_slave_data, 0, GET_UINT, OPT_ARG, 0, 0, MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL, 0, 0, 0}, - {"events", 'E', "Dump events.", - &opt_events, &opt_events, 0, GET_BOOL, - NO_ARG, 0, 0, 0, 0, 0, 0}, + {"events", 'E', "Dump events.", &opt_events, &opt_events, 0, GET_BOOL, + NO_ARG, 0, 0, 0, 0, 0, 0}, {"extended-insert", 'e', "Use multiple-row INSERT syntax that include several VALUES lists.", &extended_insert, &extended_insert, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"fields-terminated-by", OPT_FTB, + {"fields-terminated-by", 0, "Fields in the output file are terminated by the given string.", &fields_terminated, &fields_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"fields-enclosed-by", OPT_ENC, + {"fields-enclosed-by", 0, "Fields in the output file are enclosed by the given character.", &enclosed, &enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0}, - {"fields-optionally-enclosed-by", OPT_O_ENC, + {"fields-optionally-enclosed-by", 0, "Fields in the output file are optionally enclosed by the given character.", &opt_enclosed, &opt_enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0}, - {"fields-escaped-by", OPT_ESC, + {"fields-escaped-by", 0, "Fields in the output file are escaped by the given character.", &escaped, &escaped, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"flush-logs", 'F', "Flush logs file in server before starting dump. " @@ -399,29 +386,26 @@ static struct my_option my_long_options[] = "to the moment all tables are locked. So if you want your dump and " "the log flush to happen at the same exact moment you should use " "--lock-all-tables or --master-data with --flush-logs.", - &flush_logs, &flush_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, - {"flush-privileges", OPT_ESC, "Emit a FLUSH PRIVILEGES statement " + &flush_logs, &flush_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"flush-privileges", 0, "Emit a FLUSH PRIVILEGES statement " "after dumping the mysql database. This option should be used any " "time the dump contains the mysql database and any other database " "that depends on the data in the mysql database for proper restore. ", &flush_privileges, &flush_privileges, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"force", 'f', "Continue even if we get an SQL error.", - &ignore_errors, &ignore_errors, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, + &ignore_errors, &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"gtid", 0, "Used together with --master-data=1 or --dump-slave=1." "When enabled, the output from those options will set the GTID position " "instead of the binlog file and offset; the file/offset will appear only as " "a comment. When disabled, the GTID position will still appear in the " "output, but only commented.", - &opt_use_gtid, &opt_use_gtid, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, + &opt_use_gtid, &opt_use_gtid, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"header", 0, "Used together with --tab. When enabled, adds header with column names to the top of output txt files.", &opt_header, &opt_header, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"hex-blob", OPT_HEXBLOB, "Dump binary strings (BINARY, " + {"hex-blob", 0, "Dump binary strings (BINARY, " "VARBINARY, BLOB) in hexadecimal format.", &opt_hex_blob, &opt_hex_blob, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"host", 'h', "Connect to host.", ¤t_host, @@ -443,15 +427,13 @@ static struct my_option my_long_options[] = "be specified with both database and table names, e.g., " "--ignore-table=database.table.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"include-master-host-port", OPT_MYSQLDUMP_INCLUDE_MASTER_HOST_PORT, + {"include-master-host-port", 0, "Adds 'MASTER_HOST=, MASTER_PORT=' to 'CHANGE MASTER TO..' " "in dump produced with --dump-slave.", &opt_include_master_host_port, - &opt_include_master_host_port, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, - {"insert-ignore", OPT_INSERT_IGNORE, "Insert rows with INSERT IGNORE.", - &opt_ignore, &opt_ignore, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, - {"lines-terminated-by", OPT_LTB, + &opt_include_master_host_port, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"insert-ignore", 0, "Insert rows with INSERT IGNORE.", + &opt_ignore, &opt_ignore, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"lines-terminated-by", 0, "Lines in the output file are terminated by the given string.", &lines_terminated, &lines_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -462,7 +444,7 @@ static struct my_option my_long_options[] = 0, 0, 0, 0, 0, 0}, {"lock-tables", 'l', "Lock all tables for read.", &lock_tables, &lock_tables, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"log-error", OPT_ERROR_LOG_FILE, "Append warnings and errors to given file.", + {"log-error", 0, "Append warnings and errors to given file.", &log_error_file, &log_error_file, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"log-queries", 0, "When restoring the dump, the server will, if logging turned on, log the queries to the general and slow query log.", @@ -479,30 +461,28 @@ static struct my_option my_long_options[] = "Option automatically turns --lock-tables off.", &opt_master_data, &opt_master_data, 0, GET_UINT, OPT_ARG, 0, 0, MYSQL_OPT_MASTER_DATA_COMMENTED_SQL, 0, 0, 0}, - {"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, + {"max_allowed_packet", 0, "The maximum packet length to send to or receive from server.", &opt_max_allowed_packet, &opt_max_allowed_packet, 0, GET_ULONG, REQUIRED_ARG, 24*1024*1024, 4096, (longlong) 2L*1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0}, - {"max-statement-time", MYSQL_OPT_MAX_STATEMENT_TIME, + {"max-statement-time", 0, "Max statement execution time. If unset, overrides server default with 0.", &opt_max_statement_time, &opt_max_statement_time, 0, GET_DOUBLE, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"net_buffer_length", OPT_NET_BUFFER_LENGTH, + {"net_buffer_length", 0, "The buffer size for TCP/IP and socket communication.", &opt_net_buffer_length, &opt_net_buffer_length, 0, GET_ULONG, REQUIRED_ARG, 1024*1024L-1025, 4096, 16*1024L*1024L, MALLOC_OVERHEAD-1024, 1024, 0}, - {"no-autocommit", OPT_AUTOCOMMIT, + {"no-autocommit", 0, "Wrap tables with autocommit/commit statements.", - &opt_autocommit, &opt_autocommit, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, + &opt_autocommit, &opt_autocommit, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"no-create-db", 'n', "Suppress the CREATE DATABASE ... IF EXISTS statement that normally is " "output for each dumped database if --all-databases or --databases is " "given.", - &opt_create_db, &opt_create_db, 0, - GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + &opt_create_db, &opt_create_db, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"no-create-info", 't', "Don't write table creation info.", &opt_no_create_info, &opt_no_create_info, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -516,7 +496,7 @@ static struct my_option my_long_options[] = {"opt", OPT_OPTIMIZE, "Same as --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys. Enabled by default, disable with --skip-opt.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"order-by-primary", OPT_ORDER_BY_PRIMARY, + {"order-by-primary", 0, "Sorts each table's rows by primary key, or first unique key, if such a key exists. Useful when dumping a MyISAM table to be loaded into an InnoDB table, but will make the dump itself take considerably longer.", &opt_order_by_primary, &opt_order_by_primary, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"order-by-size", 0, @@ -541,27 +521,24 @@ static struct my_option my_long_options[] = {"quote-names",'Q', "Quote table and column names with backticks (`).", &opt_quoted, &opt_quoted, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"replace", OPT_MYSQL_REPLACE_INTO, "Use REPLACE INTO instead of INSERT INTO.", - &opt_replace_into, &opt_replace_into, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, + {"replace", 0, "Use REPLACE INTO instead of INSERT INTO.", &opt_replace_into, + &opt_replace_into, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"result-file", 'r', "Direct output to a given file. This option should be used in systems " "(e.g., DOS, Windows) that use carriage-return linefeed pairs (\\r\\n) " "to separate text lines. This option ensures that only a single newline " "is used.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"routines", 'R', "Dump stored routines (functions and procedures).", - &opt_routines, &opt_routines, 0, GET_BOOL, - NO_ARG, 0, 0, 0, 0, 0, 0}, - {"set-charset", OPT_SET_CHARSET, - "Add 'SET NAMES default_character_set' to the output.", - &opt_set_charset, &opt_set_charset, 0, GET_BOOL, NO_ARG, 1, - 0, 0, 0, 0, 0}, + &opt_routines, &opt_routines, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"set-charset", 0, + "Add 'SET NAMES default_character_set' to the output.", &opt_set_charset, + &opt_set_charset, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, /* Note that the combination --single-transaction --master-data will give bullet-proof binlog position only if server >=4.1.3. That's the old "FLUSH TABLES WITH READ LOCK does not block commit" fixed bug. */ - {"single-transaction", OPT_TRANSACTION, + {"single-transaction", 0, "Creates a consistent snapshot by dumping all tables in a single " "transaction. Works ONLY for tables stored in storage engines which " "support multiversioning (currently only InnoDB does); the dump is NOT " @@ -580,7 +557,7 @@ static struct my_option my_long_options[] = &opt_mysql_unix_port, &opt_mysql_unix_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #include - {"system", 256, "Dump system tables as portable SQL", + {"system", 0, "Dump system tables as portable SQL", &opt_system, &opt_system, &opt_system_types, GET_SET, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"tab",'T', "Create tab-separated textfile for each table to given path. (Create .sql " @@ -589,17 +566,16 @@ static struct my_option my_long_options[] = &path, &path, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"tables", OPT_TABLES, "Overrides option --databases (-B).", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"triggers", OPT_TRIGGERS, "Dump triggers for each dumped table.", + {"triggers", 0, "Dump triggers for each dumped table.", &opt_dump_triggers, &opt_dump_triggers, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"tz-utc", OPT_TZ_UTC, + {"tz-utc", 0, "Set connection time zone to UTC before commencing the dump and add " "SET TIME_ZONE=´+00:00´ to the top of the dump file.", &opt_tz_utc, &opt_tz_utc, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, #ifndef DONT_ALLOW_USER_CHANGE - {"user", 'u', "User for login if not current user.", - ¤t_user, ¤t_user, 0, GET_STR, REQUIRED_ARG, - 0, 0, 0, 0, 0, 0}, + {"user", 'u', "User for login if not current user.", ¤t_user, + ¤t_user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #endif {"verbose", 'v', "Print info about the various stages.", &verbose, &verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -609,11 +585,10 @@ static struct my_option my_long_options[] = &where, &where, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"xml", 'X', "Dump a database as well formed XML.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, - "Default authentication client-side plugin to use.", + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} @@ -770,56 +745,59 @@ static void write_header(FILE *sql_file, const char *db_name) fputs(">\n", sql_file); check_io(sql_file); } - else if (!opt_compact) + else { - print_comment(sql_file, 0, - "-- MariaDB dump %s Distrib %s, for %s (%s)\n--\n", - DUMP_VERSION, MYSQL_SERVER_VERSION, SYSTEM_TYPE, - MACHINE_TYPE); - print_comment(sql_file, 0, "-- Host: %s ", - fix_for_comment(current_host ? current_host : "localhost")); - print_comment(sql_file, 0, "Database: %s\n", - fix_for_comment(db_name ? db_name : "")); - print_comment(sql_file, 0, - "-- ------------------------------------------------------\n" - ); - print_comment(sql_file, 0, "-- Server version\t%s\n", - mysql_get_server_info(&mysql_connection)); + fprintf(sql_file, "/*!999999\\- enable the sandbox mode */ \n"); + if (!opt_compact) + { + print_comment(sql_file, 0, + "-- MariaDB dump %s Distrib %s, for %s (%s)\n--\n", + DUMP_VERSION, MYSQL_SERVER_VERSION, SYSTEM_TYPE, + MACHINE_TYPE); + print_comment(sql_file, 0, "-- Host: %s ", + fix_for_comment(current_host ? current_host : "localhost")); + print_comment(sql_file, 0, "Database: %s\n", + fix_for_comment(db_name ? db_name : "")); + print_comment(sql_file, 0, + "-- ------------------------------------------------------\n" + ); + print_comment(sql_file, 0, "-- Server version\t%s\n", + mysql_get_server_info(&mysql_connection)); - if (!opt_logging) - fprintf(sql_file, -"\n/*M!100101 SET LOCAL SQL_LOG_OFF=0, LOCAL LOG_SLOW_QUERY=0 */;"); + if (!opt_logging) + fprintf(sql_file, + "\n/*M!100101 SET LOCAL SQL_LOG_OFF=0, LOCAL LOG_SLOW_QUERY=0 */;"); - if (opt_set_charset) - fprintf(sql_file, -"\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;" -"\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;" -"\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;" -"\n/*!40101 SET NAMES %s */;\n",default_charset); + if (opt_set_charset) + fprintf(sql_file, + "\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;" + "\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;" + "\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;" + "\n/*!40101 SET NAMES %s */;\n",default_charset); - if (opt_tz_utc) - { - fprintf(sql_file, "/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;\n"); - fprintf(sql_file, "/*!40103 SET TIME_ZONE='+00:00' */;\n"); - } + if (opt_tz_utc) + { + fprintf(sql_file, "/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;\n"); + fprintf(sql_file, "/*!40103 SET TIME_ZONE='+00:00' */;\n"); + } - if (!path) - { - if (!opt_no_create_info) + if (!path) { - /* We don't need unique checks as the table is created just before */ - fprintf(md_result_file,"\ -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;\n"); + if (!opt_no_create_info) + { + /* We don't need unique checks as the table is created just before */ + fprintf(md_result_file, + "/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;\n"); + } + fprintf(md_result_file, + "/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n"); } - fprintf(md_result_file,"\ -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n\ -"); + fprintf(sql_file, + "/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='%s%s%s' */;\n" + "/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n", + path?"":"NO_AUTO_VALUE_ON_ZERO",compatible_mode_normal_str[0]==0?"":",", + compatible_mode_normal_str); } - fprintf(sql_file, - "/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='%s%s%s' */;\n" - "/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n", - path?"":"NO_AUTO_VALUE_ON_ZERO",compatible_mode_normal_str[0]==0?"":",", - compatible_mode_normal_str); check_io(sql_file); } } /* write_header */ @@ -1273,8 +1251,9 @@ static int get_options(int *argc, char ***argv) if (opt_slave_data) { opt_lock_all_tables= !opt_single_transaction; - opt_master_data= 0; opt_delete_master_logs= 0; + if (opt_slave_data != MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL) + opt_master_data= 0; } /* Ensure consistency of the set of binlog & locking options */ @@ -1287,10 +1266,7 @@ static int get_options(int *argc, char ***argv) return(EX_USAGE); } if (opt_master_data) - { opt_lock_all_tables= !opt_single_transaction; - opt_slave_data= 0; - } if (opt_single_transaction || opt_lock_all_tables) lock_tables= 0; if (enclosed && opt_enclosed) @@ -3125,8 +3101,9 @@ static uint get_table_structure(const char *table, const char *db, char *table_t if (opt_header) dynstr_set_checked(&select_field_names_for_header, ""); } - insert_option= ((delayed && opt_ignore) ? " DELAYED IGNORE " : - delayed ? " DELAYED " : opt_ignore ? " IGNORE " : ""); + + insert_option= ((delayed && opt_ignore) ? "DELAYED IGNORE " : + delayed ? "DELAYED " : opt_ignore ? "IGNORE " : ""); verbose_msg("-- Retrieving table structure for table %s...\n", table); @@ -6227,17 +6204,12 @@ static int do_show_master_status(MYSQL *mysql_con, int consistent_binlog_pos, } - /* SHOW MASTER STATUS reports file and position */ - print_comment(md_result_file, 0, - "\n--\n-- Position to start replication or point-in-time " - "recovery from\n--\n\n"); - fprintf(md_result_file, - "%sCHANGE MASTER TO MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;\n", - (use_gtid ? "-- " : comment_prefix), file, offset); + /* gtid */ if (have_mariadb_gtid) { print_comment(md_result_file, 0, - "\n--\n-- GTID to start replication from\n--\n\n"); + "\n-- Preferably use GTID to start replication from GTID " + "position:\n\n"); if (use_gtid) fprintf(md_result_file, "%sCHANGE MASTER TO MASTER_USE_GTID=slave_pos;\n", @@ -6246,6 +6218,19 @@ static int do_show_master_status(MYSQL *mysql_con, int consistent_binlog_pos, "%sSET GLOBAL gtid_slave_pos='%s';\n", (!use_gtid ? "-- " : comment_prefix), gtid_pos); } + + /* SHOW MASTER STATUS reports file and position */ + print_comment(md_result_file, 0, + "\n--\n-- Alternately, following is the position of the binary " + "logging from SHOW MASTER STATUS at point of backup." + "\n-- Use this when creating a replica of the primary server " + "where the backup was made." + "\n-- The new server will be connecting to the primary server " + "where the backup was taken." + "\n--\n\n"); + fprintf(md_result_file, + "%sCHANGE MASTER TO MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;\n", + (use_gtid ? "-- " : comment_prefix), file, offset); check_io(md_result_file); if (!consistent_binlog_pos) @@ -6324,7 +6309,6 @@ static int do_show_slave_status(MYSQL *mysql_con, int use_gtid, (opt_slave_data == MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL) ? "-- " : ""; const char *gtid_comment_prefix= (use_gtid ? comment_prefix : "-- "); const char *nogtid_comment_prefix= (!use_gtid ? comment_prefix : "-- "); - int set_gtid_done= 0; if (mysql_query_with_error_report(mysql_con, &slave, multi_source ? @@ -6340,23 +6324,36 @@ static int do_show_slave_status(MYSQL *mysql_con, int use_gtid, return 1; } - while ((row= mysql_fetch_row(slave))) + print_comment(md_result_file, 0, + "\n--\n-- The following is the SQL position of the replication " + "taken from SHOW SLAVE STATUS at the time of backup.\n" + "-- Use this position when creating a clone of, or replacement " + "server, from where the backup was taken." + "\n-- This new server will connects to the same primary " + "server%s.\n--\n", + multi_source ? "(s)" : ""); + + if (multi_source) { - if (multi_source && !set_gtid_done) + char gtid_pos[MAX_GTID_LENGTH]; + if (have_mariadb_gtid && get_gtid_pos(gtid_pos, 0)) { - char gtid_pos[MAX_GTID_LENGTH]; - if (have_mariadb_gtid && get_gtid_pos(gtid_pos, 0)) - { - mysql_free_result(slave); - return 1; - } - if (opt_comments) - fprintf(md_result_file, "\n--\n-- Gtid position to start replication " - "from\n--\n\n"); - fprintf(md_result_file, "%sSET GLOBAL gtid_slave_pos='%s';\n", - gtid_comment_prefix, gtid_pos); - set_gtid_done= 1; + mysql_free_result(slave); + return 1; } + print_comment(md_result_file, 0, + "-- GTID position to start replication:\n"); + fprintf(md_result_file, "%sSET GLOBAL gtid_slave_pos='%s';\n", + gtid_comment_prefix, gtid_pos); + } + if (use_gtid) + print_comment(md_result_file, 0, + "\n-- Use only the MASTER_USE_GTID=slave_pos or " + "MASTER_LOG_FILE/MASTER_LOG_POS in the statements below." + "\n\n"); + + while ((row= mysql_fetch_row(slave))) + { if (row[9 + multi_source] && row[21 + multi_source]) { if (use_gtid) @@ -6370,11 +6367,6 @@ static int do_show_slave_status(MYSQL *mysql_con, int use_gtid, } /* SHOW MASTER STATUS reports file and position */ - if (opt_comments) - fprintf(md_result_file, - "\n--\n-- Position to start replication or point-in-time " - "recovery from (the master of this slave)\n--\n\n"); - if (multi_source) fprintf(md_result_file, "%sCHANGE MASTER '%.80s' TO ", nogtid_comment_prefix, row[0]); @@ -6395,6 +6387,7 @@ static int do_show_slave_status(MYSQL *mysql_con, int use_gtid, check_io(md_result_file); } } + fprintf(md_result_file, "\n"); mysql_free_result(slave); return 0; } diff --git a/client/mysqlimport.c b/client/mysqlimport.c index a7c60e2b..f23ba1e4 100644 --- a/client/mysqlimport.c +++ b/client/mysqlimport.c @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2011, 2022, MariaDB + Copyright (c) 2011, 2024, MariaDB 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 @@ -70,10 +70,10 @@ static char **argv_to_free; static struct my_option my_long_options[] = { - {"character-sets-dir", OPT_CHARSETS_DIR, + {"character-sets-dir", 0, "Directory for character set files.", (char**) &charsets_dir, (char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-character-set", 0, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"columns", 'c', @@ -85,31 +85,31 @@ static struct my_option my_long_options[] = 0, 0, 0}, {"debug",'#', "Output debug log. Often this is 'd:t:o,filename'.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"delete", 'd', "First delete all rows from table.", &opt_delete, &opt_delete, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"fields-terminated-by", OPT_FTB, + {"fields-terminated-by", 0, "Fields in the input file are terminated by the given string.", &fields_terminated, &fields_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"fields-enclosed-by", OPT_ENC, + {"fields-enclosed-by", 0, "Fields in the import file are enclosed by the given character.", &enclosed, &enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"fields-optionally-enclosed-by", OPT_O_ENC, + {"fields-optionally-enclosed-by", 0, "Fields in the input file are optionally enclosed by the given character.", &opt_enclosed, &opt_enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"fields-escaped-by", OPT_ESC, + {"fields-escaped-by", 0, "Fields in the input file are escaped by the given character.", &escaped, &escaped, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -126,10 +126,10 @@ static struct my_option my_long_options[] = "Disable foreign key checks while importing the data.", &ignore_foreign_keys, &ignore_foreign_keys, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"ignore-lines", OPT_IGN_LINES, "Ignore first n lines of data infile.", + {"ignore-lines", 0, "Ignore first n lines of data infile.", &opt_ignore_lines, &opt_ignore_lines, 0, GET_LL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"lines-terminated-by", OPT_LTB, + {"lines-terminated-by", 0, "Lines in the input file are terminated by the given string.", &lines_terminated, &lines_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -138,7 +138,7 @@ static struct my_option my_long_options[] = {"lock-tables", 'l', "Lock all tables for write (this disables threads).", &lock_tables, &lock_tables, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"low-priority", OPT_LOW_PRIORITY, + {"low-priority", 0, "Use LOW_PRIORITY when updating the table.", &opt_low_priority, &opt_low_priority, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"password", 'p', @@ -148,7 +148,7 @@ static struct my_option my_long_options[] = {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " @@ -170,7 +170,7 @@ static struct my_option my_long_options[] = &opt_mysql_unix_port, &opt_mysql_unix_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #include - {"use-threads", OPT_USE_THREADS, + {"use-threads", 0, "Load files in parallel. The argument is the number " "of threads to use for loading data.", &opt_use_threads, &opt_use_threads, 0, diff --git a/client/mysqlshow.c b/client/mysqlshow.c index aa606d61..4ad31b65 100644 --- a/client/mysqlshow.c +++ b/client/mysqlshow.c @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2010, 2019, MariaDB + Copyright (c) 2010, 2024, MariaDB 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 @@ -191,10 +191,10 @@ static struct my_option my_long_options[] = {"character-sets-dir", 'c', "Directory for character set files.", (char**) &charsets_dir, (char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-character-set", 0, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"count", OPT_COUNT, + {"count", 0, "Show number of rows per table (may be slow for non-MyISAM tables).", &opt_count, &opt_count, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -203,13 +203,13 @@ static struct my_option my_long_options[] = 0, 0, 0}, {"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -226,7 +226,7 @@ static struct my_option my_long_options[] = "Password to use when connecting to server. If password is not given, it's " "solicited on the tty.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " diff --git a/client/mysqlslap.c b/client/mysqlslap.c index 885a5f43..035a7f0d 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -1,6 +1,6 @@ /* Copyright (c) 2005, 2015, Oracle and/or its affiliates. - Copyright (c) 2010, 2022, MariaDB + Copyright (c) 2010, 2024, MariaDB 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 @@ -535,50 +535,45 @@ static struct my_option my_long_options[] = "Generate SQL where not supplied by file or command line.", &auto_generate_sql, &auto_generate_sql, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-add-autoincrement", OPT_SLAP_AUTO_GENERATE_ADD_AUTO, + {"auto-generate-sql-add-autoincrement", 0, "Add an AUTO_INCREMENT column to auto-generated tables.", - &auto_generate_sql_autoincrement, - &auto_generate_sql_autoincrement, + &auto_generate_sql_autoincrement, &auto_generate_sql_autoincrement, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-execute-number", OPT_SLAP_AUTO_GENERATE_EXECUTE_QUERIES, + {"auto-generate-sql-execute-number", 0, "Set this number to generate a set number of queries to run.", &auto_actual_queries, &auto_actual_queries, 0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-guid-primary", OPT_SLAP_AUTO_GENERATE_GUID_PRIMARY, + {"auto-generate-sql-guid-primary", 0, "Add GUID based primary keys to auto-generated tables.", - &auto_generate_sql_guid_primary, - &auto_generate_sql_guid_primary, + &auto_generate_sql_guid_primary, &auto_generate_sql_guid_primary, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-load-type", OPT_SLAP_AUTO_GENERATE_SQL_LOAD_TYPE, + {"auto-generate-sql-load-type", 0, "Specify test load type: mixed, update, write, key, or read; default is mixed.", (char**) &auto_generate_sql_type, (char**) &auto_generate_sql_type, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-secondary-indexes", - OPT_SLAP_AUTO_GENERATE_SECONDARY_INDEXES, + {"auto-generate-sql-secondary-indexes", 0, "Number of secondary indexes to add to auto-generated tables.", &auto_generate_sql_secondary_indexes, &auto_generate_sql_secondary_indexes, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-unique-query-number", - OPT_SLAP_AUTO_GENERATE_UNIQUE_QUERY_NUM, + {"auto-generate-sql-unique-query-number", 0, "Number of unique queries to generate for automatic tests.", &auto_generate_sql_unique_query_number, &auto_generate_sql_unique_query_number, 0, GET_ULL, REQUIRED_ARG, 10, 0, 0, 0, 0, 0}, - {"auto-generate-sql-unique-write-number", - OPT_SLAP_AUTO_GENERATE_UNIQUE_WRITE_NUM, + {"auto-generate-sql-unique-write-number", 0, "Number of unique queries to generate for auto-generate-sql-write-number.", &auto_generate_sql_unique_write_number, &auto_generate_sql_unique_write_number, 0, GET_ULL, REQUIRED_ARG, 10, 0, 0, 0, 0, 0}, - {"auto-generate-sql-write-number", OPT_SLAP_AUTO_GENERATE_WRITE_NUM, + {"auto-generate-sql-write-number", 0, "Number of row inserts to perform for each thread (default is 100).", &auto_generate_sql_number, &auto_generate_sql_number, 0, GET_ULL, REQUIRED_ARG, 100, 0, 0, 0, 0, 0}, {"character-sets-dir", OPT_CHARSETS_DIR, "Directory for character set files.", (char **)&charsets_dir, (char **)&charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"commit", OPT_SLAP_COMMIT, "Commit records every X number of statements.", + {"commit", 0, "Commit records every X number of statements.", &commit_rate, &commit_rate, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"compress", 'C', "Use compression in server/client protocol.", @@ -587,10 +582,10 @@ static struct my_option my_long_options[] = {"concurrency", 'c', "Number of clients to simulate for query to run.", (char**) &concurrency_str, (char**) &concurrency_str, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"create", OPT_SLAP_CREATE_STRING, "File or string to use create tables.", + {"create", 0, "File or string to use create tables.", &create_string, &create_string, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"create-schema", OPT_CREATE_SLAP_SCHEMA, "Schema to run tests in.", + {"create-schema", 0, "Schema to run tests in.", (char**) &create_schema_string, (char**) &create_schema_string, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"csv", OPT_SLAP_CSV, @@ -604,12 +599,12 @@ static struct my_option my_long_options[] = (char**) &default_dbug_option, (char**) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"debug-info", 'T', "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -617,7 +612,7 @@ static struct my_option my_long_options[] = "Delimiter to use in SQL statements supplied in file or command line.", (char**) &delimiter, (char**) &delimiter, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"detach", OPT_SLAP_DETACH, + {"detach", 0, "Detach (close and reopen) connections after X number of requests.", &detach_rate, &detach_rate, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -629,14 +624,14 @@ static struct my_option my_long_options[] = GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"host", 'h', "Connect to host.", &host, &host, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"init-command", OPT_INIT_COMMAND, + {"init-command", 0, "SQL Command to execute when connecting to MariaDB server. Will " "automatically be re-executed when reconnecting.", &opt_init_command, &opt_init_command, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"iterations", 'i', "Number of times to run the tests.", &iterations, &iterations, 0, GET_UINT, REQUIRED_ARG, 1, 0, 0, 0, 0, 0}, - {"no-drop", OPT_SLAP_NO_DROP, "Do not drop the schema after the test.", + {"no-drop", 0, "Do not drop the schema after the test.", &opt_no_drop, &opt_no_drop, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"number-char-cols", 'x', "Number of VARCHAR columns to create in table if specifying --auto-generate-sql.", @@ -646,11 +641,11 @@ static struct my_option my_long_options[] = "Number of INT columns to create in table if specifying --auto-generate-sql.", (char**) &num_int_cols_opt, (char**) &num_int_cols_opt, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"number-of-queries", OPT_MYSQL_NUMBER_OF_QUERY, + {"number-of-queries", 0, "Limit each client to this number of queries (this is not exact).", &num_of_query, &num_of_query, 0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"only-print", OPT_MYSQL_ONLY_PRINT, + {"only-print", 0, "Do not connect to the databases, but instead print out what would have " "been done.", &opt_only_print, &opt_only_print, 0, GET_BOOL, NO_ARG, @@ -662,25 +657,25 @@ static struct my_option my_long_options[] = {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection.", &opt_mysql_port, &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, MYSQL_PORT, 0, 0, 0, 0, 0}, - {"post-query", OPT_SLAP_POST_QUERY, + {"post-query", 0, "Query to run or file containing query to execute after tests have completed.", &user_supplied_post_statements, &user_supplied_post_statements, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"post-system", OPT_SLAP_POST_SYSTEM, + {"post-system", 0, "system() string to execute after tests have completed.", &post_system, &post_system, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"pre-query", OPT_SLAP_PRE_QUERY, + {"pre-query", 0, "Query to run or file containing query to execute before running tests.", &user_supplied_pre_statements, &user_supplied_pre_statements, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"pre-system", OPT_SLAP_PRE_SYSTEM, + {"pre-system", 0, "system() string to execute before running tests.", &pre_system, &pre_system, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -1649,6 +1644,9 @@ drop_primary_key_list(void) return 0; } + +PRAGMA_DISABLE_CHECK_STACK_FRAME + static int create_schema(MYSQL *mysql, const char *db, statement *stmt, option_string *engine_stmt) @@ -1744,6 +1742,7 @@ limit_not_met: DBUG_RETURN(0); } +PRAGMA_REENABLE_CHECK_STACK_FRAME static int drop_schema(MYSQL *mysql, const char *db) diff --git a/client/mysqltest.cc b/client/mysqltest.cc index a49895c9..46565095 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -78,7 +78,7 @@ static my_bool non_blocking_api_enabled= 0; #define MAX_DELIMITER_LENGTH 16 #define DEFAULT_MAX_CONN 64 -#define DIE_BUFF_SIZE 256*1024 +#define DIE_BUFF_SIZE 15*1024 #define RESULT_STRING_INIT_MEM 2048 #define RESULT_STRING_INCREMENT_MEM 2048 @@ -397,7 +397,7 @@ enum enum_commands { Q_IF, Q_DISABLE_PARSING, Q_ENABLE_PARSING, Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST, - Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_SKIP, + Q_WRITE_FILE, Q_WRITE_LINE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_SKIP, Q_CHMOD_FILE, Q_APPEND_FILE, Q_CAT_FILE, Q_DIFF_FILES, Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR, Q_LIST_FILES, Q_LIST_FILES_WRITE_FILE, Q_LIST_FILES_APPEND_FILE, @@ -500,6 +500,7 @@ const char *command_names[]= "remove_file", "file_exists", "write_file", + "write_line", "copy_file", "perl", "die", @@ -615,7 +616,7 @@ void replace_strings_append(struct st_replace *rep, DYNAMIC_STRING* ds, const char *from); ATTRIBUTE_NORETURN -static void cleanup_and_exit(int exit_code); +static void cleanup_and_exit(int exit_code, bool called_from_die); ATTRIBUTE_NORETURN static void really_die(const char *msg); @@ -932,6 +933,7 @@ pthread_attr_t cn_thd_attrib; pthread_handler_t connection_thread(void *arg) { struct st_connection *cn= (struct st_connection*)arg; + DBUG_ENTER("connection_thread"); mysql_thread_init(); while (cn->command != EMB_END_CONNECTION) @@ -943,6 +945,7 @@ pthread_handler_t connection_thread(void *arg) pthread_cond_wait(&cn->query_cond, &cn->query_mutex); pthread_mutex_unlock(&cn->query_mutex); } + DBUG_PRINT("info", ("executing command: %d", cn->command)); switch (cn->command) { case EMB_END_CONNECTION: @@ -963,24 +966,26 @@ pthread_handler_t connection_thread(void *arg) break; case EMB_CLOSE_STMT: cn->result= mysql_stmt_close(cn->stmt); + cn->stmt= 0; break; default: DBUG_ASSERT(0); } - cn->command= 0; pthread_mutex_lock(&cn->result_mutex); cn->query_done= 1; + cn->command= 0; pthread_cond_signal(&cn->result_cond); pthread_mutex_unlock(&cn->result_mutex); } end_thread: - cn->query_done= 1; + DBUG_ASSERT(cn->stmt == 0); mysql_close(cn->mysql); cn->mysql= 0; + cn->query_done= 1; mysql_thread_end(); pthread_exit(0); - return 0; + DBUG_RETURN(0); } static void wait_query_thread_done(struct st_connection *con) @@ -998,12 +1003,16 @@ static void wait_query_thread_done(struct st_connection *con) static void signal_connection_thd(struct st_connection *cn, int command) { + DBUG_ENTER("signal_connection_thd"); + DBUG_PRINT("enter", ("command: %d", command)); + DBUG_ASSERT(cn->has_thread); cn->query_done= 0; - cn->command= command; pthread_mutex_lock(&cn->query_mutex); + cn->command= command; pthread_cond_signal(&cn->query_cond); pthread_mutex_unlock(&cn->query_mutex); + DBUG_VOID_RETURN; } @@ -1068,27 +1077,37 @@ static int do_stmt_execute(struct st_connection *cn) static int do_stmt_close(struct st_connection *cn) { DBUG_ENTER("do_stmt_close"); - /* The cn->stmt is already set. */ if (!cn->has_thread) - DBUG_RETURN(mysql_stmt_close(cn->stmt)); + { + /* The cn->stmt is already set. */ + int res= mysql_stmt_close(cn->stmt); + cn->stmt= 0; + DBUG_RETURN(res); + } + wait_query_thread_done(cn); signal_connection_thd(cn, EMB_CLOSE_STMT); wait_query_thread_done(cn); + DBUG_ASSERT(cn->stmt == 0); DBUG_RETURN(cn->result); } static void emb_close_connection(struct st_connection *cn) { + DBUG_ENTER("emb_close_connection"); if (!cn->has_thread) - return; + DBUG_VOID_RETURN; wait_query_thread_done(cn); signal_connection_thd(cn, EMB_END_CONNECTION); pthread_join(cn->tid, NULL); cn->has_thread= FALSE; + DBUG_ASSERT(cn->mysql == 0); + DBUG_ASSERT(cn->stmt == 0); pthread_mutex_destroy(&cn->query_mutex); pthread_cond_destroy(&cn->query_cond); pthread_mutex_destroy(&cn->result_mutex); pthread_cond_destroy(&cn->result_cond); + DBUG_VOID_RETURN; } @@ -1112,7 +1131,13 @@ static void init_connection_thd(struct st_connection *cn) #define do_read_query_result(cn) mysql_read_query_result(cn->mysql) #define do_stmt_prepare(cn, q, q_len) mysql_stmt_prepare(cn->stmt, q, (ulong)q_len) #define do_stmt_execute(cn) mysql_stmt_execute(cn->stmt) -#define do_stmt_close(cn) mysql_stmt_close(cn->stmt) + +static int do_stmt_close(struct st_connection *cn) +{ + int res= mysql_stmt_close(cn->stmt); + cn->stmt= 0; + return res; +} #endif /*EMBEDDED_LIBRARY*/ @@ -1440,7 +1465,6 @@ void close_statements() { if (con->stmt) do_stmt_close(con); - con->stmt= 0; } DBUG_VOID_RETURN; } @@ -1511,8 +1535,8 @@ void free_used_memory() void ha_pre_shutdown(); #endif - -ATTRIBUTE_NORETURN static void cleanup_and_exit(int exit_code) +ATTRIBUTE_NORETURN static void cleanup_and_exit(int exit_code, + bool called_from_die) { #ifdef EMBEDDED_LIBRARY if (server_initialized) @@ -1525,16 +1549,6 @@ ATTRIBUTE_NORETURN static void cleanup_and_exit(int exit_code) if (server_initialized) mysql_server_end(); - /* - mysqltest is fundamentally written in a way that makes impossible - to free all memory before exit (consider memory allocated - for frame local DYNAMIC_STRING's and die() invoked down the stack. - - We close stderr here to stop unavoidable safemalloc reports - from polluting the output. - */ - fclose(stderr); - my_end(my_end_arg); if (!silent) { @@ -1554,6 +1568,11 @@ ATTRIBUTE_NORETURN static void cleanup_and_exit(int exit_code) } } + /* + Report memory leaks, if not called from 'die()', as die() will not release + all memory. + */ + sf_leaking_memory= called_from_die; exit(exit_code); } @@ -1620,7 +1639,7 @@ static void really_die(const char *msg) second time, just exit */ if (dying) - cleanup_and_exit(1); + cleanup_and_exit(1, 1); dying= 1; log_file.show_tail(opt_tail_lines); @@ -1632,7 +1651,7 @@ static void really_die(const char *msg) if (cur_con && !cur_con->pending) show_warnings_before_error(cur_con->mysql); - cleanup_and_exit(1); + cleanup_and_exit(1, 1); } void report_or_die(const char *fmt, ...) @@ -1686,7 +1705,7 @@ void abort_not_supported_test(const char *fmt, ...) } va_end(args); - cleanup_and_exit(62); + cleanup_and_exit(62, 0); } @@ -2233,14 +2252,14 @@ int dyn_string_cmp(DYNAMIC_STRING* ds, const char *fname) check_result RETURN VALUES - error - the function will not return - + 0 ok + 1 error */ -void check_result() +int check_result() { const char *mess= 0; - + int error= 1; DBUG_ENTER("check_result"); DBUG_ASSERT(result_file_name); DBUG_PRINT("enter", ("result_file_name: %s", result_file_name)); @@ -2248,7 +2267,10 @@ void check_result() switch (compare_files(log_file.file_name(), result_file_name)) { case RESULT_OK: if (!error_count) + { + error= 0; break; /* ok */ + } mess= "Got errors while running test"; /* Fallthrough */ case RESULT_LENGTH_MISMATCH: @@ -2287,14 +2309,13 @@ void check_result() log_file.file_name(), reject_file, errno); show_diff(NULL, result_file_name, reject_file); - die("%s", mess); + fprintf(stderr, "%s", mess); break; } default: /* impossible */ die("Unknown error code from dyn_string_cmp()"); } - - DBUG_VOID_RETURN; + DBUG_RETURN(error); } @@ -4348,6 +4369,49 @@ void do_write_file(struct st_command *command) do_write_file_command(command, FALSE); } +/** + Write a line to the start of the file. + Truncates existing file, creates new one if it doesn't exist. + + Usage + write_line ; + + Example + --write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect + + @note Both the file and the line parameters are evaluated + (can be variables). + + @note This is a better alternative to + exec echo > file, as it doesn't depend on shell, + and can better handle sporadic file access errors caused + by antivirus or backup software on Windows. +*/ +void do_write_line(struct st_command *command) +{ + DYNAMIC_STRING ds_line; + DYNAMIC_STRING ds_filename; + + struct command_arg write_line_args[] = { + { "line", ARG_STRING, FALSE, &ds_line, "line to add" }, + { "filename", ARG_STRING, TRUE, &ds_filename, "File to write to" }, + }; + DBUG_ENTER("do_write_line"); + + check_command_args(command, + command->first_argument, + write_line_args, + sizeof(write_line_args)/sizeof(struct command_arg), + ' '); + + if (bad_path(ds_filename.str)) + DBUG_VOID_RETURN; + dynstr_append_mem(&ds_line, "\n", 1); + str_to_file2(ds_filename.str, ds_line.str, ds_line.length, FALSE); + dynstr_free(&ds_filename); + dynstr_free(&ds_line); + DBUG_VOID_RETURN; +} /* SYNOPSIS @@ -5265,7 +5329,11 @@ void do_shutdown_server(struct st_command *command) */ if (timeout && mysql_shutdown(mysql, SHUTDOWN_DEFAULT)) - die("mysql_shutdown failed"); + { + handle_error(command, mysql_errno(mysql), mysql_error(mysql), + mysql_sqlstate(mysql), &ds_res); + DBUG_VOID_RETURN; + } if (!timeout || wait_until_dead(pid, timeout)) { @@ -5693,7 +5761,6 @@ void do_close_connection(struct st_command *command) #endif /*!EMBEDDED_LIBRARY*/ if (con->stmt) do_stmt_close(con); - con->stmt= 0; #ifdef EMBEDDED_LIBRARY /* As query could be still executed in a separate thread @@ -7381,17 +7448,17 @@ get_one_option(const struct my_option *opt, const char *argument, const char *) break; case 'V': print_version(); - exit(0); + cleanup_and_exit(0,0); case OPT_MYSQL_PROTOCOL: #ifndef EMBEDDED_LIBRARY if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, opt->name)) <= 0) - exit(1); + cleanup_and_exit(1,0); #endif break; case '?': usage(); - exit(0); + cleanup_and_exit(0,0); } return 0; } @@ -7403,12 +7470,12 @@ int parse_args(int argc, char **argv) default_argv= argv; if ((handle_options(&argc, &argv, my_long_options, get_one_option))) - exit(1); + cleanup_and_exit(1, 0); if (argc > 1) { usage(); - exit(1); + cleanup_and_exit(1, 0); } if (argc == 1) opt_db= *argv; @@ -7475,7 +7542,7 @@ void str_to_file2(const char *fname, char *str, size_t size, my_bool append) die("Could not open '%s' for writing, errno: %d", buff, errno); if (append && my_seek(fd, 0, SEEK_END, MYF(0)) == MY_FILEPOS_ERROR) die("Could not find end of file '%s', errno: %d", buff, errno); - if (my_write(fd, (uchar*)str, size, MYF(MY_WME|MY_FNABP))) + if (size > 0 && my_write(fd, (uchar*)str, size, MYF(MY_WME|MY_FNABP))) die("write failed, errno: %d", errno); my_close(fd, MYF(0)); } @@ -8270,7 +8337,7 @@ static int match_expected_error(struct st_command *command, SYNOPSIS handle_error() - q - query context + command - command err_errno - error number err_error - error message err_sqlstate - sql state @@ -8529,7 +8596,7 @@ void run_query_stmt(struct st_connection *cn, struct st_command *command, my_bool ds_res_1st_execution_init = FALSE; my_bool compare_2nd_execution = TRUE; int query_match_ps2_re; - + MYSQL_RES *res; DBUG_ENTER("run_query_stmt"); DBUG_PRINT("query", ("'%-.60s'", query)); DBUG_PRINT("info", @@ -8735,10 +8802,13 @@ void run_query_stmt(struct st_connection *cn, struct st_command *command, The --enable_prepare_warnings command can be used to change this so that warnings from both the prepare and execute phase are shown. */ - if ((mysql_stmt_result_metadata(stmt) != NULL) && - !disable_warnings && - !prepare_warnings_enabled) - dynstr_set(&ds_prepare_warnings, NULL); + if ((res= mysql_stmt_result_metadata(stmt))) + { + if (!disable_warnings && + !prepare_warnings_enabled) + dynstr_set(&ds_prepare_warnings, NULL); + mysql_free_result(res); + } /* Fetch info before fetching warnings, since it will be reset @@ -9865,6 +9935,7 @@ static sig_handler signal_handler(int sig) fflush(stderr); my_write_core(sig); #ifndef _WIN32 + sf_leaking_memory= 1; exit(1); // Shouldn't get here but just in case #endif } @@ -9938,12 +10009,10 @@ int main(int argc, char **argv) uint command_executed= 0, last_command_executed= 0; char save_file[FN_REFLEN]; bool empty_result= FALSE; + int error= 0; MY_INIT(argv[0]); DBUG_ENTER("main"); - /* mysqltest has no way to free all its memory correctly */ - sf_leaking_memory= 1; - save_file[0]= 0; TMPDIR[0]= 0; @@ -10269,6 +10338,7 @@ int main(int argc, char **argv) break; case Q_FILE_EXIST: do_file_exist(command); break; case Q_WRITE_FILE: do_write_file(command); break; + case Q_WRITE_LINE: do_write_line(command); break; case Q_APPEND_FILE: do_append_file(command); break; case Q_DIFF_FILES: do_diff_files(command); break; case Q_SEND_QUIT: do_send_quit(command); break; @@ -10636,7 +10706,7 @@ int main(int argc, char **argv) die("Test ended with parsing disabled"); /* - The whole test has been executed _successfully_. + The whole test has been executed successfully. Time to compare result or save it to record file. The entire output from test is in the log file */ @@ -10659,7 +10729,7 @@ int main(int argc, char **argv) else { /* Check that the output from test is equal to result file */ - check_result(); + error= check_result(); } } } @@ -10669,7 +10739,8 @@ int main(int argc, char **argv) if (! result_file_name || record || compare_files (log_file.file_name(), result_file_name)) { - die("The test didn't produce any output"); + fprintf(stderr, "mysqltest: The test didn't produce any output\n"); + error= 1; } else { @@ -10678,12 +10749,15 @@ int main(int argc, char **argv) } if (!command_executed && result_file_name && !empty_result) - die("No queries executed but non-empty result file found!"); + { + fprintf(stderr, "mysqltest: No queries executed but non-empty result file found!\n"); + error= 1; + } - verbose_msg("Test has succeeded!"); + if (!error) + verbose_msg("Test has succeeded!"); timer_output(); - /* Yes, if we got this far the test has succeeded! Sakila smiles */ - cleanup_and_exit(0); + cleanup_and_exit(error, 0); return 0; /* Keep compiler happy too */ } diff --git a/cmake/FindPMEM.cmake b/cmake/FindPMEM.cmake deleted file mode 100644 index 02443644..00000000 --- a/cmake/FindPMEM.cmake +++ /dev/null @@ -1,18 +0,0 @@ -if(PMEM_LIBRARIES) - set(PMEM_FOUND TRUE) - return() -endif() -if(DEFINED PMEM_LIBRARIES) - set(PMEM_FOUND FALSE) - return() -endif() - -find_path(PMEM_INCLUDE_DIRS NAMES libpmem.h) -find_library(PMEM_LIBRARIES NAMES pmem) - -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS( - PMEM DEFAULT_MSG - PMEM_LIBRARIES PMEM_INCLUDE_DIRS) - -mark_as_advanced(PMEM_INCLUDE_DIRS PMEM_LIBRARIES) diff --git a/cmake/libutils.cmake b/cmake/libutils.cmake index 74853c36..3263c08e 100644 --- a/cmake/libutils.cmake +++ b/cmake/libutils.cmake @@ -379,5 +379,11 @@ FUNCTION (MAYBE_DISABLE_IPO target) INTERPROCEDURAL_OPTIMIZATION_RELEASE OFF INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO OFF INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL OFF) + IF(CMAKE_CONFIGURATION_TYPES) + FOREACH(cfg ${CMAKE_CONFIGURATION_TYPES}) + STRING(TOUPPER "${cfg}" cfg_upper) + SET_TARGET_PROPERTIES(${target} PROPERTIES INTERPROCEDURAL_OPTIMIZATION_${cfg_upper} OFF) + ENDFOREACH() + ENDIF() ENDIF() ENDFUNCTION() diff --git a/cmake/mariadb_connector_c.cmake b/cmake/mariadb_connector_c.cmake index a9b10334..b4f56597 100644 --- a/cmake/mariadb_connector_c.cmake +++ b/cmake/mariadb_connector_c.cmake @@ -40,6 +40,13 @@ SET(CLIENT_PLUGIN_PVIO_SOCKET STATIC) MESSAGE("== Configuring MariaDB Connector/C") ADD_SUBDIRECTORY(libmariadb) +IF(MSVC AND TARGET mariadb_obj AND TARGET mariadbclient) + # With MSVC, do not produce LTCG-compiled static client libraries. + # They are not usable by end-users, being tied to exact compiler version + MAYBE_DISABLE_IPO(mariadb_obj) + MAYBE_DISABLE_IPO(mariadbclient) +ENDIF() + IF(UNIX) INSTALL(CODE "EXECUTE_PROCESS( COMMAND ${CMAKE_COMMAND} -E make_directory \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}) diff --git a/cmake/os/AIX.cmake b/cmake/os/AIX.cmake index 7513c4f4..299b7919 100644 --- a/cmake/os/AIX.cmake +++ b/cmake/os/AIX.cmake @@ -34,8 +34,5 @@ ELSE() SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -maix64 -pthread -mcmodel=large") ENDIF() -# fcntl(fd, F_SETFL, O_DIRECT) is not supported; O_DIRECT is an open(2) flag -SET(HAVE_FCNTL_DIRECT 0 CACHE INTERNAL "") - # make it WARN by default, not AUTO (that implies -Werror) SET(MYSQL_MAINTAINER_MODE "WARN" CACHE STRING "Enable MariaDB maintainer-specific warnings. One of: NO (warnings are disabled) WARN (warnings are enabled) ERR (warnings are errors) AUTO (warnings are errors in Debug only)") diff --git a/cmake/os/SunOS.cmake b/cmake/os/SunOS.cmake index 3d99d347..3a9d2dcc 100644 --- a/cmake/os/SunOS.cmake +++ b/cmake/os/SunOS.cmake @@ -17,10 +17,6 @@ INCLUDE(CheckSymbolExists) INCLUDE(CheckCSourceRuns) INCLUDE(CheckCSourceCompiles) -# fcntl(fd, F_SETFL, O_DIRECT) is not supported, -# and directio(3C) would only work on UFS or NFS, not ZFS. -SET(HAVE_FCNTL_DIRECT 0 CACHE INTERNAL "") - # Enable 64 bit file offsets SET(_FILE_OFFSET_BITS 64) diff --git a/cmake/os/WindowsCache.cmake b/cmake/os/WindowsCache.cmake index ceb42627..c1048661 100644 --- a/cmake/os/WindowsCache.cmake +++ b/cmake/os/WindowsCache.cmake @@ -44,7 +44,6 @@ SET(HAVE_EXECINFO_H CACHE INTERNAL "") SET(HAVE_FCHMOD CACHE INTERNAL "") SET(HAVE_FCNTL CACHE INTERNAL "") SET(HAVE_FCNTL_H 1 CACHE INTERNAL "") -SET(HAVE_FCNTL_DIRECT 0 CACHE INTERNAL "") SET(HAVE_FCNTL_NONBLOCK CACHE INTERNAL "") SET(HAVE_FDATASYNC CACHE INTERNAL "") SET(HAVE_DECL_FDATASYNC CACHE INTERNAL "") diff --git a/cmake/pcre.cmake b/cmake/pcre.cmake index 3c427b88..f42db939 100644 --- a/cmake/pcre.cmake +++ b/cmake/pcre.cmake @@ -4,6 +4,9 @@ SET(WITH_PCRE "auto" CACHE STRING "Which pcre to use (possible values are 'bundled', 'system', or 'auto')") MACRO(BUNDLE_PCRE2) + SET(WITH_PCRE "bundled" CACHE STRING + "Which pcre to use (possible values are 'bundled', 'system', or 'auto')") + SET(dir "${CMAKE_BINARY_DIR}/extra/pcre2") SET(PCRE_INCLUDE_DIRS ${dir}/src/pcre2-build ${dir}/src/pcre2/src) MESSAGE(STATUS "Will download and bundle pcre2") @@ -41,21 +44,21 @@ MACRO(BUNDLE_PCRE2) SET(byproducts ${byproducts} BUILD_BYPRODUCTS ${file} ${file_d}) SET_TARGET_PROPERTIES(${lib} PROPERTIES IMPORTED_LOCATION ${file}) ENDFOREACH() + FOREACH(v "" "_DEBUG" "_RELWITHDEBINFO" "_RELEASE" "_MINSIZEREL") - STRING(REPLACE "/WX" "" pcre2_flags${v} "${CMAKE_C_FLAGS${v}}") - SET(pcre2_flags${v} "${pcre2_flags${v}} -std=c99 ") + SET(pcre2_flags${v} "${CMAKE_C_FLAGS${v}}") IF(MSVC) + STRING(REPLACE "/WX" "" pcre2_flags${v} "${pcre2_flags${v}}") # Suppress a warning - STRING(APPEND pcre2_flags${v} " /wd4244 " ) - # Disable asan support - STRING(REPLACE "-fsanitize=address" "" pcre2_flags${v} "${CMAKE_C_FLAGS${v}}") + STRING(APPEND pcre2_flags${v} " /wd4244 /wd4267 " ) ENDIF() ENDFOREACH() + ExternalProject_Add( pcre2 PREFIX "${dir}" - URL "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.zip" - URL_MD5 fe90992fbfb03f854bd9f344074f49eb + URL "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.43/pcre2-10.43.zip" + URL_MD5 b58f050f2fdd6f2ca5774a2975377a85 INSTALL_COMMAND "" CMAKE_ARGS "-DCMAKE_WARN_DEPRECATED=FALSE" diff --git a/cmake/plugin.cmake b/cmake/plugin.cmake index 6efd40fd..378fc5f5 100644 --- a/cmake/plugin.cmake +++ b/cmake/plugin.cmake @@ -46,7 +46,7 @@ MACRO(MYSQL_ADD_PLUGIN) ${CMAKE_SOURCE_DIR}/sql ${PCRE_INCLUDE_DIRS} ${SSL_INCLUDE_DIRS} - ${ZLIB_INCLUDE_DIR}) + ${ZLIB_INCLUDE_DIRS}) LIST(GET ARG_UNPARSED_ARGUMENTS 0 plugin) SET(SOURCES ${ARG_UNPARSED_ARGUMENTS}) diff --git a/cmake/ssl.cmake b/cmake/ssl.cmake index 646aa37a..8be48e2a 100644 --- a/cmake/ssl.cmake +++ b/cmake/ssl.cmake @@ -53,13 +53,14 @@ MACRO (MYSQL_USE_BUNDLED_SSL) ${CMAKE_SOURCE_DIR}/extra/wolfssl/wolfssl ${CMAKE_SOURCE_DIR}/extra/wolfssl/wolfssl/wolfssl ) - SET(SSL_LIBRARIES wolfssl wolfcrypt) + SET(SSL_LIBRARIES wolfssl) SET(SSL_INCLUDE_DIRS ${INC_DIRS}) SET(SSL_DEFINES "-DHAVE_OPENSSL -DHAVE_WOLFSSL -DWOLFSSL_USER_SETTINGS") SET(HAVE_ERR_remove_thread_state ON CACHE INTERNAL "wolfssl doesn't have ERR_remove_thread_state") SET(HAVE_EncryptAes128Ctr OFF CACHE INTERNAL "wolfssl does support AES-CTR, but differently from openssl") SET(HAVE_EncryptAes128Gcm OFF CACHE INTERNAL "wolfssl does not support AES-GCM") SET(HAVE_X509_check_host ON CACHE INTERNAL "wolfssl does support X509_check_host") + SET(HAVE_des ON CACHE INTERNAL "wolfssl does support DES API") CHANGE_SSL_SETTINGS("bundled") ADD_SUBDIRECTORY(extra/wolfssl) MESSAGE_ONCE(SSL_LIBRARIES "SSL_LIBRARIES = ${SSL_LIBRARIES}") @@ -158,6 +159,8 @@ MACRO (MYSQL_CHECK_SSL) HAVE_EncryptAes128Gcm) CHECK_SYMBOL_EXISTS(X509_check_host "openssl/x509v3.h" HAVE_X509_check_host) + CHECK_SYMBOL_EXISTS(DES_set_key_unchecked "openssl/des.h" + HAVE_des) SET(CMAKE_REQUIRED_INCLUDES) SET(CMAKE_REQUIRED_LIBRARIES) SET(CMAKE_REQUIRED_DEFINITIONS) diff --git a/cmake/zlib.cmake b/cmake/zlib.cmake index 9e085189..a933194c 100644 --- a/cmake/zlib.cmake +++ b/cmake/zlib.cmake @@ -14,9 +14,12 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA MACRO (MYSQL_USE_BUNDLED_ZLIB) - SET(ZLIB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/zlib ${CMAKE_BINARY_DIR}/zlib) + SET(ZLIB_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/zlib ${CMAKE_BINARY_DIR}/zlib) SET(BUILD_BUNDLED_ZLIB 1) - SET(ZLIB_LIBRARY zlib CACHE INTERNAL "Bundled zlib library") + SET(ZLIB_LIBRARIES zlib CACHE INTERNAL "Bundled zlib library") + # temporarily define ZLIB_LIBRARY and ZLIB_INCLUDE_DIR for libmariadb + SET(ZLIB_LIBRARY ${ZLIB_LIBRARIES}) + SET(ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIRS}) SET(ZLIB_FOUND TRUE) SET(WITH_ZLIB "bundled" CACHE STRING "Use bundled zlib") ADD_SUBDIRECTORY(zlib) @@ -29,7 +32,7 @@ ENDMACRO() # If this is set,we use bundled zlib # If this is not set,search for system zlib. # if system zlib is not found, use bundled copy -# ZLIB_LIBRARIES, ZLIB_INCLUDE_DIR and ZLIB_SOURCES +# ZLIB_LIBRARIES, ZLIB_INCLUDE_DIRS # are set after this macro has run MACRO (MYSQL_CHECK_ZLIB_WITH_COMPRESS) @@ -37,10 +40,14 @@ MACRO (MYSQL_CHECK_ZLIB_WITH_COMPRESS) IF(WITH_ZLIB STREQUAL "bundled") MYSQL_USE_BUNDLED_ZLIB() ELSE() - INCLUDE(FindZLIB) + FIND_PACKAGE(PkgConfig QUIET) + IF(PKG_CONFIG_FOUND AND (COMMAND PKG_GET_VARIABLE) AND (NOT WIN32)) + PKG_GET_VARIABLE(ZLIB_ROOT zlib prefix) + ENDIF() + FIND_PACKAGE(ZLIB) IF(ZLIB_FOUND) INCLUDE(CheckFunctionExists) - SET(CMAKE_REQUIRED_LIBRARIES z) + SET(CMAKE_REQUIRED_LIBRARIES ${ZLIB_LIBRARIES}) CHECK_FUNCTION_EXISTS(crc32 HAVE_CRC32) CHECK_FUNCTION_EXISTS(compressBound HAVE_COMPRESSBOUND) CHECK_FUNCTION_EXISTS(deflateBound HAVE_DEFLATEBOUND) @@ -48,7 +55,6 @@ MACRO (MYSQL_CHECK_ZLIB_WITH_COMPRESS) IF(HAVE_CRC32 AND HAVE_COMPRESSBOUND AND HAVE_DEFLATEBOUND) SET(WITH_ZLIB "system" CACHE STRING "Which zlib to use (possible values are 'bundled' or 'system')") - SET(ZLIB_SOURCES "") ELSE() SET(ZLIB_FOUND FALSE CACHE INTERNAL "Zlib found but not usable") MESSAGE(STATUS "system zlib found but not usable") diff --git a/config.h.cmake b/config.h.cmake index 81ca8fe7..49783ce6 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -30,7 +30,6 @@ #cmakedefine HAVE_DLFCN_H 1 #cmakedefine HAVE_EXECINFO_H 1 #cmakedefine HAVE_FCNTL_H 1 -#cmakedefine HAVE_FCNTL_DIRECT 1 #cmakedefine HAVE_FENV_H 1 #cmakedefine HAVE_FLOAT_H 1 #cmakedefine HAVE_FNMATCH_H 1 @@ -500,6 +499,7 @@ #cmakedefine HAVE_COMPRESS 1 #cmakedefine HAVE_EncryptAes128Ctr 1 #cmakedefine HAVE_EncryptAes128Gcm 1 +#cmakedefine HAVE_des 1 /* Stuff that always need to be defined (compile breaks without it) diff --git a/configure.cmake b/configure.cmake index 061837c1..5aefb673 100644 --- a/configure.cmake +++ b/configure.cmake @@ -60,15 +60,6 @@ IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" AND (NOT MSVC)) ENDIF() ENDIF() -# workaround for old gcc on x86, gcc atomic ops only work under -march=i686 -IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" AND CMAKE_COMPILER_IS_GNUCC AND - CMAKE_C_COMPILER_VERSION VERSION_LESS "4.4.0") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i686") - # query_response_time.cc causes "error: unable to find a register to spill" - SET(PLUGIN_QUERY_RESPONSE_TIME NO CACHE BOOL "Disabled, gcc is too old") -ENDIF() - # use runtime atomic-support detection in aarch64 IF(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") MY_CHECK_AND_SET_COMPILER_FLAG("-moutline-atomics") @@ -706,7 +697,6 @@ CHECK_SYMBOL_EXISTS(O_NONBLOCK "unistd.h;fcntl.h" HAVE_FCNTL_NONBLOCK) IF(NOT HAVE_FCNTL_NONBLOCK) SET(NO_FCNTL_NONBLOCK 1) ENDIF() -CHECK_SYMBOL_EXISTS(O_DIRECT "fcntl.h" HAVE_FCNTL_DIRECT) # # Test for how the C compiler does inline, if at all @@ -985,3 +975,8 @@ IF(have_C__Werror) ) SET(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS}) ENDIF() + +IF(CMAKE_C_COMPILER_ID MATCHES "Intel") + MY_CHECK_AND_SET_COMPILER_FLAG("-no-ansi-alias") + MY_CHECK_AND_SET_COMPILER_FLAG("-fp-model precise") +ENDIF() diff --git a/extra/CMakeLists.txt b/extra/CMakeLists.txt index 5021128e..06dc8900 100644 --- a/extra/CMakeLists.txt +++ b/extra/CMakeLists.txt @@ -13,7 +13,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${ZLIB_INCLUDE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${ZLIB_INCLUDE_DIRS}) # Default install component for the files is Server here SET(MYSQL_INSTALL_COMPONENT Server) diff --git a/extra/mariabackup/CMakeLists.txt b/extra/mariabackup/CMakeLists.txt index f1c9dca7..63ac8cf3 100644 --- a/extra/mariabackup/CMakeLists.txt +++ b/extra/mariabackup/CMakeLists.txt @@ -31,6 +31,7 @@ ENDIF() INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql + ${CMAKE_SOURCE_DIR}/storage/maria ${CMAKE_CURRENT_SOURCE_DIR}/quicklz ${CMAKE_CURRENT_SOURCE_DIR} ) @@ -49,14 +50,9 @@ ADD_DEFINITIONS(-UMYSQL_SERVER) ADD_DEFINITIONS(-DPCRE_STATIC=1) ADD_DEFINITIONS(${SSL_DEFINES}) -IF(PMEM_FOUND) - ADD_COMPILE_FLAGS(xtrabackup.cc COMPILE_FLAGS "-DHAVE_PMEM") -ENDIF() - MYSQL_ADD_EXECUTABLE(mariadb-backup xtrabackup.cc innobackupex.cc - changed_page_bitmap.cc datasink.cc ds_buffer.cc ds_compress.cc @@ -72,8 +68,12 @@ MYSQL_ADD_EXECUTABLE(mariadb-backup xbstream_write.cc backup_mysql.cc backup_copy.cc - xb_plugin.cc + encryption_plugin.cc ${PROJECT_BINARY_DIR}/sql/sql_builtin.cc + aria_backup_client.cc + thread_pool.cc + ddl_log.cc + common_engine.cc ${PROJECT_SOURCE_DIR}/sql/net_serv.cc ${PROJECT_SOURCE_DIR}/libmysqld/libmysql.c COMPONENT backup @@ -82,7 +82,8 @@ MYSQL_ADD_EXECUTABLE(mariadb-backup # Export all symbols on Unix, for better crash callstacks SET_TARGET_PROPERTIES(mariadb-backup PROPERTIES ENABLE_EXPORTS TRUE) -TARGET_LINK_LIBRARIES(mariadb-backup sql sql_builtins) +TARGET_LINK_LIBRARIES(mariadb-backup sql sql_builtins aria) + IF(NOT HAVE_SYSTEM_REGEX) TARGET_LINK_LIBRARIES(mariadb-backup pcre2-posix) ENDIF() diff --git a/extra/mariabackup/aria_backup_client.cc b/extra/mariabackup/aria_backup_client.cc new file mode 100644 index 00000000..25468148 --- /dev/null +++ b/extra/mariabackup/aria_backup_client.cc @@ -0,0 +1,1016 @@ +#include +#include +extern "C" { +#include "maria_def.h" +} +#undef LSN_MAX +#include "aria_backup_client.h" +#include "backup_copy.h" +#include "common.h" +#include "sql_table.h" +#include "ma_checkpoint.h" +#include "ma_recovery.h" +#include "backup_debug.h" +#include "aria_backup.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace aria { + +const char *log_preffix = "aria_log."; + + +static std::string log_file_name_only(size_t log_num) { + std::string log_file; + { + std::stringstream ss; + ss << std::setw(8) << std::setfill('0') << log_num; + log_file.append(log_preffix).append(ss.str()); + } + return log_file; +} + + +static std::string log_file_name(const char *datadir_path, size_t log_num) { + std::string log_file(datadir_path); + return log_file.append("/").append(log_file_name_only(log_num)); +} + + +class LogFileCollection +{ + uint32 m_first; + uint32 m_count; +public: + uint32 first() const { return m_first; } + uint32 count() const { return m_count; } + uint32 last() const + { + DBUG_ASSERT(m_count > 0); + return m_first + m_count - 1; + } + + // Initialize by checking existing log files on the disk + LogFileCollection(const char *datadir, uint32 max_log_no) + { + uint32 end= find_greatest_existing_log(datadir, max_log_no); + if (!end) + { + // No log files were found at all + m_first= 0; + m_count= 0; + } + else if (end == 1) + { + // Just the very first one log file (aria_log.00000001) was found. + m_first= 1; + m_count= 1; + } + else + { + // Multiple files were found + m_first= find_greatest_missing_log(datadir, end - 1) + 1; + m_count= 1 + end - m_first; + } + } + + /* + Skip all missing log files and find the greatest existing log file, or + Skip all existing log files and find the greatest missing log file. + + @param datadir - Search files in this directory + @param start - Start searching from this log number and go downto 1. + @param kind - true - search for an existing file + false - search for a missing file. + @returns - [1..start] - the greatest found log file + of the searched kind + - 0 - if no log files of this kind + were found in the range [1..start]. + */ + static uint32 find_greatest_existing_or_missing_log(const char *datadir, + uint32 start, + bool kind) + { + DBUG_ASSERT(start > 0); + for (uint32 i= start; i > 0; i--) + { + if (file_exists(log_file_name(datadir, i).c_str()) == kind) + return i; + } + return 0; // No log files of the searched kind were found + } + + static uint32 find_greatest_existing_log(const char *datadir, uint32 start) + { + return find_greatest_existing_or_missing_log(datadir, start, true); + } + + static uint32 find_greatest_missing_log(const char *datadir, uint32 start) + { + return find_greatest_existing_or_missing_log(datadir, start, false); + } + + /* + In some scenarios (e.g. log rotate) some new log files can appear + outside of the initially assumed [first,last] log number range. + This function adds all extra files behind "last". + */ + void find_logs_after_last(const char *datadir) + { + DBUG_ASSERT(m_count > 0); + for ( ; + file_exists(log_file_name(datadir, last() + 1).c_str()) ; + m_count++) + { } + } + + void report_found(unsigned thread_num) const + { + if (m_count) + msg(thread_num, + "Found %u aria log files, " + "minimum log number %u, " + "maximum log number %u", + m_count, m_first, last()); + } + + void die_if_missing(uint32 logno) const + { + DBUG_ASSERT(logno > 0); + if (!m_count || m_first > logno || last() < logno) + die("Aria log file %u does not exists.", logno); + } +}; + + +class Table { +public: + struct Partition { + std::string m_file_path; + File m_index_file = -1; + MY_STAT m_index_file_stat; + File m_data_file = -1; + MY_STAT m_data_file_stat; + }; + Table() = default; + Table (Table &&other) = delete; + Table & operator= (Table &&other) = delete; + Table(const Table &) = delete; + Table & operator= (const Table &) = delete; + ~Table(); + bool init(const char *data_file_path); + bool open(MYSQL *con, bool opt_no_lock, unsigned thread_num); + bool close(); + bool copy(ds_ctxt_t *ds, unsigned thread_num); + + bool is_online_backup_safe() const { + DBUG_ASSERT(is_opened()); + return m_cap.online_backup_safe; + } + bool is_stats() const { + return is_stats_table(m_db.c_str(), m_table.c_str()); + } + bool is_log() const { + return is_log_table(m_db.c_str(), m_table.c_str()); + } + bool is_opened() const { + return !m_partitions.empty() && + m_partitions[0].m_index_file >= 0 && m_partitions[0].m_data_file >= 0; + }; + std::string &get_full_name() { + return m_full_name; + } + std::string &get_db() { return m_db; } + std::string &get_table() { return m_table; } + std::string &get_version() { return m_table_version; } + bool is_partitioned() const { return m_partitioned; } + void add_partition(const Table &partition) { + DBUG_ASSERT(is_partitioned()); + m_partitions.push_back(partition.m_partitions[0]); + } +#ifndef DBUG_OFF + const std::string& get_sql_name() const { return m_sql_name; } +#endif //DBUG_OFF +private: + + bool copy(ds_ctxt_t *ds, bool is_index, unsigned thread_num); + // frm and par files will be copied under BLOCK_DDL stage in + // backup_copy_non_system() + bool copy_frm_and_par(ds_ctxt_t *ds, unsigned thread_num); + bool read_table_version_id(File file); + + std::string m_db; + std::string m_table; + std::string m_full_name; + std::string m_frm_par_path; + std::string m_table_version; +#ifndef DBUG_OFF + std::string m_sql_name; +#endif //DBUG_OFF + bool m_partitioned = false; + std::vector m_partitions; + ARIA_TABLE_CAPABILITIES m_cap; +}; + +Table::~Table() { + (void)close(); +} + +bool Table::init(const char *data_file_path) { + DBUG_ASSERT(data_file_path); + + const char *ext_pos = strrchr(data_file_path, '.'); + if (!ext_pos) + return false; + + char db_name_orig[FN_REFLEN]; + char table_name_orig[FN_REFLEN]; + parse_db_table_from_file_path( + data_file_path, db_name_orig, table_name_orig); + if (!db_name_orig[0] || !table_name_orig[0]) + return false; + char db_name_conv[FN_REFLEN]; + char table_name_conv[FN_REFLEN]; + filename_to_tablename(db_name_orig, db_name_conv, sizeof(db_name_conv)); + filename_to_tablename( + table_name_orig, table_name_conv, sizeof(table_name_conv)); + if (!db_name_conv[0] || !table_name_conv[0]) + return false; + + if (strstr(data_file_path, "#P#")) + m_partitioned = true; + + const char *table_name_begin = strrchr(data_file_path, FN_LIBCHAR); + if (!table_name_begin) + return false; + m_frm_par_path.assign(data_file_path, table_name_begin + 1). + append(table_name_orig); + + m_db.assign(db_name_conv); + m_table.assign(table_name_conv); + // TODO: find the correct way to represent quoted table/db names + m_full_name.assign("`").append(m_db).append("`.`"). + append(m_table).append("`"); +#ifndef DBUG_OFF + m_sql_name.assign(m_db).append("/").append(m_table); +#endif // DBUG_OFF + Partition partition; + partition.m_file_path.assign(data_file_path, ext_pos - data_file_path); + m_partitions.push_back(std::move(partition)); + return true; +} + +bool Table::read_table_version_id(File file) { + m_table_version = ::read_table_version_id(file); + return m_table_version.empty(); +} + +bool Table::open(MYSQL *con, bool opt_no_lock, unsigned thread_num) { + int error= 1; + bool have_capabilities = false; + File frm_file = -1; + + if (!opt_no_lock && !backup_lock(con, m_full_name.c_str())) { + msg(thread_num, "Error on BACKUP LOCK for aria table %s", + m_full_name.c_str()); + goto exit; + } + + for (Partition &partition : m_partitions) { + std::string file_path = partition.m_file_path + ".MAI"; + if ((partition.m_index_file= my_open(file_path.c_str(), + O_RDONLY | O_SHARE | O_NOFOLLOW | O_CLOEXEC, + MYF(MY_WME))) < 0) { + msg(thread_num, "Error on aria table file open %s", file_path.c_str()); + goto exit; + } + if (!my_stat(file_path.c_str(), &partition.m_index_file_stat, MYF(0))) { + msg(thread_num, "Error on aria table file stat %s", file_path.c_str()); + goto exit; + } + if (!have_capabilities) { + if ((error= aria_get_capabilities(partition.m_index_file, &m_cap))) { + msg(thread_num, "aria_get_capabilities failed: %d", error); + goto exit; + } + have_capabilities = true; + } + + file_path = partition.m_file_path + ".MAD"; + if ((partition.m_data_file= my_open(file_path.c_str(), + O_RDONLY | O_SHARE | O_NOFOLLOW | O_CLOEXEC, MYF(MY_WME))) < 0) { + msg(thread_num, "Error on aria table file open %s", file_path.c_str()); + goto exit; + } + if (!my_stat(file_path.c_str(), &partition.m_data_file_stat, MYF(0))) { + msg(thread_num, "Error on aria table file stat %s", file_path.c_str()); + goto exit; + } + } + + if ((frm_file = mysql_file_open( + key_file_frm, (m_frm_par_path + ".frm").c_str(), + O_RDONLY | O_SHARE, MYF(0))) < 0) { + msg(thread_num, "Error on aria table %s file open", + (m_frm_par_path + ".frm").c_str()); + goto exit; + } + + error = 0; + +exit: + if (!opt_no_lock && !backup_unlock(con)) { + msg(thread_num, "Error on BACKUP UNLOCK for aria table %s", + m_full_name.c_str()); + error = 1; + } + if (error) + (void)close(); + else { + (void)read_table_version_id(frm_file); + mysql_file_close(frm_file, MYF(MY_WME)); + } + return !error; +} + +bool Table::close() { + for (Partition &partition : m_partitions) { + if (partition.m_index_file >= 0) { + my_close(partition.m_index_file, MYF(MY_WME)); + partition.m_index_file = -1; + } + if (partition.m_data_file >= 0) { + my_close(partition.m_data_file, MYF(MY_WME)); + partition.m_data_file = -1; + } + } + return true; +} + +bool Table::copy(ds_ctxt_t *ds, unsigned thread_num) { + DBUG_ASSERT(is_opened()); + DBUG_MARIABACKUP_EVENT_LOCK("before_aria_table_copy", + fil_space_t::name_type(m_sql_name.data(), m_sql_name.size())); + bool result = +// copy_frm_and_par(ds, thread_num) && + copy(ds, true, thread_num) && copy(ds, false, thread_num); + return result; +} + +bool Table::copy(ds_ctxt_t *ds, bool is_index, unsigned thread_num) { + DBUG_ASSERT(ds); + const char *ext = is_index ? ".MAI" : ".MAD"; + int error= 1; + for (const Partition &partition : m_partitions) { + ds_file_t *dst_file = nullptr; + uchar *copy_buffer = nullptr; + std::string full_name = partition.m_file_path + ext; + const char *dst_path = + (xtrabackup_copy_back || xtrabackup_move_back) ? + full_name.c_str() : trim_dotslash(full_name.c_str()); + + dst_file = ds_open(ds, dst_path, + is_index ? &partition.m_index_file_stat : &partition.m_data_file_stat); + if (!dst_file) { + msg(thread_num, "error: cannot open the destination stream for %s", + dst_path); + goto err; + } + + copy_buffer = + reinterpret_cast(my_malloc(PSI_NOT_INSTRUMENTED, + m_cap.block_size, MYF(0))); + + DBUG_MARIABACKUP_EVENT_LOCK( + is_index ? + "before_aria_index_file_copy": + "before_aria_data_file_copy", + fil_space_t::name_type(m_sql_name.data(), + m_sql_name.size())); + + for (ulonglong block= 0 ; ; block++) { + size_t length = m_cap.block_size; + if (is_index) { + if ((error= aria_read_index( + partition.m_index_file, &m_cap, block, copy_buffer) == + HA_ERR_END_OF_FILE)) + break; + } else { + if ((error= aria_read_data( + partition.m_data_file, &m_cap, block, copy_buffer, &length) == + HA_ERR_END_OF_FILE)) + break; + } + if (error) { + msg(thread_num, "error: aria_read %s failed: %d", + is_index ? "index" : "data", error); + goto err; + } + xtrabackup_io_throttling(); + if ((error = ds_write(dst_file, copy_buffer, length))) { + msg(thread_num, "error: aria_write failed: %d", error); + goto err; + } + } + + DBUG_MARIABACKUP_EVENT_LOCK( + is_index ? + "after_aria_index_file_copy": + "after_aria_data_file_copy", + fil_space_t::name_type(m_sql_name.data(), + m_sql_name.size())); + + error = 0; + msg(thread_num, "aria table file %s is copied successfully.", + full_name.c_str()); + + err: + if (dst_file) + ds_close(dst_file); + if (copy_buffer) + my_free(copy_buffer); + if (error) + break; + } + return !error; +} + +class BackupImpl { +public: + BackupImpl( + const char *datadir_path, + const char *aria_log_path, + ds_ctxt_t *datasink, bool opt_no_lock, + std::vector &con_pool, ThreadPool &thread_pool) : + m_datadir_path(datadir_path), + m_aria_log_dir_path(aria_log_path), + m_ds(datasink), m_con_pool(con_pool), + m_tasks_group(thread_pool), m_thread_pool(thread_pool) { } + ~BackupImpl() { destroy(); } + bool init(); + bool start(bool no_lock); + bool wait_for_finish(); + bool copy_offline_tables( + const std::unordered_set *exclude_tables, bool no_lock, + bool copy_stats); + bool finalize(); + void set_post_copy_table_hook(const post_copy_table_hook_t &hook) { + m_table_post_copy_hook = hook; + } + bool copy_log_tail() { return copy_log_tail(0, false); } +private: + void destroy(); + void scan_job(bool no_lock, unsigned thread_num); + bool copy_log_tail(unsigned thread_num, bool finalize); + void copy_log_file_job(size_t log_num, unsigned thread_num); + void destroy_log_tail(); + void process_table_job(Table *table, bool online_only, bool copy_stats, + bool no_lock, unsigned thread_num); + + const char *m_datadir_path; + const char *m_aria_log_dir_path; + std::string aria_log_dir_path() const + { + if (!m_aria_log_dir_path || !m_aria_log_dir_path[0]) + return m_datadir_path; + if (is_absolute_path(m_aria_log_dir_path)) + return m_aria_log_dir_path; + return std::string(m_datadir_path).append("/") + .append(m_aria_log_dir_path); + } + ds_ctxt_t *m_ds; + std::vector &m_con_pool; + + TasksGroup m_tasks_group; + + std::mutex m_offline_tables_mutex; + std::vector> m_offline_tables; + post_copy_table_hook_t m_table_post_copy_hook; + + ThreadPool &m_thread_pool; + + size_t m_last_log_num = 0; + ds_file_t* m_last_log_dst = nullptr; + File m_last_log_src = -1; +}; + +bool BackupImpl::init() { + DBUG_ASSERT(m_tasks_group.is_finished()); + return true; +}; + +void BackupImpl::destroy() { + DBUG_ASSERT(m_tasks_group.is_finished()); + destroy_log_tail(); +} + +bool BackupImpl::start(bool no_lock) { + DBUG_ASSERT(m_tasks_group.is_finished()); + m_tasks_group.push_task( + std::bind(&BackupImpl::scan_job, this, no_lock, std::placeholders::_1)); + return true; +} + +void BackupImpl::process_table_job( + Table *table_ptr, bool online_only, bool copy_stats, bool no_lock, + unsigned thread_num) { + DBUG_ASSERT(table_ptr); + DBUG_ASSERT(thread_num < m_con_pool.size()); + std::unique_ptr table(table_ptr); + bool is_online; + bool is_stats; + bool need_copy; + int result = 1; + + if (!m_tasks_group.get_result()) + goto exit; + + if (!table->open(m_con_pool[thread_num], no_lock, thread_num)) { + // if table can't be opened, it might be removed or renamed, this is not + // error for transactional tables + table->close(); // Close opened table files + goto exit; + } + + is_online = table->is_online_backup_safe(); + is_stats = table->is_stats(); + + need_copy = (!online_only || is_online) && (copy_stats || !is_stats); + + if (need_copy && !table->copy(m_ds, thread_num)) { + table->close(); + DBUG_MARIABACKUP_EVENT_LOCK("after_aria_table_copy", + fil_space_t::name_type(table->get_sql_name().data(), + table->get_sql_name().size())); + // if table is opened, it must be copied, + // the corresponding diagnostic messages must be issued in Table::copy() + result = 0; + goto exit; + } + + if (!table->close()) { + msg(thread_num, "Can't close aria table %s.\n", + table->get_full_name().c_str()); + result = 0; + goto exit; + } + + if (!need_copy) { + std::lock_guard lock(m_offline_tables_mutex); + m_offline_tables.push_back(std::move(table)); + } + else { + DBUG_MARIABACKUP_EVENT_LOCK("after_aria_table_copy", + fil_space_t::name_type(table->get_sql_name().data(), + table->get_sql_name().size())); + if (m_table_post_copy_hook) + m_table_post_copy_hook( + std::move(table->get_db()), + std::move(table->get_table()), + std::move(table->get_version())); + } +exit: + m_tasks_group.finish_task(result); +} + + +void BackupImpl::scan_job(bool no_lock, unsigned thread_num) { + std::unordered_map> partitioned_tables; + + std::string aria_log_dir_path_cache(aria_log_dir_path()); + std::string log_control_file_path(aria_log_dir_path_cache); + log_control_file_path.append("/aria_log_control"); + if (!m_ds->copy_file( + log_control_file_path.c_str(), "aria_log_control", + 0, false)) { + msg("Aria log control file copying error."); + m_tasks_group.finish_task(0); + return; + } + + msg(thread_num, "Loading aria_log_control."); + aria_readonly= 1; + maria_data_root= aria_log_dir_path_cache.c_str(); + if (ma_control_file_open(FALSE, FALSE, FALSE, O_RDONLY)) + die("Can't open Aria control file (%d)", errno); + uint32 aria_log_control_last_log_number= last_logno; + msg(thread_num, "aria_log_control: last_log_number: %d", + aria_log_control_last_log_number); + ma_control_file_end(); + + msg(thread_num, "Start scanning aria tables."); + + foreach_file_in_db_dirs(m_datadir_path, [&](const char *file_path)->bool { + + if (check_if_skip_table(file_path)) { + msg(thread_num, "Skipping %s.", file_path); + return true; + } + + if (!ends_with(file_path, ".MAD")) + return true; + + std::unique_ptr
table(new Table()); + if (!table->init(file_path)) { + msg(thread_num, "Can't init aria table %s.\n", file_path); + return true; + } + + if (table->is_log()) + return true; + + if (table->is_partitioned()) { + auto table_it = partitioned_tables.find(table->get_full_name()); + if (table_it == partitioned_tables.end()) { + partitioned_tables[table->get_full_name()] = std::move(table); + } else { + table_it->second->add_partition(*table); + } + return true; + } + + m_tasks_group.push_task( + std::bind(&BackupImpl::process_table_job, this, table.release(), true, + false, no_lock, std::placeholders::_1)); + return true; + }); + + for (auto &table_it : partitioned_tables) { + m_tasks_group.push_task( + std::bind(&BackupImpl::process_table_job, this, table_it.second.release(), + true, false, no_lock, std::placeholders::_1)); + } + + msg(thread_num, "Start scanning aria log files."); + + LogFileCollection logs(aria_log_dir_path_cache.c_str(), + aria_log_control_last_log_number); + logs.report_found(thread_num); + logs.die_if_missing(aria_log_control_last_log_number); + + m_last_log_num= logs.last(); + + DBUG_MARIABACKUP_EVENT("after_scanning_log_files", {}); + + for (uint32 i= logs.first(); i <= logs.last(); ++i) + m_tasks_group.push_task( + std::bind(&BackupImpl::copy_log_file_job, this, + i, std::placeholders::_1)); + + msg(thread_num, "Stop scanning aria tables."); + + m_tasks_group.finish_task(1); +} + +template +T align_down(T n, ulint align_no) +{ + DBUG_ASSERT(align_no > 0); + DBUG_ASSERT(ut_is_2pow(align_no)); + return n & ~(static_cast(align_no) - 1); +} + +static ssize_t copy_file_chunk(File src, ds_file_t* dst, size_t size) { + size_t bytes_read; + static const size_t max_buf_size = 10 * 1024 * 1024; + size_t buf_size = size ? std::min(size, max_buf_size) : max_buf_size; + std::unique_ptr buf(new uchar[buf_size]); + ssize_t copied_size = 0; + bool unlim = !size; + while((unlim || size) && (bytes_read = my_read(src, buf.get(), + unlim ? buf_size : std::min(buf_size, size), MY_WME))) { + if (bytes_read == size_t(-1)) + return -1; + xtrabackup_io_throttling(); + if (ds_write(dst, buf.get(), bytes_read)) + return -1; + copied_size += bytes_read; + if (!unlim) + size -= bytes_read; + } + return copied_size; +} + +bool BackupImpl::copy_log_tail(unsigned thread_num, bool finalize) { + bool result = false; + std::string log_file = log_file_name(aria_log_dir_path().c_str(), m_last_log_num); + std::string prev_log_file; + ssize_t total_bytes_copied = 0; + MY_STAT stat_info; + my_off_t file_offset = 0; + size_t to_copy_size = 0; + +repeat: + memset(&stat_info, 0, sizeof(MY_STAT)); + if (!m_tasks_group.get_result()) { + msg(thread_num, "Skip copying aria lof file tail %s due to error.", + log_file.c_str()); + result = true; + goto exit; + } + + msg(thread_num, "Start copying aria log file tail: %s", log_file.c_str()); + + if (m_last_log_src < 0 && (m_last_log_src = + my_open(log_file.c_str(), O_RDONLY | O_SHARE | O_NOFOLLOW | O_CLOEXEC, + MYF(MY_WME))) < 0) { + msg("Aria log file %s open failed: %d", log_file.c_str(), my_errno); + goto exit; + } + + if (!m_last_log_dst && + !(m_last_log_dst = ds_open(m_ds, + log_file_name_only(m_last_log_num).c_str(), + &stat_info, false))) { + msg(thread_num, "error: failed to open the target stream for " + "aria log file %s.", + log_file.c_str()); + goto exit; + } + +// If there is no need to finalize log file copying, calculate the size to copy +// without the last page, which can be rewritten by the server +// (see translog_force_current_buffer_to_finish()). + if (!finalize) { + if (my_fstat(m_last_log_src, &stat_info, MYF(0))) { + msg(thread_num, "error: failed to get file size for aria log file: %s.", + log_file.c_str()); + goto exit; + } + if ((file_offset = my_tell(m_last_log_src, MYF(0))) == (my_off_t)(-1)) { + msg(thread_num, "error: failed to get file offset for aria log file: %s.", + log_file.c_str()); + goto exit; + } + DBUG_ASSERT(file_offset <= static_cast(stat_info.st_size)); + to_copy_size = static_cast(stat_info.st_size - file_offset); + to_copy_size = to_copy_size >= TRANSLOG_PAGE_SIZE ? + (align_down(to_copy_size, TRANSLOG_PAGE_SIZE) - TRANSLOG_PAGE_SIZE) : 0; + } + +// Copy from the last position to the end of file, +// excluding the last page is there is no need to finalize the copy. + if ((to_copy_size || finalize) && + (total_bytes_copied = copy_file_chunk(m_last_log_src, + m_last_log_dst, to_copy_size)) < 0) { + msg(thread_num, "Aria log file %s chunk copy error", log_file.c_str()); + goto exit; + } + + msg(thread_num, "Stop copying aria log file tail: %s, copied %zu bytes", + log_file.c_str(), total_bytes_copied); + +// Check if there is new log file, if yes, then copy the last page of the old +// one, and fix it last LSN in the log header, as it is changed on new +// log file creating by the server (see translog_create_new_file() and +// translog_max_lsn_to_header()). Then close the old log file and repeat +// the copying for the new log file. + prev_log_file = std::move(log_file); + log_file = log_file_name(aria_log_dir_path().c_str(), m_last_log_num + 1); + if (file_exists(log_file.c_str())) { + uchar lsn_buff[LSN_STORE_SIZE]; + msg(thread_num, "Found new aria log tail file: %s, start copy %s tail", + log_file.c_str(), prev_log_file.c_str()); + if ((total_bytes_copied = copy_file_chunk(m_last_log_src, + m_last_log_dst, 0)) < 0) { + msg(thread_num, "Aria log file %s tail copy error", + prev_log_file.c_str()); + goto exit; + } + + if (my_pread(m_last_log_src, lsn_buff, LSN_STORE_SIZE, + (LOG_HEADER_DATA_SIZE - LSN_STORE_SIZE), MYF(0)) < LSN_STORE_SIZE) { + msg(thread_num, "Aria lsn store read error for log file %s", + prev_log_file.c_str()); + goto exit; + } + + if (ds_seek_set(m_last_log_dst, (LOG_HEADER_DATA_SIZE - LSN_STORE_SIZE))) { + msg(thread_num, "Set aria log pointer error for log file %s", + prev_log_file.c_str()); + goto exit; + } + + if (ds_write(m_last_log_dst, lsn_buff, LSN_STORE_SIZE)) { + msg(thread_num, "LSN write error for aria log file %s", + prev_log_file.c_str()); + goto exit; + } + + msg(thread_num, "The last %zu bytes were copied for %s.", + total_bytes_copied, prev_log_file.c_str()); + destroy_log_tail(); + ++m_last_log_num; + goto repeat; + } + + result = true; + +exit: + if (!result) + destroy_log_tail(); + return result; +} + +void BackupImpl::copy_log_file_job(size_t log_num, unsigned thread_num) { + DBUG_ASSERT(log_num <= m_last_log_num); + + if (!m_tasks_group.get_result()) { + msg(thread_num, "Skip copying %zu aria log file due to error", log_num); + m_tasks_group.finish_task(0); + return; + } + +// Copy log file if the file is not the last one. + if (log_num < m_last_log_num) { + std::string log_file = log_file_name(aria_log_dir_path().c_str(), log_num); + if (!m_ds->copy_file(log_file.c_str(), + log_file_name_only(log_num).c_str(), + thread_num, false)) { + msg(thread_num, "Error on copying %s aria log file.", log_file.c_str()); + m_tasks_group.finish_task(0); + } + else + m_tasks_group.finish_task(1); + return; + } +// Copy the last log file. + m_tasks_group.finish_task(copy_log_tail(thread_num, false) ? 1 : 0); +} + +void BackupImpl::destroy_log_tail() { + if (m_last_log_src >= 0) { + my_close(m_last_log_src, MYF(MY_WME)); + m_last_log_src = -1; + } + if (m_last_log_dst) { + ds_close(m_last_log_dst); + m_last_log_dst = nullptr; + } +} + +bool BackupImpl::wait_for_finish() { + return m_tasks_group.wait_for_finish(); +} + +bool BackupImpl::copy_offline_tables( + const std::unordered_set *exclude_tables, bool no_lock, + bool copy_stats) { + DBUG_ASSERT(m_tasks_group.is_finished()); + + std::vector> ignored_tables; + + while (true) { + std::unique_lock lock(m_offline_tables_mutex); + if (m_offline_tables.empty()) + break; + auto table = std::move(m_offline_tables.back()); + m_offline_tables.pop_back(); + lock.unlock(); + if ((exclude_tables && + exclude_tables->count(table_key(table->get_db(), table->get_table()))) || + (!copy_stats && table->is_stats())) { + ignored_tables.push_back(std::move(table)); + continue; + } + m_tasks_group.push_task( + std::bind(&BackupImpl::process_table_job, this, table.release(), false, + copy_stats, no_lock, std::placeholders::_1)); + } + + if (!ignored_tables.empty()) { + std::lock_guard lock(m_offline_tables_mutex); + m_offline_tables = std::move(ignored_tables); + } + + return true; +} + +bool BackupImpl::finalize() { + DBUG_ASSERT(m_tasks_group.is_finished()); + DBUG_ASSERT(!m_con_pool.empty()); + bool result = true; + msg("Start copying statistics aria tables."); + copy_offline_tables(nullptr, true, true); + while (!m_tasks_group.is_finished()) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + msg("Stop copying statistics aria tables."); + copy_log_tail(0, true); + destroy_log_tail(); + return result; +} + +Backup::Backup(const char *datadir_path, + const char *aria_log_path, + ds_ctxt_t *datasink, + std::vector &con_pool, ThreadPool &thread_pool) : + m_backup_impl( + new BackupImpl(datadir_path, aria_log_path, + datasink, opt_no_lock, con_pool, + thread_pool)) { } + +Backup::~Backup() { + delete m_backup_impl; +} + +bool Backup::init() { + return m_backup_impl->init(); +} + +bool Backup::start(bool no_lock) { + return m_backup_impl->start(no_lock); +} + +bool Backup::wait_for_finish() { + return m_backup_impl->wait_for_finish(); +} + +bool Backup::copy_offline_tables( + const std::unordered_set *exclude_tables, bool no_lock, + bool copy_stats) { + return m_backup_impl->copy_offline_tables(exclude_tables, no_lock, + copy_stats); +} + +bool Backup::finalize() { + return m_backup_impl->finalize(); +} + +bool Backup::copy_log_tail() { + return m_backup_impl->copy_log_tail(); +} + +void Backup::set_post_copy_table_hook(const post_copy_table_hook_t &hook) { + m_backup_impl->set_post_copy_table_hook(hook); +} + +bool prepare(const char *target_dir) { + maria_data_root= (char *)target_dir; + + if (maria_init()) + die("Can't init Aria engine (%d)", errno); + + maria_block_size= 0; /* Use block size from file */ + /* we don't want to create a control file, it MUST exist */ + if (ma_control_file_open(FALSE, TRUE, TRUE, control_file_open_flags)) + die("Can't open Aria control file (%d)", errno); + + if (last_logno == FILENO_IMPOSSIBLE) + die("Can't find any Aria log"); + + LogFileCollection logs(target_dir, last_logno); + logs.die_if_missing(last_logno); // Fatal, a broken backup. + /* + "mariadb-backup --backup" can put extra log files, + with log number greater than last_logno. For example, + this combination of files is possible: + - aria_log_control (with last_logno==1) + - aria_log.00000001 (last_logno) + - aria_log.00000002 (last_logno+1, the extra log file) + This can happen if during the ealier run of + "mariadb-backup --backup" a log rotate happened. + The extra log file is copied to the backup directory, + but last_logno in aria_log_control does not get updated. + This mismatch is probably not good and should eventually be fixed. + But during "mariadb-backup --prepare" this mismatch goes away: + aria_log_control gets fixed to say last_logno==2. + See mysql-test/suite/mariabackup/aria_log_rotate_during_backup.test, + it covers the scenario with one extra file created during --backup. + */ + logs.find_logs_after_last(target_dir); + last_logno= logs.last(); // Update last_logno if extra logs were found + + if (init_pagecache(maria_pagecache, 1024L*1024L, 0, 0, + static_cast(maria_block_size), 0, MY_WME) == 0) + die("Got error in Aria init_pagecache() (errno: %d)", errno); + + if (init_pagecache(maria_log_pagecache, 1024L*1024L, + 0, 0, TRANSLOG_PAGE_SIZE, 0, MY_WME) == 0 || + translog_init(maria_data_root, TRANSLOG_FILE_SIZE, + 0, 0, maria_log_pagecache, TRANSLOG_DEFAULT_FLAGS, FALSE)) + die("Can't init Aria loghandler (%d)", errno); + + if (maria_recovery_from_log()) + die("Aria log apply FAILED"); + + if (maria_recovery_changed_data || recovery_failures) { + if (ma_control_file_write_and_force(last_checkpoint_lsn, last_logno, + max_trid_in_control_file, 0)) + die("Aria control file update error"); +// TODO: find out do we need checkpoint here + } + + maria_end(); + return true; +} + +} // namespace aria diff --git a/extra/mariabackup/aria_backup_client.h b/extra/mariabackup/aria_backup_client.h new file mode 100644 index 00000000..7a581b58 --- /dev/null +++ b/extra/mariabackup/aria_backup_client.h @@ -0,0 +1,38 @@ +#pragma once +#include "my_global.h" +#include "datasink.h" +#include "backup_mysql.h" +#include "thread_pool.h" +#include "xtrabackup.h" + +namespace aria { + +bool prepare(const char *target_dir); + +class BackupImpl; + +class Backup { + public: + Backup(const char *datadir_path, + const char *aria_log_path, + ds_ctxt_t *datasink, + std::vector &con_pool, ThreadPool &thread_pool); + ~Backup(); + Backup (Backup &&other) = delete; + Backup & operator= (Backup &&other) = delete; + Backup(const Backup &) = delete; + Backup & operator= (const Backup &) = delete; + bool init(); + bool start(bool no_lock); + bool wait_for_finish(); + bool copy_offline_tables( + const std::unordered_set *exclude_tables, bool no_lock, + bool copy_stats); + bool finalize(); + bool copy_log_tail(); + void set_post_copy_table_hook(const post_copy_table_hook_t &hook); + private: + BackupImpl *m_backup_impl; +}; + +} // namespace aria diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc index f8d315d9..198da01a 100644 --- a/extra/mariabackup/backup_copy.cc +++ b/extra/mariabackup/backup_copy.cc @@ -41,6 +41,9 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA *******************************************************/ #include +#include +#include +#include #include #include #include @@ -66,19 +69,26 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA #include #endif +#ifdef MYSQL_CLIENT +#define WAS_MYSQL_CLIENT 1 +#undef MYSQL_CLIENT +#endif + +#include "table.h" + +#ifdef WAS_MYSQL_CLIENT +#define MYSQL_CLIENT 1 +#undef WAS_MYSQL_CLIENT +#endif #define ROCKSDB_BACKUP_DIR "#rocksdb" -/* list of files to sync for --rsync mode */ -static std::set rsync_list; /* locations of tablespaces read from .isl files */ static std::map tablespace_locations; /* Whether LOCK BINLOG FOR BACKUP has been issued during backup */ bool binlog_locked; -static void rocksdb_create_checkpoint(); -static bool has_rocksdb_plugin(); static void rocksdb_backup_checkpoint(ds_ctxt *ds_data); static void rocksdb_copy_back(ds_ctxt *ds_data); @@ -135,10 +145,6 @@ struct datadir_thread_ctxt_t { bool ret; }; -static bool backup_files_from_datadir(ds_ctxt_t *ds_data, - const char *dir_path, - const char *prefix); - /************************************************************************ Retirn true if character if file separator */ bool @@ -585,7 +591,6 @@ datafile_read(datafile_cur_t *cursor) Check to see if a file exists. Takes name of the file to check. @return true if file exists. */ -static bool file_exists(const char *filename) { @@ -601,7 +606,6 @@ file_exists(const char *filename) /************************************************************************ Trim leading slashes from absolute path so it becomes relative */ -static const char * trim_dotslash(const char *path) { @@ -634,7 +638,7 @@ ends_with(const char *str, const char *suffix) && strcmp(str + str_len - suffix_len, suffix) == 0); } -static bool starts_with(const char *str, const char *prefix) +bool starts_with(const char *str, const char *prefix) { return strncmp(str, prefix, strlen(prefix)) == 0; } @@ -785,7 +789,6 @@ directory_exists_and_empty(const char *dir, const char *comment) /************************************************************************ Check if file name ends with given set of suffixes. @return true if it does. */ -static bool filename_matches(const char *filename, const char **ext_list) { @@ -800,52 +803,127 @@ filename_matches(const char *filename, const char **ext_list) return(false); } - -/************************************************************************ -Copy data file for backup. Also check if it is allowed to copy by -comparing its name to the list of known data file types and checking -if passes the rules for partial backup. -@return true if file backed up or skipped successfully. */ +// TODO: the code can be used to find storage engine of partitions +/* static -bool -datafile_copy_backup(ds_ctxt *ds_data, const char *filepath, uint thread_n) -{ - const char *ext_list[] = {"frm", "isl", "MYD", "MYI", "MAD", "MAI", - "MRG", "TRG", "TRN", "ARM", "ARZ", "CSM", "CSV", "opt", "par", - NULL}; +bool is_aria_frm_or_par(const char *path) { + if (!ends_with(path, ".frm") && !ends_with(path, ".par")) + return false; - /* Get the name and the path for the tablespace. node->name always - contains the path (which may be absolute for remote tablespaces in - 5.6+). space->name contains the tablespace name in the form - "./database/table.ibd" (in 5.5-) or "database/table" (in 5.6+). For a - multi-node shared tablespace, space->name contains the name of the first - node, but that's irrelevant, since we only need node_name to match them - against filters, and the shared tablespace is always copied regardless - of the filters value. */ + const char *frm_path = path; + if (ends_with(path, ".par")) { + size_t frm_path_len = strlen(path); + DBUG_ASSERT(frm_path_len > strlen("frm")); + frm_path = strdup(path); + strcpy(const_cast(frm_path) + frm_path_len - strlen("frm"), "frm"); + } - if (check_if_skip_table(filepath)) { - msg(thread_n,"Skipping %s.", filepath); - return(true); + bool result = false; + File file; + uchar header[40]; + legacy_db_type dbt; + + if ((file= mysql_file_open(key_file_frm, frm_path, O_RDONLY | O_SHARE, MYF(0))) + < 0) + goto err; + + if (mysql_file_read(file, (uchar*) header, sizeof(header), MYF(MY_NABP))) + goto err; + + if (!strncmp((char*) header, "TYPE=VIEW\n", 10)) + goto err; + + if (!is_binary_frm_header(header)) + goto err; + + dbt = (legacy_db_type)header[3]; + + if (dbt == DB_TYPE_ARIA) { + result = true; } + else if (dbt == DB_TYPE_PARTITION_DB) { + MY_STAT state; + uchar *frm_image= 0; +// uint n_length; - if (filename_matches(filepath, ext_list)) { - return ds_data->copy_file(filepath, filepath, thread_n); + if (mysql_file_fstat(file, &state, MYF(MY_WME))) + goto err; + + if (mysql_file_seek(file, 0, SEEK_SET, MYF(MY_WME))) + goto err; + + if (read_string(file, &frm_image, (size_t)state.st_size)) + goto err; + + dbt = (legacy_db_type)frm_image[61]; + if (dbt == DB_TYPE_ARIA) { + result = true; + } + my_free(frm_image); } - return(true); +err: + if (file >= 0) + mysql_file_close(file, MYF(MY_WME)); + if (frm_path != path) + free(const_cast(frm_path)); + return result; } +*/ +void parse_db_table_from_file_path( + const char *filepath, char *dbname, char *tablename) { + dbname[0] = '\0'; + tablename[0] = '\0'; + const char *dbname_start = nullptr; + const char *tablename_start = filepath; + const char *const_ptr; + while ((const_ptr = strchr(tablename_start, FN_LIBCHAR)) != NULL) { + dbname_start = tablename_start; + tablename_start = const_ptr + 1; + } + if (!dbname_start) + return; + size_t dbname_len = tablename_start - dbname_start - 1; + if (dbname_len >= FN_REFLEN) + dbname_len = FN_REFLEN-1; + strmake(dbname, dbname_start, dbname_len); + strmake(tablename, tablename_start, FN_REFLEN-1); + char *ptr; + if ((ptr = strchr(tablename, '.'))) + *ptr = '\0'; + if ((ptr = strstr(tablename, "#P#"))) + *ptr = '\0'; +} + +bool is_system_table(const char *dbname, const char *tablename) +{ + DBUG_ASSERT(dbname); + DBUG_ASSERT(tablename); + + LEX_CSTRING lex_dbname; + LEX_CSTRING lex_tablename; + lex_dbname.str = dbname; + lex_dbname.length = strlen(dbname); + lex_tablename.str = tablename; + lex_tablename.length = strlen(tablename); + + TABLE_CATEGORY tg = get_table_category(&lex_dbname, &lex_tablename); + + return (tg == TABLE_CATEGORY_LOG) || (tg == TABLE_CATEGORY_SYSTEM); +} /************************************************************************ -Same as datafile_copy_backup, but put file name into the list for -rsync command. */ +Copy data file for backup. Also check if it is allowed to copy by +comparing its name to the list of known data file types and checking +if passes the rules for partial backup. +@return true if file backed up or skipped successfully. */ static bool -datafile_rsync_backup(const char *filepath, bool save_to_list, FILE *f) +datafile_copy_backup(ds_ctxt *ds_data, const char *filepath, uint thread_n) { - const char *ext_list[] = {"frm", "isl", "MYD", "MYI", "MAD", "MAI", - "MRG", "TRG", "TRN", "ARM", "ARZ", "CSM", "CSV", "opt", "par", - NULL}; + const char *ext_list[] = {".frm", ".isl", ".TRG", ".TRN", ".opt", ".par", + NULL}; /* Get the name and the path for the tablespace. node->name always contains the path (which may be absolute for remote tablespaces in @@ -857,15 +935,13 @@ datafile_rsync_backup(const char *filepath, bool save_to_list, FILE *f) of the filters value. */ if (check_if_skip_table(filepath)) { + msg(thread_n,"Skipping %s.", filepath); return(true); } if (filename_matches(filepath, ext_list)) { - fprintf(f, "%s\n", filepath); - if (save_to_list) { - rsync_list.insert(filepath); - } - } + return ds_data->copy_file(filepath, filepath, thread_n); + } return(true); } @@ -1004,16 +1080,15 @@ Copy file for backup/restore. bool ds_ctxt_t::copy_file(const char *src_file_path, const char *dst_file_path, - uint thread_n) + uint thread_n, + bool rewrite) { char dst_name[FN_REFLEN]; ds_file_t *dstfile = NULL; datafile_cur_t cursor; xb_fil_cur_result_t res; DBUG_ASSERT(datasink->remove); - const char *dst_path = - (xtrabackup_copy_back || xtrabackup_move_back)? - dst_file_path : trim_dotslash(dst_file_path); + const char *dst_path = convert_dst(dst_file_path); if (!datafile_open(src_file_path, &cursor, thread_n)) { goto error_close; @@ -1021,7 +1096,7 @@ ds_ctxt_t::copy_file(const char *src_file_path, strncpy(dst_name, cursor.rel_path, sizeof(dst_name)); - dstfile = ds_open(this, dst_path, &cursor.statinfo); + dstfile = ds_open(this, dst_path, &cursor.statinfo, rewrite); if (dstfile == NULL) { msg(thread_n,"error: " "cannot open the destination stream for %s", dst_name); @@ -1245,278 +1320,45 @@ cleanup: } - - -static bool -backup_files(ds_ctxt *ds_data, const char *from, bool prep_mode) +backup_files(ds_ctxt *ds_data, const char *from) { - char rsync_tmpfile_name[FN_REFLEN]; - FILE *rsync_tmpfile = NULL; datadir_iter_t *it; datadir_node_t node; bool ret = true; - - if (prep_mode && !opt_rsync) { - return(true); - } - - if (opt_rsync) { - snprintf(rsync_tmpfile_name, sizeof(rsync_tmpfile_name), - "%s/%s%d", opt_mysql_tmpdir, - "xtrabackup_rsyncfiles_pass", - prep_mode ? 1 : 2); - rsync_tmpfile = fopen(rsync_tmpfile_name, "w"); - if (rsync_tmpfile == NULL) { - msg("Error: can't create file %s", - rsync_tmpfile_name); - return(false); - } - } - - msg("Starting %s non-InnoDB tables and files", - prep_mode ? "prep copy of" : "to backup"); - + msg("Starting to backup non-InnoDB tables and files"); datadir_node_init(&node); it = datadir_iter_new(from); - while (datadir_iter_next(it, &node)) { - if (!node.is_empty_dir) { - if (opt_rsync) { - ret = datafile_rsync_backup(node.filepath, - !prep_mode, rsync_tmpfile); - } else { - ret = datafile_copy_backup(ds_data, node.filepath, 1); - } + ret = datafile_copy_backup(ds_data, node.filepath, 1); if (!ret) { msg("Failed to copy file %s", node.filepath); goto out; } - } else if (!prep_mode) { + } else { /* backup fake file into empty directory */ char path[FN_REFLEN]; - snprintf(path, sizeof(path), - "%s/db.opt", node.filepath); - if (!(ret = ds_data->backup_file_printf( - trim_dotslash(path), "%s", ""))) { + snprintf(path, sizeof(path), "%s/db.opt", node.filepath); + if (!(ret = ds_data->backup_file_printf(trim_dotslash(path), "%s", ""))) { msg("Failed to create file %s", path); goto out; } } } - - if (opt_rsync) { - std::stringstream cmd; - int err; - - if (buffer_pool_filename && file_exists(buffer_pool_filename)) { - fprintf(rsync_tmpfile, "%s\n", buffer_pool_filename); - rsync_list.insert(buffer_pool_filename); - } - if (file_exists("ib_lru_dump")) { - fprintf(rsync_tmpfile, "%s\n", "ib_lru_dump"); - rsync_list.insert("ib_lru_dump"); - } - - fclose(rsync_tmpfile); - rsync_tmpfile = NULL; - - cmd << "rsync -t . --files-from=" << rsync_tmpfile_name - << " " << xtrabackup_target_dir; - - msg("Starting rsync as: %s", cmd.str().c_str()); - if ((err = system(cmd.str().c_str()) && !prep_mode) != 0) { - msg("Error: rsync failed with error code %d", err); - ret = false; - goto out; - } - msg("rsync finished successfully."); - - if (!prep_mode && !opt_no_lock) { - char path[FN_REFLEN]; - char dst_path[FN_REFLEN]; - char *newline; - - /* Remove files that have been removed between first and - second passes. Cannot use "rsync --delete" because it - does not work with --files-from. */ - snprintf(rsync_tmpfile_name, sizeof(rsync_tmpfile_name), - "%s/%s", opt_mysql_tmpdir, - "xtrabackup_rsyncfiles_pass1"); - - rsync_tmpfile = fopen(rsync_tmpfile_name, "r"); - if (rsync_tmpfile == NULL) { - msg("Error: can't open file %s", - rsync_tmpfile_name); - ret = false; - goto out; - } - - while (fgets(path, sizeof(path), rsync_tmpfile)) { - - newline = strchr(path, '\n'); - if (newline) { - *newline = 0; - } - if (rsync_list.count(path) < 1) { - snprintf(dst_path, sizeof(dst_path), - "%s/%s", xtrabackup_target_dir, - path); - msg("Removing %s", dst_path); - unlink(dst_path); - } - } - - fclose(rsync_tmpfile); - rsync_tmpfile = NULL; - } - } - - msg("Finished %s non-InnoDB tables and files", - prep_mode ? "a prep copy of" : "backing up"); - + msg("Finished backing up non-InnoDB tables and files"); out: datadir_iter_free(it); datadir_node_free(&node); - - if (rsync_tmpfile != NULL) { - fclose(rsync_tmpfile); - } - return(ret); } - -lsn_t get_current_lsn(MYSQL *connection) -{ - static const char lsn_prefix[] = "\nLog sequence number "; - lsn_t lsn = 0; - if (MYSQL_RES *res = xb_mysql_query(connection, - "SHOW ENGINE INNODB STATUS", - true, false)) { - if (MYSQL_ROW row = mysql_fetch_row(res)) { - const char *p= strstr(row[2], lsn_prefix); - DBUG_ASSERT(p); - if (p) { - p += sizeof lsn_prefix - 1; - lsn = lsn_t(strtoll(p, NULL, 10)); - } - } - mysql_free_result(res); - } - return lsn; -} - lsn_t server_lsn_after_lock; extern void backup_wait_for_lsn(lsn_t lsn); -/** Start --backup */ -bool backup_start(ds_ctxt *ds_data, ds_ctxt *ds_meta, - CorruptedPages &corrupted_pages) -{ - if (!opt_no_lock) { - if (opt_safe_slave_backup) { - if (!wait_for_safe_slave(mysql_connection)) { - return(false); - } - } - - if (!backup_files(ds_data, fil_path_to_mysql_datadir, true)) { - return(false); - } - - history_lock_time = time(NULL); - - if (!lock_tables(mysql_connection)) { - return(false); - } - server_lsn_after_lock = get_current_lsn(mysql_connection); - } - - if (!backup_files(ds_data, fil_path_to_mysql_datadir, false)) { - return(false); - } - - if (!backup_files_from_datadir(ds_data, fil_path_to_mysql_datadir, - "aws-kms-key") || - !backup_files_from_datadir(ds_data, - aria_log_dir_path, - "aria_log")) { - return false; - } - if (has_rocksdb_plugin()) { - rocksdb_create_checkpoint(); - } - - msg("Waiting for log copy thread to read lsn %llu", (ulonglong)server_lsn_after_lock); - backup_wait_for_lsn(server_lsn_after_lock); - DBUG_EXECUTE_FOR_KEY("sleep_after_waiting_for_lsn", {}, - { - ulong milliseconds = strtoul(dbug_val, NULL, 10); - msg("sleep_after_waiting_for_lsn"); - my_sleep(milliseconds*1000UL); - }); - - corrupted_pages.backup_fix_ddl(ds_data, ds_meta); - - // There is no need to stop slave thread before coping non-Innodb data when - // --no-lock option is used because --no-lock option requires that no DDL or - // DML to non-transaction tables can occur. - if (opt_no_lock) { - if (opt_safe_slave_backup) { - if (!wait_for_safe_slave(mysql_connection)) { - return(false); - } - } - } - - if (opt_slave_info) { - lock_binlog_maybe(mysql_connection); - - if (!write_slave_info(ds_data, mysql_connection)) { - return(false); - } - } - - /* The only reason why Galera/binlog info is written before - wait_for_ibbackup_log_copy_finish() is that after that call the xtrabackup - binary will start streamig a temporary copy of REDO log to stdout and - thus, any streaming from innobackupex would interfere. The only way to - avoid that is to have a single process, i.e. merge innobackupex and - xtrabackup. */ - if (opt_galera_info) { - if (!write_galera_info(ds_data, mysql_connection)) { - return(false); - } - } - - if (opt_binlog_info == BINLOG_INFO_ON) { - - lock_binlog_maybe(mysql_connection); - write_binlog_info(ds_data, mysql_connection); - } - - if (!opt_no_lock) { - msg("Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS..."); - xb_mysql_query(mysql_connection, - "FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS", false); - } - - return(true); -} - -/** Release resources after backup_start() */ +/** Release resources after backup_files() */ void backup_release() { - /* release all locks */ - if (!opt_no_lock) { - unlock_all(mysql_connection); - history_lock_time = 0; - } else { - history_lock_time = time(NULL) - history_lock_time; - } - if (opt_lock_ddl_per_table) { mdl_unlock_all(); } @@ -1530,11 +1372,11 @@ void backup_release() static const char *default_buffer_pool_file = "ib_buffer_pool"; -/** Finish after backup_start() and backup_release() */ +/** Finish after backup_files() and backup_release() */ bool backup_finish(ds_ctxt *ds_data) { /* Copy buffer pool dump or LRU dump */ - if (!opt_rsync && opt_galera_info) { + if (opt_galera_info) { if (buffer_pool_filename && file_exists(buffer_pool_filename)) { ds_data->copy_file(buffer_pool_filename, default_buffer_pool_file, 0); } @@ -1893,8 +1735,6 @@ copy_back() return(false); } - srv_max_n_threads = 1000; - /* copy undo tablespaces */ Copy_back_dst_dir dst_dir_buf; @@ -1922,7 +1762,8 @@ copy_back() dst_dir = dst_dir_buf.make(srv_log_group_home_dir); - /* --backup generates a single ib_logfile0, which we must copy. */ + /* --backup generates a single LOG_FILE_NAME, which we must copy + if it exists. */ ds_tmp = ds_create(dst_dir, DS_TYPE_LOCAL); if (!(ret = copy_or_move_file(ds_tmp, LOG_FILE_NAME, LOG_FILE_NAME, @@ -2155,8 +1996,6 @@ decrypt_decompress() bool ret; datadir_iter_t *it = NULL; - srv_max_n_threads = 1000; - /* cd to backup directory */ if (my_setwd(xtrabackup_target_dir, MYF(MY_WME))) { @@ -2169,8 +2008,6 @@ decrypt_decompress() it = datadir_iter_new(".", false); - ut_a(xtrabackup_parallel >= 0); - ret = run_data_threads(it, decrypt_decompress_thread_func, xtrabackup_parallel ? xtrabackup_parallel : 1); @@ -2192,9 +2029,9 @@ decrypt_decompress() Do not copy the Innodb files (ibdata1, redo log files), as this is done in a separate step. */ -static bool backup_files_from_datadir(ds_ctxt_t *ds_data, - const char *dir_path, - const char *prefix) +bool backup_files_from_datadir(ds_ctxt_t *ds_data, + const char *dir_path, + const char *prefix) { os_file_dir_t dir = os_file_opendir(dir_path); if (dir == IF_WIN(INVALID_HANDLE_VALUE, nullptr)) return false; @@ -2218,10 +2055,6 @@ static bool backup_files_from_datadir(ds_ctxt_t *ds_data, pname = info.name; if (!starts_with(pname, prefix)) - /* For ES exchange the above line with the following code: - (!xtrabackup_prepare || !xtrabackup_incremental_dir || - !starts_with(pname, "aria_log"))) - */ continue; if (xtrabackup_prepare && xtrabackup_incremental_dir && @@ -2244,7 +2077,7 @@ static int rocksdb_remove_checkpoint_directory() return 0; } -static bool has_rocksdb_plugin() +bool has_rocksdb_plugin() { static bool first_time = true; static bool has_plugin= false; @@ -2390,7 +2223,7 @@ static void rocksdb_unlock_checkpoint() #define MARIADB_CHECKPOINT_DIR "mariabackup-checkpoint" static char rocksdb_checkpoint_dir[FN_REFLEN]; -static void rocksdb_create_checkpoint() +void rocksdb_create_checkpoint() { MYSQL_RES *result = xb_mysql_query(mysql_connection, "SELECT @@rocksdb_datadir,@@datadir", true, true); MYSQL_ROW row = mysql_fetch_row(result); @@ -2470,3 +2303,39 @@ static void rocksdb_copy_back(ds_ctxt *ds_data) { mkdirp(rocksdb_home_dir, 0777, MYF(0)); ds_data->copy_or_move_dir(ROCKSDB_BACKUP_DIR, rocksdb_home_dir, xtrabackup_copy_back, xtrabackup_copy_back); } + +void foreach_file_in_db_dirs( + const char *dir_path, std::function func) { + DBUG_ASSERT(dir_path); + + datadir_iter_t *it; + datadir_node_t node; + + datadir_node_init(&node); + it = datadir_iter_new(dir_path); + + while (datadir_iter_next(it, &node)) + if (!node.is_empty_dir && !func(node.filepath)) + break; + + datadir_iter_free(it); + datadir_node_free(&node); +} + +void foreach_file_in_datadir( + const char *dir_path, std::function func) +{ + DBUG_ASSERT(dir_path); + os_file_dir_t dir = os_file_opendir(dir_path); + os_file_stat_t info; + while (os_file_readdir_next_file(dir_path, dir, &info) == 0) { + if (info.type != OS_FILE_TYPE_FILE) + continue; + const char *pname = strrchr(info.name, IF_WIN('\\', '/')); + if (!pname) + pname = info.name; + if (!func(pname)) + break; + } + os_file_closedir(dir); +} diff --git a/extra/mariabackup/backup_copy.h b/extra/mariabackup/backup_copy.h index b5aaf312..409e7839 100644 --- a/extra/mariabackup/backup_copy.h +++ b/extra/mariabackup/backup_copy.h @@ -2,6 +2,7 @@ #ifndef XTRABACKUP_BACKUP_COPY_H #define XTRABACKUP_BACKUP_COPY_H +#include #include #include #include "datasink.h" @@ -21,11 +22,10 @@ bool equal_paths(const char *first, const char *second); /** Start --backup */ -bool backup_start(ds_ctxt *ds_data, ds_ctxt *ds_meta, - CorruptedPages &corrupted_pages); -/** Release resources after backup_start() */ +bool backup_files(ds_ctxt *ds_data, const char *from); +/** Release resources after backup_files() */ void backup_release(); -/** Finish after backup_start() and backup_release() */ +/** Finish after backup_files() and backup_release() */ bool backup_finish(ds_ctxt *ds_data); bool apply_log_finish(); @@ -38,7 +38,25 @@ is_path_separator(char); bool directory_exists(const char *dir, bool create); -lsn_t -get_current_lsn(MYSQL *connection); - +bool has_rocksdb_plugin(); +void rocksdb_create_checkpoint(); +void foreach_file_in_db_dirs( + const char *dir_path, std::function func); +void foreach_file_in_datadir( + const char *dir_path, std::function func); +bool ends_with(const char *str, const char *suffix); +bool starts_with(const char *str, const char *prefix); +void parse_db_table_from_file_path( + const char *filepath, char *dbname, char *tablename); +const char *trim_dotslash(const char *path); +bool backup_files_from_datadir(ds_ctxt_t *ds_data, + const char *dir_path, + const char *prefix); + +bool is_system_table(const char *dbname, const char *tablename); +std::unique_ptr> + find_files(const char *dir_path, const char *prefix, const char *suffix); +bool file_exists(const char *filename); +bool +filename_matches(const char *filename, const char **ext_list); #endif diff --git a/extra/mariabackup/backup_debug.h b/extra/mariabackup/backup_debug.h index 777b4f4a..9286bc7b 100644 --- a/extra/mariabackup/backup_debug.h +++ b/extra/mariabackup/backup_debug.h @@ -1,5 +1,6 @@ #pragma once #include "my_dbug.h" + #ifndef DBUG_OFF char *dbug_mariabackup_get_val(const char *event, fil_space_t::name_type key); /* @@ -14,11 +15,21 @@ To use this facility, you need to for the variable) 3. start mariabackup with --dbug=+d,debug_mariabackup_events */ -#define DBUG_EXECUTE_FOR_KEY(EVENT, KEY, CODE) \ - DBUG_EXECUTE_IF("mariabackup_inject_code", \ - { char *dbug_val= dbug_mariabackup_get_val(EVENT, KEY); \ - if (dbug_val) CODE }) +extern void dbug_mariabackup_event( + const char *event, const fil_space_t::name_type key, bool need_lock); +#define DBUG_MARIABACKUP_EVENT(A, B) \ + DBUG_EXECUTE_IF("mariabackup_events", \ + dbug_mariabackup_event(A,B,false);); +#define DBUG_MARIABACKUP_EVENT_LOCK(A, B) \ + DBUG_EXECUTE_IF("mariabackup_events", \ + dbug_mariabackup_event(A,B, true);); +#define DBUG_EXECUTE_FOR_KEY(EVENT, KEY, CODE) \ + DBUG_EXECUTE_IF("mariabackup_inject_code", {\ + char *dbug_val = dbug_mariabackup_get_val(EVENT, KEY); \ + if (dbug_val && *dbug_val) CODE \ + }) #else +#define DBUG_MARIABACKUP_EVENT(A,B) +#define DBUG_MARIABACKUP_EVENT_LOCK(A,B) #define DBUG_EXECUTE_FOR_KEY(EVENT, KEY, CODE) #endif - diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc index c2f15da4..2aad6004 100644 --- a/extra/mariabackup/backup_mysql.cc +++ b/extra/mariabackup/backup_mysql.cc @@ -47,6 +47,12 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA #include #include #include +#ifdef HAVE_PWD_H +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#include +#endif #include "common.h" #include "xtrabackup.h" #include "srv0srv.h" @@ -54,19 +60,19 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA #include "backup_copy.h" #include "backup_mysql.h" #include "mysqld.h" -#include "xb_plugin.h" +#include "encryption_plugin.h" #include #include #include "page0zip.h" +#include "backup_debug.h" char *tool_name; -char tool_args[2048]; +char tool_args[8192]; ulong mysql_server_version; /* server capabilities */ bool have_changed_page_bitmaps = false; -bool have_backup_locks = false; bool have_lock_wait_timeout = false; bool have_galera_enabled = false; bool have_multi_threaded_slave = false; @@ -92,11 +98,54 @@ MYSQL *mysql_connection; extern my_bool opt_ssl_verify_server_cert, opt_use_ssl; + +/* + get_os_user() + Ressemles read_user_name() from libmariadb/libmariadb/mariadb_lib.c. +*/ + +#if !defined(_WIN32) + +#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL) +struct passwd *getpwuid(uid_t); +char* getlogin(void); +#endif + +static const char *get_os_user() // Posix +{ + if (!geteuid()) + return "root"; +#ifdef HAVE_GETPWUID + struct passwd *pw; + const char *str; + if ((pw= getpwuid(geteuid())) != NULL) + return pw->pw_name; + if ((str= getlogin()) != NULL) + return str; +#endif + if ((str= getenv("USER")) || + (str= getenv("LOGNAME")) || + (str= getenv("LOGIN"))) + return str; + return NULL; +} + +#else + +static const char *get_os_user() // Windows +{ + return getenv("USERNAME"); +} + +#endif // _WIN32 + + MYSQL * xb_mysql_connect() { MYSQL *connection = mysql_init(NULL); char mysql_port_str[std::numeric_limits::digits10 + 3]; + const char *user= opt_user ? opt_user : get_os_user(); sprintf(mysql_port_str, "%d", opt_port); @@ -126,7 +175,7 @@ xb_mysql_connect() msg("Connecting to MariaDB server host: %s, user: %s, password: %s, " "port: %s, socket: %s", opt_host ? opt_host : "localhost", - opt_user ? opt_user : "not set", + user ? user : "not set", opt_password ? "set" : "not set", opt_port != 0 ? mysql_port_str : "not set", opt_socket ? opt_socket : "not set"); @@ -147,7 +196,7 @@ xb_mysql_connect() if (!mysql_real_connect(connection, opt_host ? opt_host : "localhost", - opt_user, + user, opt_password, "" /*database*/, opt_port, opt_socket, 0)) { @@ -203,13 +252,14 @@ struct mysql_variable { static -void +uint read_mysql_variables(MYSQL *connection, const char *query, mysql_variable *vars, bool vertical_result) { MYSQL_RES *mysql_result; MYSQL_ROW row; mysql_variable *var; + uint n_values=0; mysql_result = xb_mysql_query(connection, query, true); @@ -223,6 +273,7 @@ read_mysql_variables(MYSQL *connection, const char *query, mysql_variable *vars, if (strcmp(var->name, name) == 0 && value != NULL) { *(var->value) = strdup(value); + n_values++; } } } @@ -239,6 +290,7 @@ read_mysql_variables(MYSQL *connection, const char *query, mysql_variable *vars, if (strcmp(var->name, name) == 0 && value != NULL) { *(var->value) = strdup(value); + n_values++; } } ++i; @@ -247,6 +299,7 @@ read_mysql_variables(MYSQL *connection, const char *query, mysql_variable *vars, } mysql_free_result(mysql_result); + return n_values; } @@ -311,7 +364,6 @@ bool get_mysql_vars(MYSQL *connection) { char *gtid_mode_var= NULL; char *version_var= NULL; - char *have_backup_locks_var= NULL; char *log_bin_var= NULL; char *lock_wait_timeout_var= NULL; char *wsrep_on_var= NULL; @@ -336,7 +388,6 @@ bool get_mysql_vars(MYSQL *connection) bool ret= true; mysql_variable mysql_vars[]= { - {"have_backup_locks", &have_backup_locks_var}, {"log_bin", &log_bin_var}, {"lock_wait_timeout", &lock_wait_timeout_var}, {"gtid_mode", >id_mode_var}, @@ -361,11 +412,6 @@ bool get_mysql_vars(MYSQL *connection) read_mysql_variables(connection, "SHOW VARIABLES", mysql_vars, true); - if (have_backup_locks_var != NULL && !opt_no_backup_locks) - { - have_backup_locks= true; - } - if (opt_binlog_info == BINLOG_INFO_AUTO) { if (log_bin_var != NULL && !strcmp(log_bin_var, "ON")) @@ -512,24 +558,6 @@ Query the server to find out what backup capabilities it supports. bool detect_mysql_capabilities_for_backup() { - const char *query = "SELECT 'INNODB_CHANGED_PAGES', COUNT(*) FROM " - "INFORMATION_SCHEMA.PLUGINS " - "WHERE PLUGIN_NAME LIKE 'INNODB_CHANGED_PAGES'"; - char *innodb_changed_pages = NULL; - mysql_variable vars[] = { - {"INNODB_CHANGED_PAGES", &innodb_changed_pages}, {NULL, NULL}}; - - if (xtrabackup_incremental) { - - read_mysql_variables(mysql_connection, query, vars, true); - - ut_ad(innodb_changed_pages != NULL); - - have_changed_page_bitmaps = (atoi(innodb_changed_pages) == 1); - - free_mysql_variables(vars); - } - /* do some sanity checks */ if (opt_galera_info && !have_galera_enabled) { msg("--galera-info is specified on the command " @@ -837,11 +865,11 @@ static void stop_query_killer() /*********************************************************************//** -Function acquires either a backup tables lock, if supported -by the server, or a global read lock (FLUSH TABLES WITH READ LOCK) -otherwise. +Function acquires backup locks @returns true if lock acquired */ -bool lock_tables(MYSQL *connection) + +bool +lock_for_backup_stage_start(MYSQL *connection) { if (have_lock_wait_timeout || opt_lock_wait_timeout) { @@ -854,12 +882,6 @@ bool lock_tables(MYSQL *connection) xb_mysql_query(connection, buf, false); } - if (have_backup_locks) - { - msg("Executing LOCK TABLES FOR BACKUP..."); - xb_mysql_query(connection, "LOCK TABLES FOR BACKUP", false); - return (true); - } if (opt_lock_wait_timeout) { @@ -884,8 +906,6 @@ bool lock_tables(MYSQL *connection) xb_mysql_query(connection, "BACKUP STAGE START", true); DBUG_MARIABACKUP_EVENT("after_backup_stage_start", {}); - xb_mysql_query(connection, "BACKUP STAGE BLOCK_COMMIT", true); - DBUG_MARIABACKUP_EVENT("after_backup_stage_block_commit", {}); /* Set the maximum supported session value for lock_wait_timeout to prevent unnecessary timeouts when the global value is changed from the default */ @@ -901,24 +921,68 @@ bool lock_tables(MYSQL *connection) return (true); } -/*********************************************************************//** -If backup locks are used, execute LOCK BINLOG FOR BACKUP provided that we are -not in the --no-lock mode and the lock has not been acquired already. -@returns true if lock acquired */ bool -lock_binlog_maybe(MYSQL *connection) -{ - if (have_backup_locks && !opt_no_lock && !binlog_locked) { - msg("Executing LOCK BINLOG FOR BACKUP..."); - xb_mysql_query(connection, "LOCK BINLOG FOR BACKUP", false); - binlog_locked = true; +lock_for_backup_stage_flush(MYSQL *connection) { + if (opt_kill_long_queries_timeout) { + start_query_killer(); + } + xb_mysql_query(connection, "BACKUP STAGE FLUSH", true); + if (opt_kill_long_queries_timeout) { + stop_query_killer(); + } + return true; +} - return(true); +bool +lock_for_backup_stage_block_ddl(MYSQL *connection) { + if (opt_kill_long_queries_timeout) { + start_query_killer(); + } + xb_mysql_query(connection, "BACKUP STAGE BLOCK_DDL", true); + DBUG_MARIABACKUP_EVENT("after_backup_stage_block_ddl", {}); + if (opt_kill_long_queries_timeout) { + stop_query_killer(); } + return true; +} - return(false); +bool +lock_for_backup_stage_commit(MYSQL *connection) { + if (opt_kill_long_queries_timeout) { + start_query_killer(); + } + xb_mysql_query(connection, "BACKUP STAGE BLOCK_COMMIT", true); + DBUG_MARIABACKUP_EVENT("after_backup_stage_block_commit", {}); + if (opt_kill_long_queries_timeout) { + stop_query_killer(); + } + return true; } +bool backup_lock(MYSQL *con, const char *table_name) { + static const std::string backup_lock_prefix("BACKUP LOCK "); + std::string backup_lock_query = backup_lock_prefix + table_name; + xb_mysql_query(con, backup_lock_query.c_str(), true); + return true; +} + +bool backup_unlock(MYSQL *con) { + xb_mysql_query(con, "BACKUP UNLOCK", true); + return true; +} + +std::unordered_set +get_tables_in_use(MYSQL *con) { + std::unordered_set result; + MYSQL_RES *q_res = + xb_mysql_query(con, "SHOW OPEN TABLES WHERE In_use = 1", true); + while (MYSQL_ROW row = mysql_fetch_row(q_res)) { + auto tk = table_key(row[0], row[1]); + msg("Table %s is in use", tk.c_str()); + result.insert(std::move(tk)); + } + return result; +} /*********************************************************************//** Releases either global read lock acquired with FTWRL and the binlog @@ -1353,77 +1417,103 @@ write_slave_info(ds_ctxt *datasink, MYSQL *connection) /*********************************************************************//** -Retrieves MySQL Galera and -saves it in a file. It also prints it to stdout. */ +Retrieves MySQL Galera and saves it in a file. It also prints it to stdout. + +We should create xtrabackup_galelera_info file even when backup locks +are used because donor's wsrep_gtid_domain_id is needed later in joiner. +Note that at this stage wsrep_local_state_uuid and wsrep_last_committed +are inconsistent but they are not used in joiner. Joiner will rewrite this file +at mariabackup --prepare phase and thus there is extra file donor_galera_info. +Information is needed to maitain wsrep_gtid_domain_id and gtid_binlog_pos +same across the cluster. If joiner node have different wsrep_gtid_domain_id +we should still receive effective domain id from the donor node, +and use it. +*/ bool write_galera_info(ds_ctxt *datasink, MYSQL *connection) { - char *state_uuid = NULL, *state_uuid55 = NULL; - char *last_committed = NULL, *last_committed55 = NULL; - char *domain_id = NULL, *domain_id55 = NULL; - bool result; - - mysql_variable status[] = { - {"Wsrep_local_state_uuid", &state_uuid}, - {"wsrep_local_state_uuid", &state_uuid55}, - {"Wsrep_last_committed", &last_committed}, - {"wsrep_last_committed", &last_committed55}, - {NULL, NULL} - }; + char *state_uuid = NULL, *state_uuid55 = NULL; + char *last_committed = NULL, *last_committed55 = NULL; + char *domain_id = NULL, *domain_id55 = NULL; + bool result=true; + uint n_values=0; + char *wsrep_on = NULL, *wsrep_on55 = NULL; + + mysql_variable vars[] = { + {"Wsrep_on", &wsrep_on}, + {"wsrep_on", &wsrep_on55}, + {NULL, NULL} + }; + + mysql_variable status[] = { + {"Wsrep_local_state_uuid", &state_uuid}, + {"wsrep_local_state_uuid", &state_uuid55}, + {"Wsrep_last_committed", &last_committed}, + {"wsrep_last_committed", &last_committed55}, + {NULL, NULL} + }; + + mysql_variable value[] = { + {"Wsrep_gtid_domain_id", &domain_id}, + {"wsrep_gtid_domain_id", &domain_id55}, + {NULL, NULL} + }; + + n_values= read_mysql_variables(connection, "SHOW VARIABLES", vars, true); + + if (n_values == 0 || (wsrep_on == NULL && wsrep_on55 == NULL)) + { + msg("Server is not Galera node thus --galera-info does not " + "have any effect."); + result = true; + goto cleanup; + } - mysql_variable value[] = { - {"Wsrep_gtid_domain_id", &domain_id}, - {"wsrep_gtid_domain_id", &domain_id55}, - {NULL, NULL} - }; + read_mysql_variables(connection, "SHOW STATUS", status, true); - /* When backup locks are supported by the server, we should skip - creating xtrabackup_galera_info file on the backup stage, because - wsrep_local_state_uuid and wsrep_last_committed will be inconsistent - without blocking commits. The state file will be created on the prepare - stage using the WSREP recovery procedure. */ - if (have_backup_locks) { - return(true); - } + if ((state_uuid == NULL && state_uuid55 == NULL) + || (last_committed == NULL && last_committed55 == NULL)) + { + msg("Warning: failed to get master wsrep state from SHOW STATUS."); + result = true; + goto cleanup; + } - read_mysql_variables(connection, "SHOW STATUS", status, true); + n_values= read_mysql_variables(connection, "SHOW VARIABLES LIKE 'wsrep%'", value, true); - if ((state_uuid == NULL && state_uuid55 == NULL) - || (last_committed == NULL && last_committed55 == NULL)) { - msg("Warning: failed to get master wsrep state from SHOW STATUS."); - result = true; - goto cleanup; - } + if (n_values == 0 || (domain_id == NULL && domain_id55 == NULL)) + { + msg("Warning: failed to get master wsrep state from SHOW VARIABLES."); + result = true; + goto cleanup; + } - read_mysql_variables(connection, "SHOW VARIABLES LIKE 'wsrep%'", value, true); + result= datasink->backup_file_printf(XTRABACKUP_GALERA_INFO, + "%s:%s %s\n", state_uuid ? state_uuid : state_uuid55, + last_committed ? last_committed : last_committed55, + domain_id ? domain_id : domain_id55); - if (domain_id == NULL && domain_id55 == NULL) { - msg("Warning: failed to get master wsrep state from SHOW VARIABLES."); - result = true; - goto cleanup; - } + if (result) + { + result= datasink->backup_file_printf(XTRABACKUP_DONOR_GALERA_INFO, + "%s:%s %s\n", state_uuid ? state_uuid : state_uuid55, + last_committed ? last_committed : last_committed55, + domain_id ? domain_id : domain_id55); + } - result = datasink->backup_file_printf(XTRABACKUP_GALERA_INFO, - "%s:%s %s\n", state_uuid ? state_uuid : state_uuid55, - last_committed ? last_committed : last_committed55, - domain_id ? domain_id : domain_id55); + if (result) + write_current_binlog_file(datasink, connection); - if (result) - { - result= datasink->backup_file_printf(XTRABACKUP_DONOR_GALERA_INFO, - "%s:%s %s\n", state_uuid ? state_uuid : state_uuid55, - last_committed ? last_committed : last_committed55, - domain_id ? domain_id : domain_id55); - } - if (result) - { - write_current_binlog_file(datasink, connection); - } + if (result) + msg("Writing Galera info succeeded with %s:%s %s", + state_uuid ? state_uuid : state_uuid55, + last_committed ? last_committed : last_committed55, + domain_id ? domain_id : domain_id55); cleanup: - free_mysql_variables(status); + free_mysql_variables(status); - return(result); + return(result); } @@ -1466,8 +1556,6 @@ write_current_binlog_file(ds_ctxt *datasink, MYSQL *connection) if (gtid_exists) { size_t log_bin_dir_length; - lock_binlog_maybe(connection); - xb_mysql_query(connection, "FLUSH BINARY LOGS", false); read_mysql_variables(connection, "SHOW MASTER STATUS", @@ -1826,13 +1914,13 @@ bool write_backup_config_file(ds_ctxt *datasink) srv_log_file_size, srv_page_size, srv_undo_dir, - srv_undo_tablespaces, + (uint) srv_undo_tablespaces, page_zip_level, innobase_buffer_pool_filename ? "innodb_buffer_pool_filename=" : "", innobase_buffer_pool_filename ? innobase_buffer_pool_filename : "", - xb_plugin_get_config()); + encryption_plugin_get_config()); return rc; } @@ -1851,9 +1939,11 @@ char *make_argv(char *buf, size_t len, int argc, char **argv) if (strncmp(*argv, "--password", strlen("--password")) == 0) { arg = "--password=..."; } - left-= snprintf(buf + len - left, left, + uint l= snprintf(buf + len - left, left, "%s%c", arg, argc > 1 ? ' ' : 0); ++argv; --argc; + if (l < left) + left-= l; } return buf; @@ -1882,18 +1972,6 @@ select_history() return(true); } -bool -flush_changed_page_bitmaps() -{ - if (xtrabackup_incremental && have_changed_page_bitmaps && - !xtrabackup_incremental_force_scan) { - xb_mysql_query(mysql_connection, - "FLUSH NO_WRITE_TO_BINLOG CHANGED_PAGE_BITMAPS", false); - } - return(true); -} - - /*********************************************************************//** Deallocate memory, disconnect from server, etc. @return true on success. */ @@ -1969,3 +2047,23 @@ mdl_unlock_all() mysql_close(mdl_con); spaceid_to_tablename.clear(); } + +ulonglong get_current_lsn(MYSQL *connection) +{ + static const char lsn_prefix[] = "\nLog sequence number "; + ulonglong lsn = 0; + if (MYSQL_RES *res = xb_mysql_query(connection, + "SHOW ENGINE INNODB STATUS", + true, false)) { + if (MYSQL_ROW row = mysql_fetch_row(res)) { + const char *p= strstr(row[2], lsn_prefix); + DBUG_ASSERT(p); + if (p) { + p += sizeof lsn_prefix - 1; + lsn = lsn_t(strtoll(p, NULL, 10)); + } + } + mysql_free_result(res); + } + return lsn; +} diff --git a/extra/mariabackup/backup_mysql.h b/extra/mariabackup/backup_mysql.h index 4b08da0b..c87efd21 100644 --- a/extra/mariabackup/backup_mysql.h +++ b/extra/mariabackup/backup_mysql.h @@ -2,13 +2,15 @@ #define XTRABACKUP_BACKUP_MYSQL_H #include +#include +#include +#include "datasink.h" /* MariaDB version */ extern ulong mysql_server_version; /* server capabilities */ extern bool have_changed_page_bitmaps; -extern bool have_backup_locks; extern bool have_lock_wait_timeout; extern bool have_galera_enabled; extern bool have_multi_threaded_slave; @@ -35,9 +37,6 @@ capture_tool_command(int argc, char **argv); bool select_history(); -bool -flush_changed_page_bitmaps(); - void backup_cleanup(); @@ -75,7 +74,21 @@ bool lock_binlog_maybe(MYSQL *connection); bool -lock_tables(MYSQL *connection); +lock_for_backup_stage_start(MYSQL *connection); + +bool +lock_for_backup_stage_flush(MYSQL *connection); + +bool +lock_for_backup_stage_block_ddl(MYSQL *connection); + +bool +lock_for_backup_stage_commit(MYSQL *connection); + +bool backup_lock(MYSQL *con, const char *table_name); +bool backup_unlock(MYSQL *con); + +std::unordered_set get_tables_in_use(MYSQL *con); bool wait_for_safe_slave(MYSQL *connection); @@ -86,5 +99,6 @@ write_galera_info(ds_ctxt *datasink, MYSQL *connection); bool write_slave_info(ds_ctxt *datasink, MYSQL *connection); +ulonglong get_current_lsn(MYSQL *connection); #endif diff --git a/extra/mariabackup/changed_page_bitmap.cc b/extra/mariabackup/changed_page_bitmap.cc deleted file mode 100644 index 39a07a25..00000000 --- a/extra/mariabackup/changed_page_bitmap.cc +++ /dev/null @@ -1,1040 +0,0 @@ -/****************************************************** -XtraBackup: hot backup tool for InnoDB -(c) 2009-2012 Percona Inc. -Originally Created 3/3/2009 Yasufumi Kinoshita -Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, -Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. - -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; version 2 of the License. - -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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA - -*******************************************************/ - -/* Changed page bitmap implementation */ - -#include "changed_page_bitmap.h" - -#include "common.h" -#include "xtrabackup.h" -#include "srv0srv.h" - -/* TODO: copy-pasted shared definitions from the XtraDB bitmap write code. -Remove these on the first opportunity, i.e. single-binary XtraBackup. */ - -/* log0online.h */ - -/** Single bitmap file information */ -struct log_online_bitmap_file_t { - char name[FN_REFLEN]; /*!< Name with full path */ - pfs_os_file_t file; /*!< Handle to opened file */ - ib_uint64_t size; /*!< Size of the file */ - ib_uint64_t offset; /*!< Offset of the next read, - or count of already-read bytes - */ -}; - -/** A set of bitmap files containing some LSN range */ -struct log_online_bitmap_file_range_t { - size_t count; /*!< Number of files */ - /*!< Dynamically-allocated array of info about individual files */ - struct files_t { - char name[FN_REFLEN];/*!< Name of a file */ - lsn_t start_lsn; /*!< Starting LSN of data in this - file */ - ulong seq_num; /*!< Sequence number of this file */ - } *files; -}; - -/* log0online.c */ - -/** File name stem for bitmap files. */ -static const char* bmp_file_name_stem = "ib_modified_log_"; - -/** The bitmap file block size in bytes. All writes will be multiples of this. - */ -enum { - MODIFIED_PAGE_BLOCK_SIZE = 4096 -}; - -/** Offsets in a file bitmap block */ -enum { - MODIFIED_PAGE_IS_LAST_BLOCK = 0,/* 1 if last block in the current - write, 0 otherwise. */ - MODIFIED_PAGE_START_LSN = 4, /* The starting tracked LSN of this and - other blocks in the same write */ - MODIFIED_PAGE_END_LSN = 12, /* The ending tracked LSN of this and - other blocks in the same write */ - MODIFIED_PAGE_SPACE_ID = 20, /* The space ID of tracked pages in - this block */ - MODIFIED_PAGE_1ST_PAGE_ID = 24, /* The page ID of the first tracked - page in this block */ - MODIFIED_PAGE_BLOCK_UNUSED_1 = 28,/* Unused in order to align the start - of bitmap at 8 byte boundary */ - MODIFIED_PAGE_BLOCK_BITMAP = 32,/* Start of the bitmap itself */ - MODIFIED_PAGE_BLOCK_UNUSED_2 = MODIFIED_PAGE_BLOCK_SIZE - 8, - /* Unused in order to align the end of - bitmap at 8 byte boundary */ - MODIFIED_PAGE_BLOCK_CHECKSUM = MODIFIED_PAGE_BLOCK_SIZE - 4 - /* The checksum of the current block */ -}; - -/** Length of the bitmap data in a block */ -enum { MODIFIED_PAGE_BLOCK_BITMAP_LEN - = MODIFIED_PAGE_BLOCK_UNUSED_2 - MODIFIED_PAGE_BLOCK_BITMAP }; - -/** Length of the bitmap data in a block in page ids */ -enum { MODIFIED_PAGE_BLOCK_ID_COUNT = MODIFIED_PAGE_BLOCK_BITMAP_LEN * 8 }; - -typedef ib_uint64_t bitmap_word_t; - -/****************************************************************//** -Calculate a bitmap block checksum. Algorithm borrowed from -log_block_calc_checksum. -@return checksum */ -UNIV_INLINE -ulint -log_online_calc_checksum( -/*=====================*/ - const byte* block); /*! p2 -*/ -static -int -log_online_compare_bmp_keys( -/*========================*/ - const void* p1, /*! k2_start_page ? 1 : 0; - } - return k1_space < k2_space ? -1 : 1; -} - -/****************************************************************//** -Calculate a bitmap block checksum. Algorithm borrowed from -log_block_calc_checksum. -@return checksum */ -UNIV_INLINE -ulint -log_online_calc_checksum( -/*=====================*/ - const byte* block) /*! 24) { - - sh = 0; - } - } - - return sum; -} - -/****************************************************************//** -Read one bitmap data page and check it for corruption. - -@return TRUE if page read OK, FALSE if I/O error */ -static -ibool -log_online_read_bitmap_page( -/*========================*/ - log_online_bitmap_file_t *bitmap_file, /*!size >= MODIFIED_PAGE_BLOCK_SIZE); - ut_a(bitmap_file->offset - <= bitmap_file->size - MODIFIED_PAGE_BLOCK_SIZE); - ut_a(bitmap_file->offset % MODIFIED_PAGE_BLOCK_SIZE == 0); - if (DB_SUCCESS != - os_file_read(IORequestRead, bitmap_file->file, page, - bitmap_file->offset, MODIFIED_PAGE_BLOCK_SIZE, - nullptr)) { - /* The following call prints an error message */ - os_file_get_last_error(TRUE); - msg("InnoDB: Warning: failed reading changed page bitmap " - "file \'%s\'", bitmap_file->name); - return FALSE; - } - - bitmap_file->offset += MODIFIED_PAGE_BLOCK_SIZE; - ut_ad(bitmap_file->offset <= bitmap_file->size); - - checksum = mach_read_from_4(page + MODIFIED_PAGE_BLOCK_CHECKSUM); - actual_checksum = log_online_calc_checksum(page); - *checksum_ok = (checksum == actual_checksum); - - return TRUE; -} - -/*********************************************************************//** -Check the name of a given file if it's a changed page bitmap file and -return file sequence and start LSN name components if it is. If is not, -the values of output parameters are undefined. - -@return TRUE if a given file is a changed page bitmap file. */ -static -ibool -log_online_is_bitmap_file( -/*======================*/ - const os_file_stat_t* file_info, /*!name) < OS_FILE_MAX_PATH); - - return ((file_info->type == OS_FILE_TYPE_FILE - || file_info->type == OS_FILE_TYPE_LINK) - && (sscanf(file_info->name, "%[a-z_]%lu_" LSN_PF ".xdb", stem, - bitmap_file_seq_num, bitmap_file_start_lsn) == 3) - && (!strcmp(stem, bmp_file_name_stem))); -} - -/*********************************************************************//** -List the bitmap files in srv_data_home and setup their range that contains the -specified LSN interval. This range, if non-empty, will start with a file that -has the greatest LSN equal to or less than the start LSN and will include all -the files up to the one with the greatest LSN less than the end LSN. Caller -must free bitmap_files->files when done if bitmap_files set to non-NULL and -this function returned TRUE. Field bitmap_files->count might be set to a -larger value than the actual count of the files, and space for the unused array -slots will be allocated but cleared to zeroes. - -@return TRUE if succeeded -*/ -static -ibool -log_online_setup_bitmap_file_range( -/*===============================*/ - log_online_bitmap_file_range_t *bitmap_files, /*!= range_start); - - bitmap_files->count = 0; - bitmap_files->files = NULL; - - /* 1st pass: size the info array */ - - bitmap_dir = os_file_opendir(srv_data_home); - if (UNIV_UNLIKELY(bitmap_dir == IF_WIN(INVALID_HANDLE_VALUE, NULL))) { - msg("InnoDB: Error: failed to open bitmap directory \'%s\'", - srv_data_home); - return FALSE; - } - - while (!os_file_readdir_next_file(srv_data_home, bitmap_dir, - &bitmap_dir_file_info)) { - - ulong file_seq_num; - lsn_t file_start_lsn; - - if (!log_online_is_bitmap_file(&bitmap_dir_file_info, - &file_seq_num, - &file_start_lsn) - || file_start_lsn >= range_end) { - - continue; - } - - if (file_seq_num > last_file_seq_num) { - - last_file_seq_num = file_seq_num; - } - - if (file_start_lsn >= range_start - || file_start_lsn == first_file_start_lsn - || first_file_start_lsn > range_start) { - - /* A file that falls into the range */ - - if (file_start_lsn < first_file_start_lsn) { - - first_file_start_lsn = file_start_lsn; - } - if (file_seq_num < first_file_seq_num) { - - first_file_seq_num = file_seq_num; - } - } else if (file_start_lsn > first_file_start_lsn) { - - /* A file that has LSN closer to the range start - but smaller than it, replacing another such file */ - first_file_start_lsn = file_start_lsn; - first_file_seq_num = file_seq_num; - } - } - - if (UNIV_UNLIKELY(os_file_closedir_failed(bitmap_dir))) { - os_file_get_last_error(TRUE); - msg("InnoDB: Error: cannot close \'%s\'",srv_data_home); - return FALSE; - } - - if (first_file_seq_num == ULONG_MAX && last_file_seq_num == 0) { - - bitmap_files->count = 0; - return TRUE; - } - - bitmap_files->count = last_file_seq_num - first_file_seq_num + 1; - - /* 2nd pass: get the file names in the file_seq_num order */ - - bitmap_dir = os_file_opendir(srv_data_home); - if (UNIV_UNLIKELY(bitmap_dir == IF_WIN(INVALID_HANDLE_VALUE, NULL))) { - msg("InnoDB: Error: failed to open bitmap directory \'%s\'", - srv_data_home); - return FALSE; - } - - bitmap_files->files = - static_cast - (malloc(bitmap_files->count * sizeof(bitmap_files->files[0]))); - memset(bitmap_files->files, 0, - bitmap_files->count * sizeof(bitmap_files->files[0])); - - while (!os_file_readdir_next_file(srv_data_home, bitmap_dir, - &bitmap_dir_file_info)) { - - ulong file_seq_num; - lsn_t file_start_lsn; - size_t array_pos; - - if (!log_online_is_bitmap_file(&bitmap_dir_file_info, - &file_seq_num, - &file_start_lsn) - || file_start_lsn >= range_end - || file_start_lsn < first_file_start_lsn) { - - continue; - } - - array_pos = file_seq_num - first_file_seq_num; - if (UNIV_UNLIKELY(array_pos >= bitmap_files->count)) { - - msg("InnoDB: Error: inconsistent bitmap file " - "directory"); - os_file_closedir(bitmap_dir); - free(bitmap_files->files); - return FALSE; - } - - if (file_seq_num > bitmap_files->files[array_pos].seq_num) { - - bitmap_files->files[array_pos].seq_num = file_seq_num; - strncpy(bitmap_files->files[array_pos].name, - bitmap_dir_file_info.name, FN_REFLEN - 1); - bitmap_files->files[array_pos].name[FN_REFLEN - 1] - = '\0'; - bitmap_files->files[array_pos].start_lsn - = file_start_lsn; - } - } - - if (UNIV_UNLIKELY(os_file_closedir_failed(bitmap_dir))) { - os_file_get_last_error(TRUE); - msg("InnoDB: Error: cannot close \'%s\'", srv_data_home); - free(bitmap_files->files); - return FALSE; - } - -#ifdef UNIV_DEBUG - ut_ad(bitmap_files->files[0].seq_num == first_file_seq_num); - - for (size_t i = 1; i < bitmap_files->count; i++) { - if (!bitmap_files->files[i].seq_num) { - - break; - } - ut_ad(bitmap_files->files[i].seq_num - > bitmap_files->files[i - 1].seq_num); - ut_ad(bitmap_files->files[i].start_lsn - >= bitmap_files->files[i - 1].start_lsn); - } -#endif - - return TRUE; -} - -/****************************************************************//** -Open a bitmap file for reading. - -@return whether opened successfully */ -static -bool -log_online_open_bitmap_file_read_only( -/*==================================*/ - const char* name, /*!name, FN_REFLEN, "%s%s", srv_data_home, name); - bitmap_file->file = os_file_create_simple_no_error_handling( - 0, bitmap_file->name, - OS_FILE_OPEN, OS_FILE_READ_ONLY, true, &success); - if (UNIV_UNLIKELY(!success)) { - - /* Here and below assume that bitmap file names do not - contain apostrophes, thus no need for ut_print_filename(). */ - msg("InnoDB: Warning: error opening the changed page " - "bitmap \'%s\'", bitmap_file->name); - return success; - } - - bitmap_file->size = os_file_get_size(bitmap_file->file); - bitmap_file->offset = 0; - -#ifdef __linux__ - posix_fadvise(bitmap_file->file, 0, 0, POSIX_FADV_SEQUENTIAL); - posix_fadvise(bitmap_file->file, 0, 0, POSIX_FADV_NOREUSE); -#endif - - return success; -} - -/****************************************************************//** -Diagnose one or both of the following situations if we read close to -the end of bitmap file: -1) Warn if the remainder of the file is less than one page. -2) Error if we cannot read any more full pages but the last read page -did not have the last-in-run flag set. - -@return FALSE for the error */ -static -ibool -log_online_diagnose_bitmap_eof( -/*===========================*/ - const log_online_bitmap_file_t* bitmap_file, /*!< in: bitmap file */ - ibool last_page_in_run)/*!< in: "last page in - run" flag value in the - last read page */ -{ - /* Check if we are too close to EOF to read a full page */ - if ((bitmap_file->size < MODIFIED_PAGE_BLOCK_SIZE) - || (bitmap_file->offset - > bitmap_file->size - MODIFIED_PAGE_BLOCK_SIZE)) { - - if (UNIV_UNLIKELY(bitmap_file->offset != bitmap_file->size)) { - - /* If we are not at EOF and we have less than one page - to read, it's junk. This error is not fatal in - itself. */ - - msg("InnoDB: Warning: junk at the end of changed " - "page bitmap file \'%s\'.", bitmap_file->name); - } - - if (UNIV_UNLIKELY(!last_page_in_run)) { - - /* We are at EOF but the last read page did not finish - a run */ - /* It's a "Warning" here because it's not a fatal error - for the whole server */ - msg("InnoDB: Warning: changed page bitmap " - "file \'%s\' does not contain a complete run " - "at the end.", bitmap_file->name); - return FALSE; - } - } - return TRUE; -} - -/* End of copy-pasted definitions */ - -/** Iterator structure over changed page bitmap */ -struct xb_page_bitmap_range_struct { - const xb_page_bitmap *bitmap; /* Bitmap with data */ - ulint space_id; /* Space id for this - iterator */ - ulint bit_i; /* Bit index of the iterator - position in the current page */ - const ib_rbt_node_t *bitmap_node; /* Current bitmap tree node */ - const byte *bitmap_page; /* Current bitmap page */ - ulint current_page_id;/* Current page id */ -}; - -/****************************************************************//** -Print a diagnostic message on missing bitmap data for an LSN range. */ -static -void -xb_msg_missing_lsn_data( -/*====================*/ - lsn_t missing_interval_start, /*!size >= MODIFIED_PAGE_BLOCK_SIZE); - - *page_end_lsn = 0; - - while ((*page_end_lsn <= lsn) - && (bitmap_file->offset - <= bitmap_file->size - MODIFIED_PAGE_BLOCK_SIZE)) { - - next_to_last_page_ok = last_page_ok; - if (!log_online_read_bitmap_page(bitmap_file, page, - &last_page_ok)) { - - return FALSE; - } - - *page_end_lsn = mach_read_from_8(page + MODIFIED_PAGE_END_LSN); - } - - /* We check two pages here because the last read page already contains - the required LSN data. If the next to the last one page is corrupted, - then we have no way of telling if that page contained the required LSN - range data too */ - return last_page_ok && next_to_last_page_ok; -} - -/****************************************************************//** -Read the disk bitmap and build the changed page bitmap tree for the -LSN interval incremental_lsn to log_sys.next_checkpoint_lsn. - -@return the built bitmap tree or NULL if unable to read the full interval for -any reason. */ -xb_page_bitmap* -xb_page_bitmap_init(void) -/*=====================*/ -{ - log_online_bitmap_file_t bitmap_file; - lsn_t bmp_start_lsn = incremental_lsn; - const lsn_t bmp_end_lsn{log_sys.next_checkpoint_lsn}; - byte page[MODIFIED_PAGE_BLOCK_SIZE]; - lsn_t current_page_end_lsn; - xb_page_bitmap *result; - ibool last_page_in_run= FALSE; - log_online_bitmap_file_range_t bitmap_files; - size_t bmp_i; - ibool last_page_ok = TRUE; - - if (UNIV_UNLIKELY(bmp_start_lsn > bmp_end_lsn)) { - - msg("mariabackup: incremental backup LSN " LSN_PF - " is larger than than the last checkpoint LSN " LSN_PF - , bmp_start_lsn, bmp_end_lsn); - return NULL; - } - - if (!log_online_setup_bitmap_file_range(&bitmap_files, bmp_start_lsn, - bmp_end_lsn)) { - - return NULL; - } - - /* Only accept no bitmap files returned if start LSN == end LSN */ - if (bitmap_files.count == 0 && bmp_end_lsn != bmp_start_lsn) { - - return NULL; - } - - result = rbt_create(MODIFIED_PAGE_BLOCK_SIZE, - log_online_compare_bmp_keys); - - if (bmp_start_lsn == bmp_end_lsn) { - - /* Empty range - empty bitmap */ - return result; - } - - bmp_i = 0; - - if (UNIV_UNLIKELY(bitmap_files.files[bmp_i].start_lsn - > bmp_start_lsn)) { - - /* The 1st file does not have the starting LSN data */ - xb_msg_missing_lsn_data(bmp_start_lsn, - bitmap_files.files[bmp_i].start_lsn); - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - /* Skip any zero-sized files at the start */ - while ((bmp_i < bitmap_files.count - 1) - && (bitmap_files.files[bmp_i].start_lsn - == bitmap_files.files[bmp_i + 1].start_lsn)) { - - bmp_i++; - } - - /* Is the 1st bitmap file missing? */ - if (UNIV_UNLIKELY(bitmap_files.files[bmp_i].name[0] == '\0')) { - - /* TODO: this is not the exact missing range */ - xb_msg_missing_lsn_data(bmp_start_lsn, bmp_end_lsn); - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - /* Open the 1st bitmap file */ - if (UNIV_UNLIKELY(!log_online_open_bitmap_file_read_only( - bitmap_files.files[bmp_i].name, - &bitmap_file))) { - - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - /* If the 1st file is truncated, no data. Not merged with the case - below because zero-length file indicates not a corruption but missing - subsequent files instead. */ - if (UNIV_UNLIKELY(bitmap_file.size < MODIFIED_PAGE_BLOCK_SIZE)) { - - xb_msg_missing_lsn_data(bmp_start_lsn, bmp_end_lsn); - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - /* Find the start of the required LSN range in the file */ - if (UNIV_UNLIKELY(!xb_find_lsn_in_bitmap_file(&bitmap_file, page, - ¤t_page_end_lsn, - bmp_start_lsn))) { - - msg("mariabackup: Warning: changed page bitmap file " - "\'%s\' corrupted", bitmap_file.name); - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - last_page_in_run - = mach_read_from_4(page + MODIFIED_PAGE_IS_LAST_BLOCK); - - if (UNIV_UNLIKELY(!log_online_diagnose_bitmap_eof(&bitmap_file, - last_page_in_run))) { - - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - if (UNIV_UNLIKELY(current_page_end_lsn < bmp_start_lsn)) { - - xb_msg_missing_lsn_data(current_page_end_lsn, bmp_start_lsn); - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - /* 1st bitmap page found, add it to the tree. */ - rbt_insert(result, page, page); - - /* Read next pages/files until all required data is read */ - while (last_page_ok - && (current_page_end_lsn < bmp_end_lsn - || (current_page_end_lsn == bmp_end_lsn - && !last_page_in_run))) { - - ib_rbt_bound_t tree_search_pos; - - /* If EOF, advance the file skipping over any empty files */ - while (bitmap_file.size < MODIFIED_PAGE_BLOCK_SIZE - || (bitmap_file.offset - > bitmap_file.size - MODIFIED_PAGE_BLOCK_SIZE)) { - - os_file_close(bitmap_file.file); - - if (UNIV_UNLIKELY( - !log_online_diagnose_bitmap_eof( - &bitmap_file, last_page_in_run))) { - - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - bmp_i++; - - if (UNIV_UNLIKELY(bmp_i == bitmap_files.count - || (bitmap_files.files[bmp_i].seq_num - == 0))) { - - xb_msg_missing_lsn_data(current_page_end_lsn, - bmp_end_lsn); - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - /* Is the next file missing? */ - if (UNIV_UNLIKELY(bitmap_files.files[bmp_i].name[0] - == '\0')) { - - /* TODO: this is not the exact missing range */ - xb_msg_missing_lsn_data(bitmap_files.files - [bmp_i - 1].start_lsn, - bmp_end_lsn); - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - if (UNIV_UNLIKELY( - !log_online_open_bitmap_file_read_only( - bitmap_files.files[bmp_i].name, - &bitmap_file))) { - - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - } - - if (UNIV_UNLIKELY( - !log_online_read_bitmap_page(&bitmap_file, page, - &last_page_ok))) { - - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - if (UNIV_UNLIKELY(!last_page_ok)) { - - msg("mariabackup: warning: changed page bitmap file " - "\'%s\' corrupted.", bitmap_file.name); - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - /* Merge the current page with an existing page or insert a new - page into the tree */ - - if (!rbt_search(result, &tree_search_pos, page)) { - - /* Merge the bitmap pages */ - byte *existing_page - = rbt_value(byte, tree_search_pos.last); - bitmap_word_t *bmp_word_1 = (bitmap_word_t *) - (existing_page + MODIFIED_PAGE_BLOCK_BITMAP); - bitmap_word_t *bmp_end = (bitmap_word_t *) - (existing_page + MODIFIED_PAGE_BLOCK_UNUSED_2); - bitmap_word_t *bmp_word_2 = (bitmap_word_t *) - (page + MODIFIED_PAGE_BLOCK_BITMAP); - while (bmp_word_1 < bmp_end) { - - *bmp_word_1++ |= *bmp_word_2++; - } - xb_a (bmp_word_1 == bmp_end); - } else { - - /* Add a new page */ - rbt_add_node(result, &tree_search_pos, page); - } - - current_page_end_lsn - = mach_read_from_8(page + MODIFIED_PAGE_END_LSN); - last_page_in_run - = mach_read_from_4(page + MODIFIED_PAGE_IS_LAST_BLOCK); - } - - xb_a (current_page_end_lsn >= bmp_end_lsn); - - free(bitmap_files.files); - os_file_close(bitmap_file.file); - - return result; -} - -/****************************************************************//** -Free the bitmap tree. */ -void -xb_page_bitmap_deinit( -/*==================*/ - xb_page_bitmap* bitmap) /*!bitmap_page has been -already found/bumped by rbt_search()/rbt_next(). - -@return FALSE if no more bitmap data for the range space ID */ -static -ibool -xb_page_bitmap_setup_next_page( -/*===========================*/ - xb_page_bitmap_range* bitmap_range) /*!bitmap_node == NULL) { - - bitmap_range->current_page_id = ULINT_UNDEFINED; - return FALSE; - } - - bitmap_range->bitmap_page = rbt_value(byte, bitmap_range->bitmap_node); - - new_space_id = mach_read_from_4(bitmap_range->bitmap_page - + MODIFIED_PAGE_SPACE_ID); - if (new_space_id != bitmap_range->space_id) { - - /* No more data for the current page id. */ - xb_a(new_space_id > bitmap_range->space_id); - bitmap_range->current_page_id = ULINT_UNDEFINED; - return FALSE; - } - - new_1st_page_id = mach_read_from_4(bitmap_range->bitmap_page + - MODIFIED_PAGE_1ST_PAGE_ID); - xb_a (new_1st_page_id >= bitmap_range->current_page_id - || bitmap_range->current_page_id == ULINT_UNDEFINED); - - bitmap_range->current_page_id = new_1st_page_id; - bitmap_range->bit_i = 0; - - return TRUE; -} - -/** Find the node with the smallest key that greater than equal to search key. -@param[in] tree red-black tree -@param[in] key search key -@return node with the smallest greater-than-or-equal key -@retval NULL if none was found */ -static -const ib_rbt_node_t* -rbt_lower_bound(const ib_rbt_t* tree, const void* key) -{ - ut_ad(!tree->cmp_arg); - const ib_rbt_node_t* ge = NULL; - - for (const ib_rbt_node_t *node = tree->root->left; - node != tree->nil; ) { - int result = tree->compare(node->value, key); - - if (result < 0) { - node = node->right; - } else { - ge = node; - if (result == 0) { - break; - } - - node = node->left; - } - } - - return(ge); -} - -/****************************************************************//** -Set up a new bitmap range iterator over a given space id changed -pages in a given bitmap. - -@return bitmap range iterator */ -xb_page_bitmap_range* -xb_page_bitmap_range_init( -/*======================*/ - xb_page_bitmap* bitmap, /*!< in: bitmap to iterate over */ - ulint space_id) /*!< in: space id */ -{ - byte search_page[MODIFIED_PAGE_BLOCK_SIZE]; - xb_page_bitmap_range *result - = static_cast(malloc(sizeof(*result))); - - memset(result, 0, sizeof(*result)); - result->bitmap = bitmap; - result->space_id = space_id; - result->current_page_id = ULINT_UNDEFINED; - - /* Search for the 1st page for the given space id */ - /* This also sets MODIFIED_PAGE_1ST_PAGE_ID to 0, which is what we - want. */ - memset(search_page, 0, MODIFIED_PAGE_BLOCK_SIZE); - mach_write_to_4(search_page + MODIFIED_PAGE_SPACE_ID, space_id); - - result->bitmap_node = rbt_lower_bound(result->bitmap, search_page); - - xb_page_bitmap_setup_next_page(result); - - return result; -} - -/****************************************************************//** -Get the value of the bitmap->range->bit_i bitmap bit - -@return the current bit value */ -static inline -ibool -is_bit_set( -/*=======*/ - const xb_page_bitmap_range* bitmap_range) /*!< in: bitmap - range */ -{ - return ((*(((bitmap_word_t *)(bitmap_range->bitmap_page - + MODIFIED_PAGE_BLOCK_BITMAP)) - + (bitmap_range->bit_i >> 6))) - & (1ULL << (bitmap_range->bit_i & 0x3F))) ? TRUE : FALSE; -} - -/****************************************************************//** -Get the next page id that has its bit set or cleared, i.e. equal to -bit_value. - -@return page id */ -ulint -xb_page_bitmap_range_get_next_bit( -/*==============================*/ - xb_page_bitmap_range* bitmap_range, /*!< in/out: bitmap range */ - ibool bit_value) /*!< in: bit value */ -{ - if (UNIV_UNLIKELY(bitmap_range->current_page_id - == ULINT_UNDEFINED)) { - - return ULINT_UNDEFINED; - } - - do { - while (bitmap_range->bit_i < MODIFIED_PAGE_BLOCK_ID_COUNT) { - - while (is_bit_set(bitmap_range) != bit_value - && (bitmap_range->bit_i - < MODIFIED_PAGE_BLOCK_ID_COUNT)) { - - bitmap_range->current_page_id++; - bitmap_range->bit_i++; - } - - if (bitmap_range->bit_i - < MODIFIED_PAGE_BLOCK_ID_COUNT) { - - ulint result = bitmap_range->current_page_id; - bitmap_range->current_page_id++; - bitmap_range->bit_i++; - return result; - } - } - - bitmap_range->bitmap_node - = rbt_next(bitmap_range->bitmap, - bitmap_range->bitmap_node); - - } while (xb_page_bitmap_setup_next_page(bitmap_range)); - - return ULINT_UNDEFINED; -} - -/****************************************************************//** -Free the bitmap range iterator. */ -void -xb_page_bitmap_range_deinit( -/*========================*/ - xb_page_bitmap_range* bitmap_range) /*! in/out: bitmap range */ -{ - free(bitmap_range); -} diff --git a/extra/mariabackup/changed_page_bitmap.h b/extra/mariabackup/changed_page_bitmap.h deleted file mode 100644 index 8d504359..00000000 --- a/extra/mariabackup/changed_page_bitmap.h +++ /dev/null @@ -1,85 +0,0 @@ -/****************************************************** -XtraBackup: hot backup tool for InnoDB -(c) 2009-2012 Percona Inc. -Originally Created 3/3/2009 Yasufumi Kinoshita -Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, -Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. - -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; version 2 of the License. - -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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA - -*******************************************************/ - -/* Changed page bitmap interface */ - -#ifndef XB_CHANGED_PAGE_BITMAP_H -#define XB_CHANGED_PAGE_BITMAP_H - -#include -#include - -/* The changed page bitmap structure */ -typedef ib_rbt_t xb_page_bitmap; - -struct xb_page_bitmap_range_struct; - -/* The bitmap range iterator over one space id */ -typedef struct xb_page_bitmap_range_struct xb_page_bitmap_range; - -/****************************************************************//** -Read the disk bitmap and build the changed page bitmap tree for the -LSN interval incremental_lsn to log_sys.next_checkpoint_lsn. - -@return the built bitmap tree */ -xb_page_bitmap* -xb_page_bitmap_init(void); -/*=====================*/ - -/****************************************************************//** -Free the bitmap tree. */ -void -xb_page_bitmap_deinit( -/*==================*/ - xb_page_bitmap* bitmap); /*! #include -#include #include #include @@ -143,7 +142,7 @@ static inline ATTRIBUTE_FORMAT(printf, 1,2) ATTRIBUTE_NORETURN void die(const ch # define POSIX_FADV_NORMAL # define POSIX_FADV_SEQUENTIAL # define POSIX_FADV_DONTNEED -# define posix_fadvise(a,b,c,d) do {} while(0) +# define posix_fadvise(fd, offset, len, advice) do { (void)offset; } while(0) #endif /*********************************************************************** diff --git a/extra/mariabackup/common_engine.cc b/extra/mariabackup/common_engine.cc new file mode 100644 index 00000000..a4a87062 --- /dev/null +++ b/extra/mariabackup/common_engine.cc @@ -0,0 +1,512 @@ +#include "common_engine.h" +#include "backup_copy.h" +#include "xtrabackup.h" +#include "common.h" +#include "backup_debug.h" + +#include +#include +#include +#include + +namespace common_engine { + +class Table { +public: + Table(std::string &db, std::string &table, std::string &fs_name) : + m_db(std::move(db)), m_table(std::move(table)), + m_fs_name(std::move(fs_name)) {} + virtual ~Table() {} + void add_file_name(const char *file_name) { m_fnames.push_back(file_name); } + virtual bool copy(ds_ctxt_t *ds, MYSQL *con, bool no_lock, + bool finalize, unsigned thread_num); + std::string &get_db() { return m_db; } + std::string &get_table() { return m_table; } + std::string &get_version() { return m_version; } + +protected: + std::string m_db; + std::string m_table; + std::string m_fs_name; + std::string m_version; + std::vector m_fnames; +}; + +bool +Table::copy(ds_ctxt_t *ds, MYSQL *con, bool no_lock, bool, unsigned thread_num) { + static const size_t buf_size = 10 * 1024 * 1024; + std::unique_ptr buf; + bool result = false; + File frm_file = -1; + std::vector files; + bool locked = false; + std::string full_tname("`"); + full_tname.append(m_db).append("`.`").append(m_table).append("`"); + + if (!no_lock && !backup_lock(con, full_tname.c_str())) { + msg(thread_num, "Error on executing BACKUP LOCK for table %s", + full_tname.c_str()); + goto exit; + } + else + locked = !no_lock; + + if ((frm_file = mysql_file_open(key_file_frm, (m_fs_name + ".frm").c_str(), + O_RDONLY | O_SHARE, MYF(0))) < 0 && !m_fnames.empty() && + !ends_with(m_fnames[0].c_str(), ".ARZ") && + !ends_with(m_fnames[0].c_str(), ".ARM")) { + // Don't treat it as error, as the table can be dropped after it + // was added to queue for copying + result = true; + goto exit; + } + + for (const auto &fname : m_fnames) { + File file = mysql_file_open(0, fname.c_str(),O_RDONLY | O_SHARE, MYF(0)); + if (file < 0) { + msg(thread_num, "Error on file %s open during %s table copy", + fname.c_str(), full_tname.c_str()); + goto exit; + } + files.push_back(file); + } + + if (locked && !backup_unlock(con)) { + msg(thread_num, "Error on BACKUP UNLOCK for table %s", full_tname.c_str()); + locked = false; + goto exit; + } + + locked = false; + + buf.reset(new uchar[buf_size]); + + for (size_t i = 0; i < m_fnames.size(); ++i) { + ds_file_t *dst_file = nullptr; + size_t bytes_read; + size_t copied_size = 0; + MY_STAT stat_info; + + if (my_fstat(files[i], &stat_info, MYF(0))) { + msg(thread_num, "error: failed to get stat info for file %s of " + "table %s", m_fnames[i].c_str(), full_tname.c_str()); + goto exit; + } + + const char *dst_path = + (xtrabackup_copy_back || xtrabackup_move_back) ? + m_fnames[i].c_str() : trim_dotslash(m_fnames[i].c_str()); + + dst_file = ds_open(ds, dst_path, &stat_info, false); + if (!dst_file) { + msg(thread_num, "error: cannot open destination stream for %s, table %s", + dst_path, full_tname.c_str()); + goto exit; + } + + while ((bytes_read = my_read(files[i], buf.get(), buf_size, MY_WME))) { + if (bytes_read == size_t(-1)) { + msg(thread_num, "error: file %s read for table %s", + m_fnames[i].c_str(), full_tname.c_str()); + ds_close(dst_file); + goto exit; + } + xtrabackup_io_throttling(); + if (ds_write(dst_file, buf.get(), bytes_read)) { + msg(thread_num, "error: file %s write for table %s", + dst_path, full_tname.c_str()); + ds_close(dst_file); + goto exit; + } + copied_size += bytes_read; + } + mysql_file_close(files[i], MYF(MY_WME)); + files[i] = -1; + ds_close(dst_file); + msg(thread_num, "Copied file %s for table %s, %zu bytes", + m_fnames[i].c_str(), full_tname.c_str(), copied_size); + } + + result = true; + +#ifndef DBUG_OFF + { + std::string sql_name(m_db); + sql_name.append("/").append(m_table); + DBUG_MARIABACKUP_EVENT_LOCK("after_ce_table_copy", fil_space_t::name_type(sql_name.data(), sql_name.size())); + } +#endif // DBUG_OFF +exit: + if (frm_file >= 0) { + m_version = ::read_table_version_id(frm_file); + mysql_file_close(frm_file, MYF(MY_WME)); + } + if (locked && !backup_unlock(con)) { + msg(thread_num, "Error on BACKUP UNLOCK for table %s", full_tname.c_str()); + result = false; + } + for (auto file : files) + if (file >= 0) + mysql_file_close(file, MYF(MY_WME)); + return result; +} + +// Append-only tables +class LogTable : public Table { + public: + LogTable(std::string &db, std::string &table, std::string &fs_name) : + Table(db, table, fs_name) {} + + virtual ~LogTable() { (void)close(); } + bool + copy(ds_ctxt_t *ds, MYSQL *con, bool no_lock, bool finalize, + unsigned thread_num) override; + bool close(); + private: + bool open(ds_ctxt_t *ds, unsigned thread_num); + std::vector m_src; + std::vector m_dst; +}; + +bool +LogTable::open(ds_ctxt_t *ds, unsigned thread_num) { + DBUG_ASSERT(m_src.empty()); + DBUG_ASSERT(m_dst.empty()); + + std::string full_tname("`"); + full_tname.append(m_db).append("`.`").append(m_table).append("`"); + + for (const auto &fname : m_fnames) { + File file = mysql_file_open(0, fname.c_str(),O_RDONLY | O_SHARE, MYF(0)); + if (file < 0) { + msg(thread_num, "Error on file %s open during %s log table copy", + fname.c_str(), full_tname.c_str()); + return false; + } + m_src.push_back(file); + + MY_STAT stat_info; + if (my_fstat(file, &stat_info, MYF(0))) { + msg(thread_num, "error: failed to get stat info for file %s of " + "log table %s", fname.c_str(), full_tname.c_str()); + return false; + } + const char *dst_path = + (xtrabackup_copy_back || xtrabackup_move_back) ? + fname.c_str() : trim_dotslash(fname.c_str()); + ds_file_t *dst_file = ds_open(ds, dst_path, &stat_info, false); + if (!dst_file) { + msg(thread_num, "error: cannot open destination stream for %s, " + "log table %s", dst_path, full_tname.c_str()); + return false; + } + m_dst.push_back(dst_file); + } + + File frm_file; + if ((frm_file = mysql_file_open(key_file_frm, (m_fs_name + ".frm").c_str(), + O_RDONLY | O_SHARE, MYF(0))) < 0 && !m_fnames.empty() && + !ends_with(m_fnames[0].c_str(), ".ARZ") && + !ends_with(m_fnames[0].c_str(), ".ARM")) { + msg(thread_num, "Error on .frm file open for log table %s", + full_tname.c_str()); + return false; + } + + m_version = ::read_table_version_id(frm_file); + mysql_file_close(frm_file, MYF(MY_WME)); + + return true; +} + +bool LogTable::close() { + while (!m_src.empty()) { + auto f = m_src.back(); + m_src.pop_back(); + mysql_file_close(f, MYF(MY_WME)); + } + while (!m_dst.empty()) { + auto f = m_dst.back(); + m_dst.pop_back(); + ds_close(f); + } + return true; +} + +bool +LogTable::copy(ds_ctxt_t *ds, MYSQL *con, bool no_lock, bool finalize, + unsigned thread_num) { + static const size_t buf_size = 10 * 1024 * 1024; + DBUG_ASSERT(ds); + DBUG_ASSERT(con); + if (m_src.empty() && !open(ds, thread_num)) { + close(); + return false; + } + DBUG_ASSERT(m_src.size() == m_dst.size()); + + std::unique_ptr buf(new uchar[buf_size]); + for (size_t i = 0; i < m_src.size(); ++i) { + // .CSM can be rewritten (see write_meta_file() usage in ha_tina.cc) + if (!finalize && ends_with(m_fnames[i].c_str(), ".CSM")) + continue; + size_t bytes_read; + size_t copied_size = 0; + while ((bytes_read = my_read(m_src[i], buf.get(), buf_size, MY_WME))) { + if (bytes_read == size_t(-1)) { + msg(thread_num, "error: file %s read for log table %s", + m_fnames[i].c_str(), + std::string("`").append(m_db).append("`.`"). + append(m_table).append("`").c_str()); + close(); + return false; + } + xtrabackup_io_throttling(); + if (ds_write(m_dst[i], buf.get(), bytes_read)) { + msg(thread_num, "error: file %s write for log table %s", + m_fnames[i].c_str(), std::string("`").append(m_db).append("`.`"). + append(m_table).append("`").c_str()); + close(); + return false; + } + copied_size += bytes_read; + } + msg(thread_num, "Copied file %s for log table %s, %zu bytes", + m_fnames[i].c_str(), std::string("`").append(m_db).append("`.`"). + append(m_table).append("`").c_str(), copied_size); + } + + return true; +} + +class BackupImpl { + public: + BackupImpl( + const char *datadir_path, ds_ctxt_t *datasink, + std::vector &con_pool, ThreadPool &thread_pool) : + m_datadir_path(datadir_path), m_ds(datasink), m_con_pool(con_pool), + m_process_table_jobs(thread_pool) {} + ~BackupImpl() { } + bool scan( + const std::unordered_set &exclude_tables, + std::unordered_set *out_processed_tables, + bool no_lock, bool collect_log_and_stats); + void set_post_copy_table_hook(const post_copy_table_hook_t &hook) { + m_table_post_copy_hook = hook; + } + bool copy_log_tables(bool finalize); + bool copy_stats_tables(); + bool wait_for_finish(); + bool close_log_tables(); + private: + + void process_table_job(Table *table, bool no_lock, bool delete_table, + bool finalize, unsigned thread_num); + + const char *m_datadir_path; + ds_ctxt_t *m_ds; + std::vector &m_con_pool; + TasksGroup m_process_table_jobs; + + post_copy_table_hook_t m_table_post_copy_hook; + std::unordered_map> m_log_tables; + std::unordered_map> m_stats_tables; +}; + +void BackupImpl::process_table_job(Table *table, bool no_lock, + bool delete_table, bool finalize, unsigned thread_num) { + int result = 0; + + if (!m_process_table_jobs.get_result()) + goto exit; + + if (!table->copy(m_ds, m_con_pool[thread_num], no_lock, finalize, thread_num)) + goto exit; + + if (m_table_post_copy_hook) + m_table_post_copy_hook(table->get_db(), table->get_table(), + table->get_version()); + + result = 1; + +exit: + if (delete_table) + delete table; + m_process_table_jobs.finish_task(result); +} + +bool BackupImpl::scan(const std::unordered_set &exclude_tables, + std::unordered_set *out_processed_tables, bool no_lock, + bool collect_log_and_stats) { + + msg("Start scanning common engine tables, need backup locks: %d, " + "collect log and stat tables: %d", no_lock, collect_log_and_stats); + + std::unordered_map> found_tables; + + foreach_file_in_db_dirs(m_datadir_path, + [&](const char *file_path)->bool { + + static const char *ext_list[] = + {".MYD", ".MYI", ".MRG", ".ARM", ".ARZ", ".CSM", ".CSV", NULL}; + + bool is_aria = ends_with(file_path, ".MAD") || ends_with(file_path, ".MAI"); + + if (!collect_log_and_stats && is_aria) + return true; + + if (!is_aria && !filename_matches(file_path, ext_list)) + return true; + + if (check_if_skip_table(file_path)) { + msg("Skipping %s.", file_path); + return true; + } + + auto db_table_fs = convert_filepath_to_tablename(file_path); + auto tk = + table_key(std::get<0>(db_table_fs), std::get<1>(db_table_fs)); + + // log and stats tables are only collected in this function, + // so there is no need to filter out them with exclude_tables. + if (collect_log_and_stats) { + if (is_log_table(std::get<0>(db_table_fs).c_str(), + std::get<1>(db_table_fs).c_str())) { + auto table_it = m_log_tables.find(tk); + if (table_it == m_log_tables.end()) { + msg("Log table found: %s", tk.c_str()); + table_it = m_log_tables.emplace(tk, + std::unique_ptr(new LogTable(std::get<0>(db_table_fs), + std::get<1>(db_table_fs), std::get<2>(db_table_fs)))).first; + } + msg("Collect log table file: %s", file_path); + table_it->second->add_file_name(file_path); + return true; + } + // Aria can handle statistics tables + else if (is_stats_table(std::get<0>(db_table_fs).c_str(), + std::get<1>(db_table_fs).c_str()) && !is_aria) { + auto table_it = m_stats_tables.find(tk); + if (table_it == m_stats_tables.end()) { + msg("Stats table found: %s", tk.c_str()); + table_it = m_stats_tables.emplace(tk, + std::unique_ptr
(new Table(std::get<0>(db_table_fs), + std::get<1>(db_table_fs), std::get<2>(db_table_fs)))).first; + } + msg("Collect stats table file: %s", file_path); + table_it->second->add_file_name(file_path); + return true; + } + } else if (is_log_table(std::get<0>(db_table_fs).c_str(), + std::get<1>(db_table_fs).c_str()) || + is_stats_table(std::get<0>(db_table_fs).c_str(), + std::get<1>(db_table_fs).c_str())) + return true; + + if (is_aria) + return true; + + if (exclude_tables.count(tk)) { + msg("Skip table %s at it is in exclude list", tk.c_str()); + return true; + } + + auto table_it = found_tables.find(tk); + if (table_it == found_tables.end()) { + table_it = found_tables.emplace(tk, + std::unique_ptr
(new Table(std::get<0>(db_table_fs), + std::get<1>(db_table_fs), std::get<2>(db_table_fs)))).first; + } + + table_it->second->add_file_name(file_path); + + return true; + }); + + for (auto &table_it : found_tables) { + m_process_table_jobs.push_task( + std::bind(&BackupImpl::process_table_job, this, table_it.second.release(), + no_lock, true, false, std::placeholders::_1)); + if (out_processed_tables) + out_processed_tables->insert(table_it.first); + } + + msg("Stop scanning common engine tables"); + return true; +} + +bool BackupImpl::copy_log_tables(bool finalize) { + for (auto &table_it : m_log_tables) { + // Do not execute BACKUP LOCK for log tables as it's supposed + // that they must be copied on BLOCK_DDL and BLOCK_COMMIT locks. + m_process_table_jobs.push_task( + std::bind(&BackupImpl::process_table_job, this, table_it.second.get(), + true, false, finalize, std::placeholders::_1)); + } + return true; +} + +bool BackupImpl::copy_stats_tables() { + for (auto &table_it : m_stats_tables) { + // Do not execute BACKUP LOCK for stats tables as it's supposed + // that they must be copied on BLOCK_DDL and BLOCK_COMMIT locks. + // Delete stats table object after copy (see process_table_job()) + m_process_table_jobs.push_task( + std::bind(&BackupImpl::process_table_job, this, table_it.second.release(), + true, true, false, std::placeholders::_1)); + } + m_stats_tables.clear(); + return true; +} + +bool BackupImpl::wait_for_finish() { + /* Wait for threads to exit */ + return m_process_table_jobs.wait_for_finish(); +} + +bool BackupImpl::close_log_tables() { + bool result = wait_for_finish(); + for (auto &table_it : m_log_tables) + table_it.second->close(); + return result; +} + +Backup::Backup(const char *datadir_path, ds_ctxt_t *datasink, + std::vector &con_pool, ThreadPool &thread_pool) : + m_backup_impl( + new BackupImpl(datadir_path, datasink, con_pool, + thread_pool)) { } + +Backup::~Backup() { + delete m_backup_impl; +} + +bool Backup::scan( + const std::unordered_set &exclude_tables, + std::unordered_set *out_processed_tables, + bool no_lock, bool collect_log_and_stats) { + return m_backup_impl->scan(exclude_tables, out_processed_tables, no_lock, + collect_log_and_stats); +} + +bool Backup::copy_log_tables(bool finalize) { + return m_backup_impl->copy_log_tables(finalize); +} + +bool Backup::copy_stats_tables() { + return m_backup_impl->copy_stats_tables(); +} + +bool Backup::wait_for_finish() { + return m_backup_impl->wait_for_finish(); +} + +bool Backup::close_log_tables() { + return m_backup_impl->close_log_tables(); +} + +void Backup::set_post_copy_table_hook(const post_copy_table_hook_t &hook) { + m_backup_impl->set_post_copy_table_hook(hook); +} + +} // namespace common_engine diff --git a/extra/mariabackup/common_engine.h b/extra/mariabackup/common_engine.h new file mode 100644 index 00000000..6f5d8062 --- /dev/null +++ b/extra/mariabackup/common_engine.h @@ -0,0 +1,39 @@ +#pragma once +#include "my_global.h" +#include "backup_mysql.h" +#include "datasink.h" +#include "thread_pool.h" +#include "xtrabackup.h" + +#include +#include +#include + +namespace common_engine { + +class BackupImpl; + +class Backup { + public: + Backup(const char *datadir_path, ds_ctxt_t *datasink, + std::vector &con_pool, ThreadPool &thread_pool); + ~Backup(); + Backup (Backup &&other) = delete; + Backup & operator= (Backup &&other) = delete; + Backup(const Backup &) = delete; + Backup & operator= (const Backup &) = delete; + bool scan( + const std::unordered_set &exclude_tables, + std::unordered_set *out_processed_tables, + bool no_lock, bool collect_log_and_stats); + bool copy_log_tables(bool finalize); + bool copy_stats_tables(); + bool wait_for_finish(); + bool close_log_tables(); + void set_post_copy_table_hook(const post_copy_table_hook_t &hook); + private: + BackupImpl *m_backup_impl; +}; + +} // namespace common_engine + diff --git a/extra/mariabackup/datasink.cc b/extra/mariabackup/datasink.cc index a576526d..132ff3fc 100644 --- a/extra/mariabackup/datasink.cc +++ b/extra/mariabackup/datasink.cc @@ -80,11 +80,11 @@ ds_create(const char *root, ds_type_t type) /************************************************************************ Open a datasink file */ ds_file_t * -ds_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *stat) +ds_open(ds_ctxt_t *ctxt, const char *path, const MY_STAT *stat, bool rewrite) { ds_file_t *file; - file = ctxt->datasink->open(ctxt, path, stat); + file = ctxt->datasink->open(ctxt, path, stat, rewrite); if (file != NULL) { file->datasink = ctxt->datasink; } @@ -104,6 +104,30 @@ ds_write(ds_file_t *file, const void *buf, size_t len) return file->datasink->write(file, (const uchar *)buf, len); } +int ds_seek_set(ds_file_t *file, my_off_t offset) { + DBUG_ASSERT(file); + DBUG_ASSERT(file->datasink); + if (file->datasink->seek_set) + return file->datasink->seek_set(file, offset); + return 0; +} + +int ds_rename(ds_ctxt_t *ctxt, const char *old_path, const char *new_path) { + DBUG_ASSERT(ctxt); + DBUG_ASSERT(ctxt->datasink); + if (ctxt->datasink->rename) + return ctxt->datasink->rename(ctxt, old_path, new_path); + return 0; +} + +int ds_remove(ds_ctxt_t *ctxt, const char *path) { + DBUG_ASSERT(ctxt); + DBUG_ASSERT(ctxt->datasink); + if (ctxt->datasink->remove) + return ctxt->datasink->mremove(ctxt, path); + return 0; +} + /************************************************************************ Close a datasink file. @return 0 on success, 1, on error. */ diff --git a/extra/mariabackup/datasink.h b/extra/mariabackup/datasink.h index 57468e0c..98cbe525 100644 --- a/extra/mariabackup/datasink.h +++ b/extra/mariabackup/datasink.h @@ -43,7 +43,8 @@ typedef struct ds_ctxt { */ bool copy_file(const char *src_file_path, const char *dst_file_path, - uint thread_n); + uint thread_n, + bool rewrite = false); bool move_file(const char *src_file_path, const char *dst_file_path, @@ -76,10 +77,15 @@ typedef struct { struct datasink_struct { ds_ctxt_t *(*init)(const char *root); - ds_file_t *(*open)(ds_ctxt_t *ctxt, const char *path, MY_STAT *stat); + ds_file_t *(*open)(ds_ctxt_t *ctxt, const char *path, + const MY_STAT *stat, bool rewrite); int (*write)(ds_file_t *file, const unsigned char *buf, size_t len); + int (*seek_set)(ds_file_t *file, my_off_t offset); int (*close)(ds_file_t *file); int (*remove)(const char *path); + // TODO: consider to return bool from "rename" and "remove" + int (*rename)(ds_ctxt_t *ctxt, const char *old_path, const char *new_path); + int (*mremove)(ds_ctxt_t *ctxt, const char *path); void (*deinit)(ds_ctxt_t *ctxt); }; @@ -106,12 +112,17 @@ ds_ctxt_t *ds_create(const char *root, ds_type_t type); /************************************************************************ Open a datasink file */ -ds_file_t *ds_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *stat); +ds_file_t *ds_open( + ds_ctxt_t *ctxt, const char *path, const MY_STAT *stat, bool rewrite = false); /************************************************************************ Write to a datasink file. @return 0 on success, 1 on error. */ int ds_write(ds_file_t *file, const void *buf, size_t len); +int ds_seek_set(ds_file_t *file, my_off_t offset); + +int ds_rename(ds_ctxt_t *ctxt, const char *old_path, const char *new_path); +int ds_remove(ds_ctxt_t *ctxt, const char *path); /************************************************************************ Close a datasink file. diff --git a/extra/mariabackup/ddl_log.cc b/extra/mariabackup/ddl_log.cc new file mode 100644 index 00000000..6af34172 --- /dev/null +++ b/extra/mariabackup/ddl_log.cc @@ -0,0 +1,553 @@ +#include "ddl_log.h" +#include "common.h" +#include "my_sys.h" +#include "sql_table.h" +#include "backup_copy.h" +#include "xtrabackup.h" +#include +#include +#include +#include + +namespace ddl_log { + +struct Entry { + enum Type { + CREATE, + ALTER, + RENAME, + REPAIR, + OPTIMIZE, + DROP, + TRUNCATE, + CHANGE_INDEX, + BULK_INSERT + }; + Type type; + std::string date; + std::string engine; + bool partitioned; + std::string db; + std::string table; + std::string id; + std::string new_engine; + bool new_partitioned; + std::string new_db; + std::string new_table; + std::string new_id; +}; + +typedef std::vector> entries_t; +typedef std::function)> store_entry_func_t; + +const char *aria_engine_name = "Aria"; +static const char *frm_ext = ".frm"; +static const char *database_keyword = "DATABASE"; + +const std::unordered_map> engine_exts = +{ + {"Aria", {".MAD", ".MAI"}}, + {"MyISAM", {".MYD", ".MYI"}}, + {"MRG_MyISAM", {".MRG"}}, + {"ARCHIVE", {".ARM", ".ARZ"}}, + {"CSV", {".CSM", ".CSV"}} +}; + +static inline bool known_engine(const std::string &engine) { + return engine_exts.count(engine); +} + +// TODO: add error messages +size_t parse(const uchar *buf, size_t buf_size, bool &error_flag, + store_entry_func_t &store_entry_func) { + DBUG_ASSERT(buf); + static constexpr char token_delimiter = '\t'; + static constexpr char line_delimiter = '\n'; + enum { + TOKEN_FIRST = 0, + TOKEN_DATE = TOKEN_FIRST, + TOKEN_TYPE, + TOKEN_ENGINE, + TOKEN_PARTITIONED, + TOKEN_DB, + TOKEN_TABLE, + TOKEN_ID, + TOKEN_MANDATORY = TOKEN_ID, + TOKEN_NEW_ENGINE, + TOKEN_NEW_PARTITIONED, + TOKEN_NEW_DB, + TOKEN_NEW_TABLE, + TOKEN_NEW_ID, + TOKEN_LAST = TOKEN_NEW_ID + }; + const size_t string_offsets[TOKEN_LAST + 1] = { + offsetof(Entry, date), + offsetof(Entry, type), // not a string, be careful + offsetof(Entry, engine), + offsetof(Entry, partitioned), // not a string, be careful + offsetof(Entry, db), + offsetof(Entry, table), + offsetof(Entry, id), + offsetof(Entry, new_engine), + offsetof(Entry, new_partitioned), // not a string, be careful + offsetof(Entry, new_db), + offsetof(Entry, new_table), + offsetof(Entry, new_id) + }; + const std::unordered_map str_to_type = { + {"CREATE", Entry::CREATE}, + {"ALTER", Entry::ALTER}, + {"RENAME", Entry::RENAME}, + // TODO: fix to use uppercase-only + {"repair", Entry::REPAIR}, + {"optimize", Entry::OPTIMIZE}, + {"DROP", Entry::DROP}, + {"TRUNCATE", Entry::TRUNCATE}, + {"CHANGE_INDEX", Entry::CHANGE_INDEX}, + {"BULK_INSERT", Entry::BULK_INSERT} + }; + + const uchar *new_line = buf; + const uchar *token_start = buf; + unsigned token_num = TOKEN_FIRST; + + error_flag = false; + + std::unique_ptr entry(new Entry()); + + for (const uchar *ptr = buf; ptr < buf + buf_size; ++ptr) { + + if (*ptr != token_delimiter && *ptr != line_delimiter) + continue; + + if (token_start != ptr) { + std::string token(token_start, ptr); + + if (token_num == TOKEN_TYPE) { + const auto type_it = str_to_type.find(token); + if (type_it == str_to_type.end()) { + error_flag = true; + goto exit; + } + entry->type = type_it->second; + } + else if (token_num == TOKEN_PARTITIONED) { + entry->partitioned = token[0] - '0'; + } + else if (token_num == TOKEN_NEW_PARTITIONED) { + entry->new_partitioned = token[0] - '0'; + } + else if (token_num <= TOKEN_LAST) { + DBUG_ASSERT(token_num != TOKEN_TYPE); + DBUG_ASSERT(token_num != TOKEN_PARTITIONED); + DBUG_ASSERT(token_num != TOKEN_NEW_PARTITIONED); + reinterpret_cast + (reinterpret_cast(entry.get()) + string_offsets[token_num])-> + assign(std::move(token)); + } + else { + error_flag = true; + goto exit; + } + } + token_start = ptr + 1; + + if (*ptr == line_delimiter) { + if (token_num < TOKEN_MANDATORY) { + error_flag = true; + goto exit; + } + if (!store_entry_func(std::move(entry))) { + error_flag = true; + goto exit; + } + entry.reset(new Entry()); + token_num = TOKEN_FIRST; + new_line = ptr + 1; + } else + ++token_num; + } + +exit: + return new_line - buf; +} + +bool parse(const char *file_path, store_entry_func_t store_entry_func) { + DBUG_ASSERT(file_path); + DBUG_ASSERT(store_entry_func); + File file= -1; + bool result = true; + uchar buf[1024]; + size_t bytes_read = 0; + size_t buf_read_offset = 0; + + if ((file= my_open(file_path, O_RDONLY | O_SHARE | O_NOFOLLOW | O_CLOEXEC, + MYF(MY_WME))) < 0) { + msg("DDL log file %s open failed: %d", file_path, my_errno); + result = false; + goto exit; + } + + while((bytes_read = my_read( + file, &buf[buf_read_offset], sizeof(buf) - buf_read_offset, MY_WME)) > 0) { + if (bytes_read == size_t(-1)) { + msg("DDL log file %s read error: %d", file_path, my_errno); + result = false; + break; + } + bytes_read += buf_read_offset; + bool parse_error_flag = false; + size_t bytes_parsed = parse( + buf, bytes_read, parse_error_flag, store_entry_func); + if (parse_error_flag) { + result = false; + break; + } + size_t rest_size = bytes_read - bytes_parsed; + if (rest_size) + memcpy(buf, buf + bytes_parsed, rest_size); + buf_read_offset = rest_size; + } + +exit: + if (file >= 0) + my_close(file, MYF(MY_WME)); + return result; +}; + + +static +bool process_database( + const char *datadir_path, + ds_ctxt_t *ds, + const Entry &entry, + std::unordered_set &dropped_databases) { + + if (entry.type == Entry::Type::CREATE || + entry.type == Entry::Type::ALTER) { + std::string opt_file(datadir_path); + opt_file.append("/").append(entry.db).append("/db.opt"); + if (!ds->copy_file(opt_file.c_str(), opt_file.c_str(), 0, true)) { + msg("Failed to re-copy %s.", opt_file.c_str()); + return false; + } + if (entry.type == Entry::Type::CREATE) + dropped_databases.erase(entry.db); + return true; + } + + DBUG_ASSERT(entry.type == Entry::Type::DROP); + + std::string db_path(datadir_path); + db_path.append("/").append(entry.db); + const char *dst_path = convert_dst(db_path.c_str()); + if (!ds_remove(ds, dst_path)) { + dropped_databases.insert(entry.db); + return true; + } + return false; +} + +static +std::unique_ptr> + find_table_files( + const char *dir_path, + const std::string &db, + const std::string &table) { + + std::unique_ptr> + result(new std::vector()); + + std::string prefix = convert_tablename_to_filepath(dir_path, db, table); + foreach_file_in_db_dirs(dir_path, [&](const char *file_name)->bool { + if (!strncmp(file_name, prefix.c_str(), prefix.size())) { + DBUG_ASSERT(strlen(file_name) >= prefix.size()); + if (file_name[prefix.size()] == '.' || + !strncmp(file_name + prefix.size(), "#P#", strlen("#P#"))) + result->push_back(std::string(file_name)); + } + return true; + }); + + return result; +} + +static +bool process_remove( + const char *datadir_path, + ds_ctxt_t *ds, + const Entry &entry, + bool remove_frm) { + + if (check_if_skip_table( + std::string(entry.db).append("/").append(entry.table).c_str())) + return true; + + auto ext_it = engine_exts.find(entry.engine); + if (ext_it == engine_exts.end()) + return true; + + std::string file_preffix = convert_tablename_to_filepath(datadir_path, + entry.db, entry.table); + const char *dst_preffix = convert_dst(file_preffix.c_str()); + + for (const char *ext : ext_it->second) { + std::string old_name(dst_preffix); + if (!entry.partitioned) + old_name.append(ext); + else + old_name.append("#P#*"); + if (ds_remove(ds, old_name.c_str())) { + msg("Failed to remove %s.", old_name.c_str()); + return false; + } + } + + if (remove_frm) { + std::string old_frm_name(dst_preffix); + old_frm_name.append(frm_ext); + if (ds_remove(ds, old_frm_name.c_str())) { + msg("Failed to remove %s.", old_frm_name.c_str()); + return false; + } + } + return true; + +} + +static +bool process_recopy( + const char *datadir_path, + ds_ctxt_t *ds, + const Entry &entry, + const tables_t &tables) { + + if (check_if_skip_table( + std::string(entry.db).append("/").append(entry.table).c_str())) + return true; + + const std::string &new_table_id = + entry.new_id.empty() ? entry.id : entry.new_id; + DBUG_ASSERT(!new_table_id.empty()); + const std::string &new_table = + entry.new_table.empty() ? entry.table : entry.new_table; + DBUG_ASSERT(!new_table.empty()); + const std::string &new_db = + entry.new_db.empty() ? entry.db : entry.new_db; + DBUG_ASSERT(!new_db.empty()); + const std::string &new_engine = + entry.new_engine.empty() ? entry.engine : entry.new_engine; + DBUG_ASSERT(!new_engine.empty()); + + if (entry.type != Entry::Type::BULK_INSERT) { + auto table_it = tables.find(table_key(new_db, new_table)); + if (table_it != tables.end() && + table_it->second == new_table_id) + return true; + } + + if (!entry.new_engine.empty() && + entry.engine != entry.new_engine && + !known_engine(entry.new_engine)) { + return process_remove(datadir_path, ds, entry, false); + } + + if ((entry.partitioned || entry.new_partitioned) && + !process_remove(datadir_path, ds, entry, false)) + return false; + + if (entry.partitioned || entry.new_partitioned) { + auto files = find_table_files(datadir_path, new_db, new_table); + if (!files.get()) + return true; + for (const auto &file : *files) { + const char *dst_path = convert_dst(file.c_str()); + if (!ds->copy_file(file.c_str(), dst_path, 0, true)) { + msg("Failed to re-copy %s.", file.c_str()); + return false; + } + } + return true; + } + + auto ext_it = engine_exts.find(new_engine); + if (ext_it == engine_exts.end()) + return false; + + for (const char *ext : ext_it->second) { + std::string file_name = + convert_tablename_to_filepath(datadir_path, new_db, new_table). + append(ext); + const char *dst_path = convert_dst(file_name.c_str()); + if (file_exists(file_name.c_str()) && + !ds->copy_file(file_name.c_str(), dst_path, 0, true)) { + msg("Failed to re-copy %s.", file_name.c_str()); + return false; + } + } + + std::string frm_file = + convert_tablename_to_filepath(datadir_path, new_db, new_table). + append(frm_ext); + const char *frm_dst_path = convert_dst(frm_file.c_str()); + if (file_exists(frm_file.c_str()) && + !ds->copy_file(frm_file.c_str(), frm_dst_path, 0, true)) { + msg("Failed to re-copy %s.", frm_file.c_str()); + return false; + } + + return true; +} + +static +bool process_rename( + const char *datadir_path, + ds_ctxt_t *ds, + const Entry &entry) { + + if (check_if_skip_table( + std::string(entry.db).append("/").append(entry.table).c_str())) + return true; + + DBUG_ASSERT(entry.db != "partition"); + + auto ext_it = engine_exts.find(entry.engine); + if (ext_it == engine_exts.end()) + return false; + + std::string new_preffix = convert_tablename_to_filepath(datadir_path, + entry.new_db, entry.new_table); + const char *dst_path = convert_dst(new_preffix.c_str()); + + std::string old_preffix = convert_tablename_to_filepath(datadir_path, + entry.db, entry.table); + const char *src_path = convert_dst(old_preffix.c_str()); + + for (const char *ext : ext_it->second) { + std::string old_name(src_path); + old_name.append(ext); + std::string new_name(dst_path); + new_name.append(ext); + if (ds_rename(ds, old_name.c_str(), new_name.c_str())) { + msg("Failed to rename %s to %s.", + old_name.c_str(), new_name.c_str()); + return false; + } + } + + std::string new_frm_file = new_preffix + frm_ext; + const char *new_frm_dst = convert_dst(new_frm_file.c_str()); + if (file_exists(new_frm_file.c_str()) && + !ds->copy_file(new_frm_file.c_str(), new_frm_dst, 0, true)) { + msg("Failed to re-copy %s.", new_frm_file.c_str()); + return false; + } + +// TODO: return this code if .frm is copied not under BLOCK_DDL +/* + std::string old_frm_name(src_path); + old_frm_name.append(frm_ext); + std::string new_frm_name(dst_path); + new_frm_name.append(frm_ext); + if (ds_rename(ds, old_frm_name.c_str(), new_frm_name.c_str())) { + msg("Failed to rename %s to %s.", + old_frm_name.c_str(), new_frm_name.c_str()); + return false; + } +*/ + return true; +} + +bool backup( + const char *datadir_path, + ds_ctxt_t *ds, + const tables_t &tables) { + DBUG_ASSERT(datadir_path); + DBUG_ASSERT(ds); + char ddl_log_path[FN_REFLEN]; + fn_format(ddl_log_path, "ddl", datadir_path, ".log", 0); + std::vector> entries; + + std::unordered_set processed_tables; + std::unordered_set dropped_databases; + + bool parsing_result = + parse(ddl_log_path, [&](std::unique_ptr entry)->bool { + + if (entry->engine == database_keyword) + return process_database(datadir_path, ds, *entry, dropped_databases); + + if (!known_engine(entry->engine) && !known_engine(entry->new_engine)) + return true; + + if (entry->type == Entry::Type::CREATE || + (entry->type == Entry::Type::ALTER && + !entry->new_engine.empty() && + entry->engine != entry->new_engine)) { + if (!process_recopy(datadir_path, ds, *entry, tables)) + return false; + processed_tables.insert(table_key(entry->db, entry->table)); + if (entry->type == Entry::Type::ALTER) + processed_tables.insert(table_key(entry->new_db, entry->new_table)); + return true; + } + + if (entry->type == Entry::Type::DROP) { + if (!process_remove(datadir_path, ds, *entry, true)) + return false; + processed_tables.insert(table_key(entry->db, entry->table)); + return true; + } + if (entry->type == Entry::Type::RENAME) { + if (entry->partitioned) { + if (!process_remove(datadir_path, ds, *entry, true)) + return false; + Entry recopy_entry { + entry->type, + {}, + entry->new_engine.empty() ? entry->engine : entry->new_engine, + true, + entry->new_db, + entry->new_table, + entry->new_id, + {}, true, {}, {}, {} + }; + if (!process_recopy(datadir_path, ds, recopy_entry, tables)) + return false; + } + else if (!process_rename(datadir_path, ds, *entry)) + return false; + processed_tables.insert(table_key(entry->db, entry->table)); + processed_tables.insert(table_key(entry->new_db, entry->new_table)); + return true; + } + + entries.push_back(std::move(entry)); + return true; + + }); + + if (!parsing_result) + return false; + + + while (!entries.empty()) { + auto entry = std::move(entries.back()); + entries.pop_back(); + auto tk = table_key( + entry->new_db.empty() ? entry->db : entry->new_db, + entry->new_table.empty() ? entry->table : entry->new_table); + if (dropped_databases.count(entry->db) || + dropped_databases.count(entry->new_db)) + continue; + if (processed_tables.count(tk)) + continue; + processed_tables.insert(std::move(tk)); + if (!process_recopy(datadir_path, ds, *entry, tables)) + return false; + } + + return true; +} + +} // namespace ddl_log diff --git a/extra/mariabackup/ddl_log.h b/extra/mariabackup/ddl_log.h new file mode 100644 index 00000000..5cac3e5d --- /dev/null +++ b/extra/mariabackup/ddl_log.h @@ -0,0 +1,15 @@ +#pragma once +#include "my_global.h" +#include "datasink.h" +#include "aria_backup_client.h" +#include +#include +#include +#include + +namespace ddl_log { + +typedef std::unordered_map tables_t; +bool backup(const char *datadir_path, ds_ctxt_t *ds, const tables_t &tables); + +} // namespace ddl_log diff --git a/extra/mariabackup/ds_buffer.cc b/extra/mariabackup/ds_buffer.cc index d6a42095..bc1d4663 100644 --- a/extra/mariabackup/ds_buffer.cc +++ b/extra/mariabackup/ds_buffer.cc @@ -44,7 +44,7 @@ typedef struct { static ds_ctxt_t *buffer_init(const char *root); static ds_file_t *buffer_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int buffer_write(ds_file_t *file, const uchar *buf, size_t len); static int buffer_close(ds_file_t *file); static void buffer_deinit(ds_ctxt_t *ctxt); @@ -53,8 +53,11 @@ datasink_t datasink_buffer = { &buffer_init, &buffer_open, &buffer_write, + nullptr, &buffer_close, &dummy_remove, + nullptr, + nullptr, &buffer_deinit }; @@ -84,8 +87,10 @@ buffer_init(const char *root) } static ds_file_t * -buffer_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) +buffer_open(ds_ctxt_t *ctxt, const char *path, + const MY_STAT *mystat, bool rewrite) { + DBUG_ASSERT(rewrite == false); ds_buffer_ctxt_t *buffer_ctxt; ds_ctxt_t *pipe_ctxt; ds_file_t *dst_file; diff --git a/extra/mariabackup/ds_compress.cc b/extra/mariabackup/ds_compress.cc index f7a9b7a1..0cb52e97 100644 --- a/extra/mariabackup/ds_compress.cc +++ b/extra/mariabackup/ds_compress.cc @@ -65,7 +65,7 @@ extern ulonglong xtrabackup_compress_chunk_size; static ds_ctxt_t *compress_init(const char *root); static ds_file_t *compress_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int compress_write(ds_file_t *file, const uchar *buf, size_t len); static int compress_close(ds_file_t *file); static void compress_deinit(ds_ctxt_t *ctxt); @@ -74,8 +74,11 @@ datasink_t datasink_compress = { &compress_init, &compress_open, &compress_write, + nullptr, &compress_close, &dummy_remove, + nullptr, + nullptr, &compress_deinit }; @@ -116,8 +119,10 @@ compress_init(const char *root) static ds_file_t * -compress_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) +compress_open(ds_ctxt_t *ctxt, const char *path, + const MY_STAT *mystat, bool rewrite) { + DBUG_ASSERT(rewrite == false); ds_compress_ctxt_t *comp_ctxt; ds_ctxt_t *dest_ctxt; ds_file_t *dest_file; diff --git a/extra/mariabackup/ds_local.cc b/extra/mariabackup/ds_local.cc index f86612b9..ff2021fc 100644 --- a/extra/mariabackup/ds_local.cc +++ b/extra/mariabackup/ds_local.cc @@ -42,8 +42,9 @@ typedef struct { static ds_ctxt_t *local_init(const char *root); static ds_file_t *local_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int local_write(ds_file_t *file, const uchar *buf, size_t len); +static int local_seek_set(ds_file_t *file, my_off_t offset); static int local_close(ds_file_t *file); static void local_deinit(ds_ctxt_t *ctxt); @@ -52,13 +53,20 @@ static int local_remove(const char *path) return unlink(path); } +static int local_rename( + ds_ctxt_t *ctxt, const char *old_path, const char *new_path); +static int local_mremove(ds_ctxt_t *ctxt, const char *path); + extern "C" { datasink_t datasink_local = { &local_init, &local_open, &local_write, + &local_seek_set, &local_close, &local_remove, + &local_rename, + &local_mremove, &local_deinit }; } @@ -89,7 +97,7 @@ local_init(const char *root) static ds_file_t * local_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat __attribute__((unused))) + const MY_STAT *mystat __attribute__((unused)), bool rewrite) { char fullpath[FN_REFLEN]; char dirpath[FN_REFLEN]; @@ -111,8 +119,10 @@ local_open(ds_ctxt_t *ctxt, const char *path, return NULL; } - fd = my_create(fullpath, 0, O_WRONLY | O_BINARY | O_EXCL | O_NOFOLLOW, - MYF(MY_WME)); + // TODO: check in Windows and set the corresponding flags on fail + fd = my_create(fullpath, 0, + O_WRONLY | O_BINARY | (rewrite ? O_TRUNC : O_EXCL) | O_NOFOLLOW, + MYF(MY_WME)); if (fd < 0) { return NULL; } @@ -194,8 +204,8 @@ static void init_ibd_data(ds_local_file_t *local_file, const uchar *buf, size_t return; } - auto flags = mach_read_from_4(&buf[FIL_PAGE_DATA + FSP_SPACE_FLAGS]); - auto ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags); + uint32_t flags = mach_read_from_4(&buf[FIL_PAGE_DATA + FSP_SPACE_FLAGS]); + uint32_t ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags); local_file->pagesize= ssize == 0 ? UNIV_PAGE_SIZE_ORIG : ((UNIV_ZIP_SIZE_MIN >> 1) << ssize); local_file->compressed = fil_space_t::full_crc32(flags) ? fil_space_t::is_compressed(flags) @@ -239,6 +249,15 @@ local_write(ds_file_t *file, const uchar *buf, size_t len) return 1; } +static +int +local_seek_set(ds_file_t *file, my_off_t offset) { + ds_local_file_t *local_file= (ds_local_file_t *)file->ptr; + if (my_seek(local_file->fd, offset, SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR) + return 1; + return 0; +} + /* Set EOF at file's current position.*/ static int set_eof(File fd) { @@ -276,3 +295,77 @@ local_deinit(ds_ctxt_t *ctxt) my_free(ctxt->root); my_free(ctxt); } + + +static int local_rename( + ds_ctxt_t *ctxt, const char *old_path, const char *new_path) { + char full_old_path[FN_REFLEN]; + char full_new_path[FN_REFLEN]; + fn_format(full_old_path, old_path, ctxt->root, "", MYF(MY_RELATIVE_PATH)); + fn_format(full_new_path, new_path, ctxt->root, "", MYF(MY_RELATIVE_PATH)); + // Ignore errors as .frm files can me copied separately. + // TODO: return error processing here after the corresponding changes in + // xtrabackup.cc + (void)my_rename(full_old_path, full_new_path, MYF(0)); +// if (my_rename(full_old_path, full_new_path, MYF(0))) { +// msg("Failed to rename file %s to %s", old_path, new_path); +// return 1; +// } + return 0; +} + +// It's ok if destination does not contain the file or folder +static int local_mremove(ds_ctxt_t *ctxt, const char *path) { + char full_path[FN_REFLEN]; + fn_format(full_path, path, ctxt->root, "", MYF(MY_RELATIVE_PATH)); + size_t full_path_len = strlen(full_path); + if (full_path[full_path_len - 1] == '*') { + full_path[full_path_len - 1] = '\0'; + char *preffix = strrchr(full_path, '/'); + const char *full_path_dir = full_path; + size_t preffix_len; + if (preffix) { + preffix_len = (full_path_len - 1) - (preffix - full_path); + *(preffix++) = '\0'; + } + else { + preffix = full_path; + preffix_len = full_path_len - 1; + full_path_dir= IF_WIN(".\\", "./"); + } + if (!preffix_len) + return 0; + MY_DIR *dir= my_dir(full_path_dir, 0); + if (!dir) + return 0; + for (size_t i = 0; i < dir->number_of_files; ++i) { + char full_fpath[FN_REFLEN]; + if (strncmp(dir->dir_entry[i].name, preffix, preffix_len)) + continue; + fn_format(full_fpath, dir->dir_entry[i].name, + full_path_dir, "", MYF(MY_RELATIVE_PATH)); + (void)my_delete(full_fpath, MYF(0)); + } + my_dirend(dir); + } + else { + MY_STAT stat; + if (!my_stat(full_path, &stat, MYF(0))) + return 0; + MY_DIR *dir= my_dir(full_path, 0); + if (!dir) { + // TODO: check for error here if necessary + (void)my_delete(full_path, MYF(0)); + return 0; + } + for (size_t i = 0; i < dir->number_of_files; ++i) { + char full_fpath[FN_REFLEN]; + fn_format(full_fpath, dir->dir_entry[i].name, + full_path, "", MYF(MY_RELATIVE_PATH)); + (void)my_delete(full_fpath, MYF(0)); + } + my_dirend(dir); + (void)my_rmtree(full_path, MYF(0)); + } + return 0; +} diff --git a/extra/mariabackup/ds_stdout.cc b/extra/mariabackup/ds_stdout.cc index a9639ff7..3fc0873b 100644 --- a/extra/mariabackup/ds_stdout.cc +++ b/extra/mariabackup/ds_stdout.cc @@ -30,7 +30,7 @@ typedef struct { static ds_ctxt_t *stdout_init(const char *root); static ds_file_t *stdout_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int stdout_write(ds_file_t *file, const uchar *buf, size_t len); static int stdout_close(ds_file_t *file); static void stdout_deinit(ds_ctxt_t *ctxt); @@ -39,8 +39,11 @@ datasink_t datasink_stdout = { &stdout_init, &stdout_open, &stdout_write, + nullptr, &stdout_close, &dummy_remove, + nullptr, + nullptr, &stdout_deinit }; @@ -61,8 +64,9 @@ static ds_file_t * stdout_open(ds_ctxt_t *ctxt __attribute__((unused)), const char *path __attribute__((unused)), - MY_STAT *mystat __attribute__((unused))) + const MY_STAT *mystat __attribute__((unused)), bool rewrite) { + DBUG_ASSERT(rewrite == false); ds_stdout_file_t *stdout_file; ds_file_t *file; size_t pathlen; diff --git a/extra/mariabackup/ds_tmpfile.cc b/extra/mariabackup/ds_tmpfile.cc index 80b9d3bb..6bafee25 100644 --- a/extra/mariabackup/ds_tmpfile.cc +++ b/extra/mariabackup/ds_tmpfile.cc @@ -41,7 +41,7 @@ typedef struct { static ds_ctxt_t *tmpfile_init(const char *root); static ds_file_t *tmpfile_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int tmpfile_write(ds_file_t *file, const uchar *buf, size_t len); static int tmpfile_close(ds_file_t *file); static void tmpfile_deinit(ds_ctxt_t *ctxt); @@ -50,8 +50,11 @@ datasink_t datasink_tmpfile = { &tmpfile_init, &tmpfile_open, &tmpfile_write, + nullptr, &tmpfile_close, &dummy_remove, + nullptr, + nullptr, &tmpfile_deinit }; @@ -80,8 +83,9 @@ tmpfile_init(const char *root) static ds_file_t * tmpfile_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat) + const MY_STAT *mystat, bool rewrite) { + DBUG_ASSERT(rewrite == false); ds_tmpfile_ctxt_t *tmpfile_ctxt; char tmp_path[FN_REFLEN]; ds_tmp_file_t *tmp_file; diff --git a/extra/mariabackup/ds_xbstream.cc b/extra/mariabackup/ds_xbstream.cc index 3bf8bd08..96e0cf7a 100644 --- a/extra/mariabackup/ds_xbstream.cc +++ b/extra/mariabackup/ds_xbstream.cc @@ -40,24 +40,31 @@ General streaming interface */ static ds_ctxt_t *xbstream_init(const char *root); static ds_file_t *xbstream_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int xbstream_write(ds_file_t *file, const uchar *buf, size_t len); +static int xbstream_seek_set(ds_file_t *file, my_off_t offset); static int xbstream_close(ds_file_t *file); static void xbstream_deinit(ds_ctxt_t *ctxt); +static int xbstream_rename( + ds_ctxt_t *ctxt, const char *old_path, const char *new_path); +static int xbstream_mremove(ds_ctxt_t *ctxt, const char *path); + datasink_t datasink_xbstream = { &xbstream_init, &xbstream_open, &xbstream_write, + &xbstream_seek_set, &xbstream_close, &dummy_remove, + &xbstream_rename, + &xbstream_mremove, &xbstream_deinit }; static ssize_t -my_xbstream_write_callback(xb_wstream_file_t *f __attribute__((unused)), - void *userdata, const void *buf, size_t len) +my_xbstream_write_callback(void *userdata, const void *buf, size_t len) { ds_stream_ctxt_t *stream_ctxt; @@ -89,7 +96,7 @@ xbstream_init(const char *root __attribute__((unused))) goto err; } - xbstream = xb_stream_write_new(); + xbstream = xb_stream_write_new(my_xbstream_write_callback, stream_ctxt); if (xbstream == NULL) { msg("xb_stream_write_new() failed."); goto err; @@ -108,7 +115,8 @@ err: static ds_file_t * -xbstream_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) +xbstream_open(ds_ctxt_t *ctxt, const char *path, + const MY_STAT *mystat, bool rewrite) { ds_file_t *file; ds_stream_file_t *stream_file; @@ -144,9 +152,7 @@ xbstream_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) xbstream = stream_ctxt->xbstream; - xbstream_file = xb_stream_write_open(xbstream, path, mystat, - stream_ctxt, - my_xbstream_write_callback); + xbstream_file = xb_stream_write_open(xbstream, path, mystat, rewrite); if (xbstream_file == NULL) { msg("xb_stream_write_open() failed."); @@ -190,6 +196,45 @@ xbstream_write(ds_file_t *file, const uchar *buf, size_t len) return 0; } +static +int +xbstream_seek_set(ds_file_t *file, my_off_t offset) +{ + ds_stream_file_t *stream_file; + xb_wstream_file_t *xbstream_file; + + + stream_file = (ds_stream_file_t *) file->ptr; + + xbstream_file = stream_file->xbstream_file; + + if (xb_stream_write_seek_set(xbstream_file, offset)) { + msg("xb_stream_write_seek_set() failed."); + return 1; + } + + return 0; +} + +static +int +xbstream_mremove(ds_ctxt_t *ctxt, const char *path) { + ds_stream_ctxt_t *stream_ctxt = + reinterpret_cast(ctxt->ptr); + xb_wstream_t *xbstream = stream_ctxt->xbstream; + return xb_stream_write_remove(xbstream, path); +} + +static +int +xbstream_rename( + ds_ctxt_t *ctxt, const char *old_path, const char *new_path) { + ds_stream_ctxt_t *stream_ctxt = + reinterpret_cast(ctxt->ptr); + xb_wstream_t *xbstream = stream_ctxt->xbstream; + return xb_stream_write_rename(xbstream, old_path, new_path); +} + static int xbstream_close(ds_file_t *file) diff --git a/extra/mariabackup/encryption_plugin.cc b/extra/mariabackup/encryption_plugin.cc new file mode 100644 index 00000000..ab0c5140 --- /dev/null +++ b/extra/mariabackup/encryption_plugin.cc @@ -0,0 +1,249 @@ +/* Copyright (c) 2017, MariaDB Corporation. + + 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; version 2 of the License. + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +extern struct st_maria_plugin *mysql_optional_plugins[]; +extern struct st_maria_plugin *mysql_mandatory_plugins[]; +static void encryption_plugin_init(int argc, char **argv); + +extern char *xb_plugin_load; +extern char *xb_plugin_dir; + +const int PLUGIN_MAX_ARGS = 1024; +std::vector backup_plugins_args; + +const char *QUERY_PLUGIN = +"SELECT plugin_name, plugin_library, @@plugin_dir" +" FROM information_schema.plugins WHERE plugin_type='ENCRYPTION'" +" OR (plugin_type = 'DAEMON' AND plugin_name LIKE 'provider\\_%')" +" AND plugin_status='ACTIVE'"; + +std::string encryption_plugin_config; + +static void add_to_plugin_load_list(const char *plugin_def) +{ + opt_plugin_load_list_ptr->push_back(new i_string(plugin_def)); +} + +static char XTRABACKUP_EXE[] = "xtrabackup"; + +/* + Read "plugin-load" value (encryption plugin) from backup-my.cnf during + prepare phase. + The value is stored during backup phase. +*/ +static std::string get_encryption_plugin_from_cnf() +{ + FILE *f = fopen("backup-my.cnf", "r"); + if (!f) + { + die("Can't open backup-my.cnf for reading"); + } + char line[512]; + std::string plugin_load; + while (fgets(line, sizeof(line), f)) + { + if (strncmp(line, "plugin_load=", 12) == 0) + { + plugin_load = line + 12; + // remote \n at the end of string + plugin_load.resize(plugin_load.size() - 1); + } + + if (strncmp(line, "innodb_encrypt_tables=", 22) == 0) + { + if (!strncmp(line + 22, "ON", 2) || + !strncmp(line + 22, "1", 1)) + srv_encrypt_tables= 1; + else if (!strncmp(line + 22, "FORCE", 5) || + !strncmp(line + 22, "2", 1)) + srv_encrypt_tables= 2; + } + } + fclose(f); + return plugin_load; +} + + +void encryption_plugin_backup_init(MYSQL *mysql) +{ + MYSQL_RES *result; + MYSQL_ROW row; + std::ostringstream oss; + char *argv[PLUGIN_MAX_ARGS]; + char show_query[1024] = ""; + std::string plugin_load; + int argc; + + result = xb_mysql_query(mysql, QUERY_PLUGIN, true, true); + while ((row = mysql_fetch_row(result))) + { + char *name= row[0]; + char *library= row[1]; + char *dir= row[2]; + + if (!plugin_load.length()) + { +#ifdef _WIN32 + for (char *p = dir; *p; p++) + if (*p == '\\') *p = '/'; +#endif + strncpy(opt_plugin_dir, dir, FN_REFLEN - 1); + opt_plugin_dir[FN_REFLEN - 1] = '\0'; + oss << "plugin_dir=" << '"' << dir << '"' << std::endl; + } + + plugin_load += std::string(";") + name; + + if (library) + { + /* Remove shared library suffixes, in case we'll prepare on different OS.*/ + const char *extensions[] = { ".dll", ".so", 0 }; + for (size_t i = 0; extensions[i]; i++) + { + const char *ext = extensions[i]; + if (ends_with(library, ext)) + library[strlen(library) - strlen(ext)] = 0; + } + plugin_load += std::string("=") + library; + } + + if (strncmp(name, "provider_", 9) == 0) + continue; + + /* Read plugin variables. */ + snprintf(show_query, sizeof(show_query), "SHOW variables like '%s_%%'", name); + } + mysql_free_result(result); + if (!plugin_load.length()) + return; + + oss << "plugin_load=" << plugin_load.c_str() + 1 << std::endl; + + /* Required to load the plugin later.*/ + add_to_plugin_load_list(plugin_load.c_str() + 1); + + + if (*show_query) + { + result = xb_mysql_query(mysql, show_query, true, true); + while ((row = mysql_fetch_row(result))) + { + std::string arg("--"); + arg += row[0]; + arg += "="; + arg += row[1]; + backup_plugins_args.push_back(arg); + oss << row[0] << "=" << row[1] << std::endl; + } + + mysql_free_result(result); + + /* Check whether to encrypt logs. */ + result = xb_mysql_query(mysql, "select @@innodb_encrypt_log", true, true); + row = mysql_fetch_row(result); + srv_encrypt_log = (row != 0 && row[0][0] == '1'); + oss << "innodb_encrypt_log=" << row[0] << std::endl; + + mysql_free_result(result); + } + + result = xb_mysql_query(mysql, "select @@innodb_encrypt_tables", true, true); + row = mysql_fetch_row(result); + if (!row); + else if (const char *r= row[0]) + { + if (!strcmp(r, "ON")) srv_encrypt_tables= 1; + else if (!strcmp(r, "FORCE")) srv_encrypt_tables= 2; + oss << "innodb_encrypt_tables=" << r << std::endl; + } + + mysql_free_result(result); + encryption_plugin_config = oss.str(); + + argc = 0; + argv[argc++] = XTRABACKUP_EXE; + for(size_t i = 0; i < backup_plugins_args.size(); i++) + { + argv[argc++] = (char *)backup_plugins_args[i].c_str(); + if (argc == PLUGIN_MAX_ARGS - 2) + break; + } + argv[argc] = 0; + + encryption_plugin_init(argc, argv); +} + +const char *encryption_plugin_get_config() +{ + return encryption_plugin_config.c_str(); +} + +extern int finalize_encryption_plugin(st_plugin_int *plugin); + + +void encryption_plugin_prepare_init(int argc, char **argv) +{ + std::string plugin_load= get_encryption_plugin_from_cnf(); + if (plugin_load.size()) + { + msg("Loading encryption plugin from %s", plugin_load.c_str()); + } + else + { + finalize_encryption_plugin(0); + return; + } + + add_to_plugin_load_list(plugin_load.c_str()); + + if (xb_plugin_dir) + { + strncpy(opt_plugin_dir, xb_plugin_dir, FN_REFLEN - 1); + opt_plugin_dir[FN_REFLEN - 1] = '\0'; + } + + char **new_argv = new char *[argc + 2]; + new_argv[0] = XTRABACKUP_EXE; + memcpy(&new_argv[1], argv, argc*sizeof(char *)); + + encryption_plugin_init(argc+1, new_argv); + + delete[] new_argv; +} + +static void encryption_plugin_init(int argc, char **argv) +{ + /* Patch optional and mandatory plugins, we only need to load the one in xb_plugin_load. */ + mysql_optional_plugins[0] = mysql_mandatory_plugins[0] = 0; + plugin_maturity = MariaDB_PLUGIN_MATURITY_UNKNOWN; /* mariabackup accepts all plugins */ + msg("Loading encryption plugin"); + for (int i= 1; i < argc; i++) + msg("\t Encryption plugin parameter : '%s'", argv[i]); + plugin_init(&argc, argv, PLUGIN_INIT_SKIP_PLUGIN_TABLE); +} + diff --git a/extra/mariabackup/encryption_plugin.h b/extra/mariabackup/encryption_plugin.h new file mode 100644 index 00000000..16d74790 --- /dev/null +++ b/extra/mariabackup/encryption_plugin.h @@ -0,0 +1,7 @@ +#include +#include +extern void encryption_plugin_backup_init(MYSQL *mysql); +extern const char* encryption_plugin_get_config(); +extern void encryption_plugin_prepare_init(int argc, char **argv); + +//extern void encryption_plugin_init(int argc, char **argv); diff --git a/extra/mariabackup/fil_cur.cc b/extra/mariabackup/fil_cur.cc index 4f5d67a5..be871e4a 100644 --- a/extra/mariabackup/fil_cur.cc +++ b/extra/mariabackup/fil_cur.cc @@ -199,14 +199,6 @@ xb_fil_cur_open( return(XB_FIL_CUR_SKIP); } -#ifdef HAVE_FCNTL_DIRECT - if (srv_file_flush_method == SRV_O_DIRECT - || srv_file_flush_method == SRV_O_DIRECT_NO_FSYNC) { - - os_file_set_nocache(cursor->file, node->name, "OPEN"); - } -#endif - posix_fadvise(cursor->file, 0, 0, POSIX_FADV_SEQUENTIAL); cursor->page_size = node->space->physical_size(); @@ -239,12 +231,14 @@ xb_fil_cur_open( / cursor->page_size); cursor->read_filter = read_filter; - cursor->read_filter->init(&cursor->read_filter_ctxt, cursor, - node->space->id); + cursor->read_filter->init(&cursor->read_filter_ctxt, cursor); return(XB_FIL_CUR_SUCCESS); } +/* Stack usage 131224 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + static bool page_is_corrupted(const byte *page, ulint page_no, const xb_fil_cur_t *cursor, const fil_space_t *space) @@ -348,6 +342,7 @@ static bool page_is_corrupted(const byte *page, ulint page_no, return buf_page_is_corrupted(true, page, space->flags); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** Reads and verifies the next block of pages from the source file. Positions the cursor after the last read non-corrupted page. @@ -510,10 +505,6 @@ xb_fil_cur_close( /*=============*/ xb_fil_cur_t *cursor) /*!< in/out: source file cursor */ { - if (cursor->read_filter) { - cursor->read_filter->deinit(&cursor->read_filter_ctxt); - } - aligned_free(cursor->buf); cursor->buf = NULL; diff --git a/extra/mariabackup/fil_cur.h b/extra/mariabackup/fil_cur.h index b7812f65..46c8cb03 100644 --- a/extra/mariabackup/fil_cur.h +++ b/extra/mariabackup/fil_cur.h @@ -27,6 +27,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA #include #include "read_filt.h" +#include "mtr0types.h" #include "srv0start.h" #include "srv0srv.h" #include "xtrabackup.h" diff --git a/extra/mariabackup/innobackupex.cc b/extra/mariabackup/innobackupex.cc index b925b415..2de57a14 100644 --- a/extra/mariabackup/innobackupex.cc +++ b/extra/mariabackup/innobackupex.cc @@ -78,10 +78,8 @@ my_bool opt_ibx_galera_info = FALSE; my_bool opt_ibx_slave_info = FALSE; my_bool opt_ibx_no_lock = FALSE; my_bool opt_ibx_safe_slave_backup = FALSE; -my_bool opt_ibx_rsync = FALSE; my_bool opt_ibx_force_non_empty_dirs = FALSE; my_bool opt_ibx_noversioncheck = FALSE; -my_bool opt_ibx_no_backup_locks = FALSE; my_bool opt_ibx_decompress = FALSE; char *opt_ibx_incremental_history_name = NULL; @@ -268,8 +266,10 @@ static struct my_option ibx_long_options[] = (uchar *) &opt_ibx_incremental, (uchar *) &opt_ibx_incremental, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"no-lock", OPT_NO_LOCK, "Use this option to disable table lock " - "with \"FLUSH TABLES WITH READ LOCK\". Use it only if ALL your " + {"no-lock", OPT_NO_LOCK, "This option should not be used as " + "mariadb-backup now is using BACKUP LOCKS, which minimizes the " + "lock time. ALTER TABLE can run in parallel with BACKUP LOCKS." + "Use the --no-lock option it only if ALL your " "tables are InnoDB and you DO NOT CARE about the binary log " "position of the backup. This option shouldn't be used if there " "are any DDL statements being executed or if any updates are " @@ -297,15 +297,6 @@ static struct my_option ibx_long_options[] = (uchar *) &opt_ibx_safe_slave_backup, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"rsync", OPT_RSYNC, "Uses the rsync utility to optimize local file " - "transfers. When this option is specified, innobackupex uses rsync " - "to copy all non-InnoDB files instead of spawning a separate cp for " - "each file, which can be much faster for servers with a large number " - "of databases or tables. This option cannot be used together with " - "--stream.", - (uchar *) &opt_ibx_rsync, (uchar *) &opt_ibx_rsync, - 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"force-non-empty-directories", OPT_FORCE_NON_EMPTY_DIRS, "This " "option, when specified, makes --copy-back or --move-back transfer " "files to non-empty directories. Note that no existing files will be " @@ -330,13 +321,9 @@ static struct my_option ibx_long_options[] = (uchar *) &opt_ibx_noversioncheck, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"no-backup-locks", OPT_NO_BACKUP_LOCKS, "This option controls if " - "backup locks should be used instead of FLUSH TABLES WITH READ LOCK " - "on the backup stage. The option has no effect when backup locks are " - "not supported by the server. This option is enabled by default, " - "disable with --no-backup-locks.", - (uchar *) &opt_ibx_no_backup_locks, - (uchar *) &opt_ibx_no_backup_locks, + {"no-backup-locks", OPT_NO_BACKUP_LOCKS, + "Old disabled option which has no effect anymore.", + (uchar *) 0, (uchar*) 0, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"decompress", OPT_DECOMPRESS, "Decompresses all files with the .qp " @@ -402,11 +389,10 @@ static struct my_option ibx_long_options[] = REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-query-type", OPT_LOCK_WAIT_QUERY_TYPE, - "This option specifies which types of queries are allowed to complete " - "before innobackupex will issue the global lock. Default is all.", - (uchar*) &opt_ibx_lock_wait_query_type, - (uchar*) &opt_ibx_lock_wait_query_type, &query_type_typelib, - GET_ENUM, REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, 0}, + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, &query_type_typelib, GET_ENUM, + REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, 0}, {"kill-long-query-type", OPT_KILL_LONG_QUERY_TYPE, "This option specifies which types of queries should be killed to " @@ -447,32 +433,32 @@ static struct my_option ibx_long_options[] = REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"kill-long-queries-timeout", OPT_KILL_LONG_QUERIES_TIMEOUT, - "This option specifies the number of seconds innobackupex waits " - "between starting FLUSH TABLES WITH READ LOCK and killing those " - "queries that block it. Default is 0 seconds, which means " - "innobackupex will not attempt to kill any queries.", - (uchar*) &opt_ibx_kill_long_queries_timeout, - (uchar*) &opt_ibx_kill_long_queries_timeout, 0, GET_UINT, + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, - "This option specifies time in seconds that innobackupex should wait " - "for queries that would block FTWRL before running it. If there are " - "still such queries when the timeout expires, innobackupex terminates " - "with an error. Default is 0, in which case innobackupex does not " - "wait for queries to complete and starts FTWRL immediately.", - (uchar*) &opt_ibx_lock_wait_timeout, - (uchar*) &opt_ibx_lock_wait_timeout, 0, GET_UINT, + "Alias for startup-wait-timeout", + (uchar*) &opt_ibx_lock_wait_timeout, + (uchar*) &opt_ibx_lock_wait_timeout, 0, GET_UINT, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"startup-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, + "This option specifies time in seconds that mariadb-backup should wait for " + "BACKUP STAGE START to complete. BACKUP STAGE START has to wait until all " + "currently running queries using explicite LOCK TABLES has ended. " + "If there are still such queries when the timeout expires, mariadb-backup " + "terminates with an error. Default is 0, in which case mariadb-backup waits " + "indefinitely for BACKUP STAGE START to finish", + (uchar*) &opt_ibx_lock_wait_timeout, + (uchar*) &opt_ibx_lock_wait_timeout, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-threshold", OPT_LOCK_WAIT_THRESHOLD, - "This option specifies the query run time threshold which is used by " - "innobackupex to detect long-running queries with a non-zero value " - "of --ftwrl-wait-timeout. FTWRL is not started until such " - "long-running queries exist. This option has no effect if " - "--ftwrl-wait-timeout is 0. Default value is 60 seconds.", - (uchar*) &opt_ibx_lock_wait_threshold, - (uchar*) &opt_ibx_lock_wait_threshold, 0, GET_UINT, + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, 0, GET_UINT, REQUIRED_ARG, 60, 0, 0, 0, 0, 0}, {"safe-slave-backup-timeout", OPT_SAFE_SLAVE_BACKUP_TIMEOUT, @@ -864,10 +850,8 @@ ibx_init() opt_slave_info = opt_ibx_slave_info; opt_no_lock = opt_ibx_no_lock; opt_safe_slave_backup = opt_ibx_safe_slave_backup; - opt_rsync = opt_ibx_rsync; opt_force_non_empty_dirs = opt_ibx_force_non_empty_dirs; opt_noversioncheck = opt_ibx_noversioncheck; - opt_no_backup_locks = opt_ibx_no_backup_locks; opt_decompress = opt_ibx_decompress; opt_incremental_history_name = opt_ibx_incremental_history_name; diff --git a/extra/mariabackup/read_filt.cc b/extra/mariabackup/read_filt.cc index 58920055..c7c0aa55 100644 --- a/extra/mariabackup/read_filt.cc +++ b/extra/mariabackup/read_filt.cc @@ -32,29 +32,13 @@ Perform read filter context initialization that is common to all read filters. */ static void -common_init( -/*========*/ +rf_pass_through_init( xb_read_filt_ctxt_t* ctxt, /*!offset = 0; ctxt->data_file_size = cursor->statinfo.st_size; ctxt->buffer_capacity = cursor->buf_size; - ctxt->page_size = cursor->page_size; -} - -/****************************************************************//** -Initialize the pass-through read filter. */ -static -void -rf_pass_through_init( -/*=================*/ - xb_read_filt_ctxt_t* ctxt, /*!offset; *read_batch_len = ctxt->data_file_size - ctxt->offset; - if (*read_batch_len > (ib_int64_t)ctxt->buffer_capacity) { - *read_batch_len = ctxt->buffer_capacity; - } - - ctxt->offset += *read_batch_len; -} - -/****************************************************************//** -Deinitialize the pass-through read filter. */ -static -void -rf_pass_through_deinit( -/*===================*/ - xb_read_filt_ctxt_t* ctxt __attribute__((unused))) - /*!bitmap_range = xb_page_bitmap_range_init(changed_page_bitmap, - space_id); - ctxt->filter_batch_end = 0; -} - -/****************************************************************//** -Get the next batch of pages for the bitmap read filter. */ -static -void -rf_bitmap_get_next_batch( -/*=====================*/ - xb_read_filt_ctxt_t* ctxt, /*!page_size; - - start_page_id = (ulint)(ctxt->offset / page_size); - - xb_a (ctxt->offset % page_size == 0); - - if (start_page_id == ctxt->filter_batch_end) { - - /* Used up all the previous bitmap range, get some more */ - ulint next_page_id; - - /* Find the next changed page using the bitmap */ - next_page_id = xb_page_bitmap_range_get_next_bit - (ctxt->bitmap_range, TRUE); - - if (next_page_id == ULINT_UNDEFINED) { - *read_batch_len = 0; - return; - } - - ctxt->offset = next_page_id * page_size; - - /* Find the end of the current changed page block by searching - for the next cleared bitmap bit */ - ctxt->filter_batch_end - = xb_page_bitmap_range_get_next_bit(ctxt->bitmap_range, - FALSE); - xb_a(next_page_id < ctxt->filter_batch_end); - } - - *read_batch_start = ctxt->offset; - if (ctxt->filter_batch_end == ULINT_UNDEFINED) { - /* No more cleared bits in the bitmap, need to copy all the - remaining pages. */ - *read_batch_len = ctxt->data_file_size - ctxt->offset; - } else { - *read_batch_len = ctxt->filter_batch_end * page_size - - ctxt->offset; - } - - /* If the page block is larger than the buffer capacity, limit it to - buffer capacity. The subsequent invocations will continue returning - the current block in buffer-sized pieces until ctxt->filter_batch_end - is reached, trigerring the next bitmap query. */ - if (*read_batch_len > (ib_int64_t)ctxt->buffer_capacity) { + if (*read_batch_len > (int64_t)ctxt->buffer_capacity) { *read_batch_len = ctxt->buffer_capacity; } ctxt->offset += *read_batch_len; - xb_a (ctxt->offset % page_size == 0); - xb_a (*read_batch_start % page_size == 0); - xb_a (*read_batch_len % page_size == 0); -} - -/****************************************************************//** -Deinitialize the changed page bitmap-based read filter. */ -static -void -rf_bitmap_deinit( -/*=============*/ - xb_read_filt_ctxt_t* ctxt) /*!bitmap_range); } /* The pass-through read filter */ xb_read_filt_t rf_pass_through = { &rf_pass_through_init, &rf_pass_through_get_next_batch, - &rf_pass_through_deinit -}; - -/* The changed page bitmap-based read filter */ -xb_read_filt_t rf_bitmap = { - &rf_bitmap_init, - &rf_bitmap_get_next_batch, - &rf_bitmap_deinit }; diff --git a/extra/mariabackup/read_filt.h b/extra/mariabackup/read_filt.h index 51150705..caf8ac56 100644 --- a/extra/mariabackup/read_filt.h +++ b/extra/mariabackup/read_filt.h @@ -25,42 +25,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA #ifndef XB_READ_FILT_H #define XB_READ_FILT_H -#include "changed_page_bitmap.h" - -typedef uint32_t space_id_t; +#include +#include struct xb_fil_cur_t; /* The read filter context */ struct xb_read_filt_ctxt_t { - ib_int64_t offset; /*!< current file offset */ - ib_int64_t data_file_size; /*!< data file size */ + int64_t offset; /*!< current file offset */ + int64_t data_file_size; /*!< data file size */ size_t buffer_capacity;/*!< read buffer capacity */ - space_id_t space_id; /*!< space id */ - /* The following fields used only in bitmap filter */ - /* Move these to union if any other filters are added in future */ - xb_page_bitmap_range *bitmap_range; /*!< changed page bitmap range - iterator for space_id */ - ulint page_size; /*!< page size */ - ulint filter_batch_end;/*!< the ending page id of the - current changed page block in - the bitmap */ - /** TODO: remove this default constructor */ - xb_read_filt_ctxt_t() : page_size(0) {} }; /* The read filter */ struct xb_read_filt_t { void (*init)(xb_read_filt_ctxt_t* ctxt, - const xb_fil_cur_t* cursor, - ulint space_id); + const xb_fil_cur_t* cursor); void (*get_next_batch)(xb_read_filt_ctxt_t* ctxt, - ib_int64_t* read_batch_start, - ib_int64_t* read_batch_len); - void (*deinit)(xb_read_filt_ctxt_t* ctxt); + int64_t* read_batch_start, + int64_t* read_batch_len); }; extern xb_read_filt_t rf_pass_through; -extern xb_read_filt_t rf_bitmap; #endif diff --git a/extra/mariabackup/thread_pool.cc b/extra/mariabackup/thread_pool.cc new file mode 100644 index 00000000..e18581f4 --- /dev/null +++ b/extra/mariabackup/thread_pool.cc @@ -0,0 +1,50 @@ +#include "thread_pool.h" +#include "common.h" + +bool ThreadPool::start(size_t threads_count) { + if (!m_stopped) + return false; + m_stopped = false; + for (unsigned i = 0; i < threads_count; ++i) + m_threads.emplace_back(&ThreadPool::thread_func, this, i); + return true; +} + +void ThreadPool::stop() { + if (m_stopped) + return; + m_stop = true; + m_cv.notify_all(); + for (auto &t : m_threads) + t.join(); + m_stopped = true; +}; + +void ThreadPool::push(ThreadPool::job_t &&j) { + std::unique_lock lock(m_mutex); + m_jobs.push(j); + lock.unlock(); + m_cv.notify_one(); +} + +void ThreadPool::thread_func(unsigned thread_num) { + if (my_thread_init()) + die("Can't init mysql thread"); + std::unique_lock lock(m_mutex); + while(true) { + if (m_stop) + goto exit; + while (!m_jobs.empty()) { + if (m_stop) + goto exit; + job_t j = std::move(m_jobs.front()); + m_jobs.pop(); + lock.unlock(); + j(thread_num); + lock.lock(); + } + m_cv.wait(lock, [&] { return m_stop || !m_jobs.empty(); }); + } +exit: + my_thread_end(); +} diff --git a/extra/mariabackup/thread_pool.h b/extra/mariabackup/thread_pool.h new file mode 100644 index 00000000..10ad74c6 --- /dev/null +++ b/extra/mariabackup/thread_pool.h @@ -0,0 +1,62 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include "trx0sys.h" + +class ThreadPool { +public: + typedef std::function job_t; + + ThreadPool() { m_stop = false; m_stopped = true; } + ThreadPool (ThreadPool &&other) = delete; + ThreadPool & operator= (ThreadPool &&other) = delete; + ThreadPool(const ThreadPool &) = delete; + ThreadPool & operator= (const ThreadPool &) = delete; + + bool start(size_t threads_count); + void stop(); + void push(job_t &&j); + size_t threads_count() const { return m_threads.size(); } +private: + void thread_func(unsigned thread_num); + std::mutex m_mutex; + std::condition_variable m_cv; + std::queue m_jobs; + std::atomic m_stop; + std::atomic m_stopped; + std::vector m_threads; +}; + +class TasksGroup { +public: + TasksGroup(ThreadPool &thread_pool) : m_thread_pool(thread_pool) { + m_tasks_count = 0; + m_tasks_result = 1; + } + void push_task(ThreadPool::job_t &&j) { + ++m_tasks_count; + m_thread_pool.push(std::forward(j)); + } + void finish_task(int res) { + --m_tasks_count; + m_tasks_result.fetch_and(res); + } + int get_result() const { return m_tasks_result; } + bool is_finished() const { + return !m_tasks_count; + } + bool wait_for_finish() { + while (!is_finished()) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + return get_result(); + } +private: + ThreadPool &m_thread_pool; + std::atomic m_tasks_count; + std::atomic m_tasks_result; +}; diff --git a/extra/mariabackup/write_filt.cc b/extra/mariabackup/write_filt.cc index 052cea26..13f19ca6 100644 --- a/extra/mariabackup/write_filt.cc +++ b/extra/mariabackup/write_filt.cc @@ -144,6 +144,18 @@ wf_incremental_process(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile) return false; } + /* Check whether TRX_SYS page has been changed */ + if (mach_read_from_4(page + FIL_PAGE_SPACE_ID) + == TRX_SYS_SPACE + && mach_read_from_4(page + FIL_PAGE_OFFSET) + == TRX_SYS_PAGE_NO) { + msg(cursor->thread_n, + "--incremental backup is impossible if " + "the server had been restarted with " + "different innodb_undo_tablespaces."); + return false; + } + /* updated page */ if (cp->npages == page_size / 4) { /* flush buffer */ diff --git a/extra/mariabackup/wsrep.cc b/extra/mariabackup/wsrep.cc index acaf5c50..15463a85 100644 --- a/extra/mariabackup/wsrep.cc +++ b/extra/mariabackup/wsrep.cc @@ -55,6 +55,9 @@ permission notice: #define XB_GALERA_INFO_FILENAME "xtrabackup_galera_info" #define XB_GALERA_DONOR_INFO_FILENAME "donor_galera_info" +/* backup copy of galera info file as sent by donor */ +#define XB_GALERA_INFO_FILENAME_SST "xtrabackup_galera_info_SST" + /*********************************************************************** Store Galera checkpoint info in the 'xtrabackup_galera_info' file, if that information is present in the trx system header. Otherwise, do nothing. */ @@ -68,21 +71,47 @@ xb_write_galera_info(bool incremental_prepare) long long seqno; MY_STAT statinfo; - /* Do not overwrite an existing file to be compatible with - servers with older server versions */ - if (!incremental_prepare && - my_stat(XB_GALERA_INFO_FILENAME, &statinfo, MYF(0)) != NULL) { - - return; - } - xid.null(); + /* try to read last wsrep XID from innodb rsegs, we will use it + instead of galera info file received from donor + */ if (!trx_rseg_read_wsrep_checkpoint(xid)) { - + /* no worries yet, SST may have brought in galera info file + from some old MariaDB version, which does not support + wsrep XID storing in innodb rsegs + */ return; } + /* if SST brought in galera info file, copy it as *_SST file + this will not be used, saved just for future reference + */ + if (my_stat(XB_GALERA_INFO_FILENAME, &statinfo, MYF(0)) != NULL) { + FILE* fp_in = fopen(XB_GALERA_INFO_FILENAME, "r"); + FILE* fp_out = fopen(XB_GALERA_INFO_FILENAME_SST, "w"); + + char buf[BUFSIZ] = {'\0'}; + size_t size; + while ((size = fread(buf, 1, BUFSIZ, fp_in))) { + if (fwrite(buf, 1, size, fp_out) != strlen(buf)) { + die( + "could not write to " + XB_GALERA_INFO_FILENAME_SST + ", errno = %d\n", + errno); + } + } + if (!feof(fp_in)) { + die( + XB_GALERA_INFO_FILENAME_SST + " not fully copied\n" + ); + } + fclose(fp_out); + fclose(fp_in); + } + wsrep_uuid_t uuid; memcpy(uuid.data, wsrep_xid_uuid(&xid), sizeof(uuid.data)); if (wsrep_uuid_print(&uuid, uuid_str, @@ -97,7 +126,6 @@ xb_write_galera_info(bool incremental_prepare) "could not create " XB_GALERA_INFO_FILENAME ", errno = %d\n", errno); - exit(EXIT_FAILURE); } seqno = wsrep_xid_seqno(&xid); diff --git a/extra/mariabackup/xb_plugin.cc b/extra/mariabackup/xb_plugin.cc deleted file mode 100644 index 7470d376..00000000 --- a/extra/mariabackup/xb_plugin.cc +++ /dev/null @@ -1,229 +0,0 @@ -/* Copyright (c) 2017, 2022, MariaDB Corporation. - - 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; version 2 of the License. - - 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -extern struct st_maria_plugin *mysql_optional_plugins[]; -extern struct st_maria_plugin *mysql_mandatory_plugins[]; -static void xb_plugin_init(int argc, char **argv); - -extern char *xb_plugin_load; -extern char *xb_plugin_dir; - -const int PLUGIN_MAX_ARGS = 1024; -std::vector backup_plugins_args; - -const char *QUERY_PLUGIN = -"SELECT plugin_name, plugin_library, @@plugin_dir" -" FROM information_schema.plugins WHERE plugin_type='ENCRYPTION'" -" OR (plugin_type = 'DAEMON' AND plugin_name LIKE 'provider\\_%')" -" AND plugin_status='ACTIVE'"; - -std::string xb_plugin_config; - -static void add_to_plugin_load_list(const char *plugin_def) -{ - opt_plugin_load_list_ptr->push_back(new i_string(plugin_def)); -} - -static char XTRABACKUP_EXE[] = "xtrabackup"; - -/* - Read "plugin-load" value from backup-my.cnf during prepare phase. - The value is stored during backup phase. -*/ -static std::string get_plugin_from_cnf(const char *dir) -{ - std::string path = dir + std::string("/backup-my.cnf"); - FILE *f = fopen(path.c_str(), "r"); - if (!f) - { - die("Can't open %s for reading", path.c_str()); - } - char line[512]; - std::string plugin_load; - while (fgets(line, sizeof(line), f)) - { - if (strncmp(line, "plugin_load=", 12) == 0) - { - plugin_load = line + 12; - // remote \n at the end of string - plugin_load.resize(plugin_load.size() - 1); - break; - } - } - fclose(f); - return plugin_load; -} - - -void xb_plugin_backup_init(MYSQL *mysql) -{ - MYSQL_RES *result; - MYSQL_ROW row; - std::ostringstream oss; - char *argv[PLUGIN_MAX_ARGS]; - char show_query[1024] = ""; - std::string plugin_load; - int argc; - - result = xb_mysql_query(mysql, QUERY_PLUGIN, true, true); - while ((row = mysql_fetch_row(result))) - { - char *name= row[0]; - char *library= row[1]; - char *dir= row[2]; - - if (!plugin_load.length()) - { -#ifdef _WIN32 - for (char *p = dir; *p; p++) - if (*p == '\\') *p = '/'; -#endif - strncpy(opt_plugin_dir, dir, FN_REFLEN - 1); - opt_plugin_dir[FN_REFLEN - 1] = '\0'; - oss << "plugin_dir=" << '"' << dir << '"' << std::endl; - } - - plugin_load += std::string(";") + name; - - if (library) - { - /* Remove shared library suffixes, in case we'll prepare on different OS.*/ - const char *extensions[] = { ".dll", ".so", 0 }; - for (size_t i = 0; extensions[i]; i++) - { - const char *ext = extensions[i]; - if (ends_with(library, ext)) - library[strlen(library) - strlen(ext)] = 0; - } - plugin_load += std::string("=") + library; - } - - if (strncmp(name, "provider_", 9) == 0) - continue; - - /* Read plugin variables. */ - snprintf(show_query, sizeof(show_query), "SHOW variables like '%s_%%'", name); - } - mysql_free_result(result); - if (!plugin_load.length()) - return; - - oss << "plugin_load=" << plugin_load.c_str() + 1 << std::endl; - - /* Required to load the plugin later.*/ - add_to_plugin_load_list(plugin_load.c_str() + 1); - - - if (*show_query) - { - result = xb_mysql_query(mysql, show_query, true, true); - while ((row = mysql_fetch_row(result))) - { - std::string arg("--"); - arg += row[0]; - arg += "="; - arg += row[1]; - backup_plugins_args.push_back(arg); - oss << row[0] << "=" << row[1] << std::endl; - } - - mysql_free_result(result); - - /* Check whether to encrypt logs. */ - result = xb_mysql_query(mysql, "select @@innodb_encrypt_log", true, true); - row = mysql_fetch_row(result); - srv_encrypt_log = (row != 0 && row[0][0] == '1'); - oss << "innodb_encrypt_log=" << row[0] << std::endl; - - mysql_free_result(result); - } - - xb_plugin_config = oss.str(); - - argc = 0; - argv[argc++] = XTRABACKUP_EXE; - for(size_t i = 0; i < backup_plugins_args.size(); i++) - { - argv[argc++] = (char *)backup_plugins_args[i].c_str(); - if (argc == PLUGIN_MAX_ARGS - 2) - break; - } - argv[argc] = 0; - - xb_plugin_init(argc, argv); -} - -const char *xb_plugin_get_config() -{ - return xb_plugin_config.c_str(); -} - -extern int finalize_encryption_plugin(st_plugin_int *plugin); - - -void xb_plugin_prepare_init(int argc, char **argv, const char *dir) -{ - std::string plugin_load= get_plugin_from_cnf(dir ? dir : "."); - if (plugin_load.size()) - { - msg("Loading plugins from %s", plugin_load.c_str()); - } - else - { - finalize_encryption_plugin(0); - return; - } - - add_to_plugin_load_list(plugin_load.c_str()); - - if (xb_plugin_dir) - { - strncpy(opt_plugin_dir, xb_plugin_dir, FN_REFLEN - 1); - opt_plugin_dir[FN_REFLEN - 1] = '\0'; - } - - char **new_argv = new char *[argc + 2]; - new_argv[0] = XTRABACKUP_EXE; - memcpy(&new_argv[1], argv, argc*sizeof(char *)); - - xb_plugin_init(argc+1, new_argv); - - delete[] new_argv; -} - -static void xb_plugin_init(int argc, char **argv) -{ - /* Patch optional and mandatory plugins, we only need to load the one in xb_plugin_load. */ - mysql_optional_plugins[0] = mysql_mandatory_plugins[0] = 0; - plugin_maturity = MariaDB_PLUGIN_MATURITY_UNKNOWN; /* mariabackup accepts all plugins */ - msg("Loading plugins"); - for (int i= 1; i < argc; i++) - msg("\t Plugin parameter : '%s'", argv[i]); - plugin_init(&argc, argv, PLUGIN_INIT_SKIP_PLUGIN_TABLE); -} - diff --git a/extra/mariabackup/xb_plugin.h b/extra/mariabackup/xb_plugin.h deleted file mode 100644 index fea24b6b..00000000 --- a/extra/mariabackup/xb_plugin.h +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include -extern void xb_plugin_backup_init(MYSQL *mysql); -extern const char* xb_plugin_get_config(); -extern void xb_plugin_prepare_init(int argc, char **argv, const char *dir); diff --git a/extra/mariabackup/xbstream.cc b/extra/mariabackup/xbstream.cc index 6306806b..d69a0029 100644 --- a/extra/mariabackup/xbstream.cc +++ b/extra/mariabackup/xbstream.cc @@ -262,7 +262,7 @@ mode_create(int argc, char **argv) return 1; } - stream = xb_stream_write_new(); + stream = xb_stream_write_new(nullptr, nullptr); if (stream == NULL) { msg("%s: xb_stream_write_new() failed.", my_progname); return 1; @@ -287,7 +287,7 @@ mode_create(int argc, char **argv) goto err; } - file = xb_stream_write_open(stream, filepath, &mystat, NULL, NULL); + file = xb_stream_write_open(stream, filepath, &mystat, false); if (file == NULL) { goto err; } @@ -314,7 +314,8 @@ err: static file_entry_t * -file_entry_new(extract_ctxt_t *ctxt, const char *path, uint pathlen) +file_entry_new(extract_ctxt_t *ctxt, const char *path, uint pathlen, + uchar chunk_flags) { file_entry_t *entry; ds_file_t *file; @@ -331,7 +332,8 @@ file_entry_new(extract_ctxt_t *ctxt, const char *path, uint pathlen) } entry->pathlen = pathlen; - file = ds_open(ctxt->ds_ctxt, path, NULL); + file = ds_open(ctxt->ds_ctxt, path, NULL, + chunk_flags == XB_STREAM_FLAG_REWRITE); if (file == NULL) { msg("%s: failed to create file.", my_progname); @@ -412,10 +414,50 @@ extract_worker_thread_func(void *arg) (uchar *) chunk.path, chunk.pathlen); + if (entry && (chunk.type == XB_CHUNK_TYPE_REMOVE || + chunk.type == XB_CHUNK_TYPE_RENAME)) { + msg("%s: rename and remove chunks can not be applied to opened file: %s", + my_progname, chunk.path); + pthread_mutex_unlock(ctxt->mutex); + break; + } + + if (chunk.type == XB_CHUNK_TYPE_REMOVE) { + if (ds_remove(ctxt->ds_ctxt, chunk.path)) { + msg("%s: error on file removing: %s", my_progname, chunk.path); + pthread_mutex_unlock(ctxt->mutex); + res = XB_STREAM_READ_ERROR; + break; + } + pthread_mutex_unlock(ctxt->mutex); + continue; + } + + if (chunk.type == XB_CHUNK_TYPE_RENAME) { + if (my_hash_search(ctxt->filehash, + reinterpret_cast(chunk.data), chunk.length)) { + msg("%s: rename chunks can not be applied to opened file: %s", + my_progname, reinterpret_cast(chunk.data)); + pthread_mutex_unlock(ctxt->mutex); + break; + } + if (ds_rename(ctxt->ds_ctxt, chunk.path, + reinterpret_cast(chunk.data))) { + msg("%s: error on file renaming: %s to %s", my_progname, + reinterpret_cast(chunk.data), chunk.path); + pthread_mutex_unlock(ctxt->mutex); + res = XB_STREAM_READ_ERROR; + break; + } + pthread_mutex_unlock(ctxt->mutex); + continue; + } + if (entry == NULL) { entry = file_entry_new(ctxt, chunk.path, - chunk.pathlen); + chunk.pathlen, + chunk.flags); if (entry == NULL) { pthread_mutex_unlock(ctxt->mutex); break; @@ -432,6 +474,18 @@ extract_worker_thread_func(void *arg) pthread_mutex_unlock(ctxt->mutex); + if (chunk.type == XB_CHUNK_TYPE_SEEK) { + if (ds_seek_set(entry->file, chunk.offset)) { + msg("%s: my_seek() failed.", my_progname); + pthread_mutex_unlock(&entry->mutex); + res = XB_STREAM_READ_ERROR; + break; + } + entry->offset = chunk.offset; + pthread_mutex_unlock(&entry->mutex); + continue; + } + res = xb_stream_validate_checksum(&chunk); if (res != XB_STREAM_READ_CHUNK) { diff --git a/extra/mariabackup/xbstream.h b/extra/mariabackup/xbstream.h index 1b36ec24..c8b2997d 100644 --- a/extra/mariabackup/xbstream.h +++ b/extra/mariabackup/xbstream.h @@ -29,6 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA /* Chunk flags */ /* Chunk can be ignored if unknown version/format */ #define XB_STREAM_FLAG_IGNORABLE 0x01 +#define XB_STREAM_FLAG_REWRITE 0x02 /* Magic + flags + type + path len */ #define CHUNK_HEADER_CONSTANT_LEN ((sizeof(XB_STREAM_CHUNK_MAGIC) - 1) + \ @@ -48,18 +49,21 @@ typedef enum { /************************************************************************ Write interface. */ -typedef ssize_t xb_stream_write_callback(xb_wstream_file_t *file, +typedef ssize_t xb_stream_write_callback( void *userdata, const void *buf, size_t len); -xb_wstream_t *xb_stream_write_new(void); - +xb_wstream_t *xb_stream_write_new( + xb_stream_write_callback *write_callback, void *user_data); xb_wstream_file_t *xb_stream_write_open(xb_wstream_t *stream, const char *path, - MY_STAT *mystat, void *userdata, - xb_stream_write_callback *onwrite); + const MY_STAT *mystat, bool rewrite); int xb_stream_write_data(xb_wstream_file_t *file, const void *buf, size_t len); - +int xb_stream_write_seek_set(xb_wstream_file_t *file, my_off_t offset); +int xb_stream_write_remove(xb_wstream_t *stream, const char *path); +int +xb_stream_write_rename( + xb_wstream_t *stream, const char *old_path, const char *new_path); int xb_stream_write_close(xb_wstream_file_t *file); int xb_stream_write_done(xb_wstream_t *stream); @@ -76,6 +80,9 @@ typedef enum { typedef enum { XB_CHUNK_TYPE_UNKNOWN = '\0', XB_CHUNK_TYPE_PAYLOAD = 'P', + XB_CHUNK_TYPE_RENAME = 'R', + XB_CHUNK_TYPE_REMOVE = 'D', + XB_CHUNK_TYPE_SEEK = 'S', XB_CHUNK_TYPE_EOF = 'E' } xb_chunk_type_t; diff --git a/extra/mariabackup/xbstream_read.cc b/extra/mariabackup/xbstream_read.cc index b54a9815..d82176ad 100644 --- a/extra/mariabackup/xbstream_read.cc +++ b/extra/mariabackup/xbstream_read.cc @@ -59,6 +59,9 @@ validate_chunk_type(uchar code) { switch ((xb_chunk_type_t) code) { case XB_CHUNK_TYPE_PAYLOAD: + case XB_CHUNK_TYPE_RENAME: + case XB_CHUNK_TYPE_REMOVE: + case XB_CHUNK_TYPE_SEEK: case XB_CHUNK_TYPE_EOF: return (xb_chunk_type_t) code; default: @@ -159,57 +162,91 @@ xb_stream_read_chunk(xb_rstream_t *stream, xb_rstream_chunk_t *chunk) } chunk->path[pathlen] = '\0'; - if (chunk->type == XB_CHUNK_TYPE_EOF) { + if (chunk->type == XB_CHUNK_TYPE_EOF || + chunk->type == XB_CHUNK_TYPE_REMOVE) { return XB_STREAM_READ_CHUNK; } - /* Payload length */ - F_READ(tmpbuf, 16); - ullval = uint8korr(tmpbuf); - if (ullval > (ulonglong) SIZE_T_MAX) { - msg("xb_stream_read_chunk(): chunk length is too large at " - "offset 0x%llx: 0x%llx.", (ulonglong) stream->offset, - ullval); - goto err; + if (chunk->type == XB_CHUNK_TYPE_RENAME) { + F_READ(tmpbuf, 4); + size_t new_pathlen = uint4korr(tmpbuf); + if (new_pathlen >= FN_REFLEN) { + msg("xb_stream_read_chunk(): path length (%lu) for new name of 'rename'" + " chunk is too large", (ulong) new_pathlen); + goto err; + } + chunk->length = new_pathlen; + stream->offset +=4; } - chunk->length = (size_t) ullval; - stream->offset += 8; - - /* Payload offset */ - ullval = uint8korr(tmpbuf + 8); - if (ullval > (ulonglong) MY_OFF_T_MAX) { - msg("xb_stream_read_chunk(): chunk offset is too large at " - "offset 0x%llx: 0x%llx.", (ulonglong) stream->offset, - ullval); - goto err; + else if (chunk->type == XB_CHUNK_TYPE_SEEK) { + F_READ(tmpbuf, 8); + chunk->offset = uint8korr(tmpbuf); + stream->offset += 8; + return XB_STREAM_READ_CHUNK; + } + else { + /* Payload length */ + F_READ(tmpbuf, 16); + ullval = uint8korr(tmpbuf); + if (ullval > (ulonglong) SIZE_T_MAX) { + msg("xb_stream_read_chunk(): chunk length is too large at " + "offset 0x%llx: 0x%llx.", (ulonglong) stream->offset, + ullval); + goto err; + } + chunk->length = (size_t) ullval; + stream->offset += 8; + + /* Payload offset */ + ullval = uint8korr(tmpbuf + 8); + if (ullval > (ulonglong) MY_OFF_T_MAX) { + msg("xb_stream_read_chunk(): chunk offset is too large at " + "offset 0x%llx: 0x%llx.", (ulonglong) stream->offset, + ullval); + goto err; + } + chunk->offset = (my_off_t) ullval; + stream->offset += 8; } - chunk->offset = (my_off_t) ullval; - stream->offset += 8; - /* Reallocate the buffer if needed */ - if (chunk->length > chunk->buflen) { - chunk->data = my_realloc(PSI_NOT_INSTRUMENTED, chunk->data, chunk->length, - MYF(MY_WME | MY_ALLOW_ZERO_PTR)); + /* Reallocate the buffer if needed, take into account trailing '\0' for + new file name in the case of XB_CHUNK_TYPE_RENAME */ + if (chunk->length + 1 > chunk->buflen) { + chunk->data = my_realloc(PSI_NOT_INSTRUMENTED, chunk->data, + chunk->length + 1, MYF(MY_WME | MY_ALLOW_ZERO_PTR)); if (chunk->data == NULL) { msg("xb_stream_read_chunk(): failed to increase buffer " - "to %lu bytes.", (ulong) chunk->length); + "to %lu bytes.", (ulong) chunk->length + 1); goto err; } - chunk->buflen = chunk->length; + chunk->buflen = chunk->length + 1; } - /* Checksum */ - F_READ(tmpbuf, 4); - chunk->checksum = uint4korr(tmpbuf); - chunk->checksum_offset = stream->offset; - - /* Payload */ - if (chunk->length > 0) { + if (chunk->type == XB_CHUNK_TYPE_RENAME) { + if (chunk->length == 0) { + msg("xb_stream_read_chunk(): failed to read new name for file to rename " + ": %s", chunk->path); + goto err; + } F_READ(chunk->data, chunk->length); stream->offset += chunk->length; + reinterpret_cast(chunk->data)[chunk->length] = '\0'; + ++chunk->length; } + else { + /* Checksum */ + F_READ(tmpbuf, 4); + chunk->checksum = uint4korr(tmpbuf); + chunk->checksum_offset = stream->offset; + + /* Payload */ + if (chunk->length > 0) { + F_READ(chunk->data, chunk->length); + stream->offset += chunk->length; + } - stream->offset += 4; + stream->offset += 4; + } return XB_STREAM_READ_CHUNK; diff --git a/extra/mariabackup/xbstream_write.cc b/extra/mariabackup/xbstream_write.cc index 5801e867..926e091b 100644 --- a/extra/mariabackup/xbstream_write.cc +++ b/extra/mariabackup/xbstream_write.cc @@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA #include #include #include +#include #include "common.h" #include "xbstream.h" @@ -29,6 +30,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA struct xb_wstream_struct { pthread_mutex_t mutex; + xb_stream_write_callback *write; + void *user_data; }; struct xb_wstream_file_struct { @@ -39,8 +42,7 @@ struct xb_wstream_file_struct { char *chunk_ptr; size_t chunk_free; my_off_t offset; - void *userdata; - xb_stream_write_callback *write; + bool rewrite; }; static int xb_stream_flush(xb_wstream_file_t *file); @@ -50,7 +52,7 @@ static int xb_stream_write_eof(xb_wstream_file_t *file); static ssize_t -xb_stream_default_write_callback(xb_wstream_file_t *file __attribute__((unused)), +xb_stream_default_write_callback( void *userdata __attribute__((unused)), const void *buf, size_t len) { @@ -60,21 +62,31 @@ xb_stream_default_write_callback(xb_wstream_file_t *file __attribute__((unused)) } xb_wstream_t * -xb_stream_write_new(void) +xb_stream_write_new( + xb_stream_write_callback *write_callback, void *user_data) { xb_wstream_t *stream; stream = (xb_wstream_t *) my_malloc(PSI_NOT_INSTRUMENTED, sizeof(xb_wstream_t), MYF(MY_FAE)); pthread_mutex_init(&stream->mutex, NULL); + if (write_callback) { +#ifdef _WIN32 + setmode(fileno(stdout), _O_BINARY); +#endif + stream->write = write_callback; + stream->user_data = user_data; + } + else { + stream->write = xb_stream_default_write_callback; + stream->user_data = user_data; + } return stream;; } xb_wstream_file_t * xb_stream_write_open(xb_wstream_t *stream, const char *path, - MY_STAT *mystat __attribute__((unused)), - void *userdata, - xb_stream_write_callback *onwrite) + const MY_STAT *mystat __attribute__((unused)), bool rewrite) { xb_wstream_file_t *file; size_t path_len; @@ -109,16 +121,7 @@ xb_stream_write_open(xb_wstream_t *stream, const char *path, file->offset = 0; file->chunk_ptr = file->chunk; file->chunk_free = XB_STREAM_MIN_CHUNK_SIZE; - if (onwrite) { -#ifdef _WIN32 - setmode(fileno(stdout), _O_BINARY); -#endif - file->userdata = userdata; - file->write = onwrite; - } else { - file->userdata = NULL; - file->write = xb_stream_default_write_callback; - } + file->rewrite = rewrite; return file; } @@ -202,7 +205,8 @@ xb_stream_write_chunk(xb_wstream_file_t *file, const void *buf, size_t len) memcpy(ptr, XB_STREAM_CHUNK_MAGIC, sizeof(XB_STREAM_CHUNK_MAGIC) - 1); ptr += sizeof(XB_STREAM_CHUNK_MAGIC) - 1; - *ptr++ = 0; /* Chunk flags */ + *ptr++ = + file->rewrite ? XB_STREAM_FLAG_REWRITE : 0; /* Chunk flags */ *ptr++ = (uchar) XB_CHUNK_TYPE_PAYLOAD; /* Chunk type */ @@ -227,11 +231,11 @@ xb_stream_write_chunk(xb_wstream_file_t *file, const void *buf, size_t len) xb_ad(ptr <= tmpbuf + sizeof(tmpbuf)); - if (file->write(file, file->userdata, tmpbuf, ptr-tmpbuf) == -1) + if (stream->write(stream->user_data, tmpbuf, ptr-tmpbuf) == -1) goto err; - if (file->write(file, file->userdata, buf, len) == -1) /* Payload */ + if (stream->write(stream->user_data, buf, len) == -1) /* Payload */ goto err; file->offset+= len; @@ -247,6 +251,38 @@ err: return 1; } +int xb_stream_write_seek_set(xb_wstream_file_t *file, my_off_t offset) +{ + /* Chunk magic + flags + chunk type + path_len + path + offset */ + uchar tmpbuf[sizeof(XB_STREAM_CHUNK_MAGIC) - 1 + 1 + 1 + 4 + + FN_REFLEN + 8]; + int error = 0; + xb_wstream_t *stream = file->stream; + uchar *ptr = tmpbuf; + /* Chunk magic */ + memcpy(ptr, XB_STREAM_CHUNK_MAGIC, sizeof(XB_STREAM_CHUNK_MAGIC) - 1); + ptr += sizeof(XB_STREAM_CHUNK_MAGIC) - 1; + *ptr++ = 0; /* Chunk flags */ + *ptr++ = (uchar) XB_CHUNK_TYPE_SEEK; /* Chunk type */ + int4store(ptr, file->path_len); /* Path length */ + ptr += 4; + memcpy(ptr, file->path, file->path_len); /* Path */ + ptr += file->path_len; + int8store(ptr, static_cast(offset)); /* Offset */ + ptr += 8; + if (xb_stream_flush(file)) + return 1; + pthread_mutex_lock(&stream->mutex); + if (stream->write(stream->user_data, tmpbuf, ptr-tmpbuf) == -1) + error = 1; + if (!error) + file->offset = offset; + pthread_mutex_unlock(&stream->mutex); + if (xb_stream_flush(file)) + return 1; + return error; +} + static int xb_stream_write_eof(xb_wstream_file_t *file) @@ -278,7 +314,7 @@ xb_stream_write_eof(xb_wstream_file_t *file) xb_ad(ptr <= tmpbuf + sizeof(tmpbuf)); - if (file->write(file, file->userdata, tmpbuf, + if (stream->write(stream->user_data, tmpbuf, (ulonglong) (ptr - tmpbuf)) == -1) goto err; @@ -291,3 +327,77 @@ err: return 1; } + + +int +xb_stream_write_remove(xb_wstream_t *stream, const char *path) { + /* Chunk magic + flags + chunk type + path_len + path */ + uchar tmpbuf[sizeof(XB_STREAM_CHUNK_MAGIC) - 1 + 1 + 1 + 4 + FN_REFLEN]; + uchar *ptr = tmpbuf; + /* Chunk magic */ + memcpy(ptr, XB_STREAM_CHUNK_MAGIC, sizeof(XB_STREAM_CHUNK_MAGIC) - 1); + ptr += sizeof(XB_STREAM_CHUNK_MAGIC) - 1; + + *ptr++ = 0; /* Chunk flags */ + + *ptr++ = (uchar) XB_CHUNK_TYPE_REMOVE; /* Chunk type */ + size_t path_len = strlen(path); + int4store(ptr, path_len); /* Path length */ + ptr += 4; + + memcpy(ptr, path, path_len); /* Path */ + ptr += path_len; + + xb_ad(ptr <= tmpbuf + sizeof(tmpbuf)); + + pthread_mutex_lock(&stream->mutex); + + ssize_t result = stream->write(stream->user_data, tmpbuf, + (ulonglong) (ptr - tmpbuf)); + + pthread_mutex_unlock(&stream->mutex); + + return result < 0; + +} + +int +xb_stream_write_rename( + xb_wstream_t *stream, const char *old_path, const char *new_path) { + /* Chunk magic + flags + chunk type + path_len + path + path_len + path*/ + uchar tmpbuf[sizeof(XB_STREAM_CHUNK_MAGIC) - 1 + 1 + 1 + + 4 + FN_REFLEN + 4 + FN_REFLEN]; + uchar *ptr = tmpbuf; + /* Chunk magic */ + memcpy(ptr, XB_STREAM_CHUNK_MAGIC, sizeof(XB_STREAM_CHUNK_MAGIC) - 1); + ptr += sizeof(XB_STREAM_CHUNK_MAGIC) - 1; + + *ptr++ = 0; /* Chunk flags */ + + *ptr++ = (uchar) XB_CHUNK_TYPE_RENAME; /* Chunk type */ + size_t path_len = strlen(old_path); + int4store(ptr, path_len); /* Path length */ + ptr += 4; + + memcpy(ptr, old_path, path_len); /* Path */ + ptr += path_len; + + path_len = strlen(new_path); + int4store(ptr, path_len); /* Path length */ + ptr += 4; + + memcpy(ptr, new_path, path_len); /* Path */ + ptr += path_len; + + xb_ad(ptr <= tmpbuf + sizeof(tmpbuf)); + + pthread_mutex_lock(&stream->mutex); + + ssize_t result = stream->write(stream->user_data, tmpbuf, + (ulonglong) (ptr - tmpbuf)); + + pthread_mutex_unlock(&stream->mutex); + + return result < 0; +} + diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 485cb143..5979bbd3 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -4,7 +4,7 @@ MariaBackup: hot backup tool for InnoDB Originally Created 3/3/2009 Yasufumi Kinoshita Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. -(c) 2017, 2022, MariaDB Corporation. +(c) 2017, 2024, MariaDB Corporation. Portions written by Marko Mäkelä. This program is free software; you can redistribute it and/or modify @@ -54,7 +54,6 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA #include #include -#include #include #ifdef __linux__ @@ -70,6 +69,7 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA # include #endif +#include "aria_backup_client.h" #include #include @@ -82,6 +82,7 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA #include #include #include "ha_innodb.h" +#include "fts0types.h" #include #include @@ -97,23 +98,26 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA #include "xb_regex.h" #include "fil_cur.h" #include "write_filt.h" -#include "xtrabackup.h" #include "ds_buffer.h" #include "ds_tmpfile.h" #include "xbstream.h" -#include "changed_page_bitmap.h" #include "read_filt.h" #include "backup_wsrep.h" #include "innobackupex.h" #include "backup_mysql.h" #include "backup_copy.h" #include "backup_mysql.h" -#include "xb_plugin.h" +#include "encryption_plugin.h" #include #include #include #include #include +#include +#include "ddl_log.h" +#include "common_engine.h" +#include "lex_string.h" +#include "sql_table.h" #include "backup_debug.h" #define MB_CORRUPTED_PAGES_FILE "innodb_corrupted_pages" @@ -126,6 +130,9 @@ int sd_notifyf() { return 0; } int sys_var_init(); +extern const char* fts_common_tables[]; +extern const fts_index_selector_t fts_index_selector[]; + /* === xtrabackup specific options === */ #define DEFAULT_TARGET_DIR "./xtrabackup_backupfiles/" char xtrabackup_real_target_dir[FN_REFLEN] = DEFAULT_TARGET_DIR; @@ -140,8 +147,8 @@ my_bool xtrabackup_decrypt_decompress; my_bool xtrabackup_print_param; my_bool xtrabackup_mysqld_args; my_bool xtrabackup_help; - my_bool xtrabackup_export; +my_bool ignored_option; longlong xtrabackup_use_memory; @@ -155,7 +162,6 @@ char *xtrabackup_incremental; lsn_t incremental_lsn; lsn_t incremental_to_lsn; lsn_t incremental_last_lsn; -xb_page_bitmap *changed_page_bitmap; char *xtrabackup_incremental_basedir; /* for --backup */ char *xtrabackup_extra_lsndir; /* for --backup with --extra-lsndir */ @@ -195,10 +201,12 @@ struct xb_filter_entry_t{ xb_filter_entry_t *name_hash; }; +lsn_t checkpoint_lsn_start; +lsn_t checkpoint_no_start; /** whether log_copying_thread() is active; protected by recv_sys.mutex */ static bool log_copying_running; -int xtrabackup_parallel; +uint xtrabackup_parallel; char *xtrabackup_stream_str = NULL; xb_stream_fmt_t xtrabackup_stream_fmt = XB_STREAM_FMT_NONE; @@ -255,7 +263,7 @@ recv_sys.mutex. */ static std::set fail_undo_ids; longlong innobase_page_size = (1LL << 14); /* 16KB */ -char* innobase_buffer_pool_filename = NULL; +char *innobase_buffer_pool_filename = NULL; /* The default values for the following char* start-up parameters are determined in innobase_init below: */ @@ -361,10 +369,8 @@ my_bool opt_galera_info = FALSE; my_bool opt_slave_info = FALSE; my_bool opt_no_lock = FALSE; my_bool opt_safe_slave_backup = FALSE; -my_bool opt_rsync = FALSE; my_bool opt_force_non_empty_dirs = FALSE; my_bool opt_noversioncheck = FALSE; -my_bool opt_no_backup_locks = FALSE; my_bool opt_decompress = FALSE; my_bool opt_remove_original; my_bool opt_log_innodb_page_corruption; @@ -422,6 +428,8 @@ pthread_cond_t scanned_lsn_cond; /** Store the deferred tablespace name during --backup */ static std::set defer_space_names; +typedef decltype(fil_space_t::id) space_id_t; + typedef std::map space_id_to_name_t; struct ddl_tracker_t { @@ -696,8 +704,190 @@ typedef void (*process_single_tablespace_func_t)(const char *dirname, uint32_t defer_space_id); static dberr_t enumerate_ibd_files(process_single_tablespace_func_t callback); +const char *convert_dst(const char *dst) { + return + (xtrabackup_copy_back || xtrabackup_move_back) ? + dst : trim_dotslash(dst); +} + +std::string convert_tablename_to_filepath( + const char *data_dir_path, const std::string &db, const std::string &table) { + char dbbuff[FN_REFLEN]; + char tbbuff[FN_REFLEN]; + (void)tablename_to_filename(db.c_str(), dbbuff, sizeof(dbbuff)); + (void)tablename_to_filename(table.c_str(), tbbuff, sizeof(tbbuff)); + std::string result(data_dir_path); + result.append(1, FN_LIBCHAR).append(dbbuff). + append(1, FN_LIBCHAR).append(tbbuff); + return result; +} + +std::tuple +convert_filepath_to_tablename(const char *filepath) { + char db_name_orig[FN_REFLEN]; + char table_name_orig[FN_REFLEN]; + parse_db_table_from_file_path(filepath, db_name_orig, table_name_orig); + if (!db_name_orig[0] || !table_name_orig[0]) + return std::make_tuple("", "", ""); + char db_name_conv[FN_REFLEN]; + char table_name_conv[FN_REFLEN]; + filename_to_tablename(db_name_orig, db_name_conv, sizeof(db_name_conv)); + filename_to_tablename( + table_name_orig, table_name_conv, sizeof(table_name_conv)); + if (!db_name_conv[0] || !table_name_conv[0]) + return std::make_tuple("", "", ""); + return std::make_tuple(db_name_conv, table_name_conv, + std::string(db_name_orig).append("/").append(table_name_orig)); +} + +std::string get_table_version_from_image(const std::vector &frm_image) { + DBUG_ASSERT(frm_image.size() >= 64); + + if (!strncmp((char*) frm_image.data(), "TYPE=VIEW\n", 10)) + return {}; + + if (!is_binary_frm_header(frm_image.data())) + return {}; + + /* Length of the MariaDB extra2 segment in the form file. */ + uint len = uint2korr(frm_image.data() + 4); + const uchar *extra2= frm_image.data() + 64; + + if (*extra2 == '/') // old frm had '/' there + return {}; + + const uchar *e2end= extra2 + len; + while (extra2 + 3 <= e2end) + { + uchar type= *extra2++; + size_t length= *extra2++; + if (!length) + { + if (extra2 + 2 >= e2end) + return {}; + length= uint2korr(extra2); + extra2+= 2; + if (length < 256) + return {}; + } + if (extra2 + length > e2end) + return {}; + if (type == EXTRA2_TABLEDEF_VERSION) { + char buff[MY_UUID_STRING_LENGTH]; + my_uuid2str(extra2, buff, 1); + return std::string(buff, buff + MY_UUID_STRING_LENGTH); + } + extra2+= length; + } + + return {}; +} + +std::pair + get_table_engine_from_image(const std::vector &frm_image) { + + DBUG_ASSERT(frm_image.size() >= 64); + + if (!strncmp((char*) frm_image.data(), "TYPE=VIEW\n", 10)) + return std::make_pair(false, DB_TYPE_UNKNOWN); + + if (!is_binary_frm_header(frm_image.data())) + return std::make_pair(false, DB_TYPE_UNKNOWN); + + legacy_db_type dbt = (legacy_db_type)frm_image[3]; + + if (dbt >= DB_TYPE_FIRST_DYNAMIC) + return std::make_pair(false, DB_TYPE_UNKNOWN); + + if (dbt != DB_TYPE_PARTITION_DB) + return std::make_pair(false, dbt); + + dbt = (legacy_db_type)frm_image[61]; + return std::make_pair(true, + dbt < DB_TYPE_FIRST_DYNAMIC ? dbt : DB_TYPE_UNKNOWN); +} + +std::vector read_frm_image(File file) { + std::vector frm_image; + MY_STAT state; + + if (mysql_file_fstat(file, &state, MYF(MY_WME))) + return frm_image; + + frm_image.resize((size_t)state.st_size, 0); + + if (mysql_file_read( + file, frm_image.data(), (size_t)state.st_size, MYF(MY_NABP))) + frm_image.clear(); + + return frm_image; +} + +std::string read_table_version_id(File file) { + auto frm_image = read_frm_image(file); + if (frm_image.empty()) + return {}; + return get_table_version_from_image(frm_image); +} + +bool is_log_table(const char *dbname, const char *tablename) { + DBUG_ASSERT(dbname); + DBUG_ASSERT(tablename); + + LEX_CSTRING lex_db; + LEX_CSTRING lex_table; + lex_db.str = dbname; + lex_db.length = strlen(dbname); + lex_table.str = tablename; + lex_table.length = strlen(tablename); + + if (!lex_string_eq(&MYSQL_SCHEMA_NAME, &lex_db)) + return false; + + if (lex_string_eq(&GENERAL_LOG_NAME, &lex_table)) + return true; + + if (lex_string_eq(&SLOW_LOG_NAME, &lex_table)) + return true; + + return false; +} + +bool is_stats_table(const char *dbname, const char *tablename) { + DBUG_ASSERT(dbname); + DBUG_ASSERT(tablename); + + LEX_CSTRING lex_db; + LEX_CSTRING lex_table; + lex_db.str = dbname; + lex_db.length = strlen(dbname); + lex_table.str = tablename; + lex_table.length = strlen(tablename); + + if (!lex_string_eq(&MYSQL_SCHEMA_NAME, &lex_db)) + return false; + + CHARSET_INFO *ci= system_charset_info; + + return (lex_table.length > 4 && + /* one of mysql.*_stat tables, but not mysql.innodb* tables*/ + ((my_tolower(ci, lex_table.str[lex_table.length-5]) == 's' && + my_tolower(ci, lex_table.str[lex_table.length-4]) == 't' && + my_tolower(ci, lex_table.str[lex_table.length-3]) == 'a' && + my_tolower(ci, lex_table.str[lex_table.length-2]) == 't' && + my_tolower(ci, lex_table.str[lex_table.length-1]) == 's') && + !(my_tolower(ci, lex_table.str[0]) == 'i' && + my_tolower(ci, lex_table.str[1]) == 'n' && + my_tolower(ci, lex_table.str[2]) == 'n' && + my_tolower(ci, lex_table.str[3]) == 'o'))); +} + /* ======== Datafiles iterator ======== */ struct datafiles_iter_t { + datafiles_iter_t() : space(fil_system.space_list.end()), node(nullptr), started(FALSE) { + } + ~datafiles_iter_t() { + } space_list_t::iterator space = fil_system.space_list.end(); fil_node_t *node = nullptr; bool started = false; @@ -777,8 +967,6 @@ static void *dbug_execute_in_new_connection(void *arg) return nullptr; } -static pthread_t dbug_alter_thread; - /* Execute query from a new connection, in own thread. @@ -789,8 +977,9 @@ Execute query from a new connection, in own thread. otherwise query should return error. @param expected_errno - if not 0, and query finished with error, expected mysql_errno() +@return created thread id */ -static void dbug_start_query_thread( +static pthread_t dbug_start_query_thread( const char *query, const char *wait_state, int expected_err, @@ -802,12 +991,14 @@ static void dbug_start_query_thread( par->expect_err = expected_err; par->expect_errno = expected_errno; par->con = xb_mysql_connect(); - - mysql_thread_create(0, &dbug_alter_thread, nullptr, + if (mysql_set_server_option(par->con, MYSQL_OPTION_MULTI_STATEMENTS_ON)) + die("Can't set multistatement option for query: %s", query); + pthread_t result_thread; + mysql_thread_create(0, &result_thread, nullptr, dbug_execute_in_new_connection, par); if (!wait_state) - return; + return result_thread; char q[256]; snprintf(q, sizeof(q), @@ -829,7 +1020,11 @@ static void dbug_start_query_thread( end: msg("query '%s' on connection %lu reached state '%s'", query, mysql_thread_id(par->con), wait_state); + return result_thread; } + +static pthread_t dbug_alter_thread; +static pthread_t dbug_emulate_ddl_on_intermediate_table_thread; #endif void mdl_lock_all() @@ -952,6 +1147,31 @@ static void backup_file_op(uint32_t space_id, int type, } } +static bool check_if_fts_table(const char *file_name) { + const char *table_name_start = strrchr(file_name, '/'); + if (table_name_start) + ++table_name_start; + else + table_name_start = file_name; + + if (!starts_with(table_name_start,"FTS_")) + return false; + + const char *table_name_end = strrchr(table_name_start, '.'); + if (!table_name_end) + table_name_end = table_name_start + strlen(table_name_start); + ptrdiff_t table_name_len = table_name_end - table_name_end; + + for (const char **suffix = fts_common_tables; *suffix; ++suffix) + if (!strncmp(table_name_start, *suffix, table_name_len)) + return true; + for (size_t i = 0; fts_index_selector[i].suffix; ++i) + if (!strncmp(table_name_start, fts_index_selector[i].suffix, + table_name_len)) + return true; + + return false; +} /* This callback is called if DDL operation is detected, @@ -985,8 +1205,9 @@ static void backup_file_op_fail(uint32_t space_id, int type, break; case FILE_DELETE: fail = !check_if_skip_table( - filename_to_spacename(name, len).c_str()); - msg("DDL tracking : delete %u \"%.*s\"", space_id, int(len), name); + filename_to_spacename(name, len).c_str()) + && !check_if_fts_table(reinterpret_cast(name)); + msg("DDL tracking : delete %u \"%.*s\"", space_id, int(len), name); break; default: ut_ad(0); @@ -1112,6 +1333,7 @@ enum options_xtrabackup OPT_INNODB_LOG_FILE_BUFFERING, #endif OPT_INNODB_LOG_FILE_SIZE, + OPT_INNODB_LOG_FILES_IN_GROUP, OPT_INNODB_OPEN_FILES, OPT_XTRA_DEBUG_SYNC, OPT_INNODB_CHECKSUM_ALGORITHM, @@ -1129,9 +1351,9 @@ enum options_xtrabackup OPT_NO_LOCK, OPT_SAFE_SLAVE_BACKUP, OPT_RSYNC, + OPT_NO_BACKUP_LOCKS, OPT_FORCE_NON_EMPTY_DIRS, OPT_NO_VERSION_CHECK, - OPT_NO_BACKUP_LOCKS, OPT_DECOMPRESS, OPT_INCREMENTAL_HISTORY_NAME, OPT_INCREMENTAL_HISTORY_UUID, @@ -1343,8 +1565,10 @@ struct my_option xb_client_options[]= { 0, 0, 0, 0, 0, 0}, {"no-lock", OPT_NO_LOCK, - "Use this option to disable table lock " - "with \"FLUSH TABLES WITH READ LOCK\". Use it only if ALL your " + "This option should not be used as " + "mariadb-backup now is using BACKUP LOCKS, which minimizes the " + "lock time. ALTER TABLE can run in parallel with BACKUP LOCKS." + "Use the --no-lock option it only if ALL your " "tables are InnoDB and you DO NOT CARE about the binary log " "position of the backup. This option shouldn't be used if there " "are any DDL statements being executed or if any updates are " @@ -1373,14 +1597,12 @@ struct my_option xb_client_options[]= { GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"rsync", OPT_RSYNC, - "Uses the rsync utility to optimize local file " - "transfers. When this option is specified, " XB_TOOL_NAME " uses rsync " - "to copy all non-InnoDB files instead of spawning a separate cp for " - "each file, which can be much faster for servers with a large number " - "of databases or tables. This option cannot be used together with " - "--stream.", - (uchar *) &opt_rsync, (uchar *) &opt_rsync, 0, GET_BOOL, NO_ARG, 0, 0, 0, - 0, 0, 0}, + "Obsolete depricated option", + &ignored_option, &ignored_option, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"no-backup-locks", OPT_NO_BACKUP_LOCKS, + "Obsolete depricated option", + &ignored_option, &ignored_option, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"force-non-empty-directories", OPT_FORCE_NON_EMPTY_DIRS, "This " @@ -1398,15 +1620,6 @@ struct my_option xb_client_options[]= { (uchar *) &opt_noversioncheck, (uchar *) &opt_noversioncheck, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"no-backup-locks", OPT_NO_BACKUP_LOCKS, - "This option controls if " - "backup locks should be used instead of FLUSH TABLES WITH READ LOCK " - "on the backup stage. The option has no effect when backup locks are " - "not supported by the server. This option is enabled by default, " - "disable with --no-backup-locks.", - (uchar *) &opt_no_backup_locks, (uchar *) &opt_no_backup_locks, 0, - GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"decompress", OPT_DECOMPRESS, "Decompresses all files with the .qp " "extension in a backup previously made with the --compress option. " @@ -1483,11 +1696,10 @@ struct my_option xb_client_options[]= { (uchar *) &opt_remove_original, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-query-type", OPT_LOCK_WAIT_QUERY_TYPE, - "This option specifies which types of queries are allowed to complete " - "before " XB_TOOL_NAME " will issue the global lock. Default is all.", - (uchar *) &opt_lock_wait_query_type, (uchar *) &opt_lock_wait_query_type, - &query_type_typelib, GET_ENUM, REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, - 0}, + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, &query_type_typelib, GET_ENUM, + REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, 0}, {"kill-long-query-type", OPT_KILL_LONG_QUERY_TYPE, "This option specifies which types of queries should be killed to " @@ -1504,32 +1716,31 @@ struct my_option xb_client_options[]= { NULL, NULL, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, {"kill-long-queries-timeout", OPT_KILL_LONG_QUERIES_TIMEOUT, - "This option specifies the number of seconds " XB_TOOL_NAME " waits " - "between starting FLUSH TABLES WITH READ LOCK and killing those " - "queries that block it. Default is 0 seconds, which means " - XB_TOOL_NAME " will not attempt to kill any queries.", - (uchar *) &opt_kill_long_queries_timeout, - (uchar *) &opt_kill_long_queries_timeout, 0, GET_UINT, REQUIRED_ARG, 0, 0, + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, - "This option specifies time in seconds that " XB_TOOL_NAME " should wait " - "for queries that would block FTWRL before running it. If there are " - "still such queries when the timeout expires, " XB_TOOL_NAME " terminates " - "with an error. Default is 0, in which case " XB_TOOL_NAME " does not " - "wait for queries to complete and starts FTWRL immediately.", - (uchar *) &opt_lock_wait_timeout, (uchar *) &opt_lock_wait_timeout, 0, - GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + "Alias for startup-wait-timeout", + (uchar*) &opt_lock_wait_timeout, (uchar*) &opt_lock_wait_timeout, + 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"startup-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, + "This option specifies time in seconds that mariadb-backup should wait for " + "BACKUP STAGE START to complete. BACKUP STAGE START has to wait until all " + "currently running queries using explicite LOCK TABLES has ended. " + "If there are still such queries when the timeout expires, mariadb-backup " + "terminates with an error. Default is 0, in which case mariadb-backup waits " + "indefinitely for BACKUP STAGE START to finish", + (uchar*) &opt_lock_wait_timeout, (uchar*) &opt_lock_wait_timeout, + 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-threshold", OPT_LOCK_WAIT_THRESHOLD, - "This option specifies the query run time threshold which is used by " - XB_TOOL_NAME " to detect long-running queries with a non-zero value " - "of --ftwrl-wait-timeout. FTWRL is not started until such " - "long-running queries exist. This option has no effect if " - "--ftwrl-wait-timeout is 0. Default value is 60 seconds.", - (uchar *) &opt_lock_wait_threshold, (uchar *) &opt_lock_wait_threshold, 0, - GET_UINT, REQUIRED_ARG, 60, 0, 0, 0, 0, 0}, - + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, 0, GET_UINT, + REQUIRED_ARG, 60, 0, 0, 0, 0, 0}, {"safe-slave-backup-timeout", OPT_SAFE_SLAVE_BACKUP_TIMEOUT, "How many seconds --safe-slave-backup should wait for " @@ -1595,7 +1806,7 @@ struct my_option xb_server_options[] = {"parallel", OPT_XTRA_PARALLEL, "Number of threads to use for parallel datafiles transfer. " "The default value is 1.", - (G_PTR*) &xtrabackup_parallel, (G_PTR*) &xtrabackup_parallel, 0, GET_INT, + (G_PTR*) &xtrabackup_parallel, (G_PTR*) &xtrabackup_parallel, 0, GET_UINT, REQUIRED_ARG, 1, 1, INT_MAX, 0, 0, 0}, {"extended_validation", OPT_XTRA_EXTENDED_VALIDATION, @@ -1677,8 +1888,8 @@ struct my_option xb_server_options[] = {"innodb_log_buffer_size", OPT_INNODB_LOG_BUFFER_SIZE, "Redo log buffer size in bytes.", (G_PTR*) &log_sys.buf_size, (G_PTR*) &log_sys.buf_size, 0, - IF_WIN(GET_ULL,GET_ULONG), REQUIRED_ARG, 2U << 20, - 2U << 20, SIZE_T_MAX, 0, 4096, 0}, + GET_UINT, REQUIRED_ARG, 2U << 20, + 2U << 20, log_sys.buf_size_max, 0, 4096, 0}, #if defined __linux__ || defined _WIN32 {"innodb_log_file_buffering", OPT_INNODB_LOG_FILE_BUFFERING, "Whether the file system cache for ib_logfile0 is enabled during --backup", @@ -1754,17 +1965,17 @@ struct my_option xb_server_options[] = 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"plugin-dir", OPT_PLUGIN_DIR, - "Server plugin directory. Used to load plugins during 'prepare' phase." - "Has no effect in the 'backup' phase (plugin directory during backup is the same as server's)", - &xb_plugin_dir, &xb_plugin_dir, - 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + "Server plugin directory. Used to load plugins during 'prepare' phase." + "Has no effect in the 'backup' phase (plugin directory during backup is the same as server's)", + &xb_plugin_dir, &xb_plugin_dir, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, {"aria_log_dir_path", OPT_ARIA_LOG_DIR_PATH, "Path to individual files and their sizes.", &aria_log_dir_path, &aria_log_dir_path, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"open_files_limit", OPT_OPEN_FILES_LIMIT, "the maximum number of file " + {"open_files_limit", 0, "the maximum number of file " "descriptors to reserve with setrlimit().", (G_PTR*) &xb_open_files_limit, (G_PTR*) &xb_open_files_limit, 0, GET_ULONG, REQUIRED_ARG, 0, 0, UINT_MAX, 0, 1, 0}, @@ -1885,7 +2096,7 @@ static int prepare_export() IF_WIN("\"","") "\"%s\" --mysqld \"%s\"" " --defaults-extra-file=./backup-my.cnf --defaults-group-suffix=%s --datadir=." " --innodb --innodb-fast-shutdown=0 --loose-partition" - " --innodb-buffer-pool-size=%llu" + " --innodb_purge_rseg_truncate_frequency=1 --innodb-buffer-pool-size=%llu" " --console --skip-log-error --skip-log-bin --bootstrap %s< " BOOTSTRAP_FILENAME IF_WIN("\"",""), mariabackup_exe, @@ -1899,7 +2110,7 @@ static int prepare_export() IF_WIN("\"","") "\"%s\" --mysqld" " --defaults-file=./backup-my.cnf --defaults-group-suffix=%s --datadir=." " --innodb --innodb-fast-shutdown=0 --loose-partition" - " --innodb-buffer-pool-size=%llu" + " --innodb_purge_rseg_truncate_frequency=1 --innodb-buffer-pool-size=%llu" " --console --log-error= --skip-log-bin --bootstrap %s< " BOOTSTRAP_FILENAME IF_WIN("\"",""), mariabackup_exe, @@ -1948,7 +2159,8 @@ static void usage(void) puts("Open source backup tool for InnoDB and XtraDB\n\ \n\ Copyright (C) 2009-2015 Percona LLC and/or its affiliates.\n\ -Portions Copyright (C) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved.\n\ +Portions Copyright (C) 2000, 2011, MySQL AB & Innobase Oy.\n\ +Portions Copyright (C) 2017-2023 MariaDB Corporation / MariaDB Plc.\n\ \n\ This program is free software; you can redistribute it and/or\n\ modify it under the terms of the GNU General Public License\n\ @@ -2021,6 +2233,10 @@ xb_get_one_option(const struct my_option *opt, ADD_PRINT_PARAM_OPT(srv_log_group_home_dir); break; + case OPT_INNODB_LOG_FILES_IN_GROUP: + case OPT_INNODB_LOG_FILE_SIZE: + break; + case OPT_INNODB_FLUSH_METHOD: #ifdef _WIN32 /* From: storage/innobase/handler/ha_innodb.cc:innodb_init_params */ @@ -2133,6 +2349,11 @@ xb_get_one_option(const struct my_option *opt, } } break; + case OPT_RSYNC: + case OPT_NO_BACKUP_LOCKS: + if (my_handle_options_init_variables) + fprintf(stderr, "Obsolete option: %s. Ignored\n", opt->name); + break; #define MYSQL_CLIENT #include "sslopt-case.h" #undef MYSQL_CLIENT @@ -2428,7 +2649,12 @@ static bool innodb_init() os_file_delete_if_exists_func(ib_logfile0.c_str(), nullptr); os_file_t file= os_file_create_func(ib_logfile0.c_str(), OS_FILE_CREATE, OS_FILE_NORMAL, - OS_DATA_FILE_NO_O_DIRECT, false, &ret); +#if defined _WIN32 || defined O_DIRECT + OS_DATA_FILE_NO_O_DIRECT, +#else + OS_DATA_FILE, +#endif + false, &ret); if (!ret) { invalid_log: @@ -3026,12 +3252,7 @@ static my_bool xtrabackup_copy_datafile(ds_ctxt *ds_data, goto skip; } - if (!changed_page_bitmap) { - read_filter = &rf_pass_through; - } - else { - read_filter = &rf_bitmap; - } + read_filter = &rf_pass_through; res = xb_fil_cur_open(&cursor, read_filter, node, thread_n, ULLONG_MAX); if (res == XB_FIL_CUR_SKIP) { @@ -3355,50 +3576,22 @@ To use this facility, you need to 3. start mariabackup with --dbug=+d,debug_mariabackup_events */ void dbug_mariabackup_event(const char *event, - const fil_space_t::name_type key) + const fil_space_t::name_type key, + bool need_lock) { + static std::mutex dbug_mariabackup_event_mutex; char *sql = dbug_mariabackup_get_val(event, key); if (sql && *sql) { msg("dbug_mariabackup_event : executing '%s'", sql); - xb_mysql_query(mysql_connection, sql, false, true); - } + if (need_lock) { + std::lock_guard lock(dbug_mariabackup_event_mutex); + xb_mysql_query(mysql_connection, sql, false, true); + } else + xb_mysql_query(mysql_connection, sql, false, true); + } } #endif // DBUG_OFF -/** Datafiles copying thread.*/ -static void data_copy_thread_func(data_thread_ctxt_t *ctxt) /* thread context */ -{ - uint num = ctxt->num; - fil_node_t* node; - ut_ad(ctxt->corrupted_pages); - - /* - Initialize mysys thread-specific memory so we can - use mysys functions in this thread. - */ - my_thread_init(); - - while ((node = datafiles_iter_next(ctxt->it)) != NULL) { - DBUG_MARIABACKUP_EVENT("before_copy", node->space->name()); - DBUG_EXECUTE_FOR_KEY("wait_innodb_redo_before_copy", - node->space->name(), - backup_wait_for_lsn(get_current_lsn(mysql_connection));); - /* copy the datafile */ - if (xtrabackup_copy_datafile(ctxt->datasinks->m_data, - ctxt->datasinks->m_meta, node, num, NULL, - xtrabackup_incremental ? wf_incremental : wf_write_through, - *ctxt->corrupted_pages)) - die("failed to copy datafile."); - - DBUG_MARIABACKUP_EVENT("after_copy", node->space->name()); - } - - pthread_mutex_lock(ctxt->count_mutex); - (*ctxt->count)--; - pthread_mutex_unlock(ctxt->count_mutex); - - my_thread_end(); -} /************************************************************************ Initialize the appropriate datasink(s). Both local backups and streaming in the @@ -3553,6 +3746,11 @@ static void xb_load_single_table_tablespace(const char *dirname, } if (file->open_read_only(true) != DB_SUCCESS) { + // Ignore FTS tables, as they can be removed for intermediate tables, + // this code must be executed under stronger or equal to BLOCK_DDL lock, + // so there must not be errors for non-intermediate FTS tables. + if (check_if_fts_table(filname)) + return; die("Can't open datafile %s", name); } @@ -4558,7 +4756,6 @@ bool Backup_datasinks::backup_low() if (failed_ids.size() > 0) { return false; } - if (!xtrabackup_incremental) { safe_strcpy(metadata_type, sizeof(metadata_type), "full-backuped"); @@ -4597,16 +4794,441 @@ bool Backup_datasinks::backup_low() return true; } +class InnodbDataCopier { +public: + InnodbDataCopier(Backup_datasinks &backup_datasinks, + CorruptedPages &corrupted_pages, + ThreadPool &thread_pool) : + m_backup_datasinks(backup_datasinks), + m_corrupted_pages(corrupted_pages), + m_tasks(thread_pool) {} + + ~InnodbDataCopier() { + DBUG_ASSERT(m_tasks.is_finished()); + } + + bool start() { + DBUG_ASSERT(m_tasks.is_finished()); + m_tasks.push_task( + std::bind(&InnodbDataCopier::scan_job, this, std::placeholders::_1)); + return true; + } + + bool wait_for_finish() { + return m_tasks.wait_for_finish(); + } + +private: + void scan_job(unsigned thread_num) { + datafiles_iter_t it; + fil_node_t* node; + while ((node = datafiles_iter_next(&it)) != nullptr) { + m_tasks.push_task( + std::bind(&InnodbDataCopier::copy_job, this, node, + std::placeholders::_1)); + } + m_tasks.finish_task(1); + } + + void copy_job(fil_node_t *node, unsigned thread_num) { + DBUG_ASSERT(node); + // TODO: this came from the old code, where it was not thread-safe + // too, use separate mysql connection per thread here + DBUG_MARIABACKUP_EVENT("before_copy", node->space->name()); + DBUG_EXECUTE_FOR_KEY("wait_innodb_redo_before_copy", + node->space->name(), + backup_wait_for_lsn( + get_current_lsn(mysql_connection));); + /* copy the datafile */ + if(xtrabackup_copy_datafile(m_backup_datasinks.m_data, + m_backup_datasinks.m_meta, + node, thread_num, NULL, + xtrabackup_incremental + ? wf_incremental : wf_write_through, + m_corrupted_pages)) + die("mariabackup: Error: failed to copy datafile."); + // TODO: this came from the old code, where it was not thread-safe + // too, use separate mysql connection per thread here + DBUG_MARIABACKUP_EVENT("after_copy", node->space->name()); + m_tasks.finish_task(1); + } + + Backup_datasinks &m_backup_datasinks; + CorruptedPages &m_corrupted_pages; + TasksGroup m_tasks; +}; + + +class BackupStages { + + public: + + BackupStages(ds_ctxt_t *ds_data) : + m_bs_con(nullptr), + m_aria_backup(fil_path_to_mysql_datadir, + aria_log_dir_path, + ds_data, m_con_pool, m_thread_pool), + m_common_backup(fil_path_to_mysql_datadir, ds_data, m_con_pool, + m_thread_pool) {} + + ~BackupStages() { destroy(); } + + bool init() { + if ((m_bs_con = xb_mysql_connect()) == nullptr) + return false; + + while(m_con_pool.size() < xtrabackup_parallel) { + MYSQL *con = xb_mysql_connect(); + if (con == nullptr) + return false; + m_con_pool.push_back(con); + } + + if (!m_thread_pool.start(xtrabackup_parallel)) + return false; + if (!m_aria_backup.init()) + return false; + m_aria_backup.set_post_copy_table_hook( + std::bind(&BackupStages::store_table_version, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + m_common_backup.set_post_copy_table_hook( + std::bind(&BackupStages::store_table_version, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + return true; + } + + void destroy() { + m_thread_pool.stop(); + while (!m_con_pool.empty()) { + MYSQL *con = m_con_pool.back(); + m_con_pool.pop_back(); + mysql_close(con); + } + if (m_bs_con) + mysql_close(m_bs_con); + m_bs_con = nullptr; + } + + bool stage_start(Backup_datasinks &backup_datasinks, + CorruptedPages &corrupted_pages) { + msg("BACKUP STAGE START"); + if (!opt_no_lock) { + if (opt_safe_slave_backup) { + if (!wait_for_safe_slave(mysql_connection)) { + return(false); + } + } + + history_lock_time = time(NULL); + + if (!lock_for_backup_stage_start(m_bs_con)) { + msg("Error on BACKUP STAGE START query execution"); + return(false); + } + } + + InnodbDataCopier innodb_data_copier(backup_datasinks, + corrupted_pages, + m_thread_pool); + // Start InnoDB data files copy in background + if (!innodb_data_copier.start()) { + msg("Error on starting InnoDB data files backup"); + return false; + } + // Start online non-stats-log Aria tables copying in background + if (!m_aria_backup.start(opt_no_lock)) { + msg("Error on starting Aria data files backup"); + innodb_data_copier.wait_for_finish(); + return false; + } + + // Wait for all innodb data files copy finish + if(!innodb_data_copier.wait_for_finish()) { + msg("InnoDB data files backup process is finished with error"); + return false; + } + // Wait for online non-stats-log Aria tables copy finish + if (!m_aria_backup.wait_for_finish()) { + msg("Aria data files backup process is finished with error"); + return false; + } + + DBUG_MARIABACKUP_EVENT_LOCK("after_aria_background", {}); + + return true; + } + + bool stage_flush() { + msg("BACKUP STAGE FLUSH"); + if (!opt_no_lock && !lock_for_backup_stage_flush(m_bs_con)) { + msg("Error on BACKUP STAGE FLUSH query execution"); + return false; + } + auto tables_in_use = get_tables_in_use(mysql_connection); + // Copy non-stats-log non-in-use tables of non-InnoDB-Aria-RocksDB engines + // in background + if (!m_common_backup.scan(tables_in_use, + &m_copied_common_tables, opt_no_lock, true)) { + msg("Error on scan data directory for common engines"); + return false; + } + // Copy Aria offline non-stats-log non-in-use tables in background + if (!m_aria_backup.copy_offline_tables(&tables_in_use, opt_no_lock, + false)) { + msg("Error on start Aria tables backup"); + return false; + } + + if (!m_aria_backup.copy_log_tail()) { + msg("Error on Aria log tail copy"); + return false; + }; + + // Wait for Aria tables copy finish + if (!m_aria_backup.wait_for_finish()) { + msg("Aria data files backup process is finished with error"); + return false; + } + // Wait for non-InnoDB-Aria-RocksDB engines copy finish + if (!m_common_backup.wait_for_finish()) { + msg("Data files backup process is finished with error"); + return false; + } + + DBUG_EXECUTE_IF("emulate_ddl_on_intermediate_table", + dbug_emulate_ddl_on_intermediate_table_thread = + dbug_start_query_thread( + "SET debug_sync='copy_data_between_tables_after_set_backup_lock " + "SIGNAL copy_started';" + "SET debug_sync='copy_data_between_tables_before_reset_backup_lock " + "SIGNAL before_backup_lock_reset WAIT_FOR backup_lock_reset';" + "SET debug_sync='alter_table_after_temp_table_drop " + "SIGNAL temp_table_dropped';" + "SET SESSION lock_wait_timeout = 1;" + "ALTER TABLE test.t1 ADD COLUMN col1_copy INT, ALGORITHM = COPY;", + NULL, 0, 0); + xb_mysql_query(mysql_connection, + "SET debug_sync='now WAIT_FOR copy_started'", false, true); + ); + + return true; + } + + bool stage_block_ddl(Backup_datasinks &backup_datasinks, + CorruptedPages &corrupted_pages) { + if (!opt_no_lock) { + if (!lock_for_backup_stage_block_ddl(m_bs_con)) { + msg("BACKUP STAGE BLOCK_DDL"); + return false; + } + if (have_galera_enabled) + { + xb_mysql_query(mysql_connection, "SET SESSION wsrep_sync_wait=0", false); + } + } + + ulonglong server_lsn_after_lock = get_current_lsn(mysql_connection); + + // Copy the rest of non-stats-lognon-InnoDB-Aria-RocksDB tables + // Do not execute BACKUP LOCK under BLOCK_DDL stage + if (!m_common_backup.scan(m_copied_common_tables, &m_copied_common_tables, + true, false)) { + msg("Error on scan data directory for common engines"); + return false; + } + // Copy log tables tail + if (!m_common_backup.copy_log_tables(false)) { + msg("Error on copy system tables"); + return false; + } + + // Copy the rest of non-stats Aria tables in background + if (!m_aria_backup.copy_offline_tables(nullptr, true, false)) { + msg("Error on start Aria tables backup"); + return false; + } + + // Copy .frm, .trn and other files + if (!backup_files(backup_datasinks.m_data, + fil_path_to_mysql_datadir)) { + msg("Backup files error"); + return false; + } + + msg("Waiting for log copy thread to read lsn %llu", + server_lsn_after_lock); + backup_wait_for_lsn(server_lsn_after_lock); + corrupted_pages.backup_fix_ddl(backup_datasinks.m_data, + backup_datasinks.m_meta); + + if (!m_aria_backup.copy_log_tail()) { + msg("Error on Aria log tail copy"); + return false; + } + + // Wait for Aria tables copy finish + if (!m_aria_backup.wait_for_finish()) { + msg("Aria data files backup process is finished with error"); + return false; + } + // Wait for non-InnoDB-Aria-RocksDB engines copy finish + if (!m_common_backup.wait_for_finish()) { + msg("Data files backup process is finished with error"); + return false; + } + + ddl_log::backup(fil_path_to_mysql_datadir, + backup_datasinks.m_data, m_tables); + + DBUG_MARIABACKUP_EVENT_LOCK("after_stage_block_ddl", {}); + + return true; + } + + bool stage_block_commit(Backup_datasinks &backup_datasinks) { + msg("BACKUP STAGE BLOCK_COMMIT"); + if (!opt_no_lock && !lock_for_backup_stage_commit(m_bs_con)) { + msg("Error on BACKUP STAGE BLOCK_COMMIT query execution"); + return false; + } + + // Copy log tables tail + if (!m_common_backup.copy_log_tables(true)) { + msg("Error on copy log tables"); + return false; + } + + // Copy stats tables + if (!m_common_backup.copy_stats_tables()) { + msg("Error on copy stats tables"); + return false; + } + + // Copy system Aria files + if (!m_aria_backup.finalize()) { + msg("Error on finalize Aria tables backup"); + return false; + } + + if (!m_common_backup.wait_for_finish()) { + msg("Error on finish common engines backup"); + return false; + } + + if (!m_common_backup.close_log_tables()) { + msg("Error on close log tables"); + return false; + } + + if (!backup_files_from_datadir(backup_datasinks.m_data, + fil_path_to_mysql_datadir, + "aws-kms-key")) { + msg("Error on root data dir files backup"); + return false; + } + + if (has_rocksdb_plugin()) { + rocksdb_create_checkpoint(); + } + + // There is no need to stop slave thread before coping non-Innodb data when + // --no-lock option is used because --no-lock option requires that no DDL or + // DML to non-transaction tables can occur. + if (opt_no_lock) { + if (opt_safe_slave_backup) { + if (!wait_for_safe_slave(mysql_connection)) { + return(false); + } + } + } + + if (opt_slave_info) { + if (!write_slave_info(backup_datasinks.m_data, + mysql_connection)) { + return(false); + } + } + + /* The only reason why Galera/binlog info is written before + wait_for_ibbackup_log_copy_finish() is that after that call the xtrabackup + binary will start streamig a temporary copy of REDO log to stdout and + thus, any streaming from innobackupex would interfere. The only way to + avoid that is to have a single process, i.e. merge innobackupex and + xtrabackup. */ + if (opt_galera_info) { + if (!write_galera_info(backup_datasinks.m_data, + mysql_connection)) { + return(false); + } + } + + bool with_binlogs = opt_binlog_info == BINLOG_INFO_ON; + + if (with_binlogs || opt_galera_info) { + if (!write_binlog_info(backup_datasinks.m_data, + mysql_connection)) { + return(false); + } + } + + if (!opt_no_lock) { + msg("Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS..."); + xb_mysql_query(mysql_connection, + "FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS", false); + } + + return backup_datasinks.backup_low(); + } + + bool stage_end(Backup_datasinks &backup_datasinks) { + msg("BACKUP STAGE END"); + /* release all locks */ + if (!opt_no_lock) { + unlock_all(m_bs_con); + history_lock_time = 0; + } else { + history_lock_time = time(NULL) - history_lock_time; + } + backup_release(); + DBUG_EXECUTE_IF("check_mdl_lock_works", + pthread_join(dbug_alter_thread, nullptr); + ); + + DBUG_EXECUTE_IF("emulate_ddl_on_intermediate_table", + pthread_join( + dbug_emulate_ddl_on_intermediate_table_thread, + nullptr); + ); + + backup_finish(backup_datasinks.m_data); + return true; + } + + void store_table_version( + std::string db, std::string table, std::string table_version) { + auto tk = table_key(db, table); + std::lock_guard lock(m_tables_mutex); + m_tables[std::move(tk)] = std::move(table_version); + } + + private: + Backup_datasinks *backup_datasinks; + MYSQL *m_bs_con; + ThreadPool m_thread_pool; + std::vector m_con_pool; + std::mutex m_tables_mutex; + ddl_log::tables_t m_tables; + aria::Backup m_aria_backup; + common_engine::Backup m_common_backup; + std::unordered_set m_copied_common_tables; +}; + /** Implement --backup @return whether the operation succeeded */ static bool xtrabackup_backup_func() { MY_STAT stat_info; - uint i; - uint count; - pthread_mutex_t count_mutex; CorruptedPages corrupted_pages; - data_thread_ctxt_t *data_threads; Backup_datasinks backup_datasinks; pthread_cond_init(&scanned_lsn_cond, NULL); @@ -4622,7 +5244,7 @@ static bool xtrabackup_backup_func() return(false); } msg("cd to %s", mysql_real_data_home); - xb_plugin_backup_init(mysql_connection); + encryption_plugin_backup_init(mysql_connection); msg("open files limit requested %lu, set to %lu", xb_open_files_limit, xb_set_max_open_files(xb_open_files_limit)); @@ -4663,22 +5285,6 @@ fail: return(false); } - if (srv_buf_pool_size >= 1000 * 1024 * 1024) { - /* Here we still have srv_pool_size counted - in kilobytes (in 4.0 this was in bytes) - srv_boot() converts the value to - pages; if buffer pool is less than 1000 MB, - assume fewer threads. */ - srv_max_n_threads = 50000; - - } else if (srv_buf_pool_size >= 8 * 1024 * 1024) { - - srv_max_n_threads = 10000; - } else { - srv_max_n_threads = 1000; /* saves several MB of memory, - especially in 64-bit - computers */ - } srv_thread_pool_init(); /* Reset the system variables in the recovery module. */ trx_pool_init(); @@ -4698,9 +5304,10 @@ fail: } /* get current checkpoint_lsn */ { + log_sys.latch.wr_lock(SRW_LOCK_CALL); mysql_mutex_lock(&recv_sys.mutex); - dberr_t err = recv_sys.find_checkpoint(); + log_sys.latch.wr_unlock(); if (err != DB_SUCCESS) { msg("Error: cannot read redo log header"); @@ -4796,11 +5403,6 @@ fail: std::thread(log_copying_thread).detach(); - /* FLUSH CHANGED_PAGE_BITMAPS call */ - if (!flush_changed_page_bitmaps()) { - goto fail; - } - ut_a(xtrabackup_parallel > 0); if (xtrabackup_parallel > 1) { @@ -4812,71 +5414,36 @@ fail: mdl_lock_all(); DBUG_EXECUTE_IF("check_mdl_lock_works", - dbug_start_query_thread("ALTER TABLE test.t ADD COLUMN mdl_lock_column int", + dbug_alter_thread = + dbug_start_query_thread("ALTER TABLE test.t ADD COLUMN mdl_lock_column int", "Waiting for table metadata lock", 0, 0);); } - datafiles_iter_t it; - - /* Create data copying threads */ - data_threads = (data_thread_ctxt_t *) - malloc(sizeof(data_thread_ctxt_t) * xtrabackup_parallel); - count = xtrabackup_parallel; - pthread_mutex_init(&count_mutex, NULL); - - for (i = 0; i < (uint) xtrabackup_parallel; i++) { - data_threads[i].it = ⁢ - data_threads[i].num = i+1; - data_threads[i].count = &count; - data_threads[i].count_mutex = &count_mutex; - data_threads[i].corrupted_pages = &corrupted_pages; - data_threads[i].datasinks= &backup_datasinks; - std::thread(data_copy_thread_func, data_threads + i).detach(); - } + BackupStages stages(backup_datasinks.m_data); - /* Wait for threads to exit */ - while (1) { - std::this_thread::sleep_for(std::chrono::seconds(1)); - pthread_mutex_lock(&count_mutex); - bool stop = count == 0; - pthread_mutex_unlock(&count_mutex); - if (stop) { - break; - } - } - - pthread_mutex_destroy(&count_mutex); - free(data_threads); - - DBUG_ASSERT(backup_datasinks.m_data); - DBUG_ASSERT(backup_datasinks.m_meta); - bool ok = backup_start(backup_datasinks.m_data, - backup_datasinks.m_meta, corrupted_pages); + if (!stages.init()) + goto fail; - if (ok) { - ok = backup_datasinks.backup_low(); + if (!stages.stage_start(backup_datasinks, corrupted_pages)) + goto fail; - backup_release(); + if (!stages.stage_flush()) + goto fail; - DBUG_EXECUTE_IF("check_mdl_lock_works", - pthread_join(dbug_alter_thread, nullptr);); + if (!stages.stage_block_ddl(backup_datasinks, corrupted_pages)) + goto fail; - if (ok) { - backup_finish(backup_datasinks.m_data); - } - } + if (!stages.stage_block_commit(backup_datasinks)) + goto fail; - if (opt_log_innodb_page_corruption) - ok = corrupted_pages.print_to_file(backup_datasinks.m_data, - MB_CORRUPTED_PAGES_FILE); + if (!stages.stage_end(backup_datasinks)) + goto fail; - if (!ok) { + if (opt_log_innodb_page_corruption + && !corrupted_pages.print_to_file(backup_datasinks.m_data, + MB_CORRUPTED_PAGES_FILE)) goto fail; - } - if (changed_page_bitmap) { - xb_page_bitmap_deinit(changed_page_bitmap); - } backup_datasinks.destroy(); msg("Redo log (from LSN " LSN_PF " to " LSN_PF ") was copied.", @@ -4938,6 +5505,12 @@ void CorruptedPages::backup_fix_ddl(ds_ctxt *ds_data, ds_ctxt *ds_meta) DBUG_MARIABACKUP_EVENT("backup_fix_ddl", {}); + DBUG_EXECUTE_IF("emulate_ddl_on_intermediate_table", + xb_mysql_query(mysql_connection, + "SET debug_sync='now SIGNAL backup_lock_reset " + "WAIT_FOR temp_table_dropped'", false, true); + ); + for (space_id_to_name_t::iterator iter = ddl_tracker.tables_in_backup.begin(); iter != ddl_tracker.tables_in_backup.end(); iter++) { @@ -5082,6 +5655,7 @@ void CorruptedPages::backup_fix_ddl(ds_ctxt *ds_data, ds_ctxt *ds_meta) } } + /* ================= prepare ================= */ /*********************************************************************** @@ -5568,7 +6142,7 @@ std::string change_extension(std::string filename, std::string new_ext) { } -static void rename_file(const char *from,const char *to) { +void rename_file(const char *from,const char *to) { msg("Renaming %s to %s\n", from, to); if (my_rename(from, to, MY_WME)) { die("Can't rename %s to %s errno %d", from, to, errno); @@ -5590,7 +6164,7 @@ typedef ibool (*handle_datadir_entry_func_t)( void* arg); /*! /dev/null 2>&1") == 0)); - if (!have_rsync) - { - msg("Error: rsync executable not found, cannot run backup with --rsync\n"); - return false; - } - } - n_mixed_options = 0; if (opt_decompress) { @@ -6493,6 +7053,7 @@ xb_init() if (opt_check_privileges && !check_all_privileges()) { return(false); } + history_start_time = time(NULL); } diff --git a/extra/mariabackup/xtrabackup.h b/extra/mariabackup/xtrabackup.h index d091c474..38d7e5fd 100644 --- a/extra/mariabackup/xtrabackup.h +++ b/extra/mariabackup/xtrabackup.h @@ -24,8 +24,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA #include #include "datasink.h" #include "xbstream.h" -#include "changed_page_bitmap.h" +#include "fil0fil.h" #include +#include "handler.h" + +#include +#include +#include +#include + #define XB_TOOL_NAME "mariadb-backup" #define XB_HISTORY_TABLE "mysql.mariadb_backup_history" @@ -84,8 +91,6 @@ extern my_bool xb_backup_rocksdb; extern uint opt_protocol; -extern xb_page_bitmap *changed_page_bitmap; - extern char *xtrabackup_incremental; extern my_bool xtrabackup_incremental_force_scan; @@ -112,7 +117,7 @@ extern my_bool xtrabackup_decrypt_decompress; extern char *innobase_data_file_path; extern longlong innobase_page_size; -extern int xtrabackup_parallel; +extern uint xtrabackup_parallel; extern my_bool xb_close_files; extern const char *xtrabackup_compress_alg; @@ -131,7 +136,6 @@ extern my_bool opt_galera_info; extern my_bool opt_slave_info; extern my_bool opt_no_lock; extern my_bool opt_safe_slave_backup; -extern my_bool opt_rsync; extern my_bool opt_force_non_empty_dirs; extern my_bool opt_noversioncheck; extern my_bool opt_no_backup_locks; @@ -288,15 +292,40 @@ fil_file_readdir_next_file( os_file_stat_t* info); /*!< in/out: buffer where the info is returned */ -#ifndef DBUG_OFF -#include -extern void dbug_mariabackup_event(const char *event, - const fil_space_t::name_type key); +const char *convert_dst(const char *dst); -#define DBUG_MARIABACKUP_EVENT(A, B) \ - DBUG_EXECUTE_IF("mariabackup_events", dbug_mariabackup_event(A, B);) -#else -#define DBUG_MARIABACKUP_EVENT(A, B) /* empty */ -#endif // DBUG_OFF +std::string get_table_version_from_image(const std::vector &frm_image); +std::pair + get_table_engine_from_image(const std::vector &frm_image); +std::string read_table_version_id(File file); + +std::string convert_tablename_to_filepath( + const char *data_dir_path, const std::string &db, const std::string &table); + +std::tuple +convert_filepath_to_tablename(const char *filepath); + +typedef std::string table_key_t; + +inline table_key_t table_key(const std::string &db, const std::string &table) { + return std::string(db).append(".").append(table); +}; + +inline table_key_t table_key(const char *db, const char *table) { + return std::string(db).append(".").append(table); +}; + +typedef std::function + post_copy_table_hook_t; + +my_bool +check_if_skip_table( +/******************/ + const char* name); /*!< in: path to the table */ + +bool is_log_table(const char *dbname, const char *tablename); +bool is_stats_table(const char *dbname, const char *tablename); +extern my_bool xtrabackup_copy_back; +extern my_bool xtrabackup_move_back; #endif /* XB_XTRABACKUP_H */ diff --git a/extra/wolfssl/CMakeLists.txt b/extra/wolfssl/CMakeLists.txt index 271e76b8..e3f8da21 100644 --- a/extra/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/CMakeLists.txt @@ -1,86 +1,57 @@ IF(MSVC_INTEL) PROJECT(wolfssl C ASM_MASM) ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64") - PROJECT(wolfssl C ASM) + PROJECT(wolfssl C ASM) ELSE() PROJECT(wolfssl C) ENDIF() IF(CMAKE_SIZEOF_VOID_P MATCHES 8) -IF(MSVC_INTEL) +IF(MSVC_INTEL AND NOT (CMAKE_C_COMPILER_ID MATCHES Clang)) SET(WOLFSSL_INTELASM ON) - SET(WOLFSSL_X86_64_BUILD 1) SET(HAVE_INTEL_RDSEED 1) SET(HAVE_INTEL_RDRAND 1) -ELSEIF(CMAKE_ASM_COMPILER_ID MATCHES "Clang" AND CMAKE_VERSION VERSION_LESS 3.16) - - # WolfSSL 5.5.4 bug workaround below does not work, due to some CMake bug ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64") - SET(WOLFSSL_X86_64_BUILD 1) IF(CMAKE_C_COMPILER_ID MATCHES GNU AND CMAKE_C_COMPILER_VERSION VERSION_LESS 4.9) MESSAGE_ONCE(NO_INTEL_ASSEMBLY "Disable Intel assembly for WolfSSL - compiler is too old") + ELSEIF(WITH_MSAN) + MESSAGE_ONCE(MSAN_CANT_HANDLE_IT "Disable Intel assembly for WolfSSL - MSAN can't handle it") ELSE() - IF(WITH_MSAN) - MESSAGE_ONCE(MSAN_CANT_HANDLE_IT - "Disable Intel assembly for WolfSSL - MSAN can't handle it") - ELSE() - MY_CHECK_C_COMPILER_FLAG(-maes) - MY_CHECK_C_COMPILER_FLAG(-msse4) - MY_CHECK_C_COMPILER_FLAG(-mpclmul) - IF(have_C__maes AND have_C__msse4 AND have_C__mpclmul) - SET(WOLFSSL_INTELASM ON) + MY_CHECK_C_COMPILER_FLAG(-maes) + MY_CHECK_C_COMPILER_FLAG(-msse4) + MY_CHECK_C_COMPILER_FLAG(-mpclmul) + IF(have_C__maes AND have_C__msse4 AND have_C__mpclmul) + SET(WOLFSSL_INTELASM ON) + MY_CHECK_C_COMPILER_FLAG(-mrdrnd) + MY_CHECK_C_COMPILER_FLAG(-mrdseed) + IF(have_C__mrdrnd) + SET(HAVE_INTEL_RDRAND ON) + ENDIF() + IF(have_C__mrdseed) + SET(HAVE_INTEL_RDSEED ON) ENDIF() - ENDIF() - MY_CHECK_C_COMPILER_FLAG(-mrdrnd) - MY_CHECK_C_COMPILER_FLAG(-mrdseed) - IF(have_C__mrdrnd) - SET(HAVE_INTEL_RDRAND ON) - ENDIF() - IF(have_C__mrdseed) - SET(HAVE_INTEL_RDSEED ON) ENDIF() ENDIF() ENDIF() ENDIF() SET(WOLFSSL_SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/src) +SET(WOLFCRYPT_SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/wolfcrypt/src) ADD_DEFINITIONS(${SSL_DEFINES}) - -SET(WOLFSSL_SOURCES - ${WOLFSSL_SRCDIR}/crl.c - ${WOLFSSL_SRCDIR}/internal.c - ${WOLFSSL_SRCDIR}/keys.c - ${WOLFSSL_SRCDIR}/tls.c - ${WOLFSSL_SRCDIR}/wolfio.c - ${WOLFSSL_SRCDIR}/ocsp.c - ${WOLFSSL_SRCDIR}/ssl.c - ${WOLFSSL_SRCDIR}/tls13.c) - ADD_DEFINITIONS(-DWOLFSSL_LIB -DBUILDING_WOLFSSL) - +ADD_DEFINITIONS(-DWOLFSSL_SP_4096) INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl) -IF(MSVC) - # size_t to long truncation warning - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -wd4267 -wd4334 -wd4028 -wd4244") -ENDIF() - -ADD_CONVENIENCE_LIBRARY(wolfssl ${WOLFSSL_SOURCES}) - -# Workaround linker crash with older Ubuntu binutils -# e.g aborting at ../../bfd/merge.c line 873 in _bfd_merged_section_offset -IF(CMAKE_SYSTEM_NAME MATCHES "Linux") - STRING(REPLACE "-g " "-g1 " CMAKE_C_FLAGS_RELWITHDEBINFO - ${CMAKE_C_FLAGS_RELWITHDEBINFO}) - STRING(REPLACE "-g " "-g1 " CMAKE_C_FLAGS_DEBUG - ${CMAKE_C_FLAGS_DEBUG}) - STRING(REPLACE "-ggdb3 " " " CMAKE_C_FLAGS_RELWITHDEBINFO - ${CMAKE_C_FLAGS_RELWITHDEBINFO}) - STRING(REPLACE "-ggdb3 " " " CMAKE_C_FLAGS_DEBUG - ${CMAKE_C_FLAGS_DEBUG}) -ENDIF() +INCLUDE_DIRECTORIES(${SSL_INCLUDE_DIRS}) -SET(WOLFCRYPT_SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/wolfcrypt/src) -SET(WOLFCRYPT_SOURCES +add_library(wolfssl STATIC +${WOLFSSL_SRCDIR}/crl.c +${WOLFSSL_SRCDIR}/internal.c +${WOLFSSL_SRCDIR}/keys.c +${WOLFSSL_SRCDIR}/tls.c +${WOLFSSL_SRCDIR}/wolfio.c +${WOLFSSL_SRCDIR}/ocsp.c +${WOLFSSL_SRCDIR}/ssl.c +${WOLFSSL_SRCDIR}/tls13.c ${WOLFCRYPT_SRCDIR}/aes.c ${WOLFCRYPT_SRCDIR}/arc4.c ${WOLFCRYPT_SRCDIR}/asn.c @@ -110,69 +81,56 @@ ${WOLFCRYPT_SRCDIR}/wc_encrypt.c ${WOLFCRYPT_SRCDIR}/hash.c ${WOLFCRYPT_SRCDIR}/wolfmath.c ${WOLFCRYPT_SRCDIR}/kdf.c +${WOLFCRYPT_SRCDIR}/sp_int.c +${WOLFCRYPT_SRCDIR}/sp_c32.c +${WOLFCRYPT_SRCDIR}/sp_c64.c ) -# Use fastmath large number math library. -IF(NOT (MSVC AND CMAKE_C_COMPILER_ID MATCHES Clang)) - # Can't use clang-cl with WOLFSSL_FASTMATH - # due to https://bugs.llvm.org/show_bug.cgi?id=25305 - SET(WOLFSSL_FASTMATH 1) -ENDIF() - -IF(WOLFSSL_FASTMATH) - SET(USE_FAST_MATH 1) - SET(TFM_TIMING_RESISTANT 1) - # FP_MAX_BITS is set high solely to satisfy ssl_8k_key.test - # WolfSSL will use more stack space with it - SET(FP_MAX_BITS 16384) - SET(WOLFCRYPT_SOURCES ${WOLFCRYPT_SOURCES} ${WOLFCRYPT_SRCDIR}/tfm.c) - IF((CMAKE_SIZEOF_VOID_P MATCHES 4) AND (CMAKE_SYSTEM_PROCESSOR MATCHES "86") - AND (NOT MSVC)) - # Workaround https://github.com/wolfSSL/wolfssl/issues/4245 - # On 32bit Intel, to satisfy inline assembly's wish for free registers - # 1. use -fomit-frame-pointer - # 2. With GCC 4, additionally use -fno-PIC, which works on x86 - # (modern GCC has PIC optimizations, that make it unnecessary) - # The following assumes GCC or Clang - SET(TFM_COMPILE_FLAGS "-fomit-frame-pointer") - IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "5") - SET(TFM_COMPILE_FLAGS "${TFM_COMPILE_FLAGS} -fno-PIC") - ENDIF() - SET_SOURCE_FILES_PROPERTIES(${WOLFCRYPT_SRCDIR}/tfm.c - PROPERTIES COMPILE_FLAGS ${TFM_COMPILE_FLAGS}) - ENDIF() -ELSE() - SET(WOLFSSL_SP_MATH_ALL 1) - SET(WOLFCRYPT_SOURCES ${WOLFCRYPT_SOURCES} ${WOLFCRYPT_SRCDIR}/sp_int.c) -ENDIF() - -IF(WOLFSSL_X86_64_BUILD) - LIST(APPEND WOLFCRYPT_SOURCES ${WOLFCRYPT_SRCDIR}/cpuid.c) - IF(MSVC) - SET(WOLFSSL_AESNI 1) - LIST(APPEND WOLFCRYPT_SOURCES - ${WOLFCRYPT_SRCDIR}/aes_asm.asm - ${WOLFCRYPT_SRCDIR}/aes_gcm_asm.asm) - IF(CMAKE_C_COMPILER_ID MATCHES Clang) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes -msse4.2 -mpclmul -mrdrnd -mrdseed") - ENDIF() - ELSEIF(WOLFSSL_INTELASM) - SET(WOLFSSL_AESNI 1) - SET(USE_INTEL_SPEEDUP 1) - LIST(APPEND WOLFCRYPT_SOURCES +# Optimizations, assembly +if(WOLFSSL_INTELASM) + set(WOLFSSL_X86_64_BUILD 1) + set(WOLFSSL_SP_X86_64 1) + set(WOLFSSL_SP_X86_64_ASM 1) + set(WOLFSSL_AESNI 1) + target_sources(wolfssl PRIVATE + ${WOLFCRYPT_SRCDIR}/cpuid.c + ${WOLFCRYPT_SRCDIR}/sp_x86_64.c + ) + if(MSVC_INTEL) + target_sources(wolfssl PRIVATE + ${WOLFCRYPT_SRCDIR}/aes_asm.asm + ${WOLFCRYPT_SRCDIR}/aes_gcm_asm.asm + ${WOLFCRYPT_SRCDIR}/sp_x86_64_asm.asm + ) + target_compile_options(wolfssl PRIVATE + $<$:-maes -msse4.2 -mpclmul -mrdrnd -mrdseed> + $<$:/Zi> + ) + else() + set(USE_INTEL_SPEEDUP 1) + target_sources(wolfssl PRIVATE ${WOLFCRYPT_SRCDIR}/aes_asm.S ${WOLFCRYPT_SRCDIR}/aes_gcm_asm.S ${WOLFCRYPT_SRCDIR}/chacha_asm.S ${WOLFCRYPT_SRCDIR}/poly1305_asm.S ${WOLFCRYPT_SRCDIR}/sha512_asm.S - ${WOLFCRYPT_SRCDIR}/sha256_asm.S) - ADD_DEFINITIONS(-maes -msse4.2 -mpclmul) - # WolfSSL 5.5.4 bug - user_settings.h not included into aes_asm.S - SET_PROPERTY(SOURCE ${WOLFCRYPT_SRCDIR}/aes_asm.S APPEND PROPERTY COMPILE_OPTIONS "-DWOLFSSL_X86_64_BUILD") - ENDIF() -ENDIF() + ${WOLFCRYPT_SRCDIR}/sha256_asm.S + ${WOLFCRYPT_SRCDIR}/sp_x86_64_asm.S + ) + target_compile_options(wolfssl PRIVATE -maes -msse4.2 -mpclmul) + # Workaround 5.5.4 bug (user_settings.h not included into aes_asm.S) + set_property(SOURCE ${WOLFCRYPT_SRCDIR}/aes_asm.S APPEND PROPERTY COMPILE_OPTIONS "-DWOLFSSL_X86_64_BUILD") + endif() +endif() + +# Silence some warnings +if(MSVC) + # truncation warnings + target_compile_options(wolfssl PRIVATE $<$:/wd4244>) + if(CMAKE_C_COMPILER_ID MATCHES Clang) + target_compile_options(wolfssl PRIVATE $<$:-Wno-incompatible-function-pointer-types>) + endif() +endif() CONFIGURE_FILE(user_settings.h.in user_settings.h) -INCLUDE_DIRECTORIES(${SSL_INCLUDE_DIRS}) -ADD_CONVENIENCE_LIBRARY(wolfcrypt ${WOLFCRYPT_SOURCES}) diff --git a/extra/wolfssl/user_settings.h.in b/extra/wolfssl/user_settings.h.in index baa64fcd..489118b3 100644 --- a/extra/wolfssl/user_settings.h.in +++ b/extra/wolfssl/user_settings.h.in @@ -21,6 +21,7 @@ #define HAVE_AESGCM #define HAVE_CHACHA #define HAVE_POLY1305 +#define HAVE_THREAD_LS #define WOLFSSL_AES_COUNTER #define NO_WOLFSSL_STUB #define OPENSSL_ALL @@ -51,20 +52,19 @@ #define NO_RABBIT #define NO_RC4 -/* - FP_MAX_BITS is set high solely to satisfy ssl_8k_key.test - WolfSSL will use more stack space with it, with fastmath -*/ -#cmakedefine FP_MAX_BITS 16384 #define RSA_MAX_SIZE 8192 +#define WOLFSSL_SP_MATH_ALL +#define WOLFSSL_HAVE_SP_RSA +#ifndef WOLFSSL_SP_4096 +#define WOLFSSL_SP_4096 +#endif + #cmakedefine WOLFSSL_AESNI -#cmakedefine USE_FAST_MATH -#cmakedefine TFM_TIMING_RESISTANT #cmakedefine HAVE_INTEL_RDSEED #cmakedefine HAVE_INTEL_RDRAND #cmakedefine USE_INTEL_SPEEDUP -#cmakedefine USE_FAST_MATH #cmakedefine WOLFSSL_X86_64_BUILD -#cmakedefine WOLFSSL_SP_MATH_ALL +#cmakedefine WOLFSSL_SP_X86_64 +#cmakedefine WOLFSSL_SP_X86_64_ASM #endif /* WOLFSSL_USER_SETTINGS_H */ diff --git a/extra/wolfssl/wolfssl/.github/workflows/async.yml b/extra/wolfssl/wolfssl/.github/workflows/async.yml index 84eb4c58..36f50265 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/async.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/async.yml @@ -18,7 +18,7 @@ jobs: # This should be a safe limit for the tests to run. timeout-minutes: 6 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 name: Checkout wolfSSL - name: Test wolfSSL async diff --git a/extra/wolfssl/wolfssl/.github/workflows/curl.yml b/extra/wolfssl/wolfssl/.github/workflows/curl.yml index fe6350e7..69840eb6 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/curl.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/curl.yml @@ -18,11 +18,11 @@ jobs: install: true - name: Upload built lib - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wolf-install-curl path: build-dir - retention-days: 1 + retention-days: 5 test_curl: name: ${{ matrix.curl_ref }} @@ -38,11 +38,11 @@ jobs: - name: Install test dependencies run: | sudo apt-get update - sudo apt-get install nghttp2 + sudo apt-get install nghttp2 libpsl5 libpsl-dev sudo pip install impacket - name: Download lib - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wolf-install-curl path: build-dir diff --git a/extra/wolfssl/wolfssl/.github/workflows/docker-Espressif.yml b/extra/wolfssl/wolfssl/.github/workflows/docker-Espressif.yml index 9b9b9be2..4990e928 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/docker-Espressif.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/docker-Espressif.yml @@ -11,7 +11,7 @@ jobs: container: image: espressif/idf:latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Initialize Espressif IDE and build examples run: . /opt/esp/idf/export.sh; IDE/Espressif/ESP-IDF/compileAllExamples.sh espressif_v4_4: @@ -20,7 +20,7 @@ jobs: container: image: espressif/idf:release-v4.4 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Initialize Espressif IDE and build examples run: . /opt/esp/idf/export.sh; IDE/Espressif/ESP-IDF/compileAllExamples.sh espressif_v5_0: @@ -29,6 +29,6 @@ jobs: container: image: espressif/idf:release-v5.0 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Initialize Espressif IDE and build examples run: . /opt/esp/idf/export.sh; IDE/Espressif/ESP-IDF/compileAllExamples.sh diff --git a/extra/wolfssl/wolfssl/.github/workflows/docker-OpenWrt.yml b/extra/wolfssl/wolfssl/.github/workflows/docker-OpenWrt.yml index aa827895..3c348b62 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/docker-OpenWrt.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/docker-OpenWrt.yml @@ -16,15 +16,15 @@ jobs: steps: - name: Install required tools run: apk add argp-standalone asciidoc bash bc binutils bzip2 cdrkit coreutils diffutils elfutils-dev findutils flex musl-fts-dev g++ gawk gcc gettext git grep intltool libxslt linux-headers make musl-libintl musl-obstack-dev ncurses-dev openssl-dev patch perl python3-dev rsync tar unzip util-linux wget zlib-dev autoconf automake libtool - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Compile libwolfssl.so run: ./autogen.sh && ./configure --enable-all && make - name: Upload libwolfssl.so - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: openwrt-libwolfssl.so path: src/.libs/libwolfssl.so - retention-days: 1 + retention-days: 5 compile_container: name: Compile container runs-on: ubuntu-latest @@ -34,16 +34,16 @@ jobs: strategy: fail-fast: false matrix: - release: [ "22.03-SNAPSHOT", "21.02-SNAPSHOT" ] # some other versions: 21.02.0 21.02.5 22.03.0 22.03.3 snapshot + release: [ "22.03.6", "21.02.7" ] # some other versions: 21.02.0 21.02.5 22.03.0 22.03.3 snapshot steps: - - uses: actions/checkout@v3 - - uses: docker/setup-buildx-action@v2 - - uses: actions/download-artifact@v3 + - uses: actions/checkout@v4 + - uses: docker/setup-buildx-action@v3 + - uses: actions/download-artifact@v4 with: name: openwrt-libwolfssl.so path: Docker/OpenWrt/. - name: Build but dont push - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v5 with: context: Docker/OpenWrt platforms: linux/amd64 diff --git a/extra/wolfssl/wolfssl/.github/workflows/haproxy.yml b/extra/wolfssl/wolfssl/.github/workflows/haproxy.yml index 54a52b8c..9c7047bc 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/haproxy.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/haproxy.yml @@ -21,7 +21,7 @@ jobs: install: true - name: Checkout VTest - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: vtest/VTest path: VTest @@ -32,7 +32,7 @@ jobs: run: make FLAGS='-O2 -s -Wall' - name: Checkout HaProxy - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: haproxy/haproxy path: haproxy diff --git a/extra/wolfssl/wolfssl/.github/workflows/hitch.yml b/extra/wolfssl/wolfssl/.github/workflows/hitch.yml index a7f745db..13b933fd 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/hitch.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/hitch.yml @@ -19,11 +19,11 @@ jobs: install: true - name: Upload built lib - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wolf-install-hitch path: build-dir - retention-days: 1 + retention-days: 5 hitch_check: strategy: @@ -41,13 +41,13 @@ jobs: needs: build_wolfssl steps: - name: Download lib - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wolf-install-hitch path: build-dir - name: Checkout OSP - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: wolfssl/osp path: osp @@ -59,7 +59,7 @@ jobs: sudo apt-get install -y libev-dev libssl-dev automake python3-docutils flex bison pkg-config make - name: Checkout hitch - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: varnish/hitch ref: 1.7.3 diff --git a/extra/wolfssl/wolfssl/.github/workflows/hostap.yml b/extra/wolfssl/wolfssl/.github/workflows/hostap.yml index 84ea1009..187c735b 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/hostap.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/hostap.yml @@ -40,11 +40,11 @@ jobs: install: true - name: Upload built lib - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.build_id }} path: build-dir - retention-days: 1 + retention-days: 5 # Build wpa_supplicant with wolfSSL and hostapd with OpenSSL and interop. hostap_test: @@ -113,7 +113,7 @@ jobs: echo Our job run ID is $SHA_SUM - name: Checkout wolfSSL - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: path: wolfssl @@ -140,7 +140,7 @@ jobs: echo "hostap_debug_flags=-d" >> $GITHUB_ENV - name: Download lib - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ matrix.config.build_id }} path: build-dir @@ -170,7 +170,7 @@ jobs: sudo rmmod mac80211_hwsim - name: Checkout hostap - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: julek-wolfssl/hostap-mirror path: hostap @@ -185,7 +185,7 @@ jobs: - if: ${{ matrix.config.osp_ref }} name: Checkout OSP - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: wolfssl/osp path: osp @@ -275,7 +275,7 @@ jobs: - name: Upload failure logs if: ${{ failure() && steps.testing.outcome == 'failure' }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: hostap-logs-${{ env.our_job_run_id }} path: hostap/tests/hwsim/logs.zip diff --git a/extra/wolfssl/wolfssl/.github/workflows/krb5.yml b/extra/wolfssl/wolfssl/.github/workflows/krb5.yml index f03237c8..0022d64d 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/krb5.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/krb5.yml @@ -11,19 +11,23 @@ jobs: # This should be a safe limit for the tests to run. timeout-minutes: 5 steps: + - name: workaround high-entropy ASLR + # not needed after either an update to llvm or runner is done + run: sudo sysctl vm.mmap_rnd_bits=28 + - name: Build wolfSSL uses: wolfSSL/actions-build-autotools-project@v1 with: path: wolfssl - configure: --enable-krb CFLAGS='-fsanitize=address' + configure: --enable-krb CC='gcc -fsanitize=address' install: true - name: Upload built lib - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wolf-install-krb5 path: build-dir - retention-days: 1 + retention-days: 5 krb5_check: strategy: @@ -38,19 +42,19 @@ jobs: needs: build_wolfssl steps: - name: Download lib - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wolf-install-krb5 path: build-dir - name: Checkout OSP - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: wolfssl/osp path: osp - name: Checkout krb5 - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: krb5/krb5 ref: krb5-${{ matrix.ref }}-final @@ -61,6 +65,10 @@ jobs: run: | patch -p1 < $GITHUB_WORKSPACE/osp/krb5/Patch-for-Kerberos-5-${{ matrix.ref }}.patch + - name: workaround high-entropy ASLR + # not needed after either an update to llvm or runner is done + run: sudo sysctl vm.mmap_rnd_bits=28 + - name: Build krb5 working-directory: ./krb5/src run: | diff --git a/extra/wolfssl/wolfssl/.github/workflows/libssh2.yml b/extra/wolfssl/wolfssl/.github/workflows/libssh2.yml new file mode 100644 index 00000000..dd9d50e6 --- /dev/null +++ b/extra/wolfssl/wolfssl/.github/workflows/libssh2.yml @@ -0,0 +1,58 @@ +name: libssh2 Tests + +on: + workflow_call: + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-all + check: false # config is already tested in many other PRB's + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-libssh2 + path: build-dir + retention-days: 5 + + libssh2_check: + strategy: + fail-fast: false + matrix: + # List of releases to test + ref: [ 1.11.0 ] + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 8 + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-libssh2 + path: build-dir + + - name: Build and test libssh2 + uses: wolfSSL/actions-build-autotools-project@v1 + with: + repository: libssh2/libssh2 + ref: libssh2-${{ matrix.ref }} + path: libssh2 + configure: --with-crypto=wolfssl --with-libwolfssl-prefix=$GITHUB_WORKSPACE/build-dir + check: true + + - name: Confirm libssh2 built with wolfSSL + working-directory: ./libssh2 + run: ldd src/.libs/libssh2.so | grep wolfssl diff --git a/extra/wolfssl/wolfssl/.github/workflows/main.yml b/extra/wolfssl/wolfssl/.github/workflows/main.yml index b1e63a32..4579eaab 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/main.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/main.yml @@ -43,5 +43,10 @@ jobs: memcached: uses: ./.github/workflows/memcached.yml # TODO: Currently this test fails. Enable it once it becomes passing. +# libssh2: +# uses: ./.github/workflows/libssh2.yml + openssh: + uses: ./.github/workflows/openssh.yml +# TODO: Currently this test fails. Enable it once it becomes passing. # haproxy: # uses: ./.github/workflows/haproxy.yml diff --git a/extra/wolfssl/wolfssl/.github/workflows/memcached.yml b/extra/wolfssl/wolfssl/.github/workflows/memcached.yml index 9a4c8131..fde37018 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/memcached.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/memcached.yml @@ -20,11 +20,11 @@ jobs: run: cp wolfssl/.github/workflows/memcached.sh build-dir/bin - name: Upload built lib - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wolf-install-memcached path: build-dir - retention-days: 1 + retention-days: 5 memcached_check: strategy: @@ -38,13 +38,13 @@ jobs: needs: build_wolfssl steps: - name: Download lib - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wolf-install-memcached path: build-dir - name: Checkout OSP - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: wolfssl/osp path: osp @@ -56,7 +56,7 @@ jobs: sudo apt-get install -y libevent-dev libevent-2.1-7 automake pkg-config make libio-socket-ssl-perl - name: Checkout memcached - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: memcached/memcached ref: 1.6.22 diff --git a/extra/wolfssl/wolfssl/.github/workflows/multi-arch.yml b/extra/wolfssl/wolfssl/.github/workflows/multi-arch.yml index e5b9859a..031ca802 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/multi-arch.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/multi-arch.yml @@ -35,7 +35,7 @@ jobs: run: | sudo apt update sudo apt install -y crossbuild-essential-${{ matrix.ARCH }} qemu-user - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build env: CC: ${{ matrix.CC }} diff --git a/extra/wolfssl/wolfssl/.github/workflows/multi-compiler.yml b/extra/wolfssl/wolfssl/.github/workflows/multi-compiler.yml index 48512df2..b63fd0f2 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/multi-compiler.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/multi-compiler.yml @@ -41,7 +41,7 @@ jobs: # This should be a safe limit for the tests to run. timeout-minutes: 4 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build env: CC: ${{ matrix.CC }} diff --git a/extra/wolfssl/wolfssl/.github/workflows/nginx.yml b/extra/wolfssl/wolfssl/.github/workflows/nginx.yml index 05f2ed7c..9f9f81ec 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/nginx.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/nginx.yml @@ -25,11 +25,11 @@ jobs: install: true - name: Upload built lib - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wolf-install-nginx path: build-dir - retention-days: 1 + retention-days: 5 nginx_check: strategy: @@ -99,7 +99,7 @@ jobs: needs: build_wolfssl steps: - name: Download lib - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wolf-install-nginx path: build-dir @@ -109,13 +109,13 @@ jobs: sudo cpan -iT Proc::Find Net::SSLeay IO::Socket::SSL - name: Checkout wolfssl-nginx - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: wolfssl/wolfssl-nginx path: wolfssl-nginx - name: Checkout nginx - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: nginx/nginx path: nginx @@ -131,7 +131,7 @@ jobs: run: patch -p1 < ../wolfssl-nginx/nginx-${{ matrix.ref }}-wolfssl-debug.patch - name: Checkout nginx-tests - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: nginx/nginx-tests path: nginx-tests @@ -174,6 +174,10 @@ jobs: run: | echo "nginx_c_flags=-O0" >> $GITHUB_ENV + - name: workaround high-entropy ASLR + # not needed after either an update to llvm or runner is done + run: sudo sysctl vm.mmap_rnd_bits=28 + - name: Build nginx with sanitizer working-directory: nginx run: | @@ -203,4 +207,4 @@ jobs: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GITHUB_WORKSPACE/build-dir/lib \ TMPDIR=$GITHUB_WORKSPACE TEST_NGINX_BINARY=../nginx/objs/nginx \ prove ${{ matrix.sanitize-ok }} - \ No newline at end of file + diff --git a/extra/wolfssl/wolfssl/.github/workflows/openssh.yml b/extra/wolfssl/wolfssl/.github/workflows/openssh.yml new file mode 100644 index 00000000..02838773 --- /dev/null +++ b/extra/wolfssl/wolfssl/.github/workflows/openssh.yml @@ -0,0 +1,68 @@ +name: openssh Tests + +on: + workflow_call: + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: >- + --enable-openssh --enable-dsa --with-max-rsa-bits=8192 + --enable-intelasm --enable-sp-asm + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-openssh + path: build-dir + retention-days: 5 + + openssh_check: + strategy: + fail-fast: false + matrix: + include: + - git_ref: 'V_9_6_P1' + osp_ver: '9.6' + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-openssh + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Build and test openssh + uses: wolfSSL/actions-build-autotools-project@v1 + with: + repository: openssh/openssh-portable + ref: ${{ matrix.git_ref }} + path: openssh + patch-file: $GITHUB_WORKSPACE/osp/openssh-patches/openssh-${{ matrix.osp_ver }}.patch + configure: --with-wolfssl=$GITHUB_WORKSPACE/build-dir --with-rpath=-Wl,-rpath= + check: false + + # make tests take >20 minutes. Consider limiting? + - name: Run tests + working-directory: ./openssh + run: | + # Run all the tests except (t-exec) as it takes too long + make file-tests interop-tests extra-tests unit diff --git a/extra/wolfssl/wolfssl/.github/workflows/openvpn.yml b/extra/wolfssl/wolfssl/.github/workflows/openvpn.yml index 10f206ff..314f9a4e 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/openvpn.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/openvpn.yml @@ -19,18 +19,18 @@ jobs: install: true - name: Upload built lib - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wolf-install-openvpn path: build-dir - retention-days: 1 + retention-days: 5 openvpn_check: strategy: fail-fast: false matrix: # List of refs to test - ref: [ master, release/2.6, v2.6.0 ] + ref: [ release/2.6, v2.6.0, master ] name: ${{ matrix.ref }} runs-on: ubuntu-latest # This should be a safe limit for the tests to run. @@ -38,7 +38,7 @@ jobs: needs: build_wolfssl steps: - name: Download lib - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wolf-install-openvpn path: build-dir @@ -50,10 +50,14 @@ jobs: linux-libc-dev man2html libcmocka-dev python3-docutils \ libtool automake autoconf libnl-genl-3-dev libnl-genl-3-200 + - name: workaround high-entropy ASLR + # not needed after either an update to llvm or runner is done + run: sudo sysctl vm.mmap_rnd_bits=28 + - if: ${{ matrix.ref != 'master' }} name: Build and test openvpn with fsanitize run: | - echo 'extra_c_flags=CFLAGS="-fsanitize=address -fno-omit-frame-pointer -O2"' >> $GITHUB_ENV + echo 'extra_c_flags=CC="gcc -fsanitize=address" CFLAGS="-fno-omit-frame-pointer -O2"' >> $GITHUB_ENV - name: Build and test openvpn uses: wolfSSL/actions-build-autotools-project@v1 diff --git a/extra/wolfssl/wolfssl/.github/workflows/os-check.yml b/extra/wolfssl/wolfssl/.github/workflows/os-check.yml index 08134c4a..9846efaa 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/os-check.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/os-check.yml @@ -67,6 +67,7 @@ jobs: 'examples/configs/user_settings_min_ecc.h', 'examples/configs/user_settings_wolfboot_keytools.h', 'examples/configs/user_settings_wolftpm.h', + 'examples/configs/user_settings_tls12.h', ] name: make user_setting.h (testwolfcrypt only) runs-on: ${{ matrix.os }} @@ -94,7 +95,7 @@ jobs: # This should be a safe limit for the tests to run. timeout-minutes: 14 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - if: ${{ matrix.os == 'macos-latest' }} run: brew install automake libtool - run: ./autogen.sh @@ -121,10 +122,10 @@ jobs: BUILD_CONFIGURATION: Release BUILD_PLATFORM: x64 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v1 + uses: microsoft/setup-msbuild@v2 - name: Restore NuGet packages working-directory: ${{env.GITHUB_WORKSPACE}} diff --git a/extra/wolfssl/wolfssl/.github/workflows/packaging.yml b/extra/wolfssl/wolfssl/.github/workflows/packaging.yml index 42e21359..50f2a086 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/packaging.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/packaging.yml @@ -11,7 +11,7 @@ jobs: timeout-minutes: 10 steps: - name: Checkout wolfSSL - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Configure wolfSSL run: | diff --git a/extra/wolfssl/wolfssl/.github/workflows/stunnel.yml b/extra/wolfssl/wolfssl/.github/workflows/stunnel.yml index ac25126d..a93a0477 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/stunnel.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/stunnel.yml @@ -19,11 +19,11 @@ jobs: install: true - name: Upload built lib - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wolf-install-stunnel path: build-dir - retention-days: 1 + retention-days: 5 stunnel_check: strategy: @@ -38,13 +38,13 @@ jobs: needs: build_wolfssl steps: - name: Download lib - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wolf-install-stunnel path: build-dir - name: Checkout OSP - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: wolfssl/osp path: osp diff --git a/extra/wolfssl/wolfssl/.github/workflows/zephyr.yml b/extra/wolfssl/wolfssl/.github/workflows/zephyr.yml index decdba25..c7f1bc8e 100644 --- a/extra/wolfssl/wolfssl/.github/workflows/zephyr.yml +++ b/extra/wolfssl/wolfssl/.github/workflows/zephyr.yml @@ -64,10 +64,10 @@ jobs: - name: Install zephyr SDK run: | - wget -q https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${{ matrix.config.zephyr-sdk }}/zephyr-sdk-${{ matrix.config.zephyr-sdk }}_linux-x86_64.tar.xz - tar xf zephyr-sdk-${{ matrix.config.zephyr-sdk }}_linux-x86_64.tar.xz + wget -q https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${{ matrix.config.zephyr-sdk }}/zephyr-sdk-${{ matrix.config.zephyr-sdk }}_linux-x86_64_minimal.tar.xz + tar xf zephyr-sdk-${{ matrix.config.zephyr-sdk }}_linux-x86_64_minimal.tar.xz cd zephyr-sdk-${{ matrix.config.zephyr-sdk }} - ./setup.sh -h -c + ./setup.sh -h -c -t x86_64-zephyr-elf - name: Run wolfssl test id: wolfssl-test @@ -97,7 +97,7 @@ jobs: - name: Upload failure logs if: ${{ failure() && (steps.wolfssl-test.outcome == 'failure' || steps.wolfssl-tls-sock.outcome == 'failure' || steps.wolfssl-tls-thread.outcome == 'failure') }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: zephyr-client-test-logs path: logs.zip diff --git a/extra/wolfssl/wolfssl/.gitignore b/extra/wolfssl/wolfssl/.gitignore index 5adfbf31..5bd31033 100644 --- a/extra/wolfssl/wolfssl/.gitignore +++ b/extra/wolfssl/wolfssl/.gitignore @@ -82,16 +82,19 @@ snifftest output mcapi/test testsuite/testsuite -tests/unit testsuite/testsuite.test +testsuite/*.der +testsuite/*.pem +testsuite/*.raw +testsuite/*.obj +testsuite/*.pdb +testsuite/*.idb +tests/unit tests/unit.test tests/bio_write_test.txt tests/test-log-dump-to-file.txt tests/cert_cache.tmp test-write-dhparams.pem -testsuite/*.der -testsuite/*.pem -testsuite/*.raw cert.der cert.pem certecc.der @@ -286,23 +289,6 @@ mqx/wolfcrypt_benchmark/.settings mqx/wolfcrypt_benchmark/.cwGeneratedFileSetLog mqx/wolfcrypt_benchmark/SaAnalysispointsManager.apconfig -# User Crypto example build -wolfcrypt/user-crypto/aclocal.m4 -wolfcrypt/user-crypto/config.guess -wolfcrypt/user-crypto/autom4te.cache -wolfcrypt/user-crypto/config.log -wolfcrypt/user-crypto/config.status -wolfcrypt/user-crypto/config.sub -wolfcrypt/user-crypto/depcomp -wolfcrypt/user-crypto/install-sh -wolfcrypt/user-crypto/libtool -wolfcrypt/user-crypto/ltmain.sh -wolfcrypt/user-crypto/m4 -wolfcrypt/user-crypto/missing -wolfcrypt/user-crypto/Makefile.in -wolfcrypt/user-crypto/lib/libusercrypto.* -*.hzs - # wolfSSL CSharp wrapper wrapper/CSharp/x64/ @@ -339,6 +325,10 @@ wolfcrypt/src/port/intel/qat_test # Arduino Generated Files /IDE/ARDUINO/wolfSSL scripts/memtest.txt +/IDE/ARDUINO/Arduino_README_prepend.md.tmp +/IDE/ARDUINO/library.properties.tmp +/IDE/ARDUINO/library.properties.tmp.backup +/IDE/ARDUINO/PREPENDED_README.md # Doxygen generated files doc/doxygen_warnings @@ -415,7 +405,7 @@ XXX-fips-test # Generated user_settings_asm.h. user_settings_asm.h -# VisualGD +# VisualGDB **/.visualgdb # Espressif sdk config default should be saved in sdkconfig.defaults @@ -423,6 +413,12 @@ user_settings_asm.h /IDE/Espressif/**/sdkconfig /IDE/Espressif/**/sdkconfig.old +# MPLAB +/IDE/MPLABX16/wolfssl.X/dist/default/ +/IDE/MPLABX16/wolfssl.X/.generated_files +/IDE/MPLABX16/wolfcrypt_test.X/dist/default/ +/IDE/MPLABX16/wolfcrypt_test.X/.generated_files + # auto-created CMake backups **/CMakeLists.txt.old diff --git a/extra/wolfssl/wolfssl/CMakeLists.txt b/extra/wolfssl/wolfssl/CMakeLists.txt index 337b0d61..bf6bc752 100644 --- a/extra/wolfssl/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/wolfssl/CMakeLists.txt @@ -28,7 +28,7 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") You must delete them, or cmake will refuse to work.") endif() -project(wolfssl VERSION 5.6.6 LANGUAGES C ASM) +project(wolfssl VERSION 5.7.0 LANGUAGES C ASM) # Set WOLFSSL_ROOT if not already defined if ("${WOLFSSL_ROOT}" STREQUAL "") @@ -42,16 +42,19 @@ else() endif() # shared library versioning -# increment if interfaces have been added, removed or changed -set(LIBTOOL_CURRENT 42) -# increment if source code has changed set to zero if current is incremented -set(LIBTOOL_REVISION 0) -# increment if interfaces have been added set to zero if interfaces have been -# removed or changed -set(LIBTOOL_AGE 0) +# increment if interfaces have been removed or changed +set(WOLFSSL_LIBRARY_VERSION_FIRST 42) -math(EXPR LIBTOOL_SO_VERSION "${LIBTOOL_CURRENT} - ${LIBTOOL_AGE}") -set(LIBTOOL_FULL_VERSION ${LIBTOOL_SO_VERSION}.${LIBTOOL_AGE}.${LIBTOOL_REVISION}) +# increment if interfaces have been added +# set to zero if WOLFSSL_LIBRARY_VERSION_FIRST is incremented +set(WOLFSSL_LIBRARY_VERSION_SECOND 1) + +# increment if source code has changed +# set to zero if WOLFSSL_LIBRARY_VERSION_FIRST is incremented or +# WOLFSSL_LIBRARY_VERSION_SECOND is incremented +set(WOLFSSL_LIBRARY_VERSION_THIRD 0) + +set(LIBTOOL_FULL_VERSION ${WOLFSSL_LIBRARY_VERSION_FIRST}.${WOLFSSL_LIBRARY_VERSION_SECOND}.${WOLFSSL_LIBRARY_VERSION_THIRD}) set(WOLFSSL_DEFINITIONS) set(WOLFSSL_LINK_LIBS) @@ -130,9 +133,15 @@ if(HAVE___UINT128_T) list(APPEND WOLFSSL_DEFINITIONS "-DHAVE___UINT128_T") endif() -include(TestBigEndian) - -test_big_endian(WORDS_BIGENDIAN) +if(CMAKE_VERSION VERSION_LESS "3.20") + # TestBigEndian was deprecated in 3.20 + include(TestBigEndian) + test_big_endian(IS_BIG_ENDIAN) + set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") + if(IS_BIG_ENDIAN) + set(CMAKE_C_BYTE_ORDER "BIG_ENDIAN") + endif() +endif() # Thread local storage include(CheckCSourceCompiles) @@ -215,6 +224,8 @@ if(WOLFSSL_REPRODUCIBLE_BUILD) set(CMAKE_C_ARCHIVE_FINISH " -D ") endif() +add_option("WOLFSSL_INSTALL" "Create install target for WolfSSL project" "yes" "yes;no") + # Support for forcing 32-bit mode # TODO: detect platform from other options add_option("WOLFSSL_32BIT" @@ -574,7 +585,7 @@ if(WOLFSSL_LEAN_PSK OR (WOLFSSL_LEAN_TLS AND NOT WOLFSSL_TLS13)) override_cache(WOLFSSL_AESGCM "no") endif() -if(WOLFSSL_AESGCM AND NOT WORDS_BIGENDIAN) +if(WOLFSSL_AESGCM AND CMAKE_C_BYTE_ORDER STREQUAL "LITTLE_ENDIAN") override_cache(WOLFSSL_AESGCM "4bit") endif() @@ -1662,17 +1673,14 @@ if(WOLFSSL_FAST_MATH) list(APPEND WOLFSSL_DEFINITIONS "-DUSE_FAST_MATH") set(WOLFSSL_SLOWMATH "no") endif() - - if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64|AMD64") - # Have settings.h set FP_MAX_BITS higher if user didn't set directly - list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_X86_64_BUILD") - endif() endif() # TODO: - Fast huge math # Set processor-specific build macros if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64|AMD64") + set(WOLFSSL_X86_64_BUILD ON) + add_option("WOLFSSL_X86_64_BUILD_ASM" "Build ASM files" "yes" "yes;no") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_X86_64_BUILD") elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64|arm64") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_AARCH64_BUILD") @@ -1753,13 +1761,15 @@ else() list(APPEND WOLFSSL_DEFINITIONS "-DWC_NO_ASYNC_THREADING") endif() -# TODO: - cryptodev -# - Session export +# TODO: - Session export add_option("WOLFSSL_CRYPTOCB" "Enable crypto callbacks (default: disabled)" "no" "yes;no") +add_option("WOLFSSL_PKCALLBACKS" + "Enable public key callbacks (default: disabled)" + "no" "yes;no") add_option("WOLFSSL_OLD_NAMES" "Keep backwards compat with old names (default: enabled)" @@ -1960,6 +1970,11 @@ if(WOLFSSL_CRYPTOCB) list(APPEND WOLFSSL_DEFINITIONS "-DWOLF_CRYPTO_CB") endif() +# Public Key Callbacks +if(WOLFSSL_PKCALLBACKS) + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_PK_CALLBACKS") +endif() + if(WOLFSSL_OCSPSTAPLING) list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_CERTIFICATE_STATUS_REQUEST" "-DHAVE_TLS_EXTENSIONS") override_cache(WOLFSSL_OCSP "yes") @@ -2075,7 +2090,7 @@ endif() # Suppress some warnings about separate compilation, inlining add_definitions("-DWOLFSSL_IGNORE_FILE_WARN") # Generate user options header -message("Generating user options header...") +message(STATUS "Generating user options header...") if (${CMAKE_DISABLE_SOURCE_CHANGES}) set(WOLFSSL_BUILD_OUT_OF_TREE_DEFAULT "${CMAKE_DISABLE_SOURCE_CHANGES}") else() @@ -2198,7 +2213,7 @@ endif() set_target_properties(wolfssl PROPERTIES - SOVERSION ${LIBTOOL_SO_VERSION} + SOVERSION ${WOLFSSL_LIBRARY_VERSION_FIRST} VERSION ${LIBTOOL_FULL_VERSION} ) @@ -2516,82 +2531,96 @@ list(JOIN HEADER_EXCLUDE "|" EXCLUDED_HEADERS_REGEX) string(PREPEND EXCLUDED_HEADERS_REGEX "(") string(APPEND EXCLUDED_HEADERS_REGEX ")") -set(INSTALLED_EXAMPLES - ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoserver/echoserver.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-server.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-client-dtls.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-client.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-server-dtls.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoclient/echoclient.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/server/server.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/benchmark/tls_bench.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/client/client.c) - -# Install the library -install(TARGETS wolfssl - EXPORT wolfssl-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin - ) -# Install the headers -install(DIRECTORY ${WOLFSSL_OUTPUT_BASE}/wolfssl/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wolfssl - FILES_MATCHING PATTERN "*.h" - REGEX ${EXCLUDED_HEADERS_REGEX} EXCLUDE) -install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wolfssl - FILES_MATCHING PATTERN "*.h" - REGEX ${EXCLUDED_HEADERS_REGEX} EXCLUDE) - -# Install the examples -install(FILES ${INSTALLED_EXAMPLES} - DESTINATION ${CMAKE_INSTALL_DOCDIR}/example) -# Install README.txt and taoCert.txt -install(FILES - ${CMAKE_CURRENT_SOURCE_DIR}/doc/README.txt - ${CMAKE_CURRENT_SOURCE_DIR}/certs/taoCert.txt - DESTINATION ${CMAKE_INSTALL_DOCDIR}) -# Install the export set -install(EXPORT wolfssl-targets - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl - FILE wolfssl-targets.cmake - NAMESPACE wolfssl::) - -# TODO: Distro build + rules for what to include in the distro. -# See various include.am files. - -set(prefix ${CMAKE_INSTALL_PREFIX}) -set(exec_prefix "\${prefix}") -set(libdir "\${exec_prefix}/lib") -set(includedir "\${prefix}/include") -set(VERSION ${PROJECT_VERSION}) - -configure_file(support/wolfssl.pc.in ${CMAKE_CURRENT_BINARY_DIR}/support/wolfssl.pc @ONLY) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/support/wolfssl.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) - -include(CMakePackageConfigHelpers) -configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in - "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config.cmake" - INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl" - NO_SET_AND_CHECK_MACRO - NO_CHECK_REQUIRED_COMPONENTS_MACRO -) +if(WOLFSSL_INSTALL) + + set(INSTALLED_EXAMPLES + ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoserver/echoserver.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-server.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-client-dtls.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-client.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-server-dtls.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoclient/echoclient.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/server/server.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/benchmark/tls_bench.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/client/client.c) -export(EXPORT wolfssl-targets - FILE "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-targets.cmake" - NAMESPACE wolfssl:: -) -write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config-version.cmake" - VERSION "${wolfssl_VERSION_MAJOR}.${wolfssl_VERSION_MINOR}" - COMPATIBILITY AnyNewerVersion -) + # Install the library + install(TARGETS wolfssl + EXPORT wolfssl-targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + ) + # Install the headers + install(DIRECTORY ${WOLFSSL_OUTPUT_BASE}/wolfssl/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wolfssl + FILES_MATCHING PATTERN "*.h" + REGEX ${EXCLUDED_HEADERS_REGEX} EXCLUDE) + install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wolfssl + FILES_MATCHING PATTERN "*.h" + REGEX ${EXCLUDED_HEADERS_REGEX} EXCLUDE) + + # Install the examples + install(FILES ${INSTALLED_EXAMPLES} + DESTINATION ${CMAKE_INSTALL_DOCDIR}/example) + # Install README.txt and taoCert.txt + install(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/doc/README.txt + ${CMAKE_CURRENT_SOURCE_DIR}/certs/taoCert.txt + DESTINATION ${CMAKE_INSTALL_DOCDIR}) + # Install the export set + install(EXPORT wolfssl-targets + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl + FILE wolfssl-targets.cmake + NAMESPACE wolfssl::) + + # TODO: Distro build + rules for what to include in the distro. + # See various include.am files. + + set(prefix ${CMAKE_INSTALL_PREFIX}) + set(exec_prefix "\${prefix}") + set(libdir "\${exec_prefix}/lib") + set(includedir "\${prefix}/include") + set(VERSION ${PROJECT_VERSION}) + + # Setting libm in Libs.private of wolfssl.pc. + # See "Link Libraries" in above about `m` insertion to LINK_LIBRARIES + get_target_property(_wolfssl_dep_libs wolfssl LINK_LIBRARIES) + list(FIND _wolfssl_dep_libs m _dep_libm) + if ("${_dep_libm}" GREATER -1) + set(LIBM -lm) + else() + set(LIBM) + endif() -install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config-version.cmake - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl -) + configure_file(support/wolfssl.pc.in ${CMAKE_CURRENT_BINARY_DIR}/support/wolfssl.pc @ONLY) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/support/wolfssl.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + + include(CMakePackageConfigHelpers) + configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl" + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO + ) + + export(EXPORT wolfssl-targets + FILE "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-targets.cmake" + NAMESPACE wolfssl:: + ) + + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config-version.cmake" + VERSION "${wolfssl_VERSION_MAJOR}.${wolfssl_VERSION_MINOR}" + COMPATIBILITY AnyNewerVersion + ) + + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config-version.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl + ) +endif() diff --git a/extra/wolfssl/wolfssl/ChangeLog.md b/extra/wolfssl/wolfssl/ChangeLog.md index 586adaa4..c3b24757 100644 --- a/extra/wolfssl/wolfssl/ChangeLog.md +++ b/extra/wolfssl/wolfssl/ChangeLog.md @@ -1,3 +1,97 @@ +# wolfSSL Release 5.7.0 (Mar 20, 2024) + +Release 5.7.0 has been developed according to wolfSSL's development and QA +process (see link below) and successfully passed the quality criteria. +https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance + +NOTE: * --enable-heapmath is being deprecated and will be removed by end of 2024 + +NOTE: In future releases, --enable-des3 (which is disabled by default) will be insufficient in itself to enable DES3 in TLS cipher suites. A new option, --enable-des3-tls-suites, will need to be supplied in addition. This option should only be used in backward compatibility scenarios, as it is inherently insecure. + +NOTE: This release switches the default ASN.1 parser to the new ASN template code. If the original ASN.1 code is preferred define `WOLFSSL_ASN_ORIGINAL` to use it. See PR #7199. + + +## Vulnerabilities +* [High] CVE-2024-0901 Potential denial of service and out of bounds read. Affects TLS 1.3 on the server side when accepting a connection from a malicious TLS 1.3 client. If using TLS 1.3 on the server side it is recommended to update the version of wolfSSL used. Fixed in this GitHub pull request https://github.com/wolfSSL/wolfssl/pull/7099 + + +* [Med] CVE-2024-1545 Fault Injection vulnerability in RsaPrivateDecryption function that potentially allows an attacker that has access to the same system with a victims process to perform a Rowhammer fault injection. Thanks to Junkai Liang, Zhi Zhang, Xin Zhang, Qingni Shen for the report (Peking University, The University of Western Australia)." +Fixed in this GitHub pull request https://github.com/wolfSSL/wolfssl/pull/7167 + + +* [Med] Fault injection attack with EdDSA signature operations. This affects ed25519 sign operations where the system could be susceptible to Rowhammer attacks. Thanks to Junkai Liang, Zhi Zhang, Xin Zhang, Qingni Shen for the report (Peking University, The University of Western Australia). +Fixed in this GitHub pull request https://github.com/wolfSSL/wolfssl/pull/7212 + + +## New Feature Additions + +* Added --enable-experimental configure flag to gate out features that are currently experimental. Now liboqs, kyber, lms, xmss, and dual-alg-certs require the --enable-experimental flag. + +### POST QUANTUM SUPPORT ADDITIONS +* Experimental framework for using wolfSSL’s XMSS implementation (PR 7161) +* Experimental framework for using wolfSSL’s LMS implementation (PR 7283) +* Experimental wolfSSL Kyber implementation and assembly optimizations, enabled with --enable-experimental --enable-kyber (PR 7318) +* Experimental support for post quantum dual key/signature certificates. A few known issues and sanitizer checks are in progress with this feature. Enabled with the configure flags --enable-experimental --enable-dual-alg-certs (PR 7112) +* CryptoCb support for PQC algorithms (PR 7110) + +### OTHER FEATURE ADDITIONS +* The Linux kernel module now supports registration of AES-GCM, AES-XTS, AES-CBC, and AES-CFB with the kernel cryptosystem through the new --enable-linuxkm-lkcapi-register option, enabling automatic use of wolfCrypt implementations by the dm-crypt/luks and ESP subsystems. In particular, wolfCrypt AES-XTS with –enable-aesni is faster than the native kernel implementation. +* CryptoCb hook to one-shot CMAC functions (PR 7059) +* BER content streaming support for PKCS7_VerifySignedData and sign/encrypt operations (PR 6961 & 7184) +* IoT-Safe SHA-384 and SHA-512 support (PR 7176) +* I/O callbacks for content and output with PKCS7 bundle sign/encrypt to reduce peak memory usage (PR 7272) +* Microchip PIC24 support and example project (PR 7151) +* AutoSAR shim layer for RNG, SHA256, and AES (PR 7296) +* wolfSSL_CertManagerUnloadIntermediateCerts API to clear intermediate certs added to certificate store (PR 7245) +* Implement SSL_get_peer_signature_nid and SSL_get_peer_signature_type_nid (PR 7236) + + +## Enhancements and Optimizations + +* Remove obsolete user-crypto functionality and Intel IPP support (PR 7097) +* Support for RSA-PSS signatures with CRL use (PR 7119) +* Enhancement for AES-GCM use with Xilsecure on Microblaze (PR 7051) +* Support for crypto cb only build with ECC and NXP CAAM (PR 7269) +* Improve liboqs integration adding locking and init/cleanup functions (PR 7026) +* Prevent memory access before clientSession->serverRow and clientSession->serverIdx are sanitized (PR 7096) +* Enhancements to reproducible build (PR 7267) +* Update Arduino example TLS Client/Server and improve support for ESP32 (PR 7304 & 7177) +* XC32 compiler version 4.x compatibility (PR 7128) +* Porting for build on PlayStation 3 and 4 (PR 7072) +* Improvements for Espressif use; SHA HW/SW selection and use on ESP32-C2/ESP8684, wolfSSL_NewThread() type, component cmake fix, and update TLS client example for ESP8266 (PR 7081, 7173, 7077, 7148, 7240) +* Allow crypto callbacks with SHA-1 HW (PR 7087) +* Update OpenSSH port to version 9.6p1(PR 7203) +* ARM Thumb2 enhancements, AES-GCM support for GCM_SMALL, alignment fix on key, fix for ASM clobber list (PR 7291,7301,7221) +* Expand heap hint support for static memory build with more x509 functions (PR 7136) +* Improving ARMv8 ChaCha20 ASM (alignment) (PR 7182) +* Unknown extension callback wolfSSL_CertManagerSetUnknownExtCallback added to CertManager (PR 7194) +* Implement wc_rng_new_ex for use with devID’s with crypto callback (PR 7271) +* Allow reading 0-RTT data after writing 0.5-RTT data (PR 7102) +* Send alert on bad PSK binder error (PR 7235) +* Enhancements to CMake build files for use with cross compiling (PR 7188) + + +## Fixes + +* Fix for checking result of MAC verify when no AAD is used with AES-GCM and Xilinx Xilsecure (PR 7051) +* Fix for Aria sign use (PR 7082) +* Fix for invalid `dh_ffdhe_test` test case using Intel QuickAssist (PR 7085) +* Fixes for TI AES and SHA on TM4C with HW acceleration and add full AES GCM and CCM support with TLS (PR 7018) +* Fixes for STM32 PKA use with ECC (PR 7098) +* Fixes for TLS 1.3 with crypto callbacks to offload KDF / HMAC operation (PR 7070) +* Fix include path for FSP 3.5 on Renesas RA6M4 (PR 7101) +* Siphash x64 asm fix for use with older compilers (PR 7299) +* Fix for SGX build with SP (PR 7308) +* Fix to Make it mandatory that the cookie is sent back in new ClientHello when seen in a HelloRetryRequest with (PR 7190) +* Fix for wrap around behavior with BIO pairs (PR 7169) +* OCSP fixes for parsing of response correctly when there was a revocation reason and returning correct error value with date checks (PR 7241 & 7255) +* Fix build with `NO_STDIO_FILESYSTEM` and improve checks for `XGETENV` (PR 7150) +* Fix for DTLS sequence number and cookie when downgrading DTLS version (PR 7214) +* Fix for write_dup use with chacha-poly cipher suites (PR 7206) +* Fix for multiple handshake messages in one record failing with OUT_OF_ORDER_E when downgrading from TLS 1.3 to TLS 1.2 (PR 7141) +* Fix for AES ECB build with Thumb and alignment (PR 7094) +* Fix for negotiate handshake until the end in wolfSSL_read/wolfSSL_write if hitting an edge case with want read/write (PR 7237) + # wolfSSL Release 5.6.6 (Dec 19, 2023) Release 5.6.6 has been developed according to wolfSSL's development and QA diff --git a/extra/wolfssl/wolfssl/Docker/Dockerfile b/extra/wolfssl/wolfssl/Docker/Dockerfile index 388169e6..b45cff4d 100644 --- a/extra/wolfssl/wolfssl/Docker/Dockerfile +++ b/extra/wolfssl/wolfssl/Docker/Dockerfile @@ -3,10 +3,13 @@ FROM $DOCKER_BASE_IMAGE USER root +# Set timezone to UTC +RUN ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo UTC > /etc/timezone + ARG DEPS_WOLFSSL="build-essential autoconf libtool clang clang-tools zlib1g-dev libuv1-dev libpam0g-dev valgrind git linux-headers-generic gcc-multilib g++-multilib libpcap-dev bubblewrap gdb iputils-ping lldb bsdmainutils netcat binutils-arm-linux-gnueabi binutils-aarch64-linux-gnu" ARG DEPS_LIBOQS="astyle cmake gcc ninja-build libssl-dev python3-pytest python3-pytest-xdist unzip xsltproc doxygen graphviz python3-yaml valgrind git" ARG DEPS_UDP_PROXY="wget libevent-dev" -ARG DEPS_TESTS="abi-dumper libcurl4-openssl-dev tcpdump" +ARG DEPS_TESTS="abi-dumper libcurl4-openssl-dev tcpdump libpsl-dev python3-pandas python3-tabulate libnl-genl-3-dev libcap-ng-dev" ARG DEPS_TOOLS="ccache" RUN DEBIAN_FRONTEND=noninteractive apt update && apt install -y apt-utils \ && apt install -y ${DEPS_WOLFSSL} ${DEPS_LIBOQS} ${DEPS_UDP_PROXY} ${DEPS_TESTS} ${DEPS_TOOLS} \ diff --git a/extra/wolfssl/wolfssl/Docker/Dockerfile.cross-compiler b/extra/wolfssl/wolfssl/Docker/Dockerfile.cross-compiler index a89a9d5b..a9868d38 100644 --- a/extra/wolfssl/wolfssl/Docker/Dockerfile.cross-compiler +++ b/extra/wolfssl/wolfssl/Docker/Dockerfile.cross-compiler @@ -3,7 +3,7 @@ FROM $DOCKER_BASE_IMAGE USER root -ARG DEPS_TESTING="gcc-arm-linux-gnueabi gcc-aarch64-linux-gnu" +ARG DEPS_TESTING="gcc-arm-linux-gnueabi gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu" RUN DEBIAN_FRONTEND=noninteractive apt update \ && apt install -y ${DEPS_TESTING} \ && apt clean -y && rm -rf /var/lib/apt/lists/* diff --git a/extra/wolfssl/wolfssl/Docker/yocto/Dockerfile b/extra/wolfssl/wolfssl/Docker/yocto/Dockerfile new file mode 100644 index 00000000..5fda38f9 --- /dev/null +++ b/extra/wolfssl/wolfssl/Docker/yocto/Dockerfile @@ -0,0 +1,27 @@ +FROM ubuntu + +# Set timezone to UTC +RUN ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo UTC > /etc/timezone + +RUN DEBIAN_FRONTEND=noninteractive apt update && apt install -y gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev python3-subunit mesa-common-dev zstd liblz4-tool file locales libacl1 vim && apt clean -y && rm -rf /var/lib/apt/lists/* +RUN locale-gen en_US.UTF-8 + +# Add in non-root user +ENV UID_OF_DOCKERUSER 1000 +RUN useradd -m -s /bin/bash -g users -u ${UID_OF_DOCKERUSER} dockerUser +RUN chown -R dockerUser:users /home/dockerUser && chown dockerUser:users /opt + +USER dockerUser + +RUN cd /opt && git clone git://git.yoctoproject.org/poky +WORKDIR /opt/poky + +ARG YOCTO_VERSION=kirkstone +RUN git checkout -t origin/${YOCTO_VERSION} -b ${YOCTO_VERSION} && git pull + +RUN git clone --single-branch --branch=${YOCTO_VERSION} https://github.com/wolfSSL/meta-wolfssl.git && \ + /bin/bash -c "source oe-init-build-env" && \ + echo 'IMAGE_INSTALL:append = " wolfssl wolfclu wolfssh wolfmqtt wolftpm wolfclu "' >> /opt/poky/build/conf/local.conf && \ + sed -i '/\/opt\/poky\/meta-poky \\/a \\t/opt/poky/meta-wolfssl \\' /opt/poky/build/conf/bblayers.conf + +RUN /bin/bash -c "source oe-init-build-env && bitbake core-image-minimal" diff --git a/extra/wolfssl/wolfssl/Docker/yocto/buildAndPush.sh b/extra/wolfssl/wolfssl/Docker/yocto/buildAndPush.sh new file mode 100755 index 00000000..d76a603e --- /dev/null +++ b/extra/wolfssl/wolfssl/Docker/yocto/buildAndPush.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# Assume we're in wolfssl/Docker/yocto +WOLFSSL_DIR=$(builtin cd ${BASH_SOURCE%/*}/../..; pwd) + +DOCKER_BUILD_OPTIONS="$1" +if [ "${DOCKER_BASE_IMAGE}" != "" ]; then + DOCKER_BUILD_OPTIONS+=" --build-arg DOCKER_BASE_IMAGE=${DOCKER_BASE_IMAGE}" +fi + +NUM_FAILURES=0 + +CUR_DATE=$(date -u +%F) +for ver in kirkstone dunfell; do + echo "Building wolfssl/yocto:${ver}-${CUR_DATE} as ${DOCKER_BUILD_OPTIONS}" + docker build -t wolfssl/yocto:${ver}-${CUR_DATE} --build-arg YOCTO_VERSION=${ver} -f Dockerfile "${WOLFSSL_DIR}/Docker/yocto" && \ + docker tag wolfssl/yocto:${ver}-${CUR_DATE} wolfssl/yocto:${ver}-latest + if [ $? -eq 0 ]; then + echo "Pushing containers to DockerHub" + docker push wolfssl/yocto:${ver}-${CUR_DATE} && docker push wolfssl/yocto:${ver}-latest + else + echo "Warning: Build wolfssl/yocto:${ver} failed. Continuing" + ((NUM_FAILURES++)) + fi +done + +echo "Script completed in $SECONDS seconds. Had $NUM_FAILURES failures." diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/Arduino_README_prepend.md b/extra/wolfssl/wolfssl/IDE/ARDUINO/Arduino_README_prepend.md new file mode 100644 index 00000000..594a0678 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/Arduino_README_prepend.md @@ -0,0 +1,13 @@ +# Arduino wolfSSL Library + +This library is restructured from [wolfSSL](https://github.com/wolfSSL/wolfssl/) Release ${WOLFSSL_VERSION} for the Arduino platform. + +The Official wolfSSL Arduino Library is found in [The Library Manager index](http://downloads.arduino.cc/libraries/library_index.json). + +See the [Arduino-wolfSSL logs](https://downloads.arduino.cc/libraries/logs/github.com/wolfSSL/Arduino-wolfSSL/). + +## Arduino Releases + +The first Official wolfSSL Arduino Library is `5.6.6-Arduino.1`: a slightly modified, post [release 5.6.6](https://github.com/wolfSSL/wolfssl/releases/tag/v5.6.6-stable) version update. + +See other [wolfSSL releases versions](https://github.com/wolfSSL/wolfssl/releases). The `./wolfssl-arduino.sh INSTALL` [script](https://github.com/wolfSSL/wolfssl/tree/master/IDE/ARDUINO) can be used to install specific GitHub versions as needed. diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/README.md b/extra/wolfssl/wolfssl/IDE/ARDUINO/README.md index 4c4e10da..75c25a20 100644 --- a/extra/wolfssl/wolfssl/IDE/ARDUINO/README.md +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/README.md @@ -1,30 +1,89 @@ -### wolfSSL with Arduino +# wolfSSL with Arduino -##### Reformatting wolfSSL as a compatible Arduino Library -This is a shell script that will re-organize the wolfSSL library to be -compatible with Arduino projects that use Arduino IDE 1.5.0 or newer. -The Arduino IDE requires a library's source files to be in the library's root -directory with a header file in the name of the library. This script moves all -src/ files to the `IDE/ARDUINO/wolfSSL/src` directory and creates a stub header -file called `wolfssl.h` inside that directory. +See the [example sketches](./sketches/README.md): -Step 1: To configure wolfSSL with Arduino, enter the following from within the -wolfssl/IDE/ARDUINO directory: +- [sketches/wolfssl_server](./sketches/wolfssl_server/README.md) +- [sketches/wolfssl_client](./sketches/wolfssl_client/README.md) - `./wolfssl-arduino.sh` +When publishing a new version to the Arduino Registry, be sure to edit `WOLFSSL_VERSION_ARUINO_SUFFIX` in the `wolfssl-arduino.sh` script. -Step 2: Copy the directory wolfSSL that was just created to: -`~/Documents/Arduino/libraries/` directory so the Arduino IDE can find it. +## Boards -Step 3: Edit `/wolfSSL/src/user_settings.h` +Many of the supported boards are natively built-in to the [Arduino IDE Board Manager](https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-board-manager/) +and by adding [additional cores](https://docs.arduino.cc/learn/starting-guide/cores/) as needed. + +STM32 Support can be added by including this link in the "Additional Boards Managers URLs" field +from [stm32duino/Arduino_Core_STM32](https://github.com/stm32duino/Arduino_Core_STM32?tab=readme-ov-file#getting-started) . + +``` +https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json +``` + +## Using wolfSSL from the Arduino IDE + +The Official wolfSSL: https://github.com/wolfSSL/arduino-wolfSSL See [PR #1](https://github.com/wolfSSL/Arduino-wolfSSL/pull/1). + +This option will allow wolfSSL to be installed directly using the native Arduino tools. + +## Manually Reformatting wolfSSL as a Compatible Arduino Library + +Use [this](./wolfssl-arduino.sh) shell script that will re-organize the wolfSSL library to be +compatible with [Arduino Library Specification](https://arduino.github.io/arduino-cli/0.35/library-specification/) +for projects that use Arduino IDE 1.5.0 or newer. + +The Arduino IDE requires a library's source files to be in the library's root directory with a +header file in the name of the library. This script moves all `src/` files to the `IDE/ARDUINO/wolfSSL/src` +directory and creates a stub header file called `wolfssl.h` inside that directory. + +### Step 1: + +To configure wolfSSL with Arduino, enter ONE of the following 4 commands +from within the `wolfssl/IDE/ARDUINO` directory: + +1. `./wolfssl-arduino.sh` + - Creates an Arduino Library directory structure in the local `wolfSSL` directory of `IDE/ARDUINO`. + - You can add your own `user_settings.h`, or copy/rename the [default](../../examples/configs/user_settings_arduino.h). + +2. `./wolfssl-arduino.sh INSTALL` (The most common option) + - Creates an Arduino Library in the local `wolfSSL` directory + - Moves that directory to the Arduino library directory: + - `$HOME/Arduino/libraries` for most bash environments + - `/mnt/c/Users/$USER/Documents/Arduino/libraries` (for WSL) + - Adds the [default](../../examples/configs/user_settings_arduino.h) as `user_settings.h`. + - The wolfSSL library is now available from the Arduino IDE. + +3. `./wolfssl-arduino.sh INSTALL /path/to/repository` (Used to update [arduino-wolfSSL](https://github.com/wolfSSL/arduino-wolfSSL)) + - Creates an Arduino Library in `wolfSSL` directory + - Copies that directory contents to the specified `/path/to/repository` + - Adds the [default](../../examples/configs/user_settings_arduino.h) as `user_settings.h`. + +4. `./wolfssl-arduino.sh INSTALL /path/to/any/other/directory` + - Creates an Arduino Library in `wolfSSL` directory + - Copies that directory contents to the specified `/path/to/any/other/directory` + +### Step 2: + +Edit `/wolfSSL/src/user_settings.h` If building for Intel Galileo platform add: `#define INTEL_GALILEO`. -Add any other custom settings, for a good start see the examples in wolfssl root -"/examples/configs/user_settings_*.h" +Add any other custom settings. For a good start see the examples in wolfssl root +"[/examples/configs/user_settings_*.h](https://github.com/wolfssl/wolfssl/tree/master/examples/configs)" -Step 4: If you experience any issues with custom user_settings.h see the wolfssl +### Step 3: + +If you experience any issues with custom `user_settings.h` see the wolfssl porting guide here for more assistance: https://www.wolfssl.com/docs/porting-guide/ -Step 5: If you still have any issues contact support@wolfssl.com for more help. +If you have any issues contact support@wolfssl.com for help. + +# Including wolfSSL in Arduino Libraries (for Arduino version 2.0 or greater) + +1. In the Arduino IDE: + +The wolfSSL library should automatically be detected when found in the `libraries` +directory. + + - In `Sketch -> Include Library` choose wolfSSL for new sketches. + ##### Including wolfSSL in Arduino Libraries (for Arduino version 1.6.6) @@ -33,6 +92,90 @@ Step 5: If you still have any issues contact support@wolfssl.com for more help. `IDE/ARDUNIO/wolfSSL` folder. - In `Sketch -> Include Library` choose wolfSSL. -2. Open an example Arduino sketch for wolfSSL: - - wolfSSL Client INO sketch: `sketches/wolfssl_client/wolfssl_client.ino` - - wolfSSL Server INO sketch: `sketches/wolfssl_server/wolfssl_server.ino` +##### wolfSSL Examples + +Open an example Arduino sketch for wolfSSL: + + - wolfSSL [Client INO sketch](./sketches/wolfssl_client/README.md): `sketches/wolfssl_client/wolfssl_client.ino` + + - wolfSSL [Server INO sketch](./sketches/wolfssl_server/README.md): `sketches/wolfssl_server/wolfssl_server.ino` + +#### Script Examples + +Refresh the local Windows Arduino wolfSSL library from GitHub repository directory using WSL: + +Don't forget to edit `WOLFSSL_VERSION_ARUINO_SUFFIX`! + +```bash +# Change to the wolfSSL Arduino IDE directory +cd /mnt/c/workspace/wolfssl-$USER/IDE/ARDUINO + +# remove current Arduino wolfSSL library +rm -rf /mnt/c/Users/$USER/Documents/Arduino/libraries/wolfssl + +# Install wolfSSL as an Arduino library +./wolfssl-arduino.sh INSTALL +``` + +Publish wolfSSL from WSL to a `Arduino-wolfSSL-$USER` repository. + +```bash +cd /mnt/c/workspace/wolfssl-$USER/IDE/ARDUINO +rm -rf /mnt/c/Users/$USER/Documents/Arduino/libraries/wolfSSL +rm -rf /mnt/c/workspace/wolfssl-$USER/IDE/ARDUINO/wolfSSL +./wolfssl-arduino.sh INSTALL /mnt/c/workspace/Arduino-wolfSSL-$USER/ +``` + +Publish wolfSSL from WSL to default Windows local library. + +```bash +cd /mnt/c/workspace/wolfssl-$USER/IDE/ARDUINO +rm -rf /mnt/c/Users/$USER/Documents/Arduino/libraries/wolfSSL +rm -rf /mnt/c/workspace/wolfssl-arduino/IDE/ARDUINO/wolfSSL +./wolfssl-arduino.sh INSTALL +``` + +Test the TLS server by running a local command-line client. + +```bash +cd /mnt/c/workspace/wolfssl-$USER +./examples/client/client -h 192.168.1.43 -p 11111 -v 3 +``` + +Build wolfSSL to include wolfSSH support to an alternate development directory. + +```bash +cd /mnt/c/workspace/wolfssl-$USER +./configure --prefix=/mnt/c/workspace/wolfssh-$USER/wolfssl_install --enable-ssh +make +make install + +``` + +Build wolfSSH with wolfSSL not installed to default directory. + +```bash +cd /mnt/c/workspace/wolfssh-$USER +./configure --with-wolfssl=/mnt/c/workspace/wolfssh-$USER/wolfssl_install +make +./examples/client/client -u jill -h 192.168.1.34 -p 22222 -P upthehill +``` + +Test the current wolfSSL. + +```bash +cd /mnt/c/workspace/wolfssl-arduino +git status +./autogen.sh +./configure --enable-all +make clean +make && make test +``` + +Build and run `testwolfcrypt`. + +```bash +./autogen.sh +./configure --enable-all +make clean && make && ./wolfcrypt/test/testwolfcrypt +``` diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/include.am b/extra/wolfssl/wolfssl/IDE/ARDUINO/include.am index 19189e82..52491a8b 100644 --- a/extra/wolfssl/wolfssl/IDE/ARDUINO/include.am +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/include.am @@ -3,6 +3,15 @@ # All paths should be given relative to the root EXTRA_DIST+= IDE/ARDUINO/README.md +EXTRA_DIST+= IDE/ARDUINO/Arduino_README_prepend.md +EXTRA_DIST+= IDE/ARDUINO/keywords.txt +EXTRA_DIST+= IDE/ARDUINO/library.properties.template +EXTRA_DIST+= IDE/ARDUINO/sketches/README.md +EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_client/README.md EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino +EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_server/README.md EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino +EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_version/README.md +EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino +EXTRA_DIST+= IDE/ARDUINO/wolfssl.h EXTRA_DIST+= IDE/ARDUINO/wolfssl-arduino.sh diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/keywords.txt b/extra/wolfssl/wolfssl/IDE/ARDUINO/keywords.txt new file mode 100644 index 00000000..27d5dc3d --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/keywords.txt @@ -0,0 +1,21 @@ +# Syntax Coloring Map For wolfSSL +# See https://arduino.github.io/arduino-cli/0.35/library-specification/#keywords +# +# Be sure to use tabs, not spaces. This might help: +# tr ' ' '\t' < keywords1.txt > keywords.txt + +#============================================= +# Datatypes (KEYWORD1) +#============================================= + + +#============================================= +# Methods and Functions (KEYWORD2) +#============================================= +wolfSSL_SetIORecv KEYWORD1 + +#============================================= +# Instances (KEYWORD2) +#============================================= +ctx KEYWORD2 + diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/library.properties.template b/extra/wolfssl/wolfssl/IDE/ARDUINO/library.properties.template new file mode 100644 index 00000000..9b18e8c2 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/library.properties.template @@ -0,0 +1,9 @@ +name=wolfssl +version=${WOLFSSL_VERSION}${WOLFSSL_VERSION_ARUINO_SUFFIX} +author=wolfSSL Inc. +maintainer=wolfSSL inc +sentence=A lightweight SSL/TLS library written in ANSI C and targeted for embedded, RTOS, and resource-constrained environments. +paragraph=Manual: https://www.wolfssl.com/documentation/manuals/wolfssl/index.html. +category=Communication +url=https://www.wolfssl.com/ +architectures=* diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/README.md b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/README.md new file mode 100644 index 00000000..26a1d1e1 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/README.md @@ -0,0 +1,12 @@ +# wolfSSL Arduino Examples + +There are currently two example Arduino sketches: + +* [wolfssl_client](./wolfssl_client/README.md): Basic TLS listening client. +* [wolfssl_server](./wolfssl_server/README.md): Basic TLS server. + +Examples have been most recently confirmed operational on the +[Arduino IDE](https://www.arduino.cc/en/software) 2.2.1. + +For examples on other platforms, see the [IDE directory](https://github.com/wolfssl/wolfssl/tree/master/IDE). +Additional examples can be found on [wolfSSL/wolfssl-examples](https://github.com/wolfSSL/wolfssl-examples/). diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/README.md b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/README.md new file mode 100644 index 00000000..caf83c58 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/README.md @@ -0,0 +1,22 @@ +# Arduino Basic TLS Listening Client + +Open the [wolfssl_client.ino](./wolfssl_client.ino) file in the Arduino IDE. + +Other IDE products are also supported, such as: + +- [PlatformIO in VS Code](https://docs.platformio.org/en/latest/frameworks/arduino.html) +- [VisualGDB](https://visualgdb.com/tutorials/arduino/) +- [VisualMicro](https://www.visualmicro.com/) + +For examples on other platforms, see the [IDE directory](https://github.com/wolfssl/wolfssl/tree/master/IDE). +Additional examples can be found on [wolfSSL/wolfssl-examples](https://github.com/wolfSSL/wolfssl-examples/). + + +### Troubleshooting + +When encountering odd errors such as `undefined reference to ``_impure_ptr'`, try cleaning the Arduino +cache directories. For Windows, that's typically in: + +```text +C:\Users\%USERNAME%\AppData\Local\Temp\arduino\sketches +``` diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino index 61362ae9..21a84deb 100644 --- a/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino @@ -20,157 +20,875 @@ */ /* - This was original tested with Intel Galileo acting as the Client, with a -laptop acting as a server using the server example provided in examples/server. -Legacy Ardunio v1.86 was used to compile and program the Galileo +Tested with: + +1) Intel Galileo acting as the Client, with a laptop acting as a server using + the server example provided in examples/server. + Legacy Arduino v1.86 was used to compile and program the Galileo + +2) Espressif ESP32 WiFi + +3) Arduino Due, Nano33 IoT, Nano RP-2040 */ -#define USE_CERT_BUFFERS_2048 +/* + * Note to code editors: the Arduino client and server examples are edited in + * parallel for side-by-side comparison between examples. + */ + +/* If you have a private include, define it here, otherwise edit WiFi params */ +#define MY_PRIVATE_CONFIG "/workspace/my_private_config.h" + +/* set REPEAT_CONNECTION to a non-zero value to continually run the example. */ +#define REPEAT_CONNECTION 0 + +/* Edit this with your other TLS host server address to connect to: */ +#define WOLFSSL_TLS_SERVER_HOST "192.168.1.39" + +/* wolfssl TLS examples communicate on port 11111 */ +#define WOLFSSL_PORT 11111 + +/* Choose a monitor serial baud rate: 9600, 14400, 19200, 57600, 74880, etc. */ +#define SERIAL_BAUD 115200 + +/* We'll wait up to 2000 milliseconds to properly shut down connection */ +#define SHUTDOWN_DELAY_MS 2000 + +/* Number of times to retry connection. */ +#define RECONNECT_ATTEMPTS 20 + +/* Optional stress test. Define to consume memory until exhausted: */ +/* #define MEMORY_STRESS_TEST */ + +/* Choose client or server example, not both. */ +#define WOLFSSL_CLIENT_EXAMPLE +/* #define WOLFSSL_SERVER_EXAMPLE */ + +#if defined(MY_PRIVATE_CONFIG) + /* the /workspace directory may contain a private config + * excluded from GitHub with items such as WiFi passwords */ + #include MY_PRIVATE_CONFIG + static const char* ssid PROGMEM = MY_ARDUINO_WIFI_SSID; + static const char* password PROGMEM = MY_ARDUINO_WIFI_PASSWORD; +#else + /* when using WiFi capable boards: */ + static const char* ssid PROGMEM = "your_SSID"; + static const char* password PROGMEM = "your_PASSWORD"; +#endif + +#define BROADCAST_ADDRESS "255.255.255.255" + +/* There's an optional 3rd party NTPClient library by Fabrice Weinberg. + * If it is installed, uncomment define USE_NTP_LIB here: */ +/* #define USE_NTP_LIB */ +#ifdef USE_NTP_LIB + #include +#endif + #include +/* Important: make sure settings.h appears before any other wolfSSL headers */ +#include +/* Reminder: settings.h includes user_settings.h + * For ALL project wolfSSL settings, see: + * [your path]/Arduino\libraries\wolfSSL\src\user_settings.h */ #include -#include #include +#include + +/* Define DEBUG_WOLFSSL in user_settings.h for more verbose logging. */ +#if defined(DEBUG_WOLFSSL) + #define PROGRESS_DOT F("") +#else + #define PROGRESS_DOT F(".") +#endif + +/* Convert a macro to a string */ +#define xstr(x) str(x) +#define str(x) #x + +/* optional board-specific networking includes */ +#if defined(ESP32) + #define USING_WIFI + #include + #include + #ifdef USE_NTP_LIB + WiFiUDP ntpUDP; + #endif + /* Ensure the F() flash macro is defined */ + #ifndef F + #define F + #endif + WiFiClient client; + +#elif defined(ESP8266) + #define USING_WIFI + #include + WiFiClient client; + +#elif defined(ARDUINO_SAM_DUE) + #include + /* There's no WiFi/Ethernet on the Due. Requires Ethernet Shield. + /* Needs "Ethernet by Various" library to be installed. Tested with V2.0.2 */ + #include + EthernetClient client; + +#elif defined(ARDUINO_SAMD_NANO_33_IOT) + #define USING_WIFI + #include + #include /* Needs Arduino WiFiNINA library installed manually */ + WiFiClient client; + +#elif defined(ARDUINO_ARCH_RP2040) + #define USING_WIFI + #include + #include + WiFiClient client; + +#elif defined(USING_WIFI) + #define USING_WIFI + #include + #include + #ifdef USE_NTP_LIB + WiFiUDP ntpUDP; + #endif + WiFiClient client; + +/* TODO +#elif defined(OTHER_BOARD) +*/ +#else + #define USING_WIFI + WiFiClient client; + +#endif + +/* Only for syntax highlighters to show interesting options enabled: */ +#if defined(HAVE_SNI) \ + || defined(HAVE_MAX_FRAGMENT) \ + || defined(HAVE_TRUSTED_CA) \ + || defined(HAVE_TRUNCATED_HMAC) \ + || defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ + || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) \ + || defined(HAVE_SUPPORTED_CURVES) \ + || defined(HAVE_ALPN) \ + || defined(HAVE_SESSION_TICKET) \ + || defined(HAVE_SECURE_RENEGOTIATION) \ + || defined(HAVE_SERVER_RENEGOTIATION_INFO) +#endif + +static const char host[] PROGMEM = WOLFSSL_TLS_SERVER_HOST; /* server to connect to */ +static const int port PROGMEM = WOLFSSL_PORT; /* port on server to connect to */ + +static WOLFSSL_CTX* ctx = NULL; +static WOLFSSL* ssl = NULL; +static char* wc_error_message = (char*)malloc(80 + 1); +static char errBuf[80]; + +#if defined(MEMORY_STRESS_TEST) + #define MEMORY_STRESS_ITERATIONS 100 + #define MEMORY_STRESS_BLOCK_SIZE 1024 + #define MEMORY_STRESS_INITIAL (4*1024) + static char* memory_stress[MEMORY_STRESS_ITERATIONS]; /* typically 1K per item */ + static int mem_ctr = 0; +#endif + +static int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx); +static int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx); +static int reconnect = RECONNECT_ATTEMPTS; +static int lng_index PROGMEM = 0; /* 0 = English */ + +#if defined(__arm__) + #include + extern char _end; + extern "C" char *sbrk(int i); + static char *ramstart=(char *)0x20070000; + static char *ramend=(char *)0x20088000; +#endif + +/*****************************************************************************/ +/* fail_wait - in case of unrecoverable error */ +/*****************************************************************************/ +int fail_wait(void) { + show_memory(); + + Serial.println(F("Failed. Halt.")); + while (1) { + delay(1000); + } + return 0; +} + +/*****************************************************************************/ +/* show_memory() to optionally view during debugging. */ +/*****************************************************************************/ +int show_memory(void) +{ +#if defined(__arm__) + struct mallinfo mi = mallinfo(); + + char *heapend=sbrk(0); + register char * stack_ptr asm("sp"); + #if defined(DEBUG_WOLFSSL_VERBOSE) + Serial.print(" arena="); + Serial.println(mi.arena); + Serial.print(" ordblks="); + Serial.println(mi.ordblks); + Serial.print(" uordblks="); + Serial.println(mi.uordblks); + Serial.print(" fordblks="); + Serial.println(mi.fordblks); + Serial.print(" keepcost="); + Serial.println(mi.keepcost); + #endif + + #if defined(DEBUG_WOLFSSL) || defined(MEMORY_STRESS_TEST) + Serial.print("Estimated free memory: "); + Serial.print(stack_ptr - heapend + mi.fordblks); + Serial.println(F(" bytes")); + #endif + + #if (0) + /* Experimental: not supported on all devices: */ + Serial.print("RAM Start %lx\n", (unsigned long)ramstart); + Serial.print("Data/Bss end %lx\n", (unsigned long)&_end); + Serial.print("Heap End %lx\n", (unsigned long)heapend); + Serial.print("Stack Ptr %lx\n",(unsigned long)stack_ptr); + Serial.print("RAM End %lx\n", (unsigned long)ramend); + + Serial.print("Heap RAM Used: ",mi.uordblks); + Serial.print("Program RAM Used ",&_end - ramstart); + Serial.print("Stack RAM Used ",ramend - stack_ptr); + + Serial.print("Estimated Free RAM: %d\n\n",stack_ptr - heapend + mi.fordblks); + #endif +#else + Serial.println(F("show_memory() not implemented for this platform")); +#endif + return 0; +} + +/*****************************************************************************/ +/* EthernetSend() to send a message string. */ +/*****************************************************************************/ +int EthernetSend(WOLFSSL* ssl, char* message, int sz, void* ctx) { + int sent = 0; + (void)ssl; + (void)ctx; + + sent = client.write((byte*)message, sz); + return sent; +} + +/*****************************************************************************/ +/* EthernetReceive() to receive a reply string. */ +/*****************************************************************************/ +int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx) { + int ret = 0; + (void)ssl; + (void)ctx; + + while (client.available() > 0 && ret < sz) { + reply[ret++] = client.read(); + } + return ret; +} + +/*****************************************************************************/ +/* Arduino setup_hardware() */ +/*****************************************************************************/ +int setup_hardware(void) { + int ret = 0; + +#if defined(ARDUINO_SAMD_NANO_33_IOT) + Serial.println(F("Detected known tested and working Arduino Nano 33 IoT")); +#elif defined(ARDUINO_ARCH_RP2040) + Serial.println(F("Detected known tested and working Arduino RP-2040")); +#elif defined(__arm__) && defined(ID_TRNG) && defined(TRNG) + /* need to manually turn on random number generator on Arduino Due, etc. */ + pmc_enable_periph_clk(ID_TRNG); + trng_enable(TRNG); + Serial.println(F("Enabled ARM TRNG")); +#endif + + show_memory(); + randomSeed(analogRead(0)); + return ret; +} + +/*****************************************************************************/ +/* Arduino setup_datetime() */ +/* The device needs to have a valid date within the valid range of certs. */ +/*****************************************************************************/ +int setup_datetime(void) { + int ret = 0; + int ntp_tries = 20; + + /* we need a date in the range of cert expiration */ +#ifdef USE_NTP_LIB + #if defined(ESP32) + NTPClient timeClient(ntpUDP, "pool.ntp.org"); + + timeClient.begin(); + timeClient.update(); + delay(1000); + while (!timeClient.isTimeSet() && (ntp_tries > 0)) { + timeClient.forceUpdate(); + Serial.println(F("Waiting for NTP update")); + delay(2000); + ntp_tries--; + } + if (ntp_tries <= 0) { + Serial.println(F("Warning: gave up waiting on NTP")); + } + Serial.println(timeClient.getFormattedTime()); + Serial.println(timeClient.getEpochTime()); + #endif +#endif + +#if defined(ESP32) + /* see esp32-hal-time.c */ + ntp_tries = 5; + /* Replace "pool.ntp.org" with your preferred NTP server */ + configTime(0, 0, "pool.ntp.org"); + + /* Wait for time to be set */ + while ((time(nullptr) <= 100000) && ntp_tries > 0) { + Serial.println(F("Waiting for time to be set...")); + delay(2000); + ntp_tries--; + } +#endif + return ret; +} /* setup_datetime */ + +/*****************************************************************************/ +/* Arduino setup_network() */ +/*****************************************************************************/ +int setup_network(void) { + int ret = 0; -const char host[] = "192.168.1.148"; /* server to connect to */ -const int port = 11111; /* port on server to connect to */ +#if defined(USING_WIFI) + int status = WL_IDLE_STATUS; -int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx); -int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx); -int reconnect = 10; + /* The ESP8266 & ESP32 support both AP and STA. We'll use STA: */ + #if defined(ESP8266) || defined(ESP32) + WiFi.mode(WIFI_STA); + #else + String fv; + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + /* don't continue if no network */ + while (true) ; + } -EthernetClient client; + fv = WiFi.firmwareVersion(); + if (fv < WIFI_FIRMWARE_LATEST_VERSION) { + Serial.println("Please upgrade the firmware"); + } + #endif + + Serial.print(F("Connecting to WiFi ")); + Serial.print(ssid); + status = WiFi.begin(ssid, password); + while (status != WL_CONNECTED) { + delay(1000); + Serial.print(F(".")); + Serial.print(status); + status = WiFi.status(); + } + + Serial.println(F(" Connected!")); +#else + /* Newer Ethernet shields have a + * MAC address printed on a sticker on the shield */ + byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + IPAddress ip(192, 168, 1, 42); + IPAddress myDns(192, 168, 1, 1); + Ethernet.init(10); /* Most Arduino shields */ + /* Ethernet.init(5); * MKR ETH Shield */ + /* Ethernet.init(0); * Teensy 2.0 */ + /* Ethernet.init(20); * Teensy++ 2.0 */ + /* Ethernet.init(15); * ESP8266 with Adafruit FeatherWing Ethernet */ + /* Ethernet.init(33); * ESP32 with Adafruit FeatherWing Ethernet */ + Serial.println(F("Initialize Ethernet with DHCP:")); + if (Ethernet.begin(mac) == 0) { + Serial.println(F("Failed to configure Ethernet using DHCP")); + /* Check for Ethernet hardware present */ + if (Ethernet.hardwareStatus() == EthernetNoHardware) { + Serial.println(F("Ethernet shield was not found.")); + while (true) { + delay(1); /* do nothing */ + } + } + if (Ethernet.linkStatus() == LinkOFF) { + Serial.println(F("Ethernet cable is not connected.")); + } + /* try to configure using IP address instead of DHCP : */ + Ethernet.begin(mac, ip, myDns); + } + else { + Serial.print(F(" DHCP assigned IP ")); + Serial.println(Ethernet.localIP()); + } + /* We'll assume the Ethernet connection is ready to go. */ +#endif -WOLFSSL_CTX* ctx = NULL; -WOLFSSL* ssl = NULL; + Serial.println(F("********************************************************")); + Serial.print(F(" wolfSSL Example Client IP = ")); +#if defined(USING_WIFI) + Serial.println(WiFi.localIP()); +#else + Serial.println(Ethernet.localIP()); +#endif + Serial.print(F(" Configured Server Host to connect to: ")); + Serial.println(host); + Serial.println(F("********************************************************")); + Serial.println(F("Setup network complete.")); -void setup() { + return ret; +} + +/*****************************************************************************/ +/* Arduino setup_wolfssl() */ +/*****************************************************************************/ +int setup_wolfssl(void) { + int ret = 0; WOLFSSL_METHOD* method; - /* Initialize Return Code */ - int rc; - Serial.begin(9600); - /* Delay need to ensure connection to server */ - delay(4000); - method = wolfTLSv1_2_client_method(); + /* Show a revision of wolfssl user_settings.h file in use when available: */ +#if defined(WOLFSSL_USER_SETTINGS_ID) + Serial.print(F("WOLFSSL_USER_SETTINGS_ID: ")); + Serial.println(F(WOLFSSL_USER_SETTINGS_ID)); +#else + Serial.println(F("No WOLFSSL_USER_SETTINGS_ID found.")); +#endif + +#if defined(NO_WOLFSSL_SERVER) + Serial.println(F("wolfSSL server code disabled to save space.")); +#endif +#if defined(NO_WOLFSSL_CLIENT) + Serial.println(F("wolfSSL client code disabled to save space.")); +#endif + +#if defined(DEBUG_WOLFSSL) + wolfSSL_Debugging_ON(); + Serial.println(F("wolfSSL Debugging is On!")); +#else + Serial.println(F("wolfSSL Debugging is Off! (enable with DEBUG_WOLFSSL)")); +#endif + + /* See ssl.c for TLS cache settings. Larger cache = use more RAM. */ +#if defined(NO_SESSION_CACHE) + Serial.println(F("wolfSSL TLS NO_SESSION_CACHE")); +#elif defined(MICRO_SESSION_CACHEx) + Serial.println(F("wolfSSL TLS MICRO_SESSION_CACHE")); +#elif defined(SMALL_SESSION_CACHE) + Serial.println(F("wolfSSL TLS SMALL_SESSION_CACHE")); +#elif defined(MEDIUM_SESSION_CACHE) + Serial.println(F("wolfSSL TLS MEDIUM_SESSION_CACHE")); +#elif defined(BIG_SESSION_CACHE) + Serial.println(F("wolfSSL TLS BIG_SESSION_CACHE")); +#elif defined(HUGE_SESSION_CACHE) + Serial.println(F("wolfSSL TLS HUGE_SESSION_CACHE")); +#elif defined(HUGE_SESSION_CACHE) + Serial.println(F("wolfSSL TLS HUGE_SESSION_CACHE")); +#else + Serial.println(F("WARNING: Unknown or no TLS session cache setting.")); + /* See wolfssl/src/ssl.c for amount of memory used. + * It is best on embedded devices to choose a TLS session cache size. */ +#endif + + ret = wolfSSL_Init(); + if (ret == WOLFSSL_SUCCESS) { + Serial.println("Successfully called wolfSSL_Init"); + } + else { + Serial.println("ERROR: wolfSSL_Init failed"); + } + + /* See companion server example with wolfSSLv23_server_method here. + * method = wolfSSLv23_client_method()); SSL 3.0 - TLS 1.3. + * method = wolfTLSv1_2_client_method(); only TLS 1.2 + * method = wolfTLSv1_3_client_method(); only TLS 1.3 + * + * see Arduino\libraries\wolfssl\src\user_settings.h */ + + Serial.println("Here we go!"); + + method = wolfSSLv23_client_method(); if (method == NULL) { - Serial.println("unable to get method"); - return; + Serial.println(F("unable to get wolfssl client method")); + fail_wait(); } ctx = wolfSSL_CTX_new(method); if (ctx == NULL) { - Serial.println("unable to get ctx"); - return; + Serial.println(F("unable to get ctx")); + fail_wait(); } - /* initialize wolfSSL using callback functions */ + + return ret; +} + +/*****************************************************************************/ +/* Arduino setup_certificates() */ +/*****************************************************************************/ +int setup_certificates(void) { + int ret = 0; + + Serial.println(F("Initializing certificates...")); + show_memory(); + + /* Use built-in validation, No verification callback function: */ wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, 0); - rc = wolfSSL_CTX_load_verify_buffer(ctx, ca_cert_der_2048,\ - sizeof_ca_cert_der_2048,\ - WOLFSSL_FILETYPE_ASN1); - Serial.print("\n\n Return code of load_verify is:"); - Serial.println(rc); - Serial.println(""); - rc = wolfSSL_CTX_use_certificate_buffer(ctx, client_cert_der_2048,\ - sizeof_client_cert_der_2048,\ - WOLFSSL_FILETYPE_ASN1); - Serial.print("\n\n Return code of use_certificate_buffer is:"); - Serial.println(rc); - Serial.println(""); - rc = wolfSSL_CTX_use_PrivateKey_buffer(ctx, client_key_der_2048,\ - sizeof_client_key_der_2048,\ - WOLFSSL_FILETYPE_ASN1); - Serial.print("\n\n Return code of use_PrivateKey_buffer is:"); - Serial.println(rc); - Serial.println(""); + + /* Certificate */ + Serial.println("Initializing certificates..."); + ret = wolfSSL_CTX_use_certificate_buffer(ctx, + CTX_CLIENT_CERT, + CTX_CLIENT_CERT_SIZE, + CTX_CLIENT_CERT_TYPE); + if (ret == WOLFSSL_SUCCESS) { + Serial.print("Success: use certificate: "); + Serial.println(xstr(CTX_SERVER_CERT)); + } + else { + Serial.println(F("Error: wolfSSL_CTX_use_certificate_buffer failed: ")); + wc_ErrorString(ret, wc_error_message); + Serial.println(wc_error_message); + fail_wait(); + } + + /* Setup private client key */ + ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + CTX_CLIENT_KEY, + CTX_CLIENT_KEY_SIZE, + CTX_CLIENT_KEY_TYPE); + if (ret == WOLFSSL_SUCCESS) { + Serial.print("Success: use private key buffer: "); + Serial.println(xstr(CTX_SERVER_KEY)); + } + else { + Serial.println(F("Error: wolfSSL_CTX_use_PrivateKey_buffer failed: ")); + wc_ErrorString(ret, wc_error_message); + Serial.println(wc_error_message); + fail_wait(); + } + + ret = wolfSSL_CTX_load_verify_buffer(ctx, + CTX_CA_CERT, + CTX_CA_CERT_SIZE, + CTX_CA_CERT_TYPE); + if (ret == WOLFSSL_SUCCESS) { + Serial.println(F("Success: load_verify CTX_CA_CERT")); + } + else { + Serial.println(F("Error: wolfSSL_CTX_load_verify_buffer failed: ")); + wc_ErrorString(ret, wc_error_message); + Serial.println(wc_error_message); + fail_wait(); + } + + + + return ret; +} /* Arduino setup */ + +/*****************************************************************************/ +/*****************************************************************************/ +/* Arduino setup() */ +/*****************************************************************************/ +/*****************************************************************************/ +void setup(void) { + int i = 0; + Serial.begin(SERIAL_BAUD); + while (!Serial && (i < 10)) { + /* wait for serial port to connect. Needed for native USB port only */ + delay(1000); + i++; + } + Serial.println(F("")); + Serial.println(F("")); + Serial.println(F("wolfSSL TLS Client Example Startup.")); + + /* define DEBUG_WOLFSSL in wolfSSL user_settings.h for diagnostics */ +#if defined(DEBUG_WOLFSSL) + wolfSSL_Debugging_ON(); +#endif + + /* Optionally pre-allocate a large block of memory for testing */ +#if defined(MEMORY_STRESS_TEST) + Serial.println(F("WARNING: Memory Stress Test Active!")); + Serial.print(F("Allocating extra memory: ")); + Serial.print(MEMORY_STRESS_INITIAL); + Serial.println(F(" bytes...")); + memory_stress[mem_ctr] = (char*)malloc(MEMORY_STRESS_INITIAL); + show_memory(); +#endif + + setup_hardware(); + + setup_network(); + + setup_datetime(); + + setup_wolfssl(); + + setup_certificates(); + + /* Initialize wolfSSL using callback functions. */ wolfSSL_SetIOSend(ctx, EthernetSend); wolfSSL_SetIORecv(ctx, EthernetReceive); - return; -} -int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx) { - int sent = 0; - sent = client.write((byte*)msg, sz); - return sent; -} + Serial.println(F("Completed Arduino setup!")); + /* See companion wolfssl_server.ino code; server begins listening here + * https://github.com/wolfSSL/wolfssl/tree/master/IDE/ARDUINO/sketches/wolfssl_server + * Any other server will work. See also: + * https://github.com/wolfSSL/wolfssl/tree/master/examples/client + */ + /* See companion wolfssl_server.ino code */ + return; +} /* Arduino setup */ -int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx) { +/*****************************************************************************/ +/* wolfSSL error_check() */ +/*****************************************************************************/ +int error_check(int this_ret, bool halt_on_error, + const __FlashStringHelper* message) { int ret = 0; - while (client.available() > 0 && ret < sz) { - reply[ret++] = client.read(); + if (this_ret == WOLFSSL_SUCCESS) { + Serial.print(F("Success: ")); + Serial.println(message); + } + else { + Serial.print(F("ERROR: return = ")); + Serial.print(this_ret); + Serial.print(F(": ")); + Serial.println(message); + Serial.println(wc_GetErrorString(this_ret)); + if (halt_on_error) { + fail_wait(); + } } + show_memory(); + return ret; +} /* error_check */ + +/*****************************************************************************/ +/* wolfSSL error_check_ssl */ +/* Parameters: */ +/* ssl is the current WOLFSSL object pointer */ +/* halt_on_error set to true to suspend operations for critical error */ +/* message is expected to be a memory-efficient F("") macro string */ +/*****************************************************************************/ +int error_check_ssl(WOLFSSL* ssl, int this_ret, bool halt_on_error, + const __FlashStringHelper* message) { + int err = 0; + + if (ssl == NULL) { + Serial.println(F("ssl is Null; Unable to allocate SSL object?")); +#ifndef DEBUG_WOLFSSL + Serial.println(F("Define DEBUG_WOLFSSL in user_settings.h for more.")); +#else + Serial.println(F("See wolfssl/wolfcrypt/error-crypt.h for codes.")); +#endif + Serial.print(F("ERROR: ")); + Serial.println(message); + show_memory(); + if (halt_on_error) { + fail_wait(); + } + } + else { + err = wolfSSL_get_error(ssl, this_ret); + if (err == WOLFSSL_SUCCESS) { + Serial.print(F("Success m: ")); + Serial.println(message); + } + else { + if (err < 0) { + wolfSSL_ERR_error_string(err, errBuf); + Serial.print(F("WOLFSSL Error: ")); + Serial.print(err); + Serial.print(F("; ")); + Serial.println(errBuf); + } + else { + Serial.println(F("Success: ssl object.")); + } + } + } + + return err; } +/*****************************************************************************/ +/*****************************************************************************/ +/* Arduino loop() */ +/*****************************************************************************/ +/*****************************************************************************/ void loop() { - int err = 0; - int input = 0; - int total_input = 0; - char msg[32] = "hello wolfssl!"; - int msgSz = (int)strlen(msg); - char errBuf[80]; char reply[80]; + char msg[32] = "hello wolfssl!"; const char* cipherName; + int retry_shutdown = SHUTDOWN_DELAY_MS; /* max try, once per millisecond */ + int total_input = 0; + int msgSz = 0; + int input = 0; + int ret = 0; + int err = 0; + msgSz = (int)strlen(msg); + Serial.println(F("")); + Serial.println(F("Starting Arduino loop() ...")); + if (reconnect) { reconnect--; - if (client.connect(host, port)) { - Serial.print("Connected to "); - Serial.println(host); + /* WiFi client returns true if connection succeeds, false if not. */ + /* Wired client returns int (1,-1,-2,-3,-4) for connection status. */ + Serial.print(F("Connecting to ")); + Serial.print(host); + Serial.print(F(":")); + Serial.println(port); + /* can also use: IPAddress server(192,168,1,37); */ + Serial.println(F("Here we go...")); + ret = client.connect(host, port); + Serial.println(F("Ok, checking...")); + if (ret > 0) { + Serial.println(F("Connected!")); + + /* initialize wolfSSL */ + ret = wolfSSL_Init(); + error_check(ret, false, F("calling wolfSSL_Init") ); + + /* create secure connection object. see setup for ctx certs. */ + Serial.println(F("Calling ssl = wolfSSL_new(ctx)")); ssl = wolfSSL_new(ctx); - if (ssl == NULL) { - Serial.println("Unable to allocate SSL object"); - return; - } - err = wolfSSL_connect(ssl); - if (err != WOLFSSL_SUCCESS) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Connect Error: "); - Serial.println(errBuf); - } - Serial.print("SSL version is "); + error_check_ssl(ssl, 0, true, F("Create WOLFSSL object from ctx")); + + Serial.print(F("Connecting to wolfSSL TLS Secure Server...")); + do { + err = 0; /* reset error */ + Serial.println(F("wolfSSL_connect ...")); + ret = wolfSSL_connect(ssl); + Serial.print("wolfSSL_connect return result ="); + Serial.println(ret); + if ((ret != WOLFSSL_SUCCESS) && (ret != WC_PENDING_E)) { + Serial.println(F("Failed connection, checking error.")); + err = error_check_ssl(ssl, ret, true, + F("Create WOLFSSL object from ctx")); + Serial.print("err ="); + Serial.println(err); + } + else { + Serial.print(PROGRESS_DOT); + } + } while (err == WC_PENDING_E); + + Serial.println(); + Serial.println(F("Connected!")); + Serial.print(F("SSL version is ")); Serial.println(wolfSSL_get_version(ssl)); + cipherName = wolfSSL_get_cipher(ssl); - Serial.print("SSL cipher suite is "); + Serial.print(F("SSL cipher suite is ")); Serial.println(cipherName); - if ((wolfSSL_write(ssl, msg, msgSz)) == msgSz) { - Serial.print("Server response: "); - /* wait for data */ - while (!client.available()) {} + + /* see test.h + * TODO: test.h needs a little bit of Arduino work for these: + showPeerEx(ssl, lng_index); + showPeerPEM(ssl); + */ + + Serial.print(F("Sending secure message to server: ")); + Serial.println(msg); + ret = wolfSSL_write(ssl, msg, msgSz); + if (ret == msgSz) { + Serial.print(F("Waiting for Server response...")); + + while (!client.available()) { + /* wait for data */ + delay(1); /* 1 ms delay */ + } + + Serial.print(F("Reading response..")); /* read data */ - while (wolfSSL_pending(ssl)) { - input = wolfSSL_read(ssl, reply, sizeof(reply) - 1); - total_input += input; - if (input < 0) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Read Error: "); - Serial.println(errBuf); - break; - } - else if (input > 0) { - reply[input] = '\0'; - Serial.print(reply); + do { + ret = wolfSSL_read(ssl, reply, sizeof(reply) - 1); + if (ret < 0) { + error_check_ssl(ssl, ret, false, + F("during TLS Read")); } else { - Serial.println(); + Serial.print(PROGRESS_DOT); } - } - } + } while (err == WC_PENDING_E); + Serial.println(); + + Serial.println(); + Serial.println(reply); /* typically: I hear you fa shizzle! */ + Serial.println(); + + } /* wolfSSL_write message size matched */ else { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Write Error: "); - Serial.println(errBuf); + error_check_ssl(ssl, ret, false, + F("during TLS Write")); + } /* any wolfSSL_write message size mismatch is an error */ + + Serial.print(F("Shutting down..")); + do { + delay(1); + Serial.print(PROGRESS_DOT); + retry_shutdown--; + ret = wolfSSL_shutdown(ssl); + } while ( (ret == WOLFSSL_SHUTDOWN_NOT_DONE) + && (retry_shutdown > 0) + ); /* There may be pending data, so wait until done. */ + Serial.println(); + + if (retry_shutdown <= 0) { + /* if wolfSSL_free is called before properly shutting down the + * ssl object, undesired results may occur. */ + Serial.println(F("Warning! Shutdown did not properly complete.")); } - wolfSSL_shutdown(ssl); + wolfSSL_free(ssl); client.stop(); - Serial.println("Connection complete."); - reconnect = 0; - } + Serial.println(F("Connection complete.")); + if (REPEAT_CONNECTION) { + reconnect = RECONNECT_ATTEMPTS; + } + else { + reconnect = 0; + } + } /* client.connect(host, port) */ else { - Serial.println("Trying to reconnect..."); + Serial.println(F("Problem sending message. Trying to reconnect...")); } } delay(1000); -} + if ((reconnect > 0) && (REPEAT_CONNECTION)) { + Serial.println(F("Arduino loop repeating...")); + Serial.println(); + } + else { + printf("wow"); + Serial.println(F("Done!")); + while(1) { + /* wait forever */ + } + } + +#if defined(MEMORY_STRESS_TEST) + if (mem_ctr < MEMORY_STRESS_ITERATIONS) { + /* reminder: mem_ctr == 0 is MEMORY_STRESS_INITIAL allocation */ + mem_ctr++; + Serial.print(F("Memory stress increment: ")); + Serial.print(mem_ctr); + Serial.print(F(". Allocating addition memory (bytes): ")); + Serial.println(MEMORY_STRESS_BLOCK_SIZE); + memory_stress[mem_ctr] = (char*)malloc(MEMORY_STRESS_BLOCK_SIZE); + show_memory(); + } +#endif +} /* Arduino loop repeats */ diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/README.md b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/README.md new file mode 100644 index 00000000..523eb087 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/README.md @@ -0,0 +1,134 @@ +# Arduino Basic TLS Server + +Open the [wolfssl_server.ino](./wolfssl_server.ino) file in the Arduino IDE. + +Other IDE products are also supported, such as: + +- [PlatformIO in VS Code](https://docs.platformio.org/en/latest/frameworks/arduino.html) +- [VisualGDB](https://visualgdb.com/tutorials/arduino/) +- [VisualMicro](https://www.visualmicro.com/) + +For examples on other platforms, see the [IDE directory](https://github.com/wolfssl/wolfssl/tree/master/IDE). +Additional examples can be found on [wolfSSL/wolfssl-examples](https://github.com/wolfSSL/wolfssl-examples/). + +## Connect with an Arduino Sketch + +See the companion [Arduino Sketch Client](../wolfssl_client/wolfssl_client.ino). + +## Connect with Linux Client + +See also the [wolfSSL Example TLS Client](https://github.com/wolfSSL/wolfssl/tree/master/examples/client) +and [wolfSSL Example TLS Server](https://github.com/wolfSSL/wolfssl/tree/master/examples/server). + +Assuming a listening [Arduino Sketch Server](./wolfssl_server.ino) at `192.168.1.38` on port `11111`, +connect with the `client` executable: + +``` +./examples/client/client -h 192.168.1.38 -p 11111 -v 3 +``` + +## wolfSSL Error -308 wolfSSL_connect error state on socket + +When using a wired Ethernet connection, and this error is encountered, simply +press the reset button or power cycle the Arduino before making a connection. + +Here's one possible script to test the server from a command-line client: + +```bash +#!/bin/bash +echo "client log " > client_log.txt +counter=1 +THIS_ERR=0 +while [ $THIS_ERR -eq 0 ]; do + ./examples/client/client -h 192.168.1.38 -p 11111 -v 3 >> client_log.txt + + THIS_ERR=$? + if [ $? -ne 0 ]; then + echo "Failed!" + exit 1 + fi + echo "Iteration $counter" + echo "Iteration $counter" >> client_log.txt + ((counter++)) +done +``` + +Output expected from the `client` command: + +``` +$ ./examples/client/client -h 192.168.1.38 -p 11111 -v 3 +Alternate cert chain used + issuer : /C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + subject: /C=US/ST=Montana/L=Bozeman/O=wolfSSL/OU=Support/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + altname = example.com + altname = 127.0.0.1 + serial number:01 +SSL version is TLSv1.2 +SSL cipher suite is ECDHE-RSA-AES128-GCM-SHA256 +SSL curve name is SECP256R1 +--- +Server certificate +-----BEGIN CERTIFICATE----- +MIIE6DCCA9CgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh +d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxEDAO +BgNVBAsMB1N1cHBvcnQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG +SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMCVCOFXQfJxbbfSRUEnAWXGRa7yvCQwuJXOL07W9hyIvHyf+6hn +f/5cnFF194rKB+c1L4/hvXvAL3yrZKgX/Mpde7rgIeVyLm8uhtiVc9qsG1O5Xz/X +GQ0lT+FjY1GLC2Q/rUO4pRxcNLOuAKBjxfZ/C1loeHOmjBipAm2vwxkBLrgQ48bM +QLRpo0YzaYduxLsXpvPo3a1zvHsvIbX9ZlEMvVSz4W1fHLwjc9EJA4kU0hC5ZMMq +0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3uhPSl3PiXSXJag3DOWCktLBpQkIJ +6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcCAwEAAaOCAUUwggFBMB0GA1UdDgQW +BBSzETLJkpiE4sn40DtuA0LKHw6OPDCB1AYDVR0jBIHMMIHJgBQnjmcRdMMmHT/t +M2OzpNgdMOXo1aGBmqSBlzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh +bmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQL +DApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG +9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFDNEGqhsAez2YPJwUQpM0RT6vOlEMAwG +A1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwHQYDVR0l +BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQBK/7nl +hZvaU2Z/ByK/thnqQuukEQdi/zlfMzc6hyZxPROyyrhkOHuKmUgOpaRrsZlu4EZR +vRlSrbymfip6fCOnzNteQ31rBMi33ZWt8JGAWcUZkSYnkbhIHOtVtqp9pDjxA7xs +i6qU1jwFepbFBvEmFC51+93lNbMBLLOtYlohmgi+Vvz5okKHhuWpxZnPrhS+4LkI +JA0dXNYU4UyfQLOp6S1Si0y/rEQxZ8GNBoXsD+SZ10t7IQZm1OT1nf+O8IY5WB2k +W+Jj73zJGIeoAiUQPoco+fXvR56lgAgRkGj+0aOoUbk3/9XKfId/a7wsEsjFhYv8 +DMa5hrjJBMNRN9JP +-----END CERTIFICATE----- +Session timeout set to 500 seconds +Client Random : 56A0BB9647B064D3F20947032B74B31FDB4C93DBAC9460BA8AEA213A2B2DD4A8 +SSL-Session: + Protocol : TLSv1.2 + Cipher : TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + Session-ID: 3255404E997FA9C27ECB4F1A20A70E722E4AA504B63A945FC175434D1907EC31 + Session-ID-ctx: + Master-Key: 67F22168BBADD678643BBA76B398277270C29788AC18FD05B57F6B715F49A7BCEEF75BEAF7FE266B0CC058534AF76C1F + TLS session ticket: NONE + Start Time: 1705533296 + Timeout : 500 (sec) + Extended master secret: no +I hear you fa shizzle! +``` + +### Troubleshooting + +When encountering odd errors such as `undefined reference to ``_impure_ptr'`, such as this: + +```text +c:/users/gojimmypi/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/esp-2021r2-patch5-8.4.0/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\gojimmypi\AppData\Local\Temp\arduino\sketches\EAB8D79A02D1ECF107884802D893914E\libraries\wolfSSL\wolfcrypt\src\logging.c.o:(.literal.wolfssl_log+0x8): undefined reference to `_impure_ptr' +collect2.exe: error: ld returned 1 exit status + +exit status 1 + +Compilation error: exit status 1 +``` + +Try cleaning the Arduino cache directories. For Windows, that's typically in: + +```text +C:\Users\%USERNAME%\AppData\Local\Temp\arduino\sketches +``` + +Remove all other boards from other serial ports, leaving one the one being programmed. diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino index f331e781..3a894323 100644 --- a/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino @@ -19,161 +19,820 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +/* +Tested with: + +1) Intel Galileo acting as the Client, with a laptop acting as a server using + the server example provided in examples/server. + Legacy Arduino v1.86 was used to compile and program the Galileo + +2) Espressif ESP32 WiFi + +3) Arduino Due, Nano33 IoT, Nano RP-2040 +*/ + +/* + * Note to code editors: the Arduino client and server examples are edited in + * parallel for side-by-side comparison between examples. + */ + +/* If you have a private include, define it here, otherwise edit WiFi params */ +#define MY_PRIVATE_CONFIG "/workspace/my_private_config.h" + +/* set REPEAT_CONNECTION to a non-zero value to continually run the example. */ +#define REPEAT_CONNECTION 1 + +/* Edit this with your other TLS host server address to connect to: */ +/* #define WOLFSSL_TLS_SERVER_HOST "192.168.1.34" */ + +/* wolfssl TLS examples communicate on port 11111 */ +#define WOLFSSL_PORT 11111 + +/* Choose a monitor serial baud rate: 9600, 14400, 19200, 57600, 74880, etc. */ +#define SERIAL_BAUD 115200 + +/* We'll wait up to 2000 milliseconds to properly shut down connection */ +#define SHUTDOWN_DELAY_MS 2000 + +/* Number of times to retry connection. */ +#define RECONNECT_ATTEMPTS 20 + +/* Optional stress test. Define to consume memory until exhausted: */ +/* #define MEMORY_STRESS_TEST */ + +/* Choose client or server example, not both. */ +/* #define WOLFSSL_CLIENT_EXAMPLE */ +#define WOLFSSL_SERVER_EXAMPLE + +#if defined(MY_PRIVATE_CONFIG) + /* the /workspace directory may contain a private config + * excluded from GitHub with items such as WiFi passwords */ + #include MY_PRIVATE_CONFIG + static const char* ssid PROGMEM = MY_ARDUINO_WIFI_SSID; + static const char* password PROGMEM = MY_ARDUINO_WIFI_PASSWORD; +#else + /* when using WiFi capable boards: */ + static const char* ssid PROGMEM = "your_SSID"; + static const char* password PROGMEM = "your_PASSWORD"; +#endif + +#define BROADCAST_ADDRESS "255.255.255.255" + +/* There's an optional 3rd party NTPClient library by Fabrice Weinberg. + * If it is installed, uncomment define USE_NTP_LIB here: */ +/* #define USE_NTP_LIB */ +#ifdef USE_NTP_LIB + #include +#endif #include +/* Important: make sure settings.h appears before any other wolfSSL headers */ +#include +/* Reminder: settings.h includes user_settings.h + * For ALL project wolfSSL settings, see: + * [your path]/Arduino\libraries\wolfSSL\src\user_settings.h */ #include -#include - -#define USE_CERT_BUFFERS_256 #include +#include -#ifdef NO_WOLFSSL_SERVER - #error Please undefine NO_WOLFSSL_SERVER for this example +/* Define DEBUG_WOLFSSL in user_settings.h for more verbose logging. */ +#if defined(DEBUG_WOLFSSL) + #define PROGRESS_DOT F("") +#else + #define PROGRESS_DOT F(".") #endif -const int port = 11111; /* port to listen on */ +/* Convert a macro to a string */ +#define xstr(x) str(x) +#define str(x) #x -int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx); -int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx); +/* optional board-specific networking includes */ +#if defined(ESP32) + #define USING_WIFI + #include + #include + #ifdef USE_NTP_LIB + WiFiUDP ntpUDP; + #endif + /* Ensure the F() flash macro is defined */ + #ifndef F + #define F + #endif + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +#elif defined(ESP8266) + #define USING_WIFI + #include + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +#elif defined(ARDUINO_SAM_DUE) + #include + /* There's no WiFi/Ethernet on the Due. Requires Ethernet Shield. + /* Needs "Ethernet by Various" library to be installed. Tested with V2.0.2 */ + #include + EthernetClient client; + EthernetClient server(WOLFSSL_PORT); +#elif defined(ARDUINO_SAMD_NANO_33_IOT) + #define USING_WIFI + #include + #include /* Needs Arduino WiFiNINA library installed manually */ + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +#elif defined(ARDUINO_ARCH_RP2040) + #define USING_WIFI + #include + #include + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +#elif defined(USING_WIFI) + #define USING_WIFI + #include + #include + #ifdef USE_NTP_LIB + WiFiUDP ntpUDP; + #endif + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +/* TODO +#elif defined(OTHER_BOARD) +*/ +#else + #define USING_WIFI + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +#endif -EthernetServer server(port); -EthernetClient client; +/* Only for syntax highlighters to show interesting options enabled: */ +#if defined(HAVE_SNI) \ + || defined(HAVE_MAX_FRAGMENT) \ + || defined(HAVE_TRUSTED_CA) \ + || defined(HAVE_TRUNCATED_HMAC) \ + || defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ + || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) \ + || defined(HAVE_SUPPORTED_CURVES) \ + || defined(HAVE_ALPN) \ + || defined(HAVE_SESSION_TICKET) \ + || defined(HAVE_SECURE_RENEGOTIATION) \ + || defined(HAVE_SERVER_RENEGOTIATION_INFO) +#endif -WOLFSSL_CTX* ctx = NULL; -WOLFSSL* ssl = NULL; -void setup() { - int err; - WOLFSSL_METHOD* method; +/* we expect our IP address from DHCP */ - Serial.begin(9600); +static WOLFSSL_CTX* ctx = NULL; +static WOLFSSL* ssl = NULL; +static char* wc_error_message = (char*)malloc(80 + 1); +static char errBuf[80]; - method = wolfTLSv1_2_server_method(); - if (method == NULL) { - Serial.println("unable to get method"); - return; - } - ctx = wolfSSL_CTX_new(method); - if (ctx == NULL) { - Serial.println("unable to get ctx"); - return; - } - - /* initialize wolfSSL using callback functions */ - wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); - wolfSSL_SetIOSend(ctx, EthernetSend); - wolfSSL_SetIORecv(ctx, EthernetReceive); - - /* setup the private key and certificate */ - err = wolfSSL_CTX_use_PrivateKey_buffer(ctx, ecc_key_der_256, - sizeof_ecc_key_der_256, WOLFSSL_FILETYPE_ASN1); - if (err != WOLFSSL_SUCCESS) { - Serial.println("error setting key"); - return; - } - err = wolfSSL_CTX_use_certificate_buffer(ctx, serv_ecc_der_256, - sizeof_serv_ecc_der_256, WOLFSSL_FILETYPE_ASN1); - if (err != WOLFSSL_SUCCESS) { - Serial.println("error setting certificate"); - return; - } +#if defined(MEMORY_STRESS_TEST) + #define MEMORY_STRESS_ITERATIONS 100 + #define MEMORY_STRESS_BLOCK_SIZE 1024 + #define MEMORY_STRESS_INITIAL (4*1024) + static char* memory_stress[MEMORY_STRESS_ITERATIONS]; /* typically 1K per item */ + static int mem_ctr = 0; +#endif - /* Start the server */ - server.begin(); - - return; +static int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx); +static int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx); +static int reconnect = RECONNECT_ATTEMPTS; +static int lng_index PROGMEM = 0; /* 0 = English */ + +#if defined(__arm__) + #include + extern char _end; + extern "C" char *sbrk(int i); + static char *ramstart=(char *)0x20070000; + static char *ramend=(char *)0x20088000; +#endif + +/*****************************************************************************/ +/* fail_wait - in case of unrecoverable error */ +/*****************************************************************************/ +int fail_wait(void) { + show_memory(); + + Serial.println(F("Failed. Halt.")); + while (1) { + delay(1000); + } + return 0; } -int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx) { - int sent = 0; +/*****************************************************************************/ +/* show_memory() to optionally view during debugging. */ +/*****************************************************************************/ +int show_memory(void) +{ +#if defined(__arm__) + struct mallinfo mi = mallinfo(); + + char *heapend=sbrk(0); + register char * stack_ptr asm("sp"); + #if defined(DEBUG_WOLFSSL_VERBOSE) + Serial.print(" arena="); + Serial.println(mi.arena); + Serial.print(" ordblks="); + Serial.println(mi.ordblks); + Serial.print(" uordblks="); + Serial.println(mi.uordblks); + Serial.print(" fordblks="); + Serial.println(mi.fordblks); + Serial.print(" keepcost="); + Serial.println(mi.keepcost); + #endif + + #if defined(DEBUG_WOLFSSL) || defined(MEMORY_STRESS_TEST) + Serial.print("Estimated free memory: "); + Serial.print(stack_ptr - heapend + mi.fordblks); + Serial.println(F(" bytes")); + #endif + + #if (0) + /* Experimental: not supported on all devices: */ + Serial.print("RAM Start %lx\n", (unsigned long)ramstart); + Serial.print("Data/Bss end %lx\n", (unsigned long)&_end); + Serial.print("Heap End %lx\n", (unsigned long)heapend); + Serial.print("Stack Ptr %lx\n",(unsigned long)stack_ptr); + Serial.print("RAM End %lx\n", (unsigned long)ramend); - sent = client.write((byte*)msg, sz); + Serial.print("Heap RAM Used: ",mi.uordblks); + Serial.print("Program RAM Used ",&_end - ramstart); + Serial.print("Stack RAM Used ",ramend - stack_ptr); - return sent; + Serial.print("Estimated Free RAM: %d\n\n",stack_ptr - heapend + mi.fordblks); + #endif +#else + Serial.println(F("show_memory() not implemented for this platform")); +#endif + return 0; } +/*****************************************************************************/ +/* EthernetSend() to send a message string. */ +/*****************************************************************************/ +int EthernetSend(WOLFSSL* ssl, char* message, int sz, void* ctx) { + int sent = 0; + (void)ssl; + (void)ctx; + + sent = client.write((byte*)message, sz); + return sent; +} + +/*****************************************************************************/ +/* EthernetReceive() to receive a reply string. */ +/*****************************************************************************/ int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx) { - int ret = 0; + int ret = 0; + (void)ssl; + (void)ctx; - while (client.available() > 0 && ret < sz) { - reply[ret++] = client.read(); - } + while (client.available() > 0 && ret < sz) { + reply[ret++] = client.read(); + } + return ret; +} + +/*****************************************************************************/ +/* Arduino setup_hardware() */ +/*****************************************************************************/ +int setup_hardware(void) { + int ret = 0; + +#if defined(ARDUINO_SAMD_NANO_33_IOT) + Serial.println(F("Detected known tested and working Arduino Nano 33 IoT")); +#elif defined(ARDUINO_ARCH_RP2040) + Serial.println(F("Detected known tested and working Arduino RP-2040")); +#elif defined(__arm__) && defined(ID_TRNG) && defined(TRNG) + /* need to manually turn on random number generator on Arduino Due, etc. */ + pmc_enable_periph_clk(ID_TRNG); + trng_enable(TRNG); + Serial.println(F("Enabled ARM TRNG")); +#endif - return ret; + show_memory(); + randomSeed(analogRead(0)); + return ret; } -void loop() { - int err = 0; - int input = 0; - char errBuf[80]; - char reply[80]; - int replySz = 0; - const char* cipherName; - - /* Listen for incoming client requests. */ - client = server.available(); - if (!client) { +/*****************************************************************************/ +/* Arduino setup_datetime() */ +/* The device needs to have a valid date within the valid range of certs. */ +/*****************************************************************************/ +int setup_datetime(void) { + int ret = 0; + int ntp_tries = 20; + + /* we need a date in the range of cert expiration */ +#ifdef USE_NTP_LIB + #if defined(ESP32) + NTPClient timeClient(ntpUDP, "pool.ntp.org"); + + timeClient.begin(); + timeClient.update(); + delay(1000); + while (!timeClient.isTimeSet() && (ntp_tries > 0)) { + timeClient.forceUpdate(); + Serial.println(F("Waiting for NTP update")); + delay(2000); + ntp_tries--; + } + if (ntp_tries <= 0) { + Serial.println(F("Warning: gave up waiting on NTP")); + } + Serial.println(timeClient.getFormattedTime()); + Serial.println(timeClient.getEpochTime()); + #endif +#endif + +#if defined(ESP32) + /* see esp32-hal-time.c */ + ntp_tries = 5; + /* Replace "pool.ntp.org" with your preferred NTP server */ + configTime(0, 0, "pool.ntp.org"); + + /* Wait for time to be set */ + while ((time(nullptr) <= 100000) && ntp_tries > 0) { + Serial.println(F("Waiting for time to be set...")); + delay(2000); + ntp_tries--; + } +#endif + + return ret; +} /* setup_datetime */ + +/*****************************************************************************/ +/* Arduino setup_network() */ +/*****************************************************************************/ +int setup_network(void) { + int ret = 0; + +#if defined(USING_WIFI) + int status = WL_IDLE_STATUS; + + /* The ESP8266 & ESP32 support both AP and STA. We'll use STA: */ + #if defined(ESP8266) || defined(ESP32) + WiFi.mode(WIFI_STA); + #else + String fv; + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + /* don't continue if no network */ + while (true) ; + } + + fv = WiFi.firmwareVersion(); + if (fv < WIFI_FIRMWARE_LATEST_VERSION) { + Serial.println("Please upgrade the firmware"); + } + #endif + + Serial.print(F("Connecting to WiFi ")); + Serial.print(ssid); + status = WiFi.begin(ssid, password); + while (status != WL_CONNECTED) { + delay(1000); + Serial.print(F(".")); + Serial.print(status); + status = WiFi.status(); + } + + Serial.println(F(" Connected!")); +#else + /* Newer Ethernet shields have a + * MAC address printed on a sticker on the shield */ + byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + IPAddress ip(192, 168, 1, 42); + IPAddress myDns(192, 168, 1, 1); + Ethernet.init(10); /* Most Arduino shields */ + /* Ethernet.init(5); * MKR ETH Shield */ + /* Ethernet.init(0); * Teensy 2.0 */ + /* Ethernet.init(20); * Teensy++ 2.0 */ + /* Ethernet.init(15); * ESP8266 with Adafruit FeatherWing Ethernet */ + /* Ethernet.init(33); * ESP32 with Adafruit FeatherWing Ethernet */ + Serial.println(F("Initialize Ethernet with DHCP:")); + if (Ethernet.begin(mac) == 0) { + Serial.println(F("Failed to configure Ethernet using DHCP")); + /* Check for Ethernet hardware present */ + if (Ethernet.hardwareStatus() == EthernetNoHardware) { + Serial.println(F("Ethernet shield was not found.")); + while (true) { + delay(1); /* do nothing */ + } + } + if (Ethernet.linkStatus() == LinkOFF) { + Serial.println(F("Ethernet cable is not connected.")); + } + /* try to configure using IP address instead of DHCP : */ + Ethernet.begin(mac, ip, myDns); + } + else { + Serial.print(F(" DHCP assigned IP ")); + Serial.println(Ethernet.localIP()); + } + /* We'll assume the Ethernet connection is ready to go. */ +#endif + + Serial.println(F("********************************************************")); + Serial.print(F(" wolfSSL Example Server IP = ")); +#if defined(USING_WIFI) + Serial.println(WiFi.localIP()); +#else + Serial.println(Ethernet.localIP()); +#endif + /* In server mode, there's no host definition. */ + /* See companion example: wolfssl_client.ino */ + Serial.println(F("********************************************************")); + Serial.println(F("Setup network complete.")); + + return ret; +} + +/*****************************************************************************/ +/* Arduino setup_wolfssl() */ +/*****************************************************************************/ +int setup_wolfssl(void) { + int ret = 0; + WOLFSSL_METHOD* method; + + /* Show a revision of wolfssl user_settings.h file in use when available: */ +#if defined(WOLFSSL_USER_SETTINGS_ID) + Serial.print(F("WOLFSSL_USER_SETTINGS_ID: ")); + Serial.println(F(WOLFSSL_USER_SETTINGS_ID)); +#else + Serial.println(F("No WOLFSSL_USER_SETTINGS_ID found.")); +#endif + +#if defined(NO_WOLFSSL_SERVER) + Serial.println(F("wolfSSL server code disabled to save space.")); +#endif +#if defined(NO_WOLFSSL_CLIENT) + Serial.println(F("wolfSSL client code disabled to save space.")); +#endif + +#if defined(DEBUG_WOLFSSL) + wolfSSL_Debugging_ON(); + Serial.println(F("wolfSSL Debugging is On!")); +#else + Serial.println(F("wolfSSL Debugging is Off! (enable with DEBUG_WOLFSSL)")); +#endif + + /* See ssl.c for TLS cache settings. Larger cache = use more RAM. */ +#if defined(NO_SESSION_CACHE) + Serial.println(F("wolfSSL TLS NO_SESSION_CACHE")); +#elif defined(MICRO_SESSION_CACHEx) + Serial.println(F("wolfSSL TLS MICRO_SESSION_CACHE")); +#elif defined(SMALL_SESSION_CACHE) + Serial.println(F("wolfSSL TLS SMALL_SESSION_CACHE")); +#elif defined(MEDIUM_SESSION_CACHE) + Serial.println(F("wolfSSL TLS MEDIUM_SESSION_CACHE")); +#elif defined(BIG_SESSION_CACHE) + Serial.println(F("wolfSSL TLS BIG_SESSION_CACHE")); +#elif defined(HUGE_SESSION_CACHE) + Serial.println(F("wolfSSL TLS HUGE_SESSION_CACHE")); +#elif defined(HUGE_SESSION_CACHE) + Serial.println(F("wolfSSL TLS HUGE_SESSION_CACHE")); +#else + Serial.println(F("WARNING: Unknown or no TLS session cache setting.")); + /* See wolfssl/src/ssl.c for amount of memory used. + * It is best on embedded devices to choose a TLS session cache size. */ +#endif + + ret = wolfSSL_Init(); + if (ret == WOLFSSL_SUCCESS) { + Serial.println("Successfully called wolfSSL_Init"); + } + else { + Serial.println("ERROR: wolfSSL_Init failed"); + } + + /* See companion server example with wolfSSLv23_server_method here. + * method = wolfSSLv23_client_method()); SSL 3.0 - TLS 1.3. + * method = wolfTLSv1_2_client_method(); only TLS 1.2 + * method = wolfTLSv1_3_client_method(); only TLS 1.3 + * + * see Arduino\libraries\wolfssl\src\user_settings.h */ + + Serial.println("Here we go!"); + + method = wolfSSLv23_server_method(); + if (method == NULL) { + Serial.println(F("unable to get wolfssl server method")); + fail_wait(); + } + ctx = wolfSSL_CTX_new(method); + if (ctx == NULL) { + Serial.println(F("unable to get ctx")); + fail_wait(); + } + + return ret; +} + +/*****************************************************************************/ +/* Arduino setup_certificates() */ +/*****************************************************************************/ +int setup_certificates(void) { + int ret = 0; + + Serial.println(F("Initializing certificates...")); + show_memory(); + + /* Use built-in validation, No verification callback function: */ + wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); + + /* Certificate */ + Serial.println("Initializing certificates..."); + ret = wolfSSL_CTX_use_certificate_buffer(ctx, + CTX_SERVER_CERT, + CTX_SERVER_CERT_SIZE, + CTX_CA_CERT_TYPE); + if (ret == WOLFSSL_SUCCESS) { + Serial.print("Success: use certificate: "); + Serial.println(xstr(CTX_SERVER_CERT)); + } + else { + Serial.print("Error: wolfSSL_CTX_use_certificate_buffer failed: "); + wc_ErrorString(ret, wc_error_message); + Serial.println(wc_error_message); + fail_wait(); + } + + /* Setup private server key */ + ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + CTX_SERVER_KEY, + CTX_SERVER_KEY_SIZE, + CTX_SERVER_KEY_TYPE); + if (ret == WOLFSSL_SUCCESS) { + Serial.print("Success: use private key buffer: "); + Serial.println(xstr(CTX_SERVER_KEY)); + } + else { + Serial.print("Error: wolfSSL_CTX_use_PrivateKey_buffer failed: "); + wc_ErrorString(ret, wc_error_message); + Serial.println(wc_error_message); + fail_wait(); + } + + return ret; +} /* Arduino setup */ + +/*****************************************************************************/ +/*****************************************************************************/ +/* Arduino setup() */ +/*****************************************************************************/ +/*****************************************************************************/ +void setup(void) { + int i = 0; + Serial.begin(SERIAL_BAUD); + while (!Serial && (i < 10)) { + /* wait for serial port to connect. Needed for native USB port only */ + delay(1000); + i++; + } + + Serial.println(F("")); + Serial.println(F("")); + Serial.println(F("wolfSSL TLS Server Example Startup.")); + + /* define DEBUG_WOLFSSL in wolfSSL user_settings.h for diagnostics */ +#if defined(DEBUG_WOLFSSL) + wolfSSL_Debugging_ON(); +#endif + + /* Optionally pre-allocate a large block of memory for testing */ +#if defined(MEMORY_STRESS_TEST) + Serial.println(F("WARNING: Memory Stress Test Active!")); + Serial.print(F("Allocating extra memory: ")); + Serial.print(MEMORY_STRESS_INITIAL); + Serial.println(F(" bytes...")); + memory_stress[mem_ctr] = (char*)malloc(MEMORY_STRESS_INITIAL); + show_memory(); +#endif + + setup_hardware(); + + setup_network(); + + setup_datetime(); + + setup_wolfssl(); + + setup_certificates(); + + /* Initialize wolfSSL using callback functions. */ + wolfSSL_SetIOSend(ctx, EthernetSend); + wolfSSL_SetIORecv(ctx, EthernetReceive); + +#if defined THIS_USER_SETTINGS_VERSION + Serial.print(F("This user_settings.h version:")) + Serial.println(THIS_USER_SETTINGS_VERSION) +#endif + + /* Start the server + * See https://www.arduino.cc/reference/en/libraries/ethernet/server.begin/ + */ + + Serial.println(F("Completed Arduino setup()")); + + server.begin(); + Serial.println("Begin Server... (waiting for remote client to connect)"); + + /* See companion wolfssl_client.ino code */ return; - } +} /* Arduino setup */ + +/*****************************************************************************/ +/* wolfSSL error_check() */ +/*****************************************************************************/ +int error_check(int this_ret, bool halt_on_error, + const __FlashStringHelper* message) { + int ret = 0; + if (this_ret == WOLFSSL_SUCCESS) { + Serial.print(F("Success: ")); + Serial.println(message); + } + else { + Serial.print(F("ERROR: return = ")); + Serial.print(this_ret); + Serial.print(F(": ")); + Serial.println(message); + Serial.println(wc_GetErrorString(this_ret)); + if (halt_on_error) { + fail_wait(); + } + } + show_memory(); - if (client.connected()) { + return ret; +} /* error_check */ - Serial.println("Client connected"); +/*****************************************************************************/ +/* wolfSSL error_check_ssl */ +/* Parameters: */ +/* ssl is the current WOLFSSL object pointer */ +/* halt_on_error set to true to suspend operations for critical error */ +/* message is expected to be a memory-efficient F("") macro string */ +/*****************************************************************************/ +int error_check_ssl(WOLFSSL* ssl, int this_ret, bool halt_on_error, + const __FlashStringHelper* message) { + int err = 0; - ssl = wolfSSL_new(ctx); if (ssl == NULL) { - Serial.println("Unable to allocate SSL object"); - return; - } - - err = wolfSSL_accept(ssl); - if (err != WOLFSSL_SUCCESS) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Accept Error: "); - Serial.println(errBuf); - } - - Serial.print("SSL version is "); - Serial.println(wolfSSL_get_version(ssl)); - - cipherName = wolfSSL_get_cipher(ssl); - Serial.print("SSL cipher suite is "); - Serial.println(cipherName); - - Serial.print("Server Read: "); - /* wait for data */ - while (!client.available()) {} - /* read data */ - while (wolfSSL_pending(ssl)) { - input = wolfSSL_read(ssl, reply, sizeof(reply) - 1); - if (input < 0) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Read Error: "); - Serial.println(errBuf); - break; - } else if (input > 0) { - replySz = input; - reply[input] = '\0'; - Serial.print(reply); - } else { - Serial.println(); - } - } - - /* echo data */ - if ((wolfSSL_write(ssl, reply, replySz)) != replySz) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Write Error: "); - Serial.println(errBuf); - } - - wolfSSL_shutdown(ssl); - wolfSSL_free(ssl); - } - - client.stop(); - Serial.println("Connection complete"); + Serial.println(F("ssl is Null; Unable to allocate SSL object?")); +#ifndef DEBUG_WOLFSSL + Serial.println(F("Define DEBUG_WOLFSSL in user_settings.h for more.")); +#else + Serial.println(F("See wolfssl/wolfcrypt/error-crypt.h for codes.")); +#endif + Serial.print(F("ERROR: ")); + Serial.println(message); + show_memory(); + if (halt_on_error) { + fail_wait(); + } + } + else { + err = wolfSSL_get_error(ssl, this_ret); + if (err == WOLFSSL_SUCCESS) { + Serial.print(F("Success m: ")); + Serial.println(message); + } + else { + if (err < 0) { + wolfSSL_ERR_error_string(err, errBuf); + Serial.print(F("WOLFSSL Error: ")); + Serial.print(err); + Serial.print(F("; ")); + Serial.println(errBuf); + } + else { + Serial.println(F("Success: ssl object.")); + } + } + } + + return err; } + +/*****************************************************************************/ +/*****************************************************************************/ +/* Arduino loop() */ +/*****************************************************************************/ +/*****************************************************************************/ +void loop() { + char errBuf[80] = "(no error"; + char reply[80] = "(no reply)"; + const char msg[] = "I hear you fa shizzle!"; + const char* cipherName; + int input = 0; + int replySz = 0; + int retry_shutdown = SHUTDOWN_DELAY_MS; /* max try, once per millisecond */ + int ret = 0; + IPAddress broadcast_address(255, 255, 255, 255); + + /* Listen for incoming client requests. */ + client = server.available(); + if (client) { + Serial.println("Have Client"); + while (!client.connected()) { + /* wait for the client to actually connect */ + delay(10); + } + Serial.print("Client connected from remote IP: "); + Serial.println(client.remoteIP()); + + ssl = wolfSSL_new(ctx); + if (ssl == NULL) { + Serial.println("Unable to allocate SSL object"); + fail_wait(); + } + + ret = wolfSSL_accept(ssl); + if (ret != WOLFSSL_SUCCESS) { + ret = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(ret, errBuf); + Serial.print("TLS Accept Error: "); + Serial.println(errBuf); + } + + cipherName = wolfSSL_get_cipher(ssl); + Serial.print("SSL cipher suite is "); + Serial.println(cipherName); + + Serial.print("Server Read: "); + while (!client.available()) { + /* wait for data */ + } + + /* read data */ + while (wolfSSL_pending(ssl)) { + input = wolfSSL_read(ssl, reply, sizeof(reply) - 1); + if (input < 0) { + ret = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(ret, errBuf); + Serial.print("TLS Read Error: "); + Serial.println(errBuf); + break; + } + else if (input > 0) { + replySz = input; + reply[input] = '\0'; + Serial.print(reply); + } + else { + Serial.println(""); + } + } + + /* Write our message into reply buffer to send */ + memset(reply, 0, sizeof(reply)); + memcpy(reply, msg, sizeof(msg)); + replySz = strnlen(reply, sizeof(reply)); + + Serial.println("Sending reply..."); + if ((wolfSSL_write(ssl, reply, replySz)) != replySz) { + ret = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(ret, errBuf); + Serial.print("TLS Write Error: "); + Serial.println(errBuf); + } + else { + Serial.println("Reply sent!"); + } + + Serial.println("Shutdown!"); + do { + delay(1); + retry_shutdown--; + ret = wolfSSL_shutdown(ssl); + } while ((ret == WOLFSSL_SHUTDOWN_NOT_DONE) && (retry_shutdown > 0)); + + if (retry_shutdown <= 0) { + /* if wolfSSL_free is called before properly shutting down the + * ssl object, undesired results may occur. */ + Serial.println("Warning! Shutdown did not properly complete."); + } + + wolfSSL_free(ssl); + Serial.println("Connection complete."); + if (REPEAT_CONNECTION) { + Serial.println(); + Serial.println("Waiting for next connection."); + } + else { + client.stop(); + Serial.println("Done!"); + while (1) { + /* wait forever if not repeating */ + delay(100); + } + } + } + else { + /* Serial.println("Client not connected. Trying again..."); */ + } + + delay(100); +} /* Arduino loop repeats */ diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/README.md b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/README.md new file mode 100644 index 00000000..3abfe829 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/README.md @@ -0,0 +1,3 @@ +# Arduino Basic Hello World + +This example simply compiles in wolfSSL and shows the current version number. diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino new file mode 100644 index 00000000..b052b46e --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino @@ -0,0 +1,24 @@ +#include +#include +#include + +/* Choose a monitor serial baud rate: 9600, 14400, 19200, 57600, 74880, etc. */ +#define SERIAL_BAUD 115200 + +/* Arduino setup */ +void setup() { + Serial.begin(SERIAL_BAUD); + while (!Serial) { + /* wait for serial port to connect. Needed for native USB port only */ + } + Serial.println(F("")); + Serial.println(F("")); + Serial.println(F("wolfSSL setup complete!")); +} + +/* Arduino main application loop. */ +void loop() { + Serial.print("wolfSSL Version: "); + Serial.println(LIBWOLFSSL_VERSION_STRING); + delay(60000); +} diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl-arduino.sh b/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl-arduino.sh index 107f99b1..d48b4166 100755 --- a/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl-arduino.sh +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl-arduino.sh @@ -2,19 +2,124 @@ # this script will reformat the wolfSSL source code to be compatible with # an Arduino project -# run as bash ./wolfssl-arduino.sh +# run as bash ./wolfssl-arduino.sh [INSTALL] [path] +# +# ./wolfssl-arduino.sh +# The default is to install to a local wolfSSL directory (`ROOT_DIR`). +# If successfully built, and the INSTALL option is used, tis directory +# is then moved to the target. +# +# ./wolfssl-arduino.sh INSTALL +# Creates a local wolfSSL directory and then moves it to the ARDUINO_ROOT +# +# ./wolfssl-arduino.sh INSTALL /mnt/c/workspace/Arduino-wolfSSL-$USER +# Updates the Arduino-wolfSSL fork for $USER to refresh versions. +# +# To ensure a pristine build, the directory must not exist. +# +# Reminder there's typically no $USER for GitHub actions, but: +# ROOT_DIR="/mnt/c/Users/$USER/Documents/Arduino/libraries" +# +# The company name is "wolfSSL Inc."; There’s a space, no comma, and a period after "Inc." +# The Arduino library name is "wolfssl" (all lower case) +# The Arduino library directory name is "wolfssl" (all lower case) +# The Arduino library include file is "wolfssl.h" (all lower case) +# The Published wolfSSL Arduino Registry is at https://github.com/wolfSSL/Arduino-wolfSSL.git +# See https://downloads.arduino.cc/libraries/logs/github.com/wolfSSL/Arduino-wolfSSL/ +ROOT_DIR="/wolfssl" + +# The Arduino Version will initially have a suffix appended during fine tuning stage. +WOLFSSL_VERSION_ARUINO_SUFFIX="-Arduino.3" + +# For verbose copy, set CP_CMD="-v", otherwise clear it: CP_CMD="cp" +# Do not set to empty string, as copy will fail with this: CP_CMD="" +# CP_CMD="cp -v " +CP_CMD="cp " + +# Specify the executable shell checker you want to use: +MY_SHELLCHECK="shellcheck" + +# There are special circumstances to publish to GitHub repository. +# Typically: https://github.com/wolfSSL/Arduino-wolfSSL +# +# Unlike a local Arduino library that requires a clean directory, +# we'll allow extra files, overwrites, etc. +# +# Note in all cases, the local IDE/ARDUINO/wolfssl must be empty. +THIS_INSTALL_IS_GITHUB="false" + +# Check if the executable is available in the PATH +if command -v "$MY_SHELLCHECK" >/dev/null 2>&1; then + # Run your command here + shellcheck "$0" || exit 1 +else + echo "$MY_SHELLCHECK is not installed. Please install it if changes to this script have been made." +fi + +if ! [ "$CP_CMD" = "cp " ]; then + if [ "$CP_CMD" = "cp -v" ]; then + echo "Copy verbose mode" + else + echo "ERROR: Copy mode not supported: $CP_CMD" + exit 1 + fi +fi + +# Check environment +if [ -n "$WSL_DISTRO_NAME" ]; then + # we found a non-blank WSL environment distro name + current_path="$(pwd)" + pattern="/mnt/?" + if echo "$current_path" | grep -Eq "^$pattern"; then + # if we are in WSL and shared Windows file system, 'ln' does not work. + ARDUINO_ROOT="/mnt/c/Users/$USER/Documents/Arduino/libraries" + else + ARDUINO_ROOT="$HOME/Arduino/libraries" + fi +fi +echo "The Arduino library root is: $ARDUINO_ROOT" + +if [ $# -gt 0 ]; then + THIS_OPERATION="$1" + if [ "$THIS_OPERATION" = "INSTALL" ]; then + THIS_INSTALL_DIR=$2 + + echo "Install is active." + + if [ "$THIS_INSTALL_DIR" = "" ]; then + if [ -d "$ARDUINO_ROOT$ROOT_DIR" ]; then + echo "Error: the installation directory already exists: $ARDUINO_ROOT$ROOT_DIR" + echo "A new directory needs to be created to ensure there are no stray files" + echo "Please delete or move the directory and try again." + exit 1 + fi + else + echo "Installing to $THIS_INSTALL_DIR" + if [ -d "$THIS_INSTALL_DIR/.git" ];then + echo "Target is a GitHub repository." + THIS_INSTALL_IS_GITHUB="true" + else + echo "Target is NOT a GitHub repository." + fi + fi + else + echo "Error: not a valid operation: $THIS_OPERATION" + exit 1 + fi +fi + -ROOT_DIR="/wolfSSL" ROOT_SRC_DIR="${ROOT_DIR}/src" +EXAMPLES_DIR="${ROOT_DIR}/examples" WOLFSSL_SRC="${ROOT_SRC_DIR}/src" WOLFSSL_HEADERS="${ROOT_SRC_DIR}/wolfssl" WOLFCRYPT_ROOT="${ROOT_SRC_DIR}/wolfcrypt" WOLFCRYPT_SRC="${WOLFCRYPT_ROOT}/src" WOLFCRYPT_HEADERS="${WOLFSSL_HEADERS}/wolfcrypt" OPENSSL_DIR="${WOLFSSL_HEADERS}/openssl" -WOLFSSL_VERSION="5.6.4" -# TOP indicates the file directory comes from the top level of the wolfssl repo + +# TOP indicates the file directory for top level of the wolfssl repository. TOP_DIR="../.." WOLFSSL_SRC_TOP="${TOP_DIR}/src" WOLFSSL_HEADERS_TOP="${TOP_DIR}/wolfssl" @@ -24,122 +129,196 @@ WOLFCRYPT_HEADERS_TOP="${WOLFSSL_HEADERS_TOP}/wolfcrypt" OPENSSL_DIR_TOP="${WOLFSSL_HEADERS_TOP}/openssl" -# TODO: Parse version number WOLFSSL_VERSION=$(grep -i "LIBWOLFSSL_VERSION_STRING" ${TOP_DIR}/wolfssl/version.h | cut -d '"' -f 2) +if [ "$WOLFSSL_VERSION" = "" ]; then + echo "ERROR: Could not find wolfSSL Version in ${TOP_DIR}/wolfssl/version.h" + exit 1 +else + echo "Found wolfSSL version $WOLFSSL_VERSION" + echo "# WOLFSSL_VERSION_ARUINO_SUFFIX $WOLFSSL_VERSION_ARUINO_SUFFIX" +fi +echo "" +THIS_DIR=${PWD##*/} -DIR=${PWD##*/} - -if [ "$DIR" = "ARDUINO" ]; then - if [ ! -d ".${ROOT_DIR}" ]; then - mkdir .${ROOT_DIR} +if [ "$THIS_DIR" = "ARDUINO" ]; then + # mkdir ./wolfssl + if [ -d ".${ROOT_DIR}" ]; then + echo "ERROR: $(realpath ".${ROOT_DIR}") is not empty" + exit 1 + else + echo "Step 01: mkdir .${ROOT_DIR}" + mkdir ."${ROOT_DIR}" fi + + # mkdir ./wolfssl/src if [ ! -d ".${ROOT_SRC_DIR}" ]; then - mkdir .${ROOT_SRC_DIR} + echo "Step 02: mkdir .${ROOT_SRC_DIR}" + mkdir ."${ROOT_SRC_DIR}" fi + # mkdir ./wolfssl/src/wolfssl if [ ! -d ".${WOLFSSL_HEADERS}" ]; then - mkdir .${WOLFSSL_HEADERS} + echo "Step 03: mkdir .${WOLFSSL_HEADERS}" + mkdir ."${WOLFSSL_HEADERS}" fi - cp ${WOLFSSL_HEADERS_TOP}/*.h .${WOLFSSL_HEADERS} + # cp ../../wolfssl/*.h ./wolfssl/src/wolfssl + echo "Step 04: cp ${WOLFSSL_HEADERS_TOP}/*.h .${WOLFSSL_HEADERS}" + $CP_CMD "${WOLFSSL_HEADERS_TOP}"/*.h ."${WOLFSSL_HEADERS}" if [ ! -d ".${WOLFCRYPT_HEADERS}" ]; then - mkdir .${WOLFCRYPT_HEADERS} + # mkdir ./wolfssl/src/wolfssl/wolfcrypt + echo "Step 05: mkdir .${WOLFCRYPT_HEADERS}" + mkdir ."${WOLFCRYPT_HEADERS}" + mkdir ."${WOLFCRYPT_HEADERS}/port" + mkdir ."${WOLFCRYPT_HEADERS}/port/atmel" + mkdir ."${WOLFCRYPT_HEADERS}/port/Espressif" fi - cp ${WOLFCRYPT_HEADERS_TOP}/*.h .${WOLFCRYPT_HEADERS} + + # cp ../../wolfssl/wolfcrypt/*.h ./wolfssl/src/wolfssl/wolfcrypt + echo "Step 06: cp ${WOLFCRYPT_HEADERS_TOP}/*.h .${WOLFCRYPT_HEADERS}" + $CP_CMD "${WOLFCRYPT_HEADERS_TOP}"/*.h ."${WOLFCRYPT_HEADERS}" || exit 1 + $CP_CMD "${WOLFCRYPT_HEADERS_TOP}"/port/atmel/*.h ."${WOLFCRYPT_HEADERS}/port/atmel" || exit 1 + $CP_CMD "${WOLFCRYPT_HEADERS_TOP}"/port/Espressif/*.h ."${WOLFCRYPT_HEADERS}/port/Espressif" || exit 1 # Add in source files to wolfcrypt/src if [ ! -d ".${WOLFCRYPT_ROOT}" ]; then - mkdir .${WOLFCRYPT_ROOT} + # mkdir ./wolfssl/src/wolfcrypt + echo "Step 07: mkdir .${WOLFCRYPT_ROOT}" + mkdir ."${WOLFCRYPT_ROOT}" fi + + # mkdir ./wolfssl/src/wolfcrypt/src if [ ! -d ".${WOLFCRYPT_SRC}" ]; then - mkdir .${WOLFCRYPT_SRC} + echo "Step 08: mkdir .${WOLFCRYPT_SRC}" + mkdir ."${WOLFCRYPT_SRC}" + mkdir ."${WOLFCRYPT_SRC}"/port + mkdir ."${WOLFCRYPT_SRC}"/port/atmel + mkdir ."${WOLFCRYPT_SRC}"/port/Espressif fi - cp ${WOLFCRYPT_SRC_TOP}/*.c .${WOLFCRYPT_SRC} - + + # cp ../../wolfcrypt/src/*.c ./wolfssl/src/wolfcrypt/src + echo "Step 09: cp ${WOLFCRYPT_SRC_TOP}/*.c .${WOLFCRYPT_SRC}" + $CP_CMD -r "${WOLFCRYPT_SRC_TOP}"/*.c ."${WOLFCRYPT_SRC}" || exit 1 + $CP_CMD -r "${WOLFCRYPT_SRC_TOP}"/port/atmel/*.c ."${WOLFCRYPT_SRC}"/port/atmel || exit 1 + $CP_CMD -r "${WOLFCRYPT_SRC_TOP}"/port/Espressif/*.c ."${WOLFCRYPT_SRC}"/port/Espressif || exit 1 + # Add in source files to top level src folders if [ ! -d ".${WOLFSSL_SRC}" ]; then - mkdir .${WOLFSSL_SRC} + # mkdir ./wolfssl/src/src + echo "Step 10: mkdir .${WOLFSSL_SRC}" + mkdir ."${WOLFSSL_SRC}" fi - cp ${WOLFSSL_SRC_TOP}/*.c .${WOLFSSL_SRC} + $CP_CMD "${WOLFSSL_SRC_TOP}"/*.c ."${WOLFSSL_SRC}" || exit 1 # put bio and evp as includes - cp .${WOLFSSL_SRC}/bio.c .${WOLFSSL_HEADERS} - cp .${WOLFCRYPT_SRC}/evp.c .${WOLFSSL_HEADERS} + $CP_CMD ."${WOLFSSL_SRC}"/bio.c ."${WOLFSSL_HEADERS}" || exit 1 + $CP_CMD ."${WOLFCRYPT_SRC}"/evp.c ."${WOLFSSL_HEADERS}" || exit 1 # make a copy of evp.c and bio.c for ssl.c to include inline - cp .${WOLFSSL_HEADERS}/evp.c .${WOLFCRYPT_SRC}/evp.c - cp .${WOLFSSL_HEADERS}/bio.c .${WOLFCRYPT_SRC}/bio.c - + $CP_CMD ."${WOLFSSL_HEADERS}"/evp.c ."${WOLFCRYPT_SRC}"/evp.c || exit 1 + $CP_CMD ."${WOLFSSL_HEADERS}"/bio.c ."${WOLFCRYPT_SRC}"/bio.c || exit 1 + # copy openssl compatibility headers to their appropriate location if [ ! -d ".${OPENSSL_DIR}" ]; then - mkdir .${OPENSSL_DIR} + mkdir ."${OPENSSL_DIR}" fi - cp ${OPENSSL_DIR_TOP}/* .${OPENSSL_DIR} + $CP_CMD "${OPENSSL_DIR_TOP}"/* ."${OPENSSL_DIR}" || exit 1 + # Finally, copy the Arduino-specific wolfssl library files into place: [lib]/src + $CP_CMD ./wolfssl.h ".${ROOT_SRC_DIR}"/wolfssl.h - cat > .${ROOT_SRC_DIR}/wolfssl.h < -#include -#include -EOF + echo "Copy examples...." + # Copy examples + mkdir -p ".${ROOT_SRC_DIR}"/examples + echo "Copy wolfssl_client example...." + mkdir -p ".${EXAMPLES_DIR}"/wolfssl_client + $CP_CMD ./sketches/wolfssl_client/wolfssl_client.ino ".${EXAMPLES_DIR}"/wolfssl_client/wolfssl_client.ino || exit 1 + $CP_CMD ./sketches/wolfssl_client/README.md ".${EXAMPLES_DIR}"/wolfssl_client/README.md || exit 1 -# Creates user_settings file if one does not exist - if [ ! -f ".${ROOT_SRC_DIR}/user_settings.h" ]; then - cat > .${ROOT_SRC_DIR}/user_settings.h < "$PREPEND_FILE.tmp" +cat "$PREPEND_FILE.tmp" ${TOP_DIR}/README.md > PREPENDED_README.md -/* RNG DEFAULT !!FOR TESTING ONLY!! */ -/* comment out the error below to get started w/ bad entropy source - * This will need fixed before distribution but is OK to test with */ -#error "needs solved, see: https://www.wolfssl.com/docs/porting-guide/" -#define WOLFSSL_GENSEED_FORTEST +# Here we'll insert the wolfSSL version into the `library.properties.tmp` file, along with an Arduino version suffix. +# The result should be something like version=5.6.6.Arduino.1 (for the 1st incremental version on top of 5.6.6) +sed s/"$VERSION_PLACEHOLDER"/"$WOLFSSL_VERSION"/ "$PROPERTIES_FILE_TEMPLATE" > "library.properties.tmp" +sed -i.backup s/"$ARDUINO_VERSION_SUFFIX_PLACEHOLDER"/"$WOLFSSL_VERSION_ARUINO_SUFFIX"/ "library.properties.tmp" -#endif /* ARDUINO_USER_SETTINGS_H */ -EOF - fi +# cat library.properties.tmp +# echo "${WOLFSSL_VERSION_ARUINO_SUFFIX}" - cp .${WOLFCRYPT_HEADERS}/settings.h .${WOLFCRYPT_HEADERS}/settings.h.bak - cat > .${WOLFCRYPT_HEADERS}/settings.h <> .${WOLFCRYPT_HEADERS}/settings.h - - #Creating library.properties file based off of: - #https://arduino.github.io/arduino-cli/0.35/library-specification/#libraryproperties-file-format - - cat > .${ROOT_DIR}/library.properties < -sentence=A lightweight SSL/TLS library written in ANSI C and targeted for embedded, RTOS, and resource-constrained environments. -paragraph=Manual: https://www.wolfssl.com/documentation/manuals/wolfssl/index.html. -category=Communication -url=https://www.wolfssl.com/ -architectures=* - -EOF +echo "Step 11: Final root file copy" +$CP_CMD PREPENDED_README.md ."${ROOT_DIR}"/README.md || exit 1 +$CP_CMD library.properties.tmp ."${ROOT_DIR}"/library.properties || exit 1 +$CP_CMD "${TOP_DIR}"/"LICENSING" ."${ROOT_DIR}"/ || exit 1 +$CP_CMD "${TOP_DIR}"/"README" ."${ROOT_DIR}"/ || exit 1 +$CP_CMD "${TOP_DIR}"/"COPYING" ."${ROOT_DIR}"/ || exit 1 +$CP_CMD "${TOP_DIR}"/"ChangeLog.md" ."${ROOT_DIR}"/ || exit 1 +$CP_CMD "${TOP_DIR}"/".editorconfig" ."${ROOT_DIR}"/ || exit 1 +$CP_CMD "${TOP_DIR}"/".gitignore" ."${ROOT_DIR}"/ || exit 1 -else - echo "ERROR: You must be in the IDE/ARDUINO directory to run this script" +$CP_CMD "keywords.txt" ."${ROOT_DIR}"/ || exit 1 + + +echo "Step 12: Workspace to publish:" +echo "" +head -n 3 PREPENDED_README.md +echo "" +ls ./wolfssl -al +echo "" + +# Optionally install to a separate directory. +# Note we should have exited above if a problem was encountered, +# as we'll never want to install a bad library. +if [ "$THIS_OPERATION" = "INSTALL" ]; then + if [ "$THIS_INSTALL_IS_GITHUB" = "true" ]; then + echo "Installing to GitHub directory: $THIS_INSTALL_DIR" + cp -r ."$ROOT_DIR"/* "$THIS_INSTALL_DIR" || exit 1 + else + echo "Config:" + echo "cp ../../examples/configs/user_settings_arduino.h ".${ROOT_SRC_DIR}"/user_settings.h" + # Nearly an ordinary copy, but we remove any lines with ">>" (typically edit with caution warning in comments) + grep -v '>>' ../../examples/configs/user_settings_arduino.h > ".${ROOT_SRC_DIR}"/user_settings.h || exit 1 + + # Show the user_settings.h revision string: + grep "WOLFSSL_USER_SETTINGS_ID" ."${ROOT_SRC_DIR}/user_settings.h" + echo "" + + echo "Install:" + echo "mv .$ROOT_DIR $ARDUINO_ROOT" + mv ."$ROOT_DIR" "$ARDUINO_ROOT" || exit 1 + + echo "Arduino wolfSSL Version: $WOLFSSL_VERSION$WOLFSSL_VERSION_ARUINO_SUFFIX" + fi fi + +echo "Done!" diff --git a/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl.h b/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl.h new file mode 100644 index 00000000..46ef50d3 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl.h @@ -0,0 +1,39 @@ +/* wolfssl.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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. + * + * wolfSSL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Edit with caution. This is an Arduino-library specific header for wolfSSL */ + +#ifndef WOLFSSL_USER_SETTINGS + #define WOLFSSL_USER_SETTINGS +#endif + +#include + +/* wolfSSL user_settings.h must be included from settings.h */ +#include +#include + +int wolfSSL_Arduino_Serial_Print(const char *const s) +{ + /* See wolfssl/wolfcrypt/logging.c */ + Serial.println(F(s)); + return 0; +}; diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/CMakeLists.txt b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/CMakeLists.txt index e82e19b6..e129a64e 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/CMakeLists.txt @@ -82,8 +82,10 @@ function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY) else() get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE) IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) - if("${FOUND_WOLFSSL}") - message(STATUS "Found WOLFSSL_ROOT via Environment Variable:") + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via Environment Variable: ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() else() message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:") message(STATUS "$ENV{WOLFSSL_ROOT}") diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt index e82e19b6..e129a64e 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt @@ -82,8 +82,10 @@ function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY) else() get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE) IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) - if("${FOUND_WOLFSSL}") - message(STATUS "Found WOLFSSL_ROOT via Environment Variable:") + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via Environment Variable: ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() else() message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:") message(STATUS "$ENV{WOLFSSL_ROOT}") diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.c b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.c index 855105e7..5a40d9cf 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.c +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.c @@ -24,21 +24,25 @@ #include "sdkconfig.h" /* wolfSSL */ +/* The wolfSSL user_settings.h file is automatically included by the settings.h + * file and should never be explicitly included in any other source files. + * The settings.h should also be listed above wolfssl library include files. */ #include -#include #include -#include "wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h" +#include #ifndef WOLFSSL_ESPIDF - #warning "Problem with wolfSSL user_settings." - #warning "Check components/wolfssl/include" + #error "Problem with wolfSSL user_settings. " \ + "Check components/wolfssl/include " \ + "and confirm WOLFSSL_USER_SETTINGS is defined, " \ + "typically in the component CMakeLists.txt" #endif #include #include /* set to 0 for one benchmark, -** set to 1 for continous benchmark loop */ -#define BENCHMARK_LOOP 1 +** set to 1 for continuous benchmark loop */ +#define BENCHMARK_LOOP 0 /* check BENCH_ARGV in sdkconfig to determine need to set WOLFSSL_BENCH_ARGV */ #ifdef CONFIG_BENCH_ARGV @@ -129,6 +133,7 @@ void my_atmel_free(int slotId) /* the following are needed by benchmark.c with args */ #ifdef WOLFSSL_BENCH_ARGV char* __argv[WOLFSSL_BENCH_ARGV_MAX_ARGUMENTS]; +#define ARG_BUFF_SIZE 16 int construct_argv() { @@ -137,7 +142,7 @@ int construct_argv() int len = 0; char *_argv; /* buffer for copying the string */ char *ch; /* char pointer to trace the string */ - char buff[16] = { 0 }; /* buffer for a argument copy */ + char buff[ARG_BUFF_SIZE] = { 0 }; /* buffer for a argument copy */ ESP_LOGI(TAG, "construct_argv arg:%s\n", CONFIG_BENCH_ARGV); len = strlen(CONFIG_BENCH_ARGV); @@ -170,7 +175,7 @@ int construct_argv() memset(buff, 0, sizeof(buff)); /* copy each args into buffer */ i = 0; - while ((*ch != ' ') && (*ch != '\0') && (i < 16)) { + while ((*ch != ' ') && (*ch != '\0') && (i <= ARG_BUFF_SIZE)) { buff[i] = *ch; ++i; ++ch; @@ -193,14 +198,15 @@ int construct_argv() void app_main(void) { int stack_start = 0; - ESP_LOGI(TAG, "---------------- wolfSSL Benchmark Example ------------"); + + ESP_LOGI(TAG, "---------------- wolfSSL Benchmark Example -------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); ESP_LOGI(TAG, "---------------------- BEGIN MAIN ----------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); -#ifdef HAVE_VERSION_EXTENDED_INFO +#if defined(HAVE_VERSION_EXTENDED_INFO) && defined(WOLFSSL_HAS_METRICS) esp_ShowExtendedSystemInfo(); #endif @@ -236,7 +242,7 @@ void app_main(void) ESP_LOGI(TAG, "Stack used: %d\n", stack_start - uxTaskGetStackHighWaterMark(NULL)); - #ifdef WOLFSSL_HW_METRICS_DISABLED/* Remove _DISABLED upon #6990 Merge */ + #if defined(WOLFSSL_HW_METRICS) && defined(WOLFSSL_HAS_METRICS) esp_hw_show_metrics(); #endif } while (BENCHMARK_LOOP); @@ -249,8 +255,9 @@ void app_main(void) ESP_LOGI(TAG, "Stack HWM: %d\n", uxTaskGetStackHighWaterMark(NULL)); #endif - ESP_LOGI(TAG, "\n\nDone!\n\n" - "If running from idf.py monitor, press twice: Ctrl+]"); +#ifdef WOLFSSL_ESPIDF_EXIT_MESSAGE + ESP_LOGI(TAG, WOLFSSL_ESPIDF_EXIT_MESSAGE); +#endif /* after the test, we'll just wait */ while (1) { diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/Makefile b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/Makefile index f3854ff1..45d4b1d2 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/Makefile +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/Makefile @@ -1,12 +1,134 @@ +# ESP8266 Project Makefile for wolfssl_client # -# This is a project Makefile. It is assumed the directory this Makefile resides in is a -# project subdirectory. +# Copyright (C) 2006-2024 wolfSSL Inc. +# +# This file is part of wolfSSL. +# +# wolfSSL 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. +# +# wolfSSL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA # +# +# This is a project Makefile. +# It is assumed the directory this Makefile resides in is a +# project subdirectory containing an entire project. +# +# Optional private config headers. Define environment variables +# to include various default header files that are typically +# not in a git path, and thus excluded from being checked in. +# +# Environment Variable Name | Header file name included +# ---------------------------------- | --------------------------------------- +# MY_PRIVATE_CONFIG (files detected / selected in header) +# USE_MY_PRIVATE_WSL_CONFIG /mnt/c/workspace/my_private_config.h +# USE_MY_PRIVATE_MAC_CONFIG ~/Documents/my_private_config.h +# USE_MY_PRIVATE_LINUX_CONFIG ~/workspace/my_private_config.h +# USE_MY_PRIVATE_WINDOWS_CONFIG /workspace/my_private_config.h +# +# PROJECT_NAME := wolfssl_client +MY_PRIVATE_CONFIG ?= n +USE_MY_PRIVATE_WSL_CONFIG ?= n +USE_MY_PRIVATE_MAC_CONFIG ?= n +USE_MY_PRIVATE_LINUX_CONFIG ?= n +USE_MY_PRIVATE_WINDOWS_CONFIG ?= n + +# Calling shell causes unintuitive error in Windows: +# OS := $(shell uname -s) +# +# But OS, or MY_PRIVATE_CONFIG should already be defined: +$(info ************* wolfssl_client *************) + +ifeq ($(MY_PRIVATE_CONFIG),y) + CFLAGS += -DMY_PRIVATE_CONFIG + $(info Enabled MY_PRIVATE_CONFIG") +endif + +# Check for Windows environment variable: USE_MY_PRIVATE_WINDOWS_CONFIG +ifeq ($(USE_MY_PRIVATE_WINDOWS_CONFIG),y) + # This hard coded MY_CONFIG_FILE value must match that in the header file. + MY_CONFIG_FILE := /workspace/my_private_config.h + ifeq ($(wildcard $(MY_CONFIG_FILE)),) + $(info File does not exist: $(MY_CONFIG_FILE)) + else + CFLAGS += -DUSE_MY_PRIVATE_WINDOWS_CONFIG + $(info Using private config file for: Windows) + endif +endif + +# Check for WSL environment variable: USE_MY_PRIVATE_WSL_CONFIG +ifeq ($(USE_MY_PRIVATE_WSL_CONFIG),y) + # This hard coded MY_CONFIG_FILE value must match that in the header file. + MY_CONFIG_FILE := /mnt/c/workspace/my_private_config.h + ifeq ($(wildcard $(MY_CONFIG_FILE)),) + $(info File does not exist: $(MY_CONFIG_FILE)) + else + CFLAGS += -DUSE_MY_PRIVATE_WSL_CONFIG + $(info Using private config file for: WSL) + endif +endif + +# Check for Linux environment variable: USE_MY_PRIVATE_LINUX_CONFIG +ifeq ($(USE_MY_PRIVATE_LINUX_CONFIG),y) + # This hard coded MY_CONFIG_FILE value must match that in the header file. + MY_CONFIG_FILE := ~/workspace/my_private_config.h + ifeq ($(wildcard $(MY_CONFIG_FILE)),) + $(info File does not exist: $(MY_CONFIG_FILE)) + else + CFLAGS += -DUSE_MY_PRIVATE_LINUX_CONFIG + $(info Using private config file for: Linux) + endif +endif + +# Check for Mac environment variable: USE_MY_PRIVATE_MAC_CONFIG +ifeq ($(USE_MY_PRIVATE_MAC_CONFIG),y) + # This hard coded MY_CONFIG_FILE value must match that in the header file. + MY_CONFIG_FILE := ~/Documents/my_private_config.h + ifeq ($(wildcard $(MY_CONFIG_FILE)),) + $(info File does not exist: $(MY_CONFIG_FILE)) + else + CFLAGS += -DUSE_MY_PRIVATE_MAC_CONFIG + $(info Using private config file for: Mac) + endif +endif + +ifneq ($(OS),MY_PRIVATE_CONFIG) + CFLAGS += -DMY_PRIVATE_CONFIG="$(MY_PRIVATE_CONFIG)" +else + ifeq ($(OS),Linux) + CFLAGS += -DOS_LINUX + endif + ifeq ($(OS),Windows_NT) + CFLAGS += -DWOLFSSL_MAKE_SYSTEM_NAME_WINDOWS + endif + ifeq ($(OS),Darwin) + CFLAGS += -DWOLFSSL_MAKE_SYSTEM_NAME_APPLE + endif + ifneq (,$(findstring MINGW,$(OS))) + CFLAGS += -DWOLFSSL_MAKE_SYSTEM_NAME_MINGW + endif + ifneq (,$(findstring CYGWIN,$(OS))) + CFLAGS += -DWOLFSSL_MAKE_SYSTEM_NAME_CYGWIN + endif +endif + +# It is essential that the build process sees the WOLFSSL_USER_SETTINGS CFLAGS += -DWOLFSSL_USER_SETTINGS -# if there isn't the directory, please disable the line below. + +# if directory not available, please disable the line below. EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/protocol_examples_common +# The Standard Espressif IDF include: include $(IDF_PATH)/make/project.mk diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README.md b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README.md index 21855add..1bfd0cc8 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README.md +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README.md @@ -8,12 +8,50 @@ When using the CLI, see the [example parameters](/IDE/Espressif/ESP-IDF/examples For general information on [wolfSSL examples for Espressif](../README.md), see the [README](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/README.md) file. -## VisualGDB +## Quick Start + +Use the [ESP-IDF](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html) +for ESP32 or [RTOS SDK](https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html) +for the ESP8266. + +Run `menuconfig` utility (`idf.py menuconfig` for ESP32 or `make menuconfig` for the ESP8266) +and set the various parameters for the target device, along with local WiFi settings: + +* Target Host: `CONFIG_WOLFSSL_TARGET_HOST` (The IP address of a listening server) +* Target Port: `CONFIG_WOLFSSL_TARGET_PORT` (Typically `11111`) +* Example WiFi SSID: `CONFIG_EXAMPLE_WIFI_SSID` (The WiFi that you want to connect to) +* Example WiFi Password: `CONFIG_EXAMPLE_WIFI_PASSWORD` (The WiFi password) + +The latest examples use makefiles that do not require local file copy installation of wolfSSL. + +Build and flash the software to see the example in action. + +## Quick Start with VisualGDB + +There are optional [VisualGDB](https://visualgdb.com/tutorials/esp8266/) project files in the +[VisualGDB](./VisualGDB) project subdirectory, and an ESP8266 project file in the project directory, +called `wolfssl_client_ESP8266.vgdbproj`. Open the VisualGDB Visual Studio Project file in the VisualGDB directory and click the "Start" button. -No wolfSSL setup is needed. You may need to adjust your specific COM port. The default is `COM20`. +No wolfSSL setup is needed. You may need to adjust your specific COM port. The default is `COM19`. + +## Troubleshooting + +Weird results, odd messages, unexpected compiler errors? Manually delete the build directory and +any locally generated files (`sdkconfig`, `sdkconfig-debug`, etc.) and start over. + +The `build` directory is typically located in the root of the project directory: `[project]/build`. + + +Difficulty flashing: + +* Ensure the target device has a robust, stable, clean power supply. +* Check that quality USB cables are being used. +* Try lowering the flash baud rate in the `menuconfig`. The 115200 is typically reliable. +* Review board specifications: some require manual boot mode via on-board buttons. +* See [Espressif ESP Frequently Asked Questions](https://docs.espressif.com/projects/esp-faq/en/latest/esp-faq-en-master.pdf) -## ESP-IDF Commandline +## ESP-IDF Commandline v5.x 1. `idf.py menuconfig` to config the project @@ -38,9 +76,83 @@ When you want to test the wolfSSL client e.g. Launch ./examples/server/server -v 4 -b -i -d + +## VisualGDB for ESP8266 + +Reminder that we build with `make` and not `cmake` in VisualGDB. + +Build files will be created in `[project directory]\build` + +## ESP-IDF make Commandline (version 3.5 or earlier for the ESP8266) + +``` +export IDF_PATH=~/esp/ESP8266_RTOS_SDK + +``` + + +## ESP-IDF CMake Commandline (version 3.5 or earlier for the ESP8266) + +Build files will be created in `[project directory]\build\debug` + +``` +# Set your path to RTOS SDK, shown here for default from WSL with VisualGDB +WRK_IDF_PATH=/mnt/c/SysGCC/esp8266/rtos-sdk/v3.4 +# or +WRK_IDF_PATH=~/esp/ESP8266_RTOS_SDK + +# Setup the environment +. $WRK_IDF_PATH/export.sh + +# install as needed / prompted +/mnt/c/SysGCC/esp8266/rtos-sdk/v3.4/install.sh + +# Fetch wolfssl from GitHub if needed: +cd /workspace +git clone https://github.com/wolfSSL/wolfssl.git + +# change directory to wolfssl client example. +cd wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client + +# or for example, WSL with C:\workspace as home for git clones: +# cd /mnt/c/workspace/wolfssl-$USER/IDE/Espressif/ESP-IDF/examples/wolfssl_client + +# adjust settings as desired +idf.py menuconfig + + +idf.py build flash -p /dev/ttyS70 -b 115200 +idf.py monitor -p /dev/ttyS70 -b 74880 +``` + ## SM Ciphers -#### Working Linux Client to ESP32 Server +(TODO coming soon) +See https://github.com/wolfSSL/wolfsm + +#### Working Linux Client to ESP32 Server Example: + +``` +./examples/client/client -h 192.168.1.37 -p 11111 -v 3 +``` + +```text +-c Certificate file, default ./certs/client-cert.pem +-k Key file, default ./certs/client-key.pem +-A Certificate Authority file, default ./certs/ca-cert.pem +``` + +Example client, with default certs explicitly given: + +```bash +./examples/client/client -h 192.168.1.37 -p 11111 -v 3 -c ./certs/client-cert.pem -k ./certs/client-key.pem -A ./certs/ca-cert.pem +``` + +Example client, with RSA 1024 certs explicitly given: + +``` +./examples/client/client -h 192.168.1.37 -p 11111 -v 3 -c ./certs/1024/client-cert.pem -k ./certs/1024/client-key.pem -A ./certs/1024/ca-cert.pem +``` Command: @@ -48,7 +160,6 @@ Command: cd /mnt/c/workspace/wolfssl-$USER/IDE/Espressif/ESP-IDF/examples/wolfssl_server . /mnt/c/SysGCC/esp32/esp-idf/v5.1/export.sh idf.py flash -p /dev/ttyS19 -b 115200 monitor - ``` ``` @@ -75,4 +186,3 @@ I hear you fa shizzle! ``` See the README.md file in the upper level 'examples' directory for [more information about examples](../README.md). - diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln index a2be094c..e8e3a317 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln @@ -18,6 +18,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "include", "include", "{5326 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A51226B3-88A7-4463-B443-0E321C4A3D53}" ProjectSection(SolutionItems) = preProject + ..\..\..\..\..\..\wolfssl\wolfcrypt\error-crypt.h = ..\..\..\..\..\..\wolfssl\wolfcrypt\error-crypt.h + ..\..\..\..\..\..\wolfssl\error-ssl.h = ..\..\..\..\..\..\wolfssl\error-ssl.h + ..\main\Kconfig.projbuild = ..\main\Kconfig.projbuild + ..\build\VisualGDB\Debug\esp-idf\esp_system\ld\memory.ld = ..\build\VisualGDB\Debug\esp-idf\esp_system\ld\memory.ld ..\..\..\..\..\..\..\my_private_config.h = ..\..\..\..\..\..\..\my_private_config.h ..\partitions_singleapp_large.csv = ..\partitions_singleapp_large.csv ..\README.md = ..\README.md @@ -25,6 +29,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\build\VisualGDB\Debug\config\sdkconfig.cmake = ..\build\VisualGDB\Debug\config\sdkconfig.cmake ..\sdkconfig.defaults = ..\sdkconfig.defaults ..\build\VisualGDB\Debug\config\sdkconfig.h = ..\build\VisualGDB\Debug\config\sdkconfig.h + ..\build\VisualGDB\Debug\esp-idf\esp_system\ld\sections.ld = ..\build\VisualGDB\Debug\esp-idf\esp_system\ld\sections.ld EndProjectSection EndProject Global diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt index e82e19b6..615142ba 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt @@ -82,8 +82,10 @@ function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY) else() get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE) IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) - if("${FOUND_WOLFSSL}") - message(STATUS "Found WOLFSSL_ROOT via Environment Variable:") + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via Environment Variable: ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() else() message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:") message(STATUS "$ENV{WOLFSSL_ROOT}") @@ -156,8 +158,8 @@ if(CMAKE_BUILD_EARLY_EXPANSION) idf_component_register( REQUIRES "${COMPONENT_REQUIRES}" PRIV_REQUIRES # esp_hw_support - esp_timer - driver # this will typically only be needed for wolfSSL benchmark + # esp_timer + # driver # this will typically only be needed for wolfSSL benchmark ) else() diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk index 13834b08..8184da11 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk @@ -17,24 +17,228 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA # + # # Component Makefile # +# +# The Espressif Managed Components are only for newer versions of the ESP-IDF +# Typically only for ESP32[-x] targets and only for ESP-IDF v4.3 or later: +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html +# https://components.espressif.com/ +# +# Usage: +# +# make flash +# +# make flash ESPPORT=/dev/ttyS55 +# +# make flash ESPBAUD=9600 +# +# make monitor ESPPORT=COM1 +# +# make monitor ESPPORT=/dev/ttyS55 MONITORBAUD=115200 +# +# export ESPPORT=/dev/ttyS55 +# +# https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html +# -COMPONENT_ADD_INCLUDEDIRS := . ./include +# Although the project should define WOLFSSL_USER_SETTINGS, we'll also +# define it here: +CFLAGS +=-DWOLFSSL_USER_SETTINGS -COMPONENT_ADD_INCLUDEDIRS += "$ENV{IDF_PATH}/components/freertos/include/freertos" -# COMPONENT_ADD_INCLUDEDIRS += "$ENV{IDF_PATH}/soc/esp32s3/include/soc" +# NOTICE: the WOLFSSL_ROOT setting MUST be relative! +# See https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-guides/build-system.html?highlight=must+relative#optional-component-specific-variables +# In the wolfSSL GitHub examples for Espressif: +# https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples +# When this wolfssl component.mk makefile is in [project]/components/wolfssl +# The root is 7 directories up from here: +WOLFSSL_ROOT := ../../../../../../.. -COMPONENT_SRCDIRS := src wolfcrypt/src -COMPONENT_SRCDIRS += wolfcrypt/src/port/Espressif -COMPONENT_SRCDIRS += wolfcrypt/src/port/atmel -COMPONENT_SRCDIRS += wolfcrypt/benchmark -COMPONENT_SRCDIRS += wolfcrypt/test +# NOTE: The wolfSSL include diretory (e.g. user_settings.h) is +# located HERE in THIS project, and *not* in the wolfSSL root. +COMPONENT_ADD_INCLUDEDIRS := ./include +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/. +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl/wolfcrypt +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl/wolfcrypt/port/Espressif +# COMPONENT_ADD_INCLUDEDIRS += $ENV(IDF_PATH)/components/freertos/include/freertos +# COMPONENT_ADD_INCLUDEDIRS += "$ENV(IDF_PATH)/soc/esp32s3/include/soc" -CFLAGS +=-DWOLFSSL_USER_SETTINGS +# wolfSSL +COMPONENT_SRCDIRS := $(WOLFSSL_ROOT)/src + +# wolfcrypt +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src + +# Espressif +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/atmel + +COMPONENT_OBJEXCLUDE := $(WOLFSSL_ROOT)/wolfcrypt/src/aes_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/misc.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/sha512_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_x25519_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/aes_gcm_x86_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/src/bio.o + + +## +## wolfSSL +## +COMPONENT_OBJS := $(WOLFSSL_ROOT)/src/bio.o +# COMPONENT_OBJS += src/conf.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/crl.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/dtls.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/dtls13.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/internal.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/keys.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/ocsp.o +# COMPONENT_OBJS += src/pk.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/quic.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/sniffer.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/ssl.o +# COMPONENT_OBJS += src/ssl_asn1.o +# COMPONENT_OBJS += src/ssl_bn.o +# COMPONENT_OBJS += src/ssl_certman.o +# COMPONENT_OBJS += src/ssl_crypto.o +# COMPONENT_OBJS += src/ssl_misc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/tls.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/tls13.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/wolfio.o +# COMPONENT_OBJS += src/x509.o +# COMPONENT_OBJS += src/x509_str.o + +## +## wolfcrypt +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/aes.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/arc4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/asm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/asn.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/async.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/blake2b.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/blake2s.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/camellia.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/chacha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/chacha20_poly1305.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cmac.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/coding.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/compress.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cpuid.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cryptocb.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/curve25519.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/curve448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/des3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dh.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dilithium.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dsa.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ecc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/eccsi.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ecc_fp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed25519.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/error.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_kyber.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_lms.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_xmss.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/falcon.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_low_mem.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_operations.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fips.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fips_test.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_low_mem.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_operations.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hash.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hmac.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hpke.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/integer.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/kdf.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/logging.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md5.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/memory.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/misc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pkcs12.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pkcs7.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/poly1305.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pwdbased.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/random.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/rc2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ripemd.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/rsa.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sakke.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/selftest.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha256.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha512.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/signature.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/siphash.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sphincs.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_armthumb.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c32.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c64.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_cortexm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_dsp32.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_int.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_arm32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_arm64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_armthumb.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_c32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_c64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_cortexm.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_x86_64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_x86_64.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/srp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/tfm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_dsp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_encrypt.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_kyber.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_kyber_poly.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_lms.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_pkcs11.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_port.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_xmss.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfevent.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfmath.o + +## +## Espressif +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_aes.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_mp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_sha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_util.o + +## +## wolfcrypt benchmark (optional) +## +## COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark/benchmark.o +## COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark +## COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark + + +## +## wolfcrypt test (optional) +## +## COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/test/test.o +## COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/test -COMPONENT_OBJEXCLUDE := wolfcrypt/src/aes_asm.o -COMPONENT_OBJEXCLUDE += wolfcrypt/src/evp.o -COMPONENT_OBJEXCLUDE += wolfcrypt/src/misc.o -COMPONENT_OBJEXCLUDE += src/bio.o +## +## wolfcrypt +## +# COMPONENT_PRIV_INCLUDEDIRS += $(PROJECT_PATH)/components/wolfssl/include diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h index de5e247c..99b61e15 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h @@ -1,6 +1,6 @@ /* user_settings.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -19,12 +19,16 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +/* Standardized wolfSSL Espressif ESP32 + ESP8266 user_settings.h V5.6.6-01 */ + /* This user_settings.h is for Espressif ESP-IDF */ #include +#define DEBUG_WOLFSSL +#define DEBUG_WOLFSSL_VERBOSE /* The Espressif sdkconfig will have chipset info. ** -** Possible values: +** Some possible values: ** ** CONFIG_IDF_TARGET_ESP32 ** CONFIG_IDF_TARGET_ESP32S2 @@ -37,7 +41,7 @@ #define WOLFSSL_ESPIDF /* - * choose ONE of these Espressif chips to define: + * ONE of these Espressif chipsets should be defined: * * WOLFSSL_ESP32 * WOLFSSL_ESPWROOM32SE @@ -46,8 +50,13 @@ #undef WOLFSSL_ESPWROOM32SE #undef WOLFSSL_ESP8266 #undef WOLFSSL_ESP32 +/* See below for chipset detection from sdkconfig.h */ -#define WOLFSSL_ESP32 +/* Small session cache saves a lot of RAM for ClientCache and SessionCache. + * Memory requirement is about 5KB, otherwise 20K is needed when not specified. + * If extra small footprint is needed, try MICRO_SESSION_CACHE (< 1K) + * When really desparate, try NO_SESSION_CACHE. */ +#define SMALL_SESSION_CACHE /* optionally turn off SHA512/224 SHA512/256 */ /* #define WOLFSSL_NOSHA512_224 */ @@ -62,6 +71,9 @@ #define BENCH_EMBEDDED #define USE_CERT_BUFFERS_2048 +#define WOLFSSL_SMALL_STACK +#define HAVE_ECC +#define RSA_LOW_MEM /* TLS 1.3 */ #define WOLFSSL_TLS13 @@ -79,7 +91,9 @@ #define HAVE_AESGCM -#define WOLFSSL_RIPEMD +/* Optional RIPEMD: RACE Integrity Primitives Evaluation Message Digest */ +/* #define WOLFSSL_RIPEMD */ + /* when you want to use SHA224 */ #define WOLFSSL_SHA224 @@ -87,24 +101,17 @@ #define WOLFSSL_SHA384 /* when you want to use SHA512 */ -#define WOLFSSL_SHA512 +/* #define WOLFSSL_SHA512 */ /* when you want to use SHA3 */ -#define WOLFSSL_SHA3 +/* #define WOLFSSL_SHA3 */ -#define HAVE_ED25519 /* ED25519 requires SHA512 */ +/* ED25519 requires SHA512 */ +/* #define HAVE_ED25519 */ -#define HAVE_ECC -#define HAVE_CURVE25519 -#define CURVE25519_SMALL -#define HAVE_ED25519 - - #define OPENSSL_EXTRA /* when you want to use pkcs7 */ /* #define HAVE_PKCS7 */ -#define HAVE_PKCS7 - #if defined(HAVE_PKCS7) #define HAVE_AES_KEYWRAP #define HAVE_X963_KDF @@ -125,7 +132,7 @@ /* #define CUSTOM_SLOT_ALLOCATION */ #endif -/* rsa primitive specific definition */ +/* RSA primitive specific definition */ #if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) /* Define USE_FAST_MATH and SMALL_STACK */ #define ESP32_USE_RSA_PRIMITIVE @@ -145,8 +152,6 @@ #endif #endif -#define RSA_LOW_MEM - /* #define WOLFSSL_ATECC508A_DEBUG */ /* date/time */ @@ -173,10 +178,6 @@ /* #undef USE_FAST_MATH */ /* #define USE_INTEGER_HEAP_MATH */ - -#define WOLFSSL_SMALL_STACK - - #define HAVE_VERSION_EXTENDED_INFO /* #define HAVE_WC_INTROSPECTION */ @@ -190,7 +191,6 @@ #define WOLFSSL_CERT_EXT #define WOLFSSL_SYS_CA_CERTS - #define WOLFSSL_CERT_TEXT #define WOLFSSL_ASN_TEMPLATE @@ -203,7 +203,7 @@ #undef WOLFSSL_SYS_CA_CERTS */ -/* +/* command-line options --enable-keygen --enable-certgen --enable-certreq @@ -211,10 +211,11 @@ --enable-asn-template */ -/* Default is HW enabled unless turned off. -** Uncomment these lines to force SW instead of HW acceleration */ - +/* Chipset detection from sdkconfig.h + * Default is HW enabled unless turned off. + * Uncomment lines to force SW instead of HW acceleration */ #if defined(CONFIG_IDF_TARGET_ESP32) + #define WOLFSSL_ESP32 /* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */ /* #define NO_ESP32_CRYPT */ /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ @@ -232,6 +233,7 @@ /***** END CONFIG_IDF_TARGET_ESP32 *****/ #elif defined(CONFIG_IDF_TARGET_ESP32S2) + #define WOLFSSL_ESP32 /* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */ /* #define NO_ESP32_CRYPT */ /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ @@ -244,6 +246,7 @@ /***** END CONFIG_IDF_TARGET_ESP32S2 *****/ #elif defined(CONFIG_IDF_TARGET_ESP32S3) + #define WOLFSSL_ESP32 /* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */ /* #define NO_ESP32_CRYPT */ /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ @@ -257,6 +260,7 @@ #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ defined(CONFIG_IDF_TARGET_ESP8684) + #define WOLFSSL_ESP32 /* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a * single QFN 4x4 mm package. Out of released documentation, Technical * Reference Manual as well as ESP-IDF Programming Guide is applicable @@ -282,6 +286,7 @@ /***** END CONFIG_IDF_TARGET_ESP32C2 *****/ #elif defined(CONFIG_IDF_TARGET_ESP32C3) + #define WOLFSSL_ESP32 /* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */ /* #define NO_ESP32_CRYPT */ @@ -299,6 +304,7 @@ /***** END CONFIG_IDF_TARGET_ESP32C3 *****/ #elif defined(CONFIG_IDF_TARGET_ESP32C6) + #define WOLFSSL_ESP32 /* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */ /* #define NO_ESP32_CRYPT */ @@ -315,6 +321,7 @@ /***** END CONFIG_IDF_TARGET_ESP32C6 *****/ #elif defined(CONFIG_IDF_TARGET_ESP32H2) + #define WOLFSSL_ESP32 /* wolfSSL Hardware Acceleration not yet implemented */ #define NO_ESP32_CRYPT #define NO_WOLFSSL_ESP32_CRYPT_HASH @@ -323,15 +330,28 @@ /***** END CONFIG_IDF_TARGET_ESP32H2 *****/ #elif defined(CONFIG_IDF_TARGET_ESP8266) - /* TODO: Revisit ESP8266 */ + #define WOLFSSL_ESP8266 + + /* There's no hardware encryption on the ESP8266 */ + /* Consider using the ESP32-C2/C3/C6 + * See https://www.espressif.com/en/products/socs/esp32-c2 */ #define NO_ESP32_CRYPT #define NO_WOLFSSL_ESP32_CRYPT_HASH #define NO_WOLFSSL_ESP32_CRYPT_AES #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI /***** END CONFIG_IDF_TARGET_ESP266 *****/ +#elif defined(CONFIG_IDF_TARGET_ESP8684) + /* There's no Hardware Acceleration available on ESP8684 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP8684 *****/ + #else /* Anything else encountered, disable HW accleration */ + #warning "Unexpected CONFIG_IDF_TARGET_NN value" #define NO_ESP32_CRYPT #define NO_WOLFSSL_ESP32_CRYPT_HASH #define NO_WOLFSSL_ESP32_CRYPT_AES @@ -392,12 +412,75 @@ #define ATCA_WOLFSSL */ -/* optional SM4 Ciphers. See https://github.com/wolfSSL/wolfsm +/***************************** Certificate Macros ***************************** + * + * The section below defines macros used in typically all of the wolfSSL + * examples such as the client and server for certs stored in header files. + * + * There are various certificate examples in this header file: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * To use the sets of macros below, define *one* of these: + * + * USE_CERT_BUFFERS_1024 - ECC 1024 bit encoded ASN1 + * USE_CERT_BUFFERS_2048 - RSA 2048 bit encoded ASN1 + * WOLFSSL_SM[2,3,4] - SM Ciphers + * + * For example: define USE_CERT_BUFFERS_2048 to use CA Certs used in this + * wolfSSL function for the `ca_cert_der_2048` buffer, size and types: + * + * ret = wolfSSL_CTX_load_verify_buffer(ctx, + * CTX_CA_CERT, + * CTX_CA_CERT_SIZE, + * CTX_CA_CERT_TYPE); + * + * See https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_load_verify_buffer + * + * In this case the CTX_CA_CERT will be defined as `ca_cert_der_2048` as + * defined here: https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * The CTX_CA_CERT_SIZE and CTX_CA_CERT_TYPE are similarly used to reference + * array size and cert type respectively. + * + * Similarly for loading the private client key: + * + * ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + * CTX_CLIENT_KEY, + * CTX_CLIENT_KEY_SIZE, + * CTX_CLIENT_KEY_TYPE); + * + * see https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_use_privatekey_buffer + * + * Similarly, the other macros are for server certificates and keys: + * `CTX_SERVER_CERT` and `CTX_SERVER_KEY` are available. + * + * The certificate and key names are typically `static const unsigned char` + * arrays. The [NAME]_size are typically `sizeof([array name])`, and the types + * are the known wolfSSL encoding type integers (e.g. WOLFSSL_FILETYPE_PEM). + * + * See `SSL_FILETYPE_[name]` in + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/ssl.h + * + * See Abstract Syntax Notation One (ASN.1) in: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/asn.h + * + * Optional SM4 Ciphers: + * + * Although the SM ciphers are shown here, the `certs_test_sm.h` may not yet + * be available. See: + * https://github.com/wolfSSL/wolfssl/pull/6825 + * https://github.com/wolfSSL/wolfsm + * + * Uncomment these 3 macros to enable the SM Ciphers and use the macros below. + */ + +/* #define WOLFSSL_SM2 #define WOLFSSL_SM3 #define WOLFSSL_SM4 */ +/* Conditional macros used in wolfSSL TLS client and server examples */ #if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) #include #define CTX_CA_CERT root_sm2 @@ -413,15 +496,47 @@ #undef WOLFSSL_BASE16 #define WOLFSSL_BASE16 #else - #define USE_CERT_BUFFERS_2048 - #define USE_CERT_BUFFERS_256 - #define CTX_CA_CERT ca_cert_der_2048 - #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 - #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 - #define CTX_SERVER_CERT server_cert_der_2048 - #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048 - #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 - #define CTX_SERVER_KEY server_key_der_2048 - #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048 - #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 -#endif + #if defined(USE_CERT_BUFFERS_2048) + #include + #define CTX_CA_CERT ca_cert_der_2048 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_2048 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_2048 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_2048 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_2048 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #elif defined(USE_CERT_BUFFERS_1024) + #include + #define CTX_CA_CERT ca_cert_der_1024 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_1024 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_1024 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_1024 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_1024 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_1024 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_1024 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_1024 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_1024 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_1024 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + #else + /* Optionally define custom cert arrays, sizes, and types here */ + #error "Must define USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_1024" + #endif +#endif /* Conditional key and cert constant names */ diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c index 9d5d26db..30388b31 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c @@ -1,6 +1,6 @@ /* client-tls.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,7 +18,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ - #include "client-tls.h" /* Espressif FreeRTOS */ @@ -28,13 +27,15 @@ #include #endif +/* Espressif */ +#include + /* socket includes */ #include #include /* wolfSSL */ #include -#include "user_settings.h" #include #ifdef WOLFSSL_TRACK_MEMORY @@ -50,30 +51,6 @@ #define DEFAULT_MAX_DHKEY_BITS 2048 #endif -#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) - #include - #define CTX_CA_CERT root_sm2 - #define CTX_CA_CERT_SIZE sizeof_root_sm2 - #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_PEM - #define CTX_CLIENT_CERT client_sm2 - #define CTX_CLIENT_CERT_SIZE sizeof_client_sm2 - #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_PEM - #define CTX_CLIENT_KEY client_sm2_priv - #define CTX_CLIENT_KEY_SIZE sizeof_client_sm2_priv - #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_PEM -#else - #include - #define CTX_CA_CERT ca_cert_der_2048 - #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 - #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 - #define CTX_CLIENT_CERT client_cert_der_2048 - #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048 - #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 - #define CTX_CLIENT_KEY client_key_der_2048 - #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048 - #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 -#endif - /* Project */ #include "wifi_connect.h" #include "time_helper.h" @@ -87,7 +64,7 @@ * -h 192.168.1.128 -v 4 -l TLS13-SM4-CCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C * **/ -static const char* const TAG = "tls_client"; +#define TAG "client-tls" #if defined(DEBUG_WOLFSSL) int stack_start = -1; @@ -264,29 +241,29 @@ WOLFSSL_ESP_TASK tls_smp_client_task(void* args) * * reference code for SM Ciphers: * - #if defined(HAVE_AESGCM) && !defined(NO_DH) - #ifdef WOLFSSL_TLS13 - defaultCipherList = "TLS13-AES128-GCM-SHA256" - #ifndef WOLFSSL_NO_TLS12 - ":DHE-PSK-AES128-GCM-SHA256" - #endif - ; - #else - defaultCipherList = "DHE-PSK-AES128-GCM-SHA256"; + #if defined(HAVE_AESGCM) && !defined(NO_DH) + #ifdef WOLFSSL_TLS13 + defaultCipherList = "TLS13-AES128-GCM-SHA256" + #ifndef WOLFSSL_NO_TLS12 + ":DHE-PSK-AES128-GCM-SHA256" #endif - #elif defined(HAVE_AESGCM) && defined(WOLFSSL_TLS13) - defaultCipherList = "TLS13-AES128-GCM-SHA256:PSK-AES128-GCM-SHA256" - #ifndef WOLFSSL_NO_TLS12 - ":PSK-AES128-GCM-SHA256" - #endif - ; - #elif defined(HAVE_NULL_CIPHER) - defaultCipherList = "PSK-NULL-SHA256"; - #elif !defined(NO_AES_CBC) - defaultCipherList = "PSK-AES128-CBC-SHA256"; + ; #else - defaultCipherList = "PSK-AES128-GCM-SHA256"; + defaultCipherList = "DHE-PSK-AES128-GCM-SHA256"; #endif + #elif defined(HAVE_AESGCM) && defined(WOLFSSL_TLS13) + defaultCipherList = "TLS13-AES128-GCM-SHA256:PSK-AES128-GCM-SHA256" + #ifndef WOLFSSL_NO_TLS12 + ":PSK-AES128-GCM-SHA256" + #endif + ; + #elif defined(HAVE_NULL_CIPHER) + defaultCipherList = "PSK-NULL-SHA256"; + #elif !defined(NO_AES_CBC) + defaultCipherList = "PSK-AES128-CBC-SHA256"; + #else + defaultCipherList = "PSK-AES128-GCM-SHA256"; + #endif */ ret = wolfSSL_CTX_set_cipher_list(ctx, WOLFSSL_ESP32_CIPHER_SUITE); @@ -294,16 +271,16 @@ WOLFSSL_ESP_TASK tls_smp_client_task(void* args) ESP_LOGI(TAG, "Set cipher list: %s\n", WOLFSSL_ESP32_CIPHER_SUITE); } else { - ESP_LOGE(TAG, "ERROR: failed to set cipher list: %s\n", WOLFSSL_ESP32_CIPHER_SUITE); + ESP_LOGE(TAG, "ERROR: failed to set cipher list: %s\n", + WOLFSSL_ESP32_CIPHER_SUITE); } #endif #ifdef DEBUG_WOLFSSL ShowCiphers(NULL); - ESP_LOGI(TAG, - "Stack used: %d\n", - CONFIG_ESP_MAIN_TASK_STACK_SIZE - - uxTaskGetStackHighWaterMark(NULL)); + ESP_LOGI(TAG, "Stack used: %d\n", + CONFIG_ESP_MAIN_TASK_STACK_SIZE + - uxTaskGetStackHighWaterMark(NULL)); #endif /* see user_settings PROJECT_DH for HAVE_DH and HAVE_FFDHE_2048 */ @@ -328,12 +305,13 @@ WOLFSSL_ESP_TASK tls_smp_client_task(void* args) CTX_CLIENT_CERT_SIZE, CTX_CLIENT_CERT_TYPE); if (ret_i != SSL_SUCCESS) { - ESP_LOGE(TAG, "ERROR: failed to load chain %d, please check the file.\n", ret_i); + ESP_LOGE(TAG, "ERROR: failed to load chain %d, " + "please check the file.", ret_i); } - /* Load client certificates into WOLFSSL_CTX */ - WOLFSSL_MSG("Loading...cert"); - ret_i = wolfSSL_CTX_load_verify_buffer(ctx, + /* Load client certificates into WOLFSSL_CTX */ + WOLFSSL_MSG("Loading...cert"); + ret_i = wolfSSL_CTX_load_verify_buffer(ctx, CTX_CA_CERT, CTX_CA_CERT_SIZE, CTX_CA_CERT_TYPE); @@ -420,10 +398,17 @@ WOLFSSL_ESP_TASK tls_smp_client_task(void* args) #endif /* Attach wolfSSL to the socket */ - wolfSSL_set_fd(ssl, sockfd); + ret_i = wolfSSL_set_fd(ssl, sockfd); + if (ret_i == WOLFSSL_SUCCESS) { + ESP_LOGI(TAG, "wolfSSL_set_fd success"); + } + else { + ESP_LOGE(TAG, "ERROR: failed wolfSSL_set_fd. Error: %d\n", ret_i); + } WOLFSSL_MSG("Connect to wolfSSL on the server side"); /* Connect to wolfSSL on the server side */ + ret_i = wolfSSL_connect(ssl); if (wolfSSL_connect(ssl) == SSL_SUCCESS) { #ifdef DEBUG_WOLFSSL ShowCiphers(ssl); @@ -458,7 +443,8 @@ WOLFSSL_ESP_TASK tls_smp_client_task(void* args) printf("%s\n", buff); } else { - ESP_LOGE(TAG, "ERROR: failed to connect to wolfSSL\n"); + ESP_LOGE(TAG, "ERROR: failed to connect to wolfSSL. " + "Error: %d\n", ret_i); } #ifdef DEBUG_WOLFSSL ShowCiphers(ssl); @@ -487,16 +473,28 @@ WOLFSSL_ESP_TASK tls_smp_client_init(void* args) #else xTaskHandle _handle; #endif - /* http://esp32.info/docs/esp_idf/html/dd/d3c/group__xTaskCreate.html */ + /* See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos_idf.html#functions */ + if (TLS_SMP_CLIENT_TASK_BYTES < (6 * 1024)) { + /* Observed approximately 6KB limit for the RTOS task stack size. + * Reminder parameter is bytes, not words as with generic FreeeRTOS. */ + ESP_LOGW(TAG, "Warning: TLS_SMP_CLIENT_TASK_BYTES < 6KB"); + } +#ifndef WOLFSSL_SMALL_STACK + ESP_LOGW(TAG, "WARNING: WOLFSSL_SMALL_STACK is not defined. Consider " + "defining that to reduce embedded memory usage."); +#endif + + /* Note that despite vanilla FreeRTOS using WORDS for a parameter, + * Espressif uses BYTES for the task stack size here: */ ret = xTaskCreate(tls_smp_client_task, TLS_SMP_CLIENT_TASK_NAME, - TLS_SMP_CLIENT_TASK_WORDS, + TLS_SMP_CLIENT_TASK_BYTES, NULL, TLS_SMP_CLIENT_TASK_PRIORITY, &_handle); if (ret != pdPASS) { - ESP_LOGI(TAG, "create thread %s failed", TLS_SMP_CLIENT_TASK_NAME); + ESP_LOGI(TAG, "Create thread %s failed.", TLS_SMP_CLIENT_TASK_NAME); } return TLS_SMP_CLIENT_TASK_RET; } diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/component.mk b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/component.mk index 61f8990c..c59edbee 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/component.mk +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/component.mk @@ -1,8 +1,8 @@ # # Main component makefile. # -# This Makefile can be left empty. By default, it will take the sources in the -# src/ directory, compile them and link them into lib(subdirectory_name).a -# in the build directory. This behaviour is entirely configurable, +# This Makefile can be left empty. By default, it will take the sources in the +# src/ directory, compile them and link them into lib(subdirectory_name).a +# in the build directory. This behavior is entirely configurable, # please read the ESP-IDF documents if you need to do this. # diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/client-tls.h b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/client-tls.h index 1188ee36..de534035 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/client-tls.h +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/client-tls.h @@ -1,6 +1,6 @@ -/* server-tls.h +/* client-tls.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,18 +18,20 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -#ifndef _SERVER_TLS_ -#define _SERVER_TLS_ +#ifndef _CLIENT_TLS_H_ +#define _CLIENT_TLS_H_ + +/* Local project, auto-generated configuration */ +#include "sdkconfig.h" #include #include -#include "sdkconfig.h" /* See main/Kconfig.projbuild for default configuration settings */ #ifdef CONFIG_WOLFSSL_TARGET_HOST #define TLS_SMP_TARGET_HOST CONFIG_WOLFSSL_TARGET_HOST #else - #define TLS_SMP_TARGET_HOST "192.168.1.38" + #define TLS_SMP_TARGET_HOST "192.168.1.37" #endif #ifdef CONFIG_WOLFSSL_TARGET_PORT @@ -39,13 +41,20 @@ #endif #define TLS_SMP_CLIENT_TASK_NAME "tls_client_example" -#define TLS_SMP_CLIENT_TASK_WORDS 22240 + +/* Reminder: Vanilla FreeRTOS is words, Espressif is bytes. */ +#if defined(WOLFSSL_ESP8266) + #define TLS_SMP_CLIENT_TASK_BYTES (6 * 1024) +#else + #define TLS_SMP_CLIENT_TASK_BYTES (8 * 1024) +#endif + #define TLS_SMP_CLIENT_TASK_PRIORITY 8 #if defined(SINGLE_THREADED) #define WOLFSSL_ESP_TASK int #else - #include "freertos/FreeRTOS.h" + #include #define WOLFSSL_ESP_TASK void #endif @@ -68,4 +77,5 @@ WOLFSSL_ESP_TASK tls_smp_client_task(void* args); #else WOLFSSL_ESP_TASK tls_smp_client_init(void* args); #endif + #endif /* _SERVER_TLS_ */ diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/main.h b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/main.h index 94c3b5eb..12c452d6 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/main.h +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/main.h @@ -1,6 +1,6 @@ -/* template main.h +/* wolfssl_client main.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_helper.h b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_helper.h index a47f9400..3586ac65 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_helper.h +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_helper.h @@ -1,5 +1,6 @@ -/* - * Copyright (C) 2006-2023 wolfSSL Inc. +/* time_helper.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -20,8 +21,8 @@ /* common Espressif time_helper v5.6.3.001 */ -#ifndef _TIME_HELPER_H -#define _TIME_HELPER_H +#ifndef _TIME_HELPER_H_ +#define _TIME_HELPER_H_ /* ESP-IDF uses a 64-bit signed integer to represent time_t starting from release v5.0 * See: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#year-2036-and-2038-overflow-issues @@ -32,13 +33,13 @@ extern "C" { #endif /* a function to show the current data and time */ -int esp_show_current_datetime(); +int esp_show_current_datetime(void); /* worst case, if GitHub time not available, used fixed time */ int set_fixed_default_time(void); /* set time from string (e.g. GitHub commit time) */ -int set_time_from_string(char* time_buffer); +int set_time_from_string(const char* time_buffer); /* set time from NTP servers, * also initially calls set_fixed_default_time or set_time_from_string */ @@ -51,4 +52,4 @@ int set_time_wait_for_ntp(void); } /* extern "C" */ #endif -#endif /* #ifndef _TIME_HELPER_H */ +#endif /* #ifndef _TIME_HELPER_H_ */ diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h index 644ce00d..b29d5812 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h @@ -21,9 +21,6 @@ #ifndef _WIFI_CONNECT_H_ #define _WIFI_CONNECT_H_ -#include -#include - /* ESP lwip */ #define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY @@ -48,19 +45,54 @@ * file my_private_config.h should be excluded from git updates */ /* #define USE_MY_PRIVATE_CONFIG */ -#ifdef USE_MY_PRIVATE_CONFIG +/* Note that IntelliSense may not work properly in the next section for the + * Espressif SDK 3.4 on the ESP8266. Macros should still be defined. + * See the project-level Makefile. Example found in: + * https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/template + * + * The USE_MY_PRIVATE_[OS]_CONFIG is typically an environment variable that + * triggers the make (not cmake) to add compiler defines. + */ +#if defined(USE_MY_PRIVATE_WINDOWS_CONFIG) + #include "/workspace/my_private_config.h" +#elif defined(USE_MY_PRIVATE_WSL_CONFIG) + #include "/mnt/c/workspace/my_private_config.h" +#elif defined(USE_MY_PRIVATE_LINUX_CONFIG) + #include "~/workspace/my_private_config.h" +#elif defined(USE_MY_PRIVATE_MAC_CONFIG) + #include "~/Documents/my_private_config.h" +#elif defined(USE_MY_PRIVATE_CONFIG) + /* This section works best with cmake & non-environment variable setting */ #if defined(WOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS) + #define WOLFSSL_CMAKE + #include "/workspace/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_WINDOWS) + #define WOLFSSL_MAKE #include "/workspace/my_private_config.h" #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_WSL) + #define WOLFSSL_CMAKE + #include "/mnt/c/workspace/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_WSL) + #define WOLFSSL_MAKE #include "/mnt/c/workspace/my_private_config.h" #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_LINUX) + #define WOLFSSL_CMAKE + #include "~/workspace/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_LINUX) + #define WOLFSSL_MAKE #include "~/workspace/my_private_config.h" #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_APPLE) #include "~/Documents/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_APPLE) + #define WOLFSSL_MAKE + #include "~/Documents/my_private_config.h" + #elif defined(OS_WINDOWS) + #include "/workspace/my_private_config.h" #else - #warning "did not detect environment. using ~/my_private_config.h" - #include "~/my_private_config.h" - #endif + /* Edit as needed for your private config: */ + #warning "default private config using /workspace/my_private_config.h" + #include "/workspace/my_private_config.h" + #endif #else /* @@ -70,14 +102,22 @@ ** If you'd rather not, just change the below entries to strings with ** the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" */ - #ifdef CONFIG_ESP_WIFI_SSID + #if defined(CONFIG_ESP_WIFI_SSID) + /* tyically from ESP32 with ESP-IDF v4 ot v5 */ #define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID + #elif defined(CONFIG_EXAMPLE_WIFI_SSID) + /* tyically from ESP8266 rtos-sdk/v3.4 */ + #define EXAMPLE_ESP_WIFI_SSID CONFIG_EXAMPLE_WIFI_SSID #else #define EXAMPLE_ESP_WIFI_SSID "MYSSID_WIFI_CONNECT" #endif - #ifdef CONFIG_ESP_WIFI_PASSWORD + #if defined(CONFIG_ESP_WIFI_PASSWORD) + /* tyically from ESP32 with ESP-IDF v4 or v5 */ #define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD + #elif defined(CONFIG_EXAMPLE_WIFI_SSID) + /* tyically from ESP8266 rtos-sdk/v3.4 */ + #define EXAMPLE_ESP_WIFI_PASS CONFIG_EXAMPLE_WIFI_PASSWORD #else #define EXAMPLE_ESP_WIFI_PASS "MYPASSWORD_WIFI_CONNECT" #endif diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/main.c b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/main.c index add43ada..fa116ed1 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/main.c +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/main.c @@ -1,6 +1,6 @@ /* main.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -27,8 +27,9 @@ #include /* wolfSSL */ +/* Always include wolfcrypt/settings.h before any other wolfSSL file. */ +/* Reminder: settings.h pulls in user_settings.h; don't include it here */ #include -#include #include #ifndef WOLFSSL_ESPIDF #warning "Problem with wolfSSL user_settings." @@ -44,13 +45,17 @@ * For wired ethernet, see: * https://github.com/wolfSSL/wolfssl-examples/tree/master/ESP32/TLS13-ENC28J60-client */ #include "wifi_connect.h" + /* + * Note ModBus TCP cannot be disabled on ESP8266 tos-sdk/v3.4 + * See https://github.com/espressif/esp-modbus/issues/2 + */ #endif #ifdef WOLFSSL_TRACK_MEMORY #include #endif -static const char* const TAG = "TLS Client"; +static const char* TAG = "main"; #if defined(WOLFSSL_ESPWROOM32SE) && defined(HAVE_PK_CALLBACKS) \ && defined(WOLFSSL_ATECC508A) @@ -115,7 +120,7 @@ void my_atmel_free(int slotId) #endif /* CUSTOM_SLOT_ALLOCATION */ #endif /* WOLFSSL_ESPWROOM32SE && HAVE_PK_CALLBACK && WOLFSSL_ATECC508A */ -/* for FreeRTOS */ +/* Entry for FreeRTOS */ void app_main(void) { int stack_start = 0; @@ -126,26 +131,42 @@ void app_main(void) ESP_LOGI(TAG, "---------------------- BEGIN MAIN ----------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); +#ifdef ESP_SDK_MEM_LIB_VERSION + sdk_init_meminfo(); +#endif #ifdef ESP_TASK_MAIN_STACK ESP_LOGI(TAG, "ESP_TASK_MAIN_STACK: %d", ESP_TASK_MAIN_STACK); #endif #ifdef TASK_EXTRA_STACK_SIZE ESP_LOGI(TAG, "TASK_EXTRA_STACK_SIZE: %d", TASK_EXTRA_STACK_SIZE); #endif -#ifdef INCLUDE_uxTaskGetStackHighWaterMark + +#ifdef SINGLE_THREADED + ESP_LOGI(TAG, "Single threaded"); +#else ESP_LOGI(TAG, "CONFIG_ESP_MAIN_TASK_STACK_SIZE = %d bytes (%d words)", CONFIG_ESP_MAIN_TASK_STACK_SIZE, - (int)(CONFIG_ESP_MAIN_TASK_STACK_SIZE / sizeof(void*))); + (int)(CONFIG_ESP_MAIN_TASK_STACK_SIZE / sizeof(void*))); + + #ifdef INCLUDE_uxTaskGetStackHighWaterMark + { + /* Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in bytes not words, unlike + * vanilla FreeRTOS) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos_idf.html + */ + stack_start = uxTaskGetStackHighWaterMark(NULL); + #ifdef ESP_SDK_MEM_LIB_VERSION + { + sdk_var_whereis("stack_start", &stack_start); + } + #endif - /* Returns the high water mark of the stack associated with xTask. That is, - * the minimum free stack space there has been (in bytes not words, unlike - * vanilla FreeRTOS) since the task started. The smaller the returned - * number the closer the task has come to overflowing its stack. - * see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos_idf.html - */ - stack_start = uxTaskGetStackHighWaterMark(NULL); - ESP_LOGI(TAG, "Stack Start HWM: %d bytes", stack_start); -#endif + ESP_LOGI(TAG, "Stack Start HWM: %d bytes", stack_start); + } + #endif /* INCLUDE_uxTaskGetStackHighWaterMark */ +#endif /* SINGLE_THREADED */ #ifdef HAVE_VERSION_EXTENDED_INFO esp_ShowExtendedSystemInfo(); @@ -184,11 +205,23 @@ void app_main(void) /* Initialize NVS */ ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || - ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); + #if defined(CONFIG_IDF_TARGET_ESP8266) + { + if (ret == ESP_ERR_NVS_NO_FREE_PAGES) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } } + #else + { + /* Non-ESP8266 initialization is slightly different */ + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || + ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + } + #endif /* else not CONFIG_IDF_TARGET_ESP8266 */ ESP_ERROR_CHECK(ret); #if defined(CONFIG_IDF_TARGET_ESP32H2) @@ -203,8 +236,8 @@ void app_main(void) ESP_LOGI(TAG, "Trying WiFi again..."); ret = wifi_init_sta(); } - #endif -#endif + #endif /* else not CONFIG_IDF_TARGET_ESP32H2 */ +#endif /* else FOUND_PROTOCOL_EXAMPLES_DIR not found */ /* Once we are connected to the network, start & wait for NTP time */ ret = set_time_wait_for_ntp(); @@ -216,14 +249,6 @@ void app_main(void) esp_show_current_datetime(); } - /* HWM is maximum amount of stack space that has been unused, in bytes - * not words (unlike vanilla freeRTOS). */ - ESP_LOGI(TAG, "Initial Stack Used (before wolfSSL Server): %d bytes", - CONFIG_ESP_MAIN_TASK_STACK_SIZE - - (uxTaskGetStackHighWaterMark(NULL)) - ); - ESP_LOGI(TAG, "Starting TLS Client task ...\n"); - #if defined(SINGLE_THREADED) /* just call the task */ tls_smp_client_task((void*)NULL); @@ -232,6 +257,19 @@ void app_main(void) /* start a thread with the task */ args[0].loops = 10; args[0].port = 11111; + + /* HWM is maximum amount of stack space that has been unused, in bytes + * not words (unlike vanilla freeRTOS). */ + int this_heap; + this_heap = esp_get_free_heap_size(); + ESP_LOGI(TAG, "Initial Stack Used (before wolfSSL Server): %d bytes", + CONFIG_ESP_MAIN_TASK_STACK_SIZE + - (uxTaskGetStackHighWaterMark(NULL)) + ); + ESP_LOGI(TAG, "Starting TLS Client task ...\n"); + + ESP_LOGI(TAG, "main tls_smp_client_init heap @ %p = %d", + &this_heap, this_heap); tls_smp_client_init(args); /* optional additional client threads tls_smp_client_init(args); @@ -244,24 +282,24 @@ void app_main(void) */ #endif + /* Done */ +#ifdef SINGLE_THREADED + ESP_LOGV(TAG, "\n\nDone!\n\n"); + while (1); +#else ESP_LOGV(TAG, "\n\nvTaskDelete...\n\n"); vTaskDelete(NULL); /* done */ while (1) { ESP_LOGV(TAG, "\n\nLoop...\n\n"); -#ifdef INCLUDE_uxTaskGetStackHighWaterMark + #ifdef INCLUDE_uxTaskGetStackHighWaterMark ESP_LOGI(TAG, "Stack HWM: %d", uxTaskGetStackHighWaterMark(NULL)); ESP_LOGI(TAG, "Stack used: %d", CONFIG_ESP_MAIN_TASK_STACK_SIZE - (uxTaskGetStackHighWaterMark(NULL) )); -#endif - -#if defined(SINGLE_THREADED) - ESP_LOGV(TAG, "\n\nDone!\n\n"); - while (1); -#else + #endif vTaskDelay(60000); -#endif - } /* done whle */ + } /* done while */ +#endif /* else not SINGLE_THREADED */ } /* app_main */ diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/time_helper.c b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/time_helper.c index 5149d2e6..5eb06a14 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/time_helper.c +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/time_helper.c @@ -1,6 +1,6 @@ /* time_helper.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -19,12 +19,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -/* common Espressif time_helper v5.6.3.002 */ -#include "esp_idf_version.h" +/* See https://tf.nist.gov/tf-cgi/servers.cgi */ + +/* common Espressif time_helper v5.6.6.001 */ #include "sdkconfig.h" #include "time_helper.h" #include +#include #if defined(ESP_IDF_VERSION_MAJOR) && defined(ESP_IDF_VERSION_MINOR) #if (ESP_IDF_VERSION_MAJOR == 5) && (ESP_IDF_VERSION_MINOR >= 1) @@ -36,25 +38,24 @@ #include #endif #else - /* TODO Consider pre IDF v5? */ + /* TODO Consider non ESP-IDF environments */ #endif /* ESP-IDF uses a 64-bit signed integer to represent time_t starting from release v5.0 * See: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#year-2036-and-2038-overflow-issues */ -const static char* TAG = "time_helper"; /* see https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html */ #ifndef TIME_ZONE -/* - * PST represents Pacific Standard Time. - * +8 specifies the offset from UTC (Coordinated Universal Time), indicating - * that Pacific Time is UTC-8 during standard time. - * PDT represents Pacific Daylight Time. - * M3.2.0 indicates that Daylight Saving Time (DST) starts on the - * second (2) Sunday (0) of March (3). - * M11.1.0 indicates that DST ends on the first (1) Sunday (0) of November (11) - */ + /* + * PST represents Pacific Standard Time. + * +8 specifies the offset from UTC (Coordinated Universal Time), indicating + * that Pacific Time is UTC-8 during standard time. + * PDT represents Pacific Daylight Time. + * M3.2.0 indicates that Daylight Saving Time (DST) starts on the + * second (2) Sunday (0) of March (3). + * M11.1.0 indicates that DST ends on the first (1) Sunday (0) of November (11) + */ #define TIME_ZONE "PST+8PDT,M3.2.0,M11.1.0" #endif /* not defined: TIME_ZONE, so we are setting our own */ @@ -87,11 +88,13 @@ const static char* TAG = "time_helper"; char* ntpServerList[NTP_SERVER_COUNT] = NTP_SERVER_LIST; +const static char* TAG = "time_helper"; + /* our NTP server list is global info */ extern char* ntpServerList[NTP_SERVER_COUNT]; /* Show the current date and time */ -int esp_show_current_datetime() +int esp_show_current_datetime(void) { time_t now; char strftime_buf[64]; @@ -104,7 +107,7 @@ int esp_show_current_datetime() localtime_r(&now, &timeinfo); strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); ESP_LOGI(TAG, "The current date/time is: %s", strftime_buf); - return 0; + return ESP_OK; } /* the worst-case scenario is a hard-coded date/time */ @@ -113,9 +116,9 @@ int set_fixed_default_time(void) /* ideally, we'd like to set time from network, * but let's set a default time, just in case */ struct tm timeinfo = { - .tm_year = 2023 - 1900, - .tm_mon = 10, - .tm_mday = 02, + .tm_year = 2024 - 1900, + .tm_mon = 1, + .tm_mday = 05, .tm_hour = 13, .tm_min = 01, .tm_sec = 05 @@ -130,7 +133,38 @@ int set_fixed_default_time(void) ESP_LOGI(TAG, "Adjusting time from fixed value"); now = (struct timeval){ .tv_sec = interim_time }; ret = settimeofday(&now, NULL); + ESP_LOGI(TAG, "settimeofday result = %d", ret); + return ret; +} + +/* probably_valid_time_string(s) + * + * some sanity checks on time string before calling sscanf() + * + * returns 0 == ESP_OK == Success if str is likely a valid time. + * -1 == ESP_FAIL otherwise + */ +int probably_valid_time_string(const char* str) +{ + int ret = ESP_OK; + size_t length = 0; + size_t spaces = 0; + size_t colons = 0; + + while (str[length] != '\0') { + if (str[length] == ' ') { + spaces++; + } + if (str[length] == ':') { + colons++; + } + length++; + } + if ((length > 32) || (spaces < 4) || (spaces > 5) || (colons > 2)) { + ret = ESP_FAIL; + ESP_LOGE(TAG, "ERROR, failed time sanity check: %s", str); + } return ret; } @@ -138,60 +172,66 @@ int set_fixed_default_time(void) * * returns 0 = success if able to set the time from the provided string * error for any other value, typically -1 */ -int set_time_from_string(char* time_buffer) +int set_time_from_string(const char* time_buffer) { /* expecting github default formatting: 'Thu Aug 31 12:41:45 2023 -0700' */ + char offset[28]; /* large arrays, just in case there's still bad data */ + char day_str[28]; + char month_str[28]; const char *format = "%3s %3s %d %d:%d:%d %d %s"; struct tm this_timeinfo; struct timeval now; time_t interim_time; - char offset[6]; /* expecting trailing single quote, not used */ - char day_str[4]; - char month_str[4]; int day, year, hour, minute, second; int quote_offset = 0; int ret = 0; - /* we are expecting the string to be encapsulated in single quotes */ - if (*time_buffer == 0x27) { - quote_offset = 1; - } + /* perform some basic sanity checkes */ + ret = probably_valid_time_string(time_buffer); + if (ret == ESP_OK) { + /* we are expecting the string to be encapsulated in single quotes */ + if (*time_buffer == 0x27) { + quote_offset = 1; + } - ret = sscanf(time_buffer + quote_offset, - format, - day_str, month_str, - &day, &hour, &minute, &second, &year, &offset); + ret = sscanf(time_buffer + quote_offset, + format, + day_str, month_str, + &day, &hour, &minute, &second, &year, &offset); - if (ret == 8) { - /* we found a match for all componets */ + if (ret == 8) { + /* we found a match for all componets */ - const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - for (int i = 0; i < 12; i++) { - if (strcmp(month_str, months[i]) == 0) { - this_timeinfo.tm_mon = i; - break; + for (int i = 0; i < 12; i++) { + if (strcmp(month_str, months[i]) == 0) { + this_timeinfo.tm_mon = i; + break; + } } - } - this_timeinfo.tm_mday = day; - this_timeinfo.tm_hour = hour; - this_timeinfo.tm_min = minute; - this_timeinfo.tm_sec = second; - this_timeinfo.tm_year = year - 1900; /* Number of years since 1900 */ + this_timeinfo.tm_mday = day; + this_timeinfo.tm_hour = hour; + this_timeinfo.tm_min = minute; + this_timeinfo.tm_sec = second; + this_timeinfo.tm_year = year - 1900; /* Number of years since 1900 */ - interim_time = mktime(&this_timeinfo); - now = (struct timeval){ .tv_sec = interim_time }; - ret = settimeofday(&now, NULL); - ESP_LOGI(TAG, "Time updated to %s", time_buffer); - } - else { - ESP_LOGE(TAG, "Failed to convert \"%s\" to a tm date.", time_buffer); - ESP_LOGI(TAG, "Trying fixed date that was hard-coded."); - set_fixed_default_time(); - ret = -1; + interim_time = mktime(&this_timeinfo); + now = (struct timeval){ .tv_sec = interim_time }; + ret = settimeofday(&now, NULL); + ESP_LOGI(TAG, "Time updated to %s", time_buffer); + } + else { + ESP_LOGE(TAG, "Failed to convert \"%s\" to a tm date.", + time_buffer); + ESP_LOGI(TAG, "Trying fixed date that was hard-coded...."); + set_fixed_default_time(); + ret = ESP_FAIL; + } } + return ret; } @@ -224,14 +264,16 @@ int set_time(void) #ifdef LIBWOLFSSL_VERSION_GIT_HASH_DATE /* initialy set a default approximate time from recent git commit */ - ESP_LOGI(TAG, "Found git hash date, attempting to set system date."); - set_time_from_string(LIBWOLFSSL_VERSION_GIT_HASH_DATE); + ESP_LOGI(TAG, "Found git hash date, attempting to set system date: %s", + LIBWOLFSSL_VERSION_GIT_HASH_DATE); + set_time_from_string(LIBWOLFSSL_VERSION_GIT_HASH_DATE"\0"); esp_show_current_datetime(); ret = -4; #else /* otherwise set a fixed time that was hard coded */ set_fixed_default_time(); + esp_show_current_datetime(); ret = -3; #endif @@ -262,6 +304,7 @@ int set_time(void) } ESP_LOGI(TAG, "%s", thisServer); sntp_setservername(i, thisServer); + ret = ESP_OK; } #ifdef HAS_ESP_NETIF_SNTP ret = esp_netif_sntp_init(&config); @@ -289,6 +332,9 @@ int set_time(void) ESP_LOGW(TAG, "No sntp time servers found."); ret = -1; } + + esp_show_current_datetime(); + ESP_LOGI(TAG, "time helper existing with result = %d", ret); return ret; } @@ -303,6 +349,8 @@ int set_time_wait_for_ntp(void) ret = esp_netif_sntp_start(); ret = esp_netif_sntp_sync_wait(500 / portTICK_PERIOD_MS); +#else + ESP_LOGE(TAG, "HAS_ESP_NETIF_SNTP not defined"); #endif /* HAS_ESP_NETIF_SNTP */ esp_show_current_datetime(); diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/wifi_connect.c b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/wifi_connect.c index b9f9ab73..19ced330 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/wifi_connect.c +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/wifi_connect.c @@ -1,6 +1,6 @@ /* wifi_connect.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,17 +18,20 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ - #include "wifi_connect.h" +#include "wifi_connect.h" +/* FreeRTOS */ #include #include #include -#include + +/* Espressif */ #include +#include +#include /* wolfSSL */ #include -#include "user_settings.h" #include #include #ifndef WOLFSSL_ESPIDF @@ -36,7 +39,12 @@ #warning "Check components/wolfssl/include" #endif -#if ESP_IDF_VERSION_MAJOR >= 5 +/* When there's too little heap, WiFi quietly refuses to connect */ +#define WIFI_LOW_HEAP_WARNING 21132 + +#if defined(CONFIG_IDF_TARGET_ESP8266) +#elif ESP_IDF_VERSION_MAJOR >= 5 + /* example path set in cmake file */ #elif ESP_IDF_VERSION_MAJOR >= 4 #include "protocol_examples_common.h" #else @@ -44,7 +52,9 @@ static EventGroupHandle_t wifi_event_group; #endif -#if defined(ESP_IDF_VERSION_MAJOR) && defined(ESP_IDF_VERSION_MINOR) +#if defined(CONFIG_IDF_TARGET_ESP8266) + +#elif defined(ESP_IDF_VERSION_MAJOR) && defined(ESP_IDF_VERSION_MINOR) #if ESP_IDF_VERSION_MAJOR >= 4 /* likely using examples, see wifi_connect.h */ #else @@ -64,7 +74,114 @@ /* breadcrumb prefix for logging */ const static char *TAG = "wifi_connect"; -#if ESP_IDF_VERSION_MAJOR < 4 +#if defined(CONFIG_IDF_TARGET_ESP8266) +#ifndef CONFIG_ESP_MAX_STA_CONN + #define CONFIG_ESP_MAX_STA_CONN 4 +#endif +#define EXAMPLE_MAX_STA_CONN CONFIG_ESP_MAX_STA_CONN + +#define WIFI_CONNECTED_BIT BIT0 +#define WIFI_FAIL_BIT BIT1 +#ifndef CONFIG_ESP_MAXIMUM_RETRY + #define CONFIG_ESP_MAXIMUM_RETRY 5 +#endif +/* FreeRTOS event group to signal when we are connected*/ +static EventGroupHandle_t s_wifi_event_group; +static int s_retry_num = 0; + +#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY +static void event_handler(void* arg, esp_event_base_t event_base, + int32_t event_id, void* event_data) +{ + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + esp_wifi_connect(); + } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { + esp_wifi_connect(); + s_retry_num++; + ESP_LOGI(TAG, "retry to connect to the AP"); + } else { + xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); + } + ESP_LOGI(TAG,"connect to the AP fail"); + } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { + ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; + ESP_LOGI(TAG, "got ip:%s", + ip4addr_ntoa(&event->ip_info.ip)); + s_retry_num = 0; + xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + } +} + +int wifi_init_sta(void) +{ + word32 this_heap; + + s_wifi_event_group = xEventGroupCreate(); + + tcpip_adapter_init(); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL)); + ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL)); + + wifi_config_t wifi_config = { + .sta = { + .ssid = EXAMPLE_ESP_WIFI_SSID, + .password = EXAMPLE_ESP_WIFI_PASS + }, + }; + + /* Setting a password implies station will connect to all security modes including WEP/WPA. + * However these modes are deprecated and not advisable to be used. Incase your Access point + * doesn't support WPA2, these mode can be enabled by commenting below line */ + + if (strlen((char *)wifi_config.sta.password)) { + wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; + } + + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); + ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); + ESP_ERROR_CHECK(esp_wifi_start() ); + + ESP_LOGI(TAG, "wifi_init_sta finished. Connecting..."); + this_heap = esp_get_free_heap_size(); + ESP_LOGI(TAG, "this heap = %d", this_heap); + if (this_heap < WIFI_LOW_HEAP_WARNING) { + ESP_LOGW(TAG, "Warning: WiFi low heap: %d", WIFI_LOW_HEAP_WARNING); + } + /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum + * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */ + EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, + WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, + pdFALSE, + pdFALSE, + portMAX_DELAY); + + ESP_LOGI(TAG, "xEventGroupWaitBits finished."); + /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually + * happened. */ + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(TAG, "connected to ap SSID:%s", + EXAMPLE_ESP_WIFI_SSID); + } else if (bits & WIFI_FAIL_BIT) { + ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s", + EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS); + } else { + ESP_LOGE(TAG, "UNEXPECTED EVENT"); + } + + ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler)); + ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler)); + vEventGroupDelete(s_wifi_event_group); + return ESP_OK; +} + +#elif ESP_IDF_VERSION_MAJOR < 4 /* event handler for wifi events */ static esp_err_t wifi_event_handler(void *ctx, system_event_t *event) { @@ -270,7 +387,8 @@ int wifi_init_sta(void) int wifi_show_ip(void) { - /* ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); */ - return 0; + /* TODO Causes panic: ESP_LOGI(TAG, "got ip:" IPSTR, + * IP2STR(&event->ip_info.ip)); */ + return ESP_OK; } #endif diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/sdkconfig.defaults b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/sdkconfig.defaults index f8bce25f..ff9a5d4c 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/sdkconfig.defaults +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/sdkconfig.defaults @@ -1,26 +1,15 @@ -CONFIG_FREERTOS_HZ=1000 -CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y - -# -# Default main stack size -# -# This is typically way bigger than needed for stack size. See user_settings.h -# -CONFIG_ESP_MAIN_TASK_STACK_SIZE=55500 +# sdkconfig.defaults for ESP8266 + ESP32 -# Legacy stack size for older ESP-IDF versions -CONFIG_MAIN_TASK_STACK_SIZE=55500 +# CONFIG_ESP_PANIC_PRINT_REBOOT is not set +CONFIG_ESP_PANIC_PRINT_REBOOT=n +CONFIG_ESP_PANIC_PRINT_HALT=y -# -# Compiler options -# -CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y -CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y -CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 -CONFIG_COMPILER_HIDE_PATHS_MACROS=y -CONFIG_COMPILER_STACK_CHECK_MODE_NORM=y -CONFIG_COMPILER_STACK_CHECK=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS is not set +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=n +CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM=y +CONFIG_HEAP_DISABLE_IRAM=y +CONFIG_FREERTOS_HZ=1000 # # Partition Table # diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj new file mode 100644 index 00000000..f0501227 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj @@ -0,0 +1,292 @@ + + + + + + Unknown + + true + + c9687472-a434-43a7-9026-7914f425b9b4 + true + true + SourceDirs + + + + + + com.visualgdb.xtensa-lx106-elf + + 8.4.0 + 8.1 + 1 + + + + release/v3.4 + rtos-sdk/v3.4 + RTOS_SDK + + 0 + + + + + + + + + + + + + Default + + false + + BuildMachine + BuiltinShortcut + + + + + + + COM70 + + 74880 + 8 + None + One + None + + + 0 + false + true + false + ASCII + + + 255 + 0 + 0 + 0 + + + 255 + 169 + 169 + 169 + + + 255 + 211 + 211 + 211 + + + 255 + 144 + 238 + 144 + + + 255 + 169 + 169 + 169 + + + + 16 + true + true + true + true + 0 + + LF + false + false + false + + + + true + + + + + True + + true + true + + Enabled + true + true + true + + true + + + + false + + apiModeling.google.GTest + core.builtin.BuiltinFunctions + core.builtin.NoReturnFunctions + core.CallAndMessage + core.DivideZero + core.DynamicTypePropagation + core.NonnilStringConstants + core.NonNullParamChecker + core.NullDereference + core.StackAddressEscape + core.UndefinedBinaryOperatorResult + core.uninitialized.ArraySubscript + core.uninitialized.Assign + core.uninitialized.Branch + core.uninitialized.CapturedBlockVariable + core.uninitialized.UndefReturn + core.VLASize + cplusplus.NewDelete + cplusplus.NewDeleteLeaks + cplusplus.SelfAssignment + deadcode.DeadStores + nullability.NullPassedToNonnull + nullability.NullReturnedFromNonnull + security.insecureAPI.getpw + security.insecureAPI.gets + security.insecureAPI.mkstemp + security.insecureAPI.mktemp + security.insecureAPI.UncheckedReturn + security.insecureAPI.vfork + unix.API + unix.cstring.BadSizeArg + unix.cstring.NullArg + unix.Malloc + unix.MallocSizeof + unix.MismatchedDeallocator + unix.StdCLibraryFunctions + unix.Vfork + + + -analyzer-store=region + -analyzer-opt-analyze-nested-blocks + -analyzer-eagerly-assume + + + + + + Debug + + build/Debug + sdkconfig-debug + false + + + + Release + + build/Release + sdkconfig-release + false + + + + + + + + + + + + + false + false + false + false + false + false + false + false + false + + false + false + false + false + false + false + true + false + None + false + false + + true + false + false + true + 0 + false + 0 + true + false + + + openocd + + -f interface/ftdi/tigard.cfg -f target/esp8266.cfg + + + + false + + 131072 + Enabled + + set remotetimeout 60 + target remote :$$SYS:GDB_PORT$$ + mon reset halt + load + mon xtensa_no_interrupts_during_steps on + mon esp8266_autofeed_watchdog on + + false + 0 + 0 + false + + 0 + Soft + 4096 + 4096 + + size4M + freq40M + QIO + + + + true + Disabled + 0 + false + false + true + false + false + + _estack + 0 + false + + true + + \ No newline at end of file diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt index e82e19b6..e129a64e 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt @@ -82,8 +82,10 @@ function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY) else() get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE) IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) - if("${FOUND_WOLFSSL}") - message(STATUS "Found WOLFSSL_ROOT via Environment Variable:") + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via Environment Variable: ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() else() message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:") message(STATUS "$ENV{WOLFSSL_ROOT}") diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt index e82e19b6..e129a64e 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt @@ -82,8 +82,10 @@ function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY) else() get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE) IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) - if("${FOUND_WOLFSSL}") - message(STATUS "Found WOLFSSL_ROOT via Environment Variable:") + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via Environment Variable: ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() else() message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:") message(STATUS "$ENV{WOLFSSL_ROOT}") diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/main.c b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/main.c index 1c21bd93..2fd41d3f 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/main.c +++ b/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/main.c @@ -36,6 +36,10 @@ #include #include +/* set to 0 for one benchmark, +** set to 1 for continuous benchmark loop */ +#define TEST_LOOP 0 + /* ** the wolfssl component can be installed in either: ** @@ -190,7 +194,10 @@ void app_main(void) #if defined(NO_ESP32_CRYPT) ESP_LOGI(TAG, "NO_ESP32_CRYPT defined! HW acceleration DISABLED."); #else - #if defined(CONFIG_IDF_TARGET_ESP32C3) + #if defined(CONFIG_IDF_TARGET_ESP32C2) + ESP_LOGI(TAG, "ESP32_CRYPT is enabled for ESP32-C2."); + + #elif defined(CONFIG_IDF_TARGET_ESP32C3) ESP_LOGI(TAG, "ESP32_CRYPT is enabled for ESP32-C3."); #elif defined(CONFIG_IDF_TARGET_ESP32S2) @@ -239,8 +246,11 @@ void app_main(void) loops++; } - while (ret == 0); - ESP_LOGI(TAG, "loops = %d", loops); + while (TEST_LOOP && (ret == 0)); + +#if defined TEST_LOOP && (TEST_LOOP == 1) + ESP_LOGI(TAG, "Test loops completed: %d", loops); +#endif /* note wolfCrypt_Cleanup() should always be called when finished. ** This is called at the end of wolf_test_task(); @@ -266,8 +276,12 @@ void app_main(void) - (uxTaskGetStackHighWaterMark(NULL))); #endif +#ifdef WOLFSSL_ESPIDF_EXIT_MESSAGE + ESP_LOGI(TAG, WOLFSSL_ESPIDF_EXIT_MESSAGE); +#else ESP_LOGI(TAG, "\n\nDone!\n\n" "If running from idf.py monitor, press twice: Ctrl+]"); +#endif /* done */ while (1) { diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/README.md b/extra/wolfssl/wolfssl/IDE/Espressif/README.md index dea3b36a..5bb1622f 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/README.md +++ b/extra/wolfssl/wolfssl/IDE/Espressif/README.md @@ -154,7 +154,48 @@ CMake Error at run_serial_tool.cmake:56 (message): Solution: -Press and hold`EN` button, press and release `IO0` button, then release `EN` button. +Press and hold `EN` button, press and release `IO0` button, then release `EN` button. + +### Unknown CMake command "esptool_py_flash_project_args". + +This unintuitive error was observed when including an unneeded `set(COMPONENTS` in the project-level CMakeLists.txt +and attempting to build with an older toolchain, such as the RTOS SDK 3.4 for the ESP8266. + +### PermissionError: [Errno 13] Permission denied could not open port {} + +This error, other than the obvious permissions, also occurs when the port is in use by another application: + +```text +Traceback (most recent call last): + File "/home/gojimmypi/.espressif/python_env/rtos3.4_py3.10_env/lib/python3.10/site-packages/serial/serialposix.py", line 322, in open + self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) +PermissionError: [Errno 13] Permission denied: '/dev/ttyS55' + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + [... snip ...] +raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg)) +serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyS55: [Errno 13] Permission denied: '/dev/ttyS55' +``` +### Panic Task watchdog got triggered. + +Long-running code may trip the watchdog timer. + +``` +Task watchdog got triggered. + +Guru Meditation Error: Core 0 panic'ed (unknown). Exception was unhandled. +``` + +The watchdog needs to be [fed](https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-reference/system/wdts.html?highlight=watchdog#_CPPv418esp_task_wdt_resetv) on a regular basis +with `void esp_task_wdt_reset(void)` from `esp8266/include/esp_task_wdt.h`. + +Try turning off the WDT in menuconfig, or for Makefiles: + +``` +EXTRA_CFLAGS += -DNO_WATCHDOG +``` #### Other Solutions diff --git a/extra/wolfssl/wolfssl/IDE/Espressif/include.am b/extra/wolfssl/wolfssl/IDE/Espressif/include.am index 66203415..5011e51f 100644 --- a/extra/wolfssl/wolfssl/IDE/Espressif/include.am +++ b/extra/wolfssl/wolfssl/IDE/Espressif/include.am @@ -95,6 +95,7 @@ EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_hel EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/README.md +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.vgdbproj diff --git a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/Projects/user_settings.h b/extra/wolfssl/wolfssl/IDE/IAR-EWARM/Projects/user_settings.h index 289a4d71..c6274a29 100644 --- a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/Projects/user_settings.h +++ b/extra/wolfssl/wolfssl/IDE/IAR-EWARM/Projects/user_settings.h @@ -1,4 +1,3 @@ - #define NO_MAIN_DRIVER #define BENCH_EMBEDDED #define NO_WRITEV @@ -17,10 +16,59 @@ #define WOLFSSL_GENSEED_FORTEST /* Warning: define your own seed gen */ -#define TFM_TIMING_RESISTANT +/* A few examples of different math options below. + * + * See examples/configs/user_settings_template.h for a more + * detailed template. */ +#if 1 + /* Use only single precision (SP) math and algorithms. + * SP math is written to accelerate specific/common key + * sizes and curves. This adds code from sp_c32.c, or one of the specific + * assembly implementations like sp_cortexm.c. This code is faster than the + * multi-precision support because it's optimized for the key/curve. + * The SP math can be used together with any multi-precision math library + * if WOLFSSL_SP_MATH is removed. If only standard keys/curves are being + * used the multi-precision math is not required. + */ + #define WOLFSSL_SP_MATH + /* Enable SP ECC support */ + #define WOLFSSL_HAVE_SP_ECC + /* Enable SP RSA support */ + #define WOLFSSL_HAVE_SP_RSA + /* Enable SP DH support */ + #define WOLFSSL_HAVE_SP_DH + /* Reduce stack use specifically in SP implementation. */ + #define WOLFSSL_SP_SMALL_STACK + /* use smaller version of code */ + #define WOLFSSL_SP_SMALL + /* Assembly optimized version - sp_cortexm.c */ + //#define WOLFSSL_SP_ARM_CORTEX_M_ASM +#elif 1 + /* Use SP math for all key sizes and curves. This will use + * the multi-precision (MP) math implementation in sp_int.c */ + #define WOLFSSL_SP_MATH_ALL + /* Disable use of dynamic stack items */ + #define WOLFSSL_SP_NO_DYN_STACK + /* use smaller version of code */ + #define WOLFSSL_SP_SMALL +#elif 1 + /* Fast Math (tfm.c) (stack based and timing resistant) */ + #define USE_FAST_MATH + /* Enable Fast Math Timing Resistance */ + #define TFM_TIMING_RESISTANT +#else + /* Normal (integer.c) (heap based, not timing resistant) - not recommended*/ + #define USE_INTEGER_HEAP_MATH +#endif + +/* Enable ECC Timing Resistance */ #define ECC_TIMING_RESISTANT +/* Enables blinding mode, to prevent timing attacks */ #define WC_RSA_BLINDING +/* reduce stack use. For variables over 100 bytes allocate from heap */ +#define WOLFSSL_SMALL_STACK +/* disable mutex locking */ #define SINGLE_THREADED /* or define RTOS option */ /* #define WOLFSSL_CMSIS_RTOS */ #define NO_FILESYSTEM diff --git a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/settings/wolfcrypt_benchmark_Debug.jlink b/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/settings/wolfcrypt_benchmark_Debug.jlink deleted file mode 100644 index 3a2fb474..00000000 --- a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/settings/wolfcrypt_benchmark_Debug.jlink +++ /dev/null @@ -1,39 +0,0 @@ -[BREAKPOINTS] -ForceImpTypeAny = 0 -ShowInfoWin = 1 -EnableFlashBP = 2 -BPDuringExecution = 0 -[CFI] -CFISize = 0x00 -CFIAddr = 0x00 -[CPU] -MonModeVTableAddr = 0xFFFFFFFF -MonModeDebug = 0 -MaxNumAPs = 0 -LowPowerHandlingMode = 0 -OverrideMemMap = 0 -AllowSimulation = 1 -ScriptFile="" -[FLASH] -CacheExcludeSize = 0x00 -CacheExcludeAddr = 0x00 -MinNumBytesFlashDL = 0 -SkipProgOnCRCMatch = 1 -VerifyDownload = 1 -AllowCaching = 1 -EnableFlashDL = 2 -Override = 1 -Device="ATSAMV71Q21" -[GENERAL] -WorkRAMSize = 0x00 -WorkRAMAddr = 0x00 -RAMUsageLimit = 0x00 -[SWO] -SWOLogFile="" -[MEM] -RdOverrideOrMask = 0x00 -RdOverrideAndMask = 0xFFFFFFFF -RdOverrideAddr = 0xFFFFFFFF -WrOverrideOrMask = 0x00 -WrOverrideAndMask = 0xFFFFFFFF -WrOverrideAddr = 0xFFFFFFFF diff --git a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/wolfcrypt_benchmark.ewt b/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/wolfcrypt_benchmark.ewt deleted file mode 100644 index 86013a04..00000000 --- a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/wolfcrypt_benchmark.ewt +++ /dev/null @@ -1,2382 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - Release - - ARM - - 0 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - Application - - $PROJ_DIR$\Application\runBenchmarks.c - - - - benchmark - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\benchmark\benchmark.c - - - - Device_Support - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\DeviceSupport\startup_sam.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\DeviceSupport\system_sam.c - - - - Setup - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\BSP.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\HardFaultHandler.S - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\JLINKMEM_Process.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\OS_Error.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\RTOSInit_SAMV71_CMSIS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_HardFaultHandler.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_RTT.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_RTT_printf.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW_Config_embOS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW_embOS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\xmtx.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\xmtx2.c - - - - - diff --git a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_lib_SAMV71_XULT/wolfcrypt_lib.ewt b/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_lib_SAMV71_XULT/wolfcrypt_lib.ewt deleted file mode 100644 index e0722daa..00000000 --- a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_lib_SAMV71_XULT/wolfcrypt_lib.ewt +++ /dev/null @@ -1,2400 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - Release - - ARM - - 0 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - wolfcrypt_sources - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\aes.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\asn.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\chacha.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\chacha20_poly1305.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\coding.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\des3.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\dh.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\dsa.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\ecc.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\hash.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\kdf.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\hmac.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\md4.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\md5.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\memory.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\misc.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\poly1305.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\pwdbased.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\random.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\rsa.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\sha.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\sha256.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\sha512.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\tfm.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\wc_encrypt.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\wc_port.c - - - - - diff --git a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/settings/wolfcrypt_test_Debug.jlink b/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/settings/wolfcrypt_test_Debug.jlink deleted file mode 100644 index 3a2fb474..00000000 --- a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/settings/wolfcrypt_test_Debug.jlink +++ /dev/null @@ -1,39 +0,0 @@ -[BREAKPOINTS] -ForceImpTypeAny = 0 -ShowInfoWin = 1 -EnableFlashBP = 2 -BPDuringExecution = 0 -[CFI] -CFISize = 0x00 -CFIAddr = 0x00 -[CPU] -MonModeVTableAddr = 0xFFFFFFFF -MonModeDebug = 0 -MaxNumAPs = 0 -LowPowerHandlingMode = 0 -OverrideMemMap = 0 -AllowSimulation = 1 -ScriptFile="" -[FLASH] -CacheExcludeSize = 0x00 -CacheExcludeAddr = 0x00 -MinNumBytesFlashDL = 0 -SkipProgOnCRCMatch = 1 -VerifyDownload = 1 -AllowCaching = 1 -EnableFlashDL = 2 -Override = 1 -Device="ATSAMV71Q21" -[GENERAL] -WorkRAMSize = 0x00 -WorkRAMAddr = 0x00 -RAMUsageLimit = 0x00 -[SWO] -SWOLogFile="" -[MEM] -RdOverrideOrMask = 0x00 -RdOverrideAndMask = 0xFFFFFFFF -RdOverrideAddr = 0xFFFFFFFF -WrOverrideOrMask = 0x00 -WrOverrideAndMask = 0xFFFFFFFF -WrOverrideAddr = 0xFFFFFFFF diff --git a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/wolfcrypt_test.ewt b/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/wolfcrypt_test.ewt deleted file mode 100644 index 2847ab53..00000000 --- a/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/wolfcrypt_test.ewt +++ /dev/null @@ -1,2382 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - Release - - ARM - - 0 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - Application - - $PROJ_DIR$\Application\runWolfcryptTests.c - - - - Device_Support - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\DeviceSupport\startup_sam.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\DeviceSupport\system_sam.c - - - - Setup - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\BSP.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\HardFaultHandler.S - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\JLINKMEM_Process.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\OS_Error.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\RTOSInit_SAMV71_CMSIS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_HardFaultHandler.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_RTT.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_RTT_printf.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW_Config_embOS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW_embOS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\xmtx.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\xmtx2.c - - - - wolfcrypt_test - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\test\test.c - - - - - diff --git a/extra/wolfssl/wolfssl/IDE/LINUX-SGX/sgx_t_static.mk b/extra/wolfssl/wolfssl/IDE/LINUX-SGX/sgx_t_static.mk index 5f26391b..ebb718cf 100644 --- a/extra/wolfssl/wolfssl/IDE/LINUX-SGX/sgx_t_static.mk +++ b/extra/wolfssl/wolfssl/IDE/LINUX-SGX/sgx_t_static.mk @@ -88,6 +88,7 @@ Wolfssl_C_Files :=$(WOLFSSL_ROOT)/wolfcrypt/src/aes.c\ $(WOLFSSL_ROOT)/wolfcrypt/src/signature.c\ $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c32.c\ $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c64.c\ + $(WOLFSSL_ROOT)/wolfcrypt/src/sp_int.c\ $(WOLFSSL_ROOT)/src/ssl.c\ $(WOLFSSL_ROOT)/src/tls.c\ $(WOLFSSL_ROOT)/wolfcrypt/src/wc_encrypt.c\ diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/README.md b/extra/wolfssl/wolfssl/IDE/MPLABX16/README.md new file mode 100644 index 00000000..a35b6dec --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/README.md @@ -0,0 +1,62 @@ +# wolfSSL MPLAB X Project Files for XC16 + +This directory contains project files for the Microchip MPLAB X IDE. These +projects have been set up to use the Microchip PIC24 Starter Kit +and the Microchip XC16 compiler. + +In order to generate the necessary auto-generated MPLAB X files, make sure +to import the wolfssl.X project into your MPLAB X workspace before trying to +build the wolfCrypt test. This will correctly set up the respective project's +Makefiles. + +## Included Project Files + +### wolfSSL library (wolfssl.X) + +This project builds a static wolfSSL library. The settings for this project are in `user_settings.h`: +``` +/IDE/MPLABX16/user_settings.h +``` + +After this project has been built, the compiled library will be located at: +``` +/IDE/MPLABX16/wolfssl.X/dist/default/production/wolfssl.X.a +``` + +### wolfCrypt Test App (wolfcrypt_test.X) + +This project tests the wolfCrypt cryptography modules. It is generally a good +idea to run this first on an embedded system after compiling wolfSSL in order +to verify all underlying crypto is working correctly. This project depends on +files generated by Microchip's MCC tool to view the UART output. Follow the +steps below to generate that code. + +## Generating MCC UART code + +1. Open the MPLAB Code Configurator application. + +2. Set the Project path to the wolfSSL/IDE/MPLABX16 and enter your PIC device +into the interface. + +3. Select MCC Clasic as the content type and click `Finish`. + +4. Under the Device Resources section, find the UART entry and add the UART1 +peripheral. + +5. Note the UART settings and check the `Enable UART Interrupts` and +`Redirect Printf to UART` boxes. + +6. Click the `Generate` button. + + +**Note** : If using an older version of `xc16`, you may have to add the +following to `user_settings.h`. +``` +#define WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MAX +``` + +## Support + +Please send questions or comments to support@wolfssl.com + diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/include.am b/extra/wolfssl/wolfssl/IDE/MPLABX16/include.am new file mode 100644 index 00000000..d7f855b1 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/include.am @@ -0,0 +1,8 @@ +# vim:ft=automake +# All paths should be given relative to the root +# + +EXTRA_DIST += \ + IDE/MPLABX16/README.md \ + IDE/MPLABX16/main.c \ + IDE/MPLABX16/user_settings.h diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/main.c b/extra/wolfssl/wolfssl/IDE/MPLABX16/main.c new file mode 100644 index 00000000..fadad81d --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/main.c @@ -0,0 +1,39 @@ +/* main.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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. + * + * wolfSSL 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include + +#include +#include + +#include + +#include "xc.h" +#include "mcc_generated_files/mcc.h" + +int main(void) { + SYSTEM_Initialize(); + + wolfcrypt_test(NULL); + + return 0; +} + diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/user_settings.h b/extra/wolfssl/wolfssl/IDE/MPLABX16/user_settings.h new file mode 100644 index 00000000..d4754db8 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/user_settings.h @@ -0,0 +1,414 @@ +/* Example custom user settings for wolfSSL */ + +#ifndef WOLFSSL_USER_SETTINGS_H +#define WOLFSSL_USER_SETTINGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------- */ +/* Platform */ +/* ------------------------------------------------------------------------- */ +#undef WOLFSSL_GENERAL_ALIGNMENT +#define WOLFSSL_GENERAL_ALIGNMENT 4 + +#undef SINGLE_THREADED +#define SINGLE_THREADED + +#undef WOLFSSL_SMALL_STACK +#define WOLFSSL_SMALL_STACK + +#define MICROCHIP_PIC24 + +/* Define for older versions of xc16 */ +#if 0 + #define WOLFSSL_HAVE_MIN + #define WOLFSSL_HAVE_MAX +#endif + +#ifdef MICROCHIP_PIC24 + #define SIZEOF_LONG_LONG 8 + #define SIZEOF_LONG 4 + #define SINGLE_THREADED + #define WOLFSSL_USER_IO + #define NO_WRITEV + #define NO_DEV_RANDOM + #define NO_FILESYSTEM + #define BENCH_EMBEDDED + #define WC_16BIT_CPU + #define WORD64_AVAILABLE + #define WOLFSSL_GENSEED_FORTEST +#endif + +/* ------------------------------------------------------------------------- */ +/* Math Configuration */ +/* ------------------------------------------------------------------------- */ +#if 1 + #undef USE_FAST_MATH + #define USE_FAST_MATH + + #undef FP_MAX_BITS + #define FP_MAX_BITS 2048 +#else + #define WOLFSSL_SP_MATH + #define WOLFSSL_SP_SMALL + #define WOLFSSL_SP_MATH_ALL + #define SP_INT_BITS 256 +#endif + + +#ifdef USE_FAST_MATH + #undef TFM_TIMING_RESISTANT + #define TFM_TIMING_RESISTANT + + /* Optimizations */ + //#define TFM_MIPS +#endif + +/* ------------------------------------------------------------------------- */ +/* Crypto */ +/* ------------------------------------------------------------------------- */ +/* ECC */ +#if 1 + #undef HAVE_ECC + #define HAVE_ECC + + /* Manually define enabled curves */ + #undef ECC_USER_CURVES + #define ECC_USER_CURVES + + /* Reduces heap usage, but slower */ + #undef ECC_TIMING_RESISTANT + #define ECC_TIMING_RESISTANT + + //#define HAVE_ECC192 + //#define HAVE_ECC224 + //#define HAVE_ECC384 + /* Fixed point cache (speeds repeated operations against same private key) */ +#if 1 + #undef FP_ECC + #define FP_ECC + #ifdef FP_ECC + /* Bits / Entries */ + #undef FP_ENTRIES + #define FP_ENTRIES 2 + #undef FP_LUT + #define FP_LUT 4 + #endif + /* Optional ECC calculation method */ + /* Note: doubles heap usage, but slightly faster */ + #undef ECC_SHAMIR + #define ECC_SHAMIR + + + #ifdef USE_FAST_MATH + /* use reduced size math buffers for ecc points */ + #undef ALT_ECC_SIZE + #define ALT_ECC_SIZE + + /* Enable TFM optimizations for ECC */ + #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES) + #define TFM_ECC192 + #endif + #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES) + #define TFM_ECC224 + #endif + #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #define TFM_ECC256 + #endif + #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #define TFM_ECC384 + #endif + #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #define TFM_ECC521 + #endif + #endif +#endif +#endif + +/* RSA */ +#undef NO_RSA +#if 0 + /* half as much memory but twice as slow */ + #undef RSA_LOW_MEM +#define RSA_LOW_MEM + + #undef WC_RSA_PSS + #define WC_RSA_PSS + + /* timing resistance */ + #undef WC_RSA_BLINDING + #define WC_RSA_BLINDING +#else + #define NO_RSA +#endif + +/* AES */ +#undef NO_AES +#if 1 + #undef HAVE_AES_DECRYPT + #define HAVE_AES_DECRYPT + + #undef HAVE_AESGCM + #define HAVE_AESGCM + + /* GCM Method: GCM_SMALL, GCM_WORD32 or GCM_TABLE */ + #undef GCM_SMALL + #define GCM_SMALL + + /* #undef HAVE_AESCCM + #define HAVE_AESCCM */ + + /* #undef WOLFSSL_AES_DIRECT + #define WOLFSSL_AES_DIRECT */ + + #undef NO_AES_CBC + #define NO_AES_CBC +#else + #define NO_AES +#endif + +/* DES3 */ +#undef NO_DES3 +#if 0 + #undef WOLFSSL_DES_ECB + #define WOLFSSL_DES_ECB +#else + #define NO_DES3 +#endif + + +/* ChaCha20 / Poly1305 */ +#undef HAVE_CHACHA +#undef HAVE_POLY1305 +#if 0 + #define HAVE_CHACHA + #define HAVE_POLY1305 + + /* Needed for Poly1305 */ + #undef HAVE_ONE_TIME_AUTH + #define HAVE_ONE_TIME_AUTH +#endif + +/* Ed25519 / Curve25519 */ +#undef HAVE_CURVE25519 +#undef HAVE_ED25519 +#if 0 + #define HAVE_CURVE25519 + #define HAVE_ED25519 + + /* Optionally use small math (less flash usage, but much slower) */ + #if 0 + #define CURVED25519_SMALL + #endif +#endif + + +/* ------------------------------------------------------------------------- */ +/* Hashing */ +/* ------------------------------------------------------------------------- */ +/* Sha */ +#undef NO_SHA +#if 0 + /* 1k smaller, but 25% slower */ + #define USE_SLOW_SHA +#else + #define NO_SHA +#endif + +/* Sha256 */ +#undef NO_SHA256 +#if 1 +#else + #define NO_SHA256 +#endif + +/* Sha512 */ +#undef WOLFSSL_SHA512 +#if 0 + #define WOLFSSL_SHA512 + + /* Sha384 */ + #undef WOLFSSL_SHA384 + #if 0 + #define WOLFSSL_SHA384 + #endif + + /* over twice as small, but 50% slower */ + #define USE_SLOW_SHA2 +#endif + + +/* ------------------------------------------------------------------------- */ +/* Benchmark / Test */ +/* ------------------------------------------------------------------------- */ +/* Use reduced benchmark / test sizes */ +#undef BENCH_EMBEDDED +#define BENCH_EMBEDDED + +//#undef USE_CERT_BUFFERS_2048 +//#define USE_CERT_BUFFERS_2048 + +#undef USE_CERT_BUFFERS_1024 +#define USE_CERT_BUFFERS_1024 + +#undef USE_CERT_BUFFERS_256 +#define USE_CERT_BUFFERS_256 + + +/* ------------------------------------------------------------------------- */ +/* Time */ +/* ------------------------------------------------------------------------- */ +#if 0 + /* Override Current Time */ + /* Allows custom "custom_time()" function to be used for benchmark */ + #define WOLFSSL_USER_CURRTIME + #define USER_TICKS + extern unsigned long custom_time(unsigned long* timer); + #define XTIME custom_time +#else + //#warning Time/RTC disabled + #undef NO_ASN_TIME + #define NO_ASN_TIME +#endif + +/* ------------------------------------------------------------------------- */ +/* Debugging */ +/* ------------------------------------------------------------------------- */ +#undef DEBUG_WOLFSSL + +#if 0 + #define DEBUG_WOLFSSL + #define WOLFSSL_DEBUG_TLS + /* Use this to measure / print heap usage */ + #undef USE_WOLFSSL_MEMORY + #define USE_WOLFSSL_MEMORY + #undef WOLFSSL_TRACK_MEMORY + #define WOLFSSL_TRACK_MEMORY +#else + #undef NO_WOLFSSL_MEMORY + #define NO_WOLFSSL_MEMORY +#endif + +/* ------------------------------------------------------------------------- */ +/* Misc */ +/* ------------------------------------------------------------------------- */ +#define WOLFSSL_ASN_TEMPLATE +#define NO_ERROR_STRINGS +#define NO_LARGE_HASH_TEST +#define NO_PKCS12 +#define NO_PKCS8 +#define WOLFSSL_NO_PEM + + +/* ------------------------------------------------------------------------- */ +/* Enable Features */ +/* ------------------------------------------------------------------------- */ +#undef KEEP_PEER_CERT +#define KEEP_PEER_CERT + +#undef HAVE_COMP_KEY +#define HAVE_COMP_KEY + +#undef WOLFSSL_TLS13 +#define WOLFSSL_TLS13 + +#undef HAVE_HKDF +#define HAVE_HKDF + +#undef HAVE_TLS_EXTENSIONS +#define HAVE_TLS_EXTENSIONS + +#ifdef HAVE_ECC +#undef HAVE_SUPPORTED_CURVES +#define HAVE_SUPPORTED_CURVES +#endif + +#undef WOLFSSL_BASE64_ENCODE +#define WOLFSSL_BASE64_ENCODE + +/* TLS Session Cache */ +#if 0 + #define SMALL_SESSION_CACHE +#else + #define NO_SESSION_CACHE +#endif + + +/* ------------------------------------------------------------------------- */ +/* Disable Features */ +/* ------------------------------------------------------------------------- */ +#undef NO_WOLFSSL_SERVER +//#define NO_WOLFSSL_SERVER + +#undef NO_WOLFSSL_CLIENT +#define NO_WOLFSSL_CLIENT + +#undef NO_CRYPT_TEST +//#define NO_CRYPT_TEST + +#undef NO_CRYPT_BENCHMARK +//#define NO_CRYPT_BENCHMARK + +/* In-lining of misc.c functions */ +/* If defined, must include wolfcrypt/src/misc.c in build */ +/* Slower, but about 1k smaller */ +#undef NO_INLINE +#define NO_INLINE + +#undef NO_FILESYSTEM +#define NO_FILESYSTEM + +#undef NO_WRITEV +#define NO_WRITEV + +#undef NO_MAIN_DRIVER +#define NO_MAIN_DRIVER + +#undef NO_DEV_RANDOM +#define NO_DEV_RANDOM + +#undef NO_PSK +#define NO_PSK + +#undef NO_DSA +#define NO_DSA + +#undef NO_DH +#define NO_DH + +#undef NO_RC4 +#define NO_RC4 + +#undef NO_OLD_TLS +#define NO_OLD_TLS + +#undef WOLFSSL_NO_TLS12 +#define WOLFSSL_NO_TLS12 + +#undef NO_PSK +//#define NO_PSK +#define WOLFSSL_STATIC_PSK + +#undef NO_MD4 +#define NO_MD4 + +#undef NO_PWDBASED +#define NO_PWDBASED + +#undef NO_MD5 +#define NO_MD5 + +#undef NO_DES3 +#define NO_DES3 + +#undef NO_CODING +//#define NO_CODING + + +#ifdef __cplusplus +} +#endif + +#endif /* WOLFSSL_USER_SETTINGS_H */ diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/Makefile b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/Makefile new file mode 100644 index 00000000..fca8e2cc --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/Makefile @@ -0,0 +1,113 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... +# WARNING: the IDE does not call this target since it takes a long time to +# simply run make. Instead, the IDE removes the configuration directories +# under build and dist directly without calling make. +# This target is left here so people can do a clean when running a clean +# outside the IDE. + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml new file mode 100755 index 00000000..fe95c871 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml @@ -0,0 +1,285 @@ + + + + + ../user_settings.h + + + + + + ../mcc_generated_files/clock.c + ../mcc_generated_files/interrupt_manager.c + ../mcc_generated_files/mcc.c + ../mcc_generated_files/pin_manager.c + ../mcc_generated_files/system.c + ../mcc_generated_files/traps.c + ../mcc_generated_files/uart1.c + + ../../../wolfcrypt/test/test.c + ../main.c + + + Makefile + + + + .. + ../../wolfcrypt/test + ../../../wolfcrypt/test + + Makefile + + + + localhost + PIC24FJ1024GB610 + + + PKOBSKDEPlatformTool + XC16 + 2.10 + 4 + + + + + + + + + + + + + + + + + + + false + true + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/include.am b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/include.am new file mode 100644 index 00000000..ab8cb715 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/include.am @@ -0,0 +1,8 @@ +j vim:ft=automake +# All paths should be given relative to the root +# + +EXTRA_DIST += \ + IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml \ + IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml + diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/configurations.xml b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/configurations.xml new file mode 100644 index 00000000..ba95e245 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/configurations.xml @@ -0,0 +1,25 @@ + + + Makefile + 0 + + + + /Applications/microchip/xc16/v2.10/bin + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/private.xml b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/private.xml new file mode 100644 index 00000000..6807a2ba --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/private.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml new file mode 100755 index 00000000..358f3c77 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml @@ -0,0 +1,33 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + wolfcrypt_test + b34c4937-7042-4352-88b1-7717bcdf8aeb + 0 + c + + h + ISO-8859-1 + + + ../wolfssl.X + + + .. + ../../wolfcrypt/test + ../../../wolfcrypt/test + + + + default + 2 + + + + false + + + + diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/Makefile b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/Makefile new file mode 100644 index 00000000..fca8e2cc --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/Makefile @@ -0,0 +1,113 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... +# WARNING: the IDE does not call this target since it takes a long time to +# simply run make. Instead, the IDE removes the configuration directories +# under build and dist directly without calling make. +# This target is left here so people can do a clean when running a clean +# outside the IDE. + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml new file mode 100644 index 00000000..bd423ae2 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml @@ -0,0 +1,290 @@ + + + + + ../user_settings.h + + + + + + ../../../wolfcrypt/src/aes.c + ../../../wolfcrypt/src/arc4.c + ../../../wolfcrypt/src/asm.c + ../../../wolfcrypt/src/asn.c + ../../../wolfcrypt/src/blake2b.c + ../../../wolfcrypt/src/blake2s.c + ../../../wolfcrypt/src/camellia.c + ../../../wolfcrypt/src/chacha.c + ../../../wolfcrypt/src/chacha20_poly1305.c + ../../../wolfcrypt/src/cmac.c + ../../../wolfcrypt/src/coding.c + ../../../wolfcrypt/src/compress.c + ../../../wolfcrypt/src/cpuid.c + ../../../wolfcrypt/src/cryptocb.c + ../../../wolfcrypt/src/curve25519.c + ../../../wolfcrypt/src/curve448.c + ../../../wolfcrypt/src/des3.c + ../../../wolfcrypt/src/dh.c + ../../../wolfcrypt/src/dilithium.c + ../../../wolfcrypt/src/dsa.c + ../../../wolfcrypt/src/ecc.c + ../../../wolfcrypt/src/ecc_fp.c + ../../../wolfcrypt/src/eccsi.c + ../../../wolfcrypt/src/ed25519.c + ../../../wolfcrypt/src/ed448.c + ../../../wolfcrypt/src/error.c + ../../../wolfcrypt/src/evp.c + ../../../wolfcrypt/src/ext_kyber.c + ../../../wolfcrypt/src/falcon.c + ../../../wolfcrypt/src/fe_448.c + ../../../wolfcrypt/src/fe_low_mem.c + ../../../wolfcrypt/src/fe_operations.c + ../../../wolfcrypt/src/ge_448.c + ../../../wolfcrypt/src/ge_low_mem.c + ../../../wolfcrypt/src/ge_operations.c + ../../../wolfcrypt/src/hash.c + ../../../wolfcrypt/src/hmac.c + ../../../wolfcrypt/src/hpke.c + ../../../wolfcrypt/src/integer.c + ../../../wolfcrypt/src/kdf.c + ../../../wolfcrypt/src/logging.c + ../../../wolfcrypt/src/md2.c + ../../../wolfcrypt/src/md4.c + ../../../wolfcrypt/src/md5.c + ../../../wolfcrypt/src/memory.c + ../../../wolfcrypt/src/misc.c + ../../../wolfcrypt/src/pkcs12.c + ../../../wolfcrypt/src/pkcs7.c + ../../../wolfcrypt/src/poly1305.c + ../../../wolfcrypt/src/pwdbased.c + ../../../wolfcrypt/src/random.c + ../../../wolfcrypt/src/rc2.c + ../../../wolfcrypt/src/ripemd.c + ../../../wolfcrypt/src/rsa.c + ../../../wolfcrypt/src/sakke.c + ../../../wolfcrypt/src/sha.c + ../../../wolfcrypt/src/sha256.c + ../../../wolfcrypt/src/sha3.c + ../../../wolfcrypt/src/sha512.c + ../../../wolfcrypt/src/signature.c + ../../../wolfcrypt/src/siphash.c + ../../../wolfcrypt/src/sp_arm32.c + ../../../wolfcrypt/src/sp_arm64.c + ../../../wolfcrypt/src/sp_armthumb.c + ../../../wolfcrypt/src/sp_c32.c + ../../../wolfcrypt/src/sp_c64.c + ../../../wolfcrypt/src/sp_int.c + ../../../wolfcrypt/src/sphincs.c + ../../../wolfcrypt/src/srp.c + ../../../wolfcrypt/src/tfm.c + ../../../wolfcrypt/src/wc_encrypt.c + ../../../wolfcrypt/src/wc_pkcs11.c + ../../../wolfcrypt/src/wc_port.c + ../../../wolfcrypt/src/wolfevent.c + ../../../wolfcrypt/src/wolfmath.c + + + ../../../src/crl.c + ../../../src/internal.c + ../../../src/keys.c + ../../../src/ssl.c + ../../../src/tls.c + ../../../src/tls13.c + ../../../src/wolfio.c + + + + Makefile + + + + .. + ../../src + ../../wolfcrypt/src + ../../wolfcrypt/test + ../../../src + ../../../wolfcrypt/src + + Makefile + + + + localhost + PIC24FJ1024GB610 + + + noID + XC16 + 2.10 + 4 + + + + + + + + + + + + + + + false + false + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/include.am b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/include.am new file mode 100644 index 00000000..14d44b06 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/include.am @@ -0,0 +1,7 @@ +# vim:ft=automake +# All paths should be given relative to the root +# + +EXTRA_DIST += \ + IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml \ + IDE/MPLABX16/wolfssl.X/nbproject/project.xml diff --git a/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/project.xml b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/project.xml new file mode 100644 index 00000000..1fb81b58 --- /dev/null +++ b/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/project.xml @@ -0,0 +1,34 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + wolfssl + 93bbfc3a-a0fa-4d48-bbc8-6cd47a2bd05b + 0 + c + + h + ISO-8859-1 + + + + .. + ../../src + ../../wolfcrypt/src + ../../wolfcrypt/test + ../../../src + ../../../wolfcrypt/src + + + + default + 3 + + + + false + + + + diff --git a/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/shared/util.h b/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/shared/util.h index 005676f4..fc54a709 100644 --- a/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/shared/util.h +++ b/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/shared/util.h @@ -26,6 +26,7 @@ #include #include #include +#include #define _GNU_SOURCE /* defines NI_NUMERICHOST */ #ifndef NI_MAXHOST diff --git a/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/user_settings.h b/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/user_settings.h index 4263164e..48541531 100644 --- a/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/user_settings.h +++ b/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/user_settings.h @@ -115,4 +115,5 @@ #endif #define CUSTOM_RAND_GENERATE_BLOCK wc_fspsm_GenerateRandBlock - +/* use original asn parsing */ +#define WOLFSSL_ASN_ORIGINAL diff --git a/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/.cproject b/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/.cproject index 61375953..e7bb1ceb 100644 --- a/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/.cproject +++ b/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/.cproject @@ -94,7 +94,7 @@ - + @@ -103,7 +103,7 @@ - +
tbl_list; @@ -9265,6 +9287,10 @@ fill_record(THD *thd, TABLE *table, Field **ptr, List &values, /* Ensure the end of the list of values is not reached */ DBUG_ASSERT(value); + if (check_for_computability && + value->check_is_evaluable_expression_or_error()) + goto err; + const bool skip_sys_field= field->vers_sys_field() && !thd->vers_insert_history_fast(table); @@ -9341,7 +9367,7 @@ fill_record_n_invoke_before_triggers(THD *thd, TABLE *table, Field **ptr, bool result; Table_triggers_list *triggers= table->triggers; - result= fill_record(thd, table, ptr, values, ignore_errors, FALSE); + result= fill_record(thd, table, ptr, values, ignore_errors, false, false); if (!result && triggers && *ptr) result= triggers->process_triggers(thd, event, TRG_ACTION_BEFORE, TRUE) || diff --git a/sql/sql_base.h b/sql/sql_base.h index ac7024a1..81413d00 100644 --- a/sql/sql_base.h +++ b/sql/sql_base.h @@ -194,7 +194,8 @@ void unfix_fields(List &items); bool fill_record(THD * thd, TABLE *table_arg, List &fields, List &values, bool ignore_errors, bool update); bool fill_record(THD *thd, TABLE *table, Field **field, List &values, - bool ignore_errors, bool use_value); + bool ignore_errors, bool use_value, + bool check_for_evaluability); Field * find_field_in_tables(THD *thd, Item_ident *item, diff --git a/sql/sql_bootstrap.cc b/sql/sql_bootstrap.cc index b39d7a57..72821384 100644 --- a/sql/sql_bootstrap.cc +++ b/sql/sql_bootstrap.cc @@ -33,26 +33,35 @@ extern "C" int read_bootstrap_query(char *query, int *query_length, fgets_input_t input, fgets_fn_t fgets_fn, int preserve_delimiter, int *error) { - char line_buffer[MAX_BOOTSTRAP_LINE_SIZE]; + char *line_buffer; const char *line; size_t len; size_t query_len= 0; int fgets_error= 0; + int exit_code= 0; *error= 0; + line_buffer= (char*) malloc(MAX_BOOTSTRAP_LINE_SIZE); + *query_length= 0; for ( ; ; ) { - line= (*fgets_fn)(line_buffer, sizeof(line_buffer), input, &fgets_error); + line= (*fgets_fn)(line_buffer, MAX_BOOTSTRAP_LINE_SIZE, input, &fgets_error); if (error) *error= fgets_error; if (fgets_error != 0) - return READ_BOOTSTRAP_ERROR; + { + exit_code= READ_BOOTSTRAP_ERROR; + break; + } if (line == NULL) - return (query_len == 0) ? READ_BOOTSTRAP_EOF : READ_BOOTSTRAP_ERROR; + { + exit_code= (query_len == 0) ? READ_BOOTSTRAP_EOF : READ_BOOTSTRAP_ERROR; + break; + } len= strlen(line); @@ -98,7 +107,8 @@ extern "C" int read_bootstrap_query(char *query, int *query_length, if (!p || !p[1]) { /* Invalid DELIMITER specifier */ - return READ_BOOTSTRAP_ERROR; + exit_code= READ_BOOTSTRAP_ERROR; + break; } delimiter.assign(p+1); if (preserve_delimiter) @@ -106,7 +116,8 @@ extern "C" int read_bootstrap_query(char *query, int *query_length, memcpy(query,line,len); query[len]=0; *query_length = (int)len; - return READ_BOOTSTRAP_SUCCESS; + exit_code= READ_BOOTSTRAP_SUCCESS; + break; } continue; } @@ -125,7 +136,8 @@ extern "C" int read_bootstrap_query(char *query, int *query_length, } query[query_len]= '\0'; *query_length= (int)query_len; - return READ_BOOTSTRAP_QUERY_SIZE; + exit_code= READ_BOOTSTRAP_QUERY_SIZE; + break; } if (query_len != 0) @@ -152,8 +164,11 @@ extern "C" int read_bootstrap_query(char *query, int *query_length, } query[query_len]= 0; *query_length= (int)query_len; - return READ_BOOTSTRAP_SUCCESS; + exit_code= READ_BOOTSTRAP_SUCCESS; + break; } } + free(line_buffer); + return exit_code; } diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index b284189d..34d063fc 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -2530,14 +2530,9 @@ void Query_cache::destroy() void Query_cache::disable_query_cache(THD *thd) { + lock(thd); m_cache_status= DISABLE_REQUEST; - /* - If there is no requests in progress try to free buffer. - try_lock(TRY) will exit immediately if there is lock. - unlock() should free block. - */ - if (m_requests_in_progress == 0 && !try_lock(thd, TRY)) - unlock(); + unlock(); } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 17d89188..711ffb1b 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -680,8 +680,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) #ifdef HAVE_REPLICATION , current_linfo(0), - slave_info(0), - is_awaiting_semisync_ack(0) + slave_info(0) #endif #ifdef WITH_WSREP , @@ -894,6 +893,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) prepare_derived_at_open= FALSE; create_tmp_table_for_derived= FALSE; save_prep_leaf_list= FALSE; + reset_sp_cache= false; org_charset= 0; /* Restore THR_THD */ set_current_thd(old_THR_THD); @@ -4479,7 +4479,7 @@ void Security_context::destroy() my_free((char*) host); host= NULL; } - if (user != delayed_user) + if (is_user_defined()) { my_free((char*) user); user= NULL; @@ -5301,14 +5301,6 @@ extern "C" enum enum_server_command thd_current_command(MYSQL_THD thd) return thd->get_command(); } -#ifdef HAVE_REPLICATION /* Working around MDEV-24622 */ -/** @return whether the current thread is for applying binlog in a replica */ -extern "C" int thd_is_slave(const MYSQL_THD thd) -{ - return thd && thd->slave_thread; -} -#endif /* HAVE_REPLICATION */ - /* Returns high resolution timestamp for the start of the current query. */ extern "C" unsigned long long thd_start_utime(const MYSQL_THD thd) @@ -5392,14 +5384,38 @@ thd_rpl_deadlock_check(MYSQL_THD thd, MYSQL_THD other_thd) return 0; if (!rgi->is_parallel_exec) return 0; - if (rgi->rli != other_rgi->rli) - return 0; - if (!rgi->gtid_sub_id || !other_rgi->gtid_sub_id) - return 0; - if (rgi->current_gtid.domain_id != other_rgi->current_gtid.domain_id) - return 0; - if (rgi->gtid_sub_id > other_rgi->gtid_sub_id) - return 0; + if (rgi->rli == other_rgi->rli && + rgi->current_gtid.domain_id == other_rgi->current_gtid.domain_id) + { + /* + Within the same master connection and domain, we can compare transaction + order on the GTID sub_id, and rollback the later transaction to allow the + earlier transaction to commit first. + */ + if (!rgi->gtid_sub_id || !other_rgi->gtid_sub_id || + rgi->gtid_sub_id > other_rgi->gtid_sub_id) + return 0; + } + else + { + /* + Lock conflicts between different master connections or domains should + usually not occur, but could still happen if user is running some + special setup that tolerates conflicting updates (or in case of user + error). We do not have a pre-defined ordering of transactions in this + case, but we still need to handle conflicts in _some_ way to avoid + undetected deadlocks and hangs. + + We do this by rolling back and retrying any transaction that is being + _optimistically_ applied. This can be overly conservative in some cases, + but should be fine as conflicts between different master connections / + domains are not common. And it ensures that we won't end up in a + deadlock and hang due to a transaction doing wait_for_prior_commit while + holding locks that block something in another master connection. + */ + if (other_rgi->speculation != rpl_group_info::SPECULATE_OPTIMISTIC) + return 0; + } if (rgi->finish_event_group_called || other_rgi->finish_event_group_called) { /* @@ -5707,6 +5723,40 @@ extern "C" void *thd_mdl_context(MYSQL_THD thd) return &thd->mdl_context; } +/** + Send check/repair message to the user + + @param op one of check or repair + @param msg_type one of info, warning or error + @param print_to_log <> 0 if we should also print the message to error log. +*/ + +extern "C" void +print_check_msg(THD *thd, const char *db_name, const char *table_name, const char *op, + const char *msg_type, const char *message, my_bool print_to_log) +{ + char name[NAME_LEN * 2 + 2]; + Protocol *protocol= thd->protocol; + + DBUG_ASSERT(strlen(db_name) <= NAME_LEN); + DBUG_ASSERT(strlen(table_name) <= NAME_LEN); + + size_t length= size_t(strxnmov(name, sizeof name - 1, + db_name, ".", table_name, NullS) - + name); + protocol->prepare_for_resend(); + protocol->store(name, length, system_charset_info); + protocol->store(op, strlen(op), system_charset_info); + protocol->store(msg_type, strlen(msg_type), system_charset_info); + protocol->store(message, strlen(message), system_charset_info); + if (protocol->write()) + sql_print_error("Failed on my_net_write, writing to stderr instead: %s: %s\n", + table_name, message); + else if (thd->variables.log_warnings > 2 && print_to_log) + sql_print_error("%s: table '%s' got '%s' during %s", + msg_type, table_name, message, op); +} + /**************************************************************************** Handling of statement states in functions and triggers. @@ -8308,6 +8358,34 @@ wait_for_commit::unregister_wait_for_prior_commit2() mysql_mutex_unlock(&LOCK_wait_commit); } +/* + Wait # seconds or until someone sends a signal (through kill) + + Note that this must have same prototype as my_sleep_for_space() +*/ + +C_MODE_START + +void mariadb_sleep_for_space(unsigned int seconds) +{ + THD *thd= current_thd; + PSI_stage_info old_stage; + if (!thd) + { + sleep(seconds); + return; + } + mysql_mutex_lock(&thd->LOCK_wakeup_ready); + thd->ENTER_COND(&thd->COND_wakeup_ready, &thd->LOCK_wakeup_ready, + &stage_waiting_for_disk_space, &old_stage); + if (!thd->killed) + mysql_cond_wait(&thd->COND_wakeup_ready, &thd->LOCK_wakeup_ready); + thd->EXIT_COND(&old_stage); + return; +} + +C_MODE_END + bool Discrete_intervals_list::append(ulonglong start, ulonglong val, ulonglong incr) diff --git a/sql/sql_class.h b/sql/sql_class.h index 7543df39..9cca3c17 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1,5 +1,4 @@ /* - Copyright (c) 2000, 2016, Oracle and/or its affiliates. Copyright (c) 2009, 2022, MariaDB Corporation. This program is free software; you can redistribute it and/or modify @@ -717,6 +716,11 @@ typedef struct system_variables ulonglong sortbuff_size; ulonglong default_regex_flags; ulonglong max_mem_used; + /* + A bitmap of OPTIMIZER_ADJ_* flags (defined in sql_priv.h). + See sys_vars.cc:adjust_secondary_key_cost for symbolic names. + */ + ulonglong optimizer_adjust_secondary_key_costs; /** Place holders to store Multi-source variables in sys_var.cc during @@ -767,7 +771,6 @@ typedef struct system_variables ulong optimizer_max_sel_arg_weight; ulong optimizer_max_sel_args; ulong optimizer_trace_max_mem_size; - ulong optimizer_adjust_secondary_key_costs; ulong use_stat_tables; double sample_percentage; ulong histogram_size; @@ -1573,6 +1576,8 @@ public: */ bool check_access(const privilege_t want_access, bool match_any = false); bool is_priv_user(const char *user, const char *host); + bool is_user_defined() const + { return user && user != delayed_user && user != slave_user; }; }; @@ -2464,6 +2469,11 @@ public: swap_variables(sp_cache*, sp_package_body_cache, rhs.sp_package_body_cache); } void sp_caches_clear(); + /** + Clear content of sp related caches. + Don't delete cache objects itself. + */ + void sp_caches_empty(); }; @@ -2954,6 +2964,12 @@ public: bool save_prep_leaf_list; + /** + The data member reset_sp_cache is to signal that content of sp_cache + must be reset (all items be removed from it). + */ + bool reset_sp_cache; + /* container for handler's private per-connection data */ Ha_data ha_data[MAX_HA]; @@ -4828,24 +4844,24 @@ public: */ bool copy_db_to(LEX_CSTRING *to) { - if (db.str == NULL) + if (db.str) { - /* - No default database is set. In this case if it's guaranteed that - no CTE can be used in the statement then we can throw an error right - now at the parser stage. Otherwise the decision about throwing such - a message must be postponed until a post-parser stage when we are able - to resolve all CTE names as we don't need this message to be thrown - for any CTE references. - */ - if (!lex->with_cte_resolution) - my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); - return TRUE; + to->str= strmake(db.str, db.length); + to->length= db.length; + return to->str == NULL; /* True on error */ } - to->str= strmake(db.str, db.length); - to->length= db.length; - return to->str == NULL; /* True on error */ + /* + No default database is set. In this case if it's guaranteed that + no CTE can be used in the statement then we can throw an error right + now at the parser stage. Otherwise the decision about throwing such + a message must be postponed until a post-parser stage when we are able + to resolve all CTE names as we don't need this message to be thrown + for any CTE references. + */ + if (!lex->with_cte_resolution) + my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); + return TRUE; } /* Get db name or "". Use for printing current db */ const char *get_db() @@ -5186,11 +5202,29 @@ public: { if (global_system_variables.log_warnings > threshold) { + char real_ip_str[64]; + real_ip_str[0]= 0; + + /* For proxied connections, add the real IP to the warning message */ + if (net.using_proxy_protocol && net.vio) + { + if(net.vio->localhost) + snprintf(real_ip_str, sizeof(real_ip_str), " real ip: 'localhost'"); + else + { + char buf[INET6_ADDRSTRLEN]; + if (!vio_getnameinfo((sockaddr *)&(net.vio->remote), buf, + sizeof(buf),NULL, 0, NI_NUMERICHOST)) + { + snprintf(real_ip_str, sizeof(real_ip_str), " real ip: '%s'",buf); + } + } + } Security_context *sctx= &main_security_ctx; sql_print_warning(ER_THD(this, ER_NEW_ABORTING_CONNECTION), thread_id, (db.str ? db.str : "unconnected"), sctx->user ? sctx->user : "unauthenticated", - sctx->host_or_ip, reason); + sctx->host_or_ip, real_ip_str, reason); } } @@ -5288,8 +5322,18 @@ public: Flag, mutex and condition for a thread to wait for a signal from another thread. - Currently used to wait for group commit to complete, can also be used for - other purposes. + Currently used to wait for group commit to complete, and COND_wakeup_ready + is used for threads to wait on semi-sync ACKs (though is protected by + Repl_semi_sync_master::LOCK_binlog). Note the following relationships + between these two use-cases when using + rpl_semi_sync_master_wait_point=AFTER_SYNC during group commit: + 1) Non-leader threads use COND_wakeup_ready to wait for the leader thread + to complete binlog commit. + 2) The leader thread uses COND_wakeup_ready to await ACKs from the + replica before signalling the non-leader threads to wake up. + + With wait_point=AFTER_COMMIT, there is no overlap as binlogging has + finished, so COND_wakeup_ready is safe to re-use. */ bool wakeup_ready; mysql_mutex_t LOCK_wakeup_ready; @@ -5417,14 +5461,6 @@ public: bool is_binlog_dump_thread(); #endif - /* - Indicates if this thread is suspended due to awaiting an ACK from a - replica. True if suspended, false otherwise. - - Note that this variable is protected by Repl_semi_sync_master::LOCK_binlog - */ - bool is_awaiting_semisync_ack; - inline ulong wsrep_binlog_format(ulong binlog_format) const { #ifdef WITH_WSREP @@ -8173,6 +8209,10 @@ extern THD_list server_threads; void setup_tmp_table_column_bitmaps(TABLE *table, uchar *bitmaps, uint field_count); +C_MODE_START +void mariadb_sleep_for_space(unsigned int seconds); +C_MODE_END + #ifdef WITH_WSREP extern void wsrep_to_isolation_end(THD*); #endif diff --git a/sql/sql_connect.cc b/sql/sql_connect.cc index 8878c722..6149cc49 100644 --- a/sql/sql_connect.cc +++ b/sql/sql_connect.cc @@ -1274,7 +1274,7 @@ void prepare_new_connection_state(THD* thd) thd->thread_id, thd->db.str ? thd->db.str : "unconnected", sctx->user ? sctx->user : "unauthenticated", - sctx->host_or_ip, "init_connect command failed"); + sctx->host_or_ip, "", "init_connect command failed"); thd->server_status&= ~SERVER_STATUS_CLEAR_SET; thd->protocol->end_statement(); thd->killed = KILL_CONNECTION; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 202dde11..c55b8789 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -263,7 +263,10 @@ int update_portion_of_time(THD *thd, TABLE *table, res= src->save_in_field(table->field[dst_fieldno], true); if (likely(!res)) + { + table->period_prepare_autoinc(); res= table->update_generated_fields(); + } if(likely(!res)) res= table->file->ha_update_row(table->record[1], table->record[0]); diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index afcbb7f8..de5a1f63 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -1217,8 +1217,12 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived) (derived->alias.str ? derived->alias.str : ""), derived->get_unit())); - if (unit->executed && !unit->uncacheable && !unit->describe && - !derived_is_recursive) + /* + Only fill derived tables once, unless the derived table is dependent in + which case we will delete all of its rows and refill it below. + */ + if (unit->executed && !(unit->uncacheable & UNCACHEABLE_DEPENDENT) && + !unit->describe && !derived_is_recursive) DBUG_RETURN(FALSE); /*check that table creation passed without problems. */ DBUG_ASSERT(derived->table && derived->table->is_created()); @@ -1233,7 +1237,9 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived) /* Execute the query that specifies the derived table by a foreign engine */ res= derived->pushdown_derived->execute(); unit->executed= true; + if (res) DBUG_RETURN(res); + goto after_exec; } if (unit->executed && !derived_is_recursive && @@ -1275,6 +1281,7 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived) } else { + DBUG_ASSERT(!unit->executed || (unit->uncacheable & UNCACHEABLE_DEPENDENT)); SELECT_LEX *first_select= unit->first_select(); unit->set_limit(unit->global_parameters()); if (unit->lim.is_unlimited()) @@ -1294,6 +1301,7 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived) derived_result, unit, first_select); } + after_exec: if (!res && !derived_is_recursive) { if (derived_result->flush()) diff --git a/sql/sql_expression_cache.cc b/sql/sql_expression_cache.cc index 8681e08e..8b511b25 100644 --- a/sql/sql_expression_cache.cc +++ b/sql/sql_expression_cache.cc @@ -272,7 +272,8 @@ my_bool Expression_cache_tmptable::put_value(Item *value) } *(items.head_ref())= value; - fill_record(table_thd, cache_table, cache_table->field, items, TRUE, TRUE); + fill_record(table_thd, cache_table, cache_table->field, items, true, true, + true); if (unlikely(table_thd->is_error())) goto err;; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 97e1c102..e16ac1c1 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1452,7 +1452,7 @@ static bool check_view_insertability(THD *thd, TABLE_LIST *view, *trans_end= trans_start + num; Field_translator *trans; uint used_fields_buff_size= bitmap_buffer_size(table->s->fields); - uint32 *used_fields_buff= (uint32*)thd->alloc(used_fields_buff_size); + my_bitmap_map *used_fields_buff= (my_bitmap_map*)thd->alloc(used_fields_buff_size); MY_BITMAP used_fields; enum_column_usage saved_column_usage= thd->column_usage; List_iterator_fast it(fields); @@ -1951,14 +1951,31 @@ int write_record(THD *thd, TABLE *table, COPY_INFO *info, select_result *sink) was used. This ensures that we don't get a problem when the whole range of the key has been used. */ - if (info->handle_duplicates == DUP_REPLACE && table->next_number_field && + if (info->handle_duplicates == DUP_REPLACE && key_nr == table->s->next_number_index && insert_id_for_cur_row > 0) goto err; - if (table->file->ha_table_flags() & HA_DUPLICATE_POS) + if (table->file->has_dup_ref()) { + /* + If engine doesn't support HA_DUPLICATE_POS, the handler may init to + INDEX, but dup_ref could also be set by lookup_handled (and then, + lookup_errkey is set, f.ex. long unique duplicate). + + In such case, handler would stay uninitialized, so do it here. + */ + bool init_lookup_handler= table->file->lookup_errkey != (uint)-1 && + table->file->inited == handler::NONE; + if (init_lookup_handler && table->file->ha_rnd_init_with_error(false)) + goto err; + DBUG_ASSERT(table->file->inited == handler::RND); - if (table->file->ha_rnd_pos(table->record[1],table->file->dup_ref)) - goto err; + int rnd_pos_err= table->file->ha_rnd_pos(table->record[1], + table->file->dup_ref); + + if (init_lookup_handler) + table->file->ha_rnd_end(); + if (rnd_pos_err) + goto err; } else { @@ -2401,7 +2418,7 @@ public: passed from connection thread to the handler thread. */ MDL_request grl_protection; - Delayed_insert(SELECT_LEX *current_select) + Delayed_insert(LEX *lex) :locks_in_memory(0), thd(next_thread_id()), table(0),tables_in_use(0), stacked_inserts(0), status(0), retry(0), handler_thread_initialized(FALSE), group_count(0) @@ -2414,8 +2431,9 @@ public: strmake_buf(thd.security_ctx->priv_user, thd.security_ctx->user); thd.current_tablenr=0; thd.set_command(COM_DELAYED_INSERT); - thd.lex->current_select= current_select; - thd.lex->sql_command= SQLCOM_INSERT; // For innodb::store_lock() + thd.lex->current_select= lex->current_select; + thd.lex->sql_command= lex->sql_command; // For innodb::store_lock() + thd.lex->duplicates= lex->duplicates; /* Prevent changes to global.lock_wait_timeout from affecting delayed insert threads as any timeouts in delayed inserts @@ -2591,7 +2609,7 @@ bool delayed_get_table(THD *thd, MDL_request *grl_protection_request, */ if (! (di= find_handler(thd, table_list))) { - if (!(di= new Delayed_insert(thd->lex->current_select))) + if (!(di= new Delayed_insert(thd->lex))) goto end_create; /* @@ -2892,6 +2910,8 @@ TABLE *Delayed_insert::get_local_table(THD* client_thd) copy->def_read_set.bitmap= (my_bitmap_map*) bitmap; copy->def_write_set.bitmap= ((my_bitmap_map*) (bitmap + share->column_bitmap_size)); + create_last_bit_mask(©->def_read_set); + create_last_bit_mask(©->def_write_set); bitmaps_used= 2; if (share->default_fields || share->default_expressions) { diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc index f8ac6516..2ee63171 100644 --- a/sql/sql_join_cache.cc +++ b/sql/sql_join_cache.cc @@ -1590,6 +1590,7 @@ bool JOIN_CACHE::put_record() { bool is_full; uchar *link= 0; + DBUG_ASSERT(!for_explain_only); if (prev_cache) link= prev_cache->get_curr_rec_link(); write_record_data(link, &is_full); diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index e6db1456..38232622 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -4264,17 +4264,18 @@ uint8 LEX::get_effective_with_check(TABLE_LIST *view) bool LEX::copy_db_to(LEX_CSTRING *to) { - if (sphead && sphead->m_name.str) - { - DBUG_ASSERT(sphead->m_db.str && sphead->m_db.length); - /* - It is safe to assign the string by-pointer, both sphead and - its statements reside in the same memory root. - */ - *to= sphead->m_db; - return FALSE; - } - return thd->copy_db_to(to); + if (!sphead || !sphead->m_name.str) + return thd->copy_db_to(to); + + DBUG_ASSERT(sphead->m_db.str); + DBUG_ASSERT(sphead->m_db.length); + + /* + It is safe to assign the string by-pointer, both sphead and + its statements reside in the same memory root. + */ + *to= sphead->m_db; + return FALSE; } /** diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 3151f237..f785d286 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -3280,7 +3280,7 @@ public: Table_type table_type; /* Used for SHOW CREATE */ List ref_list; List users_list; - List *insert_list,field_list,value_list,update_list; + List *insert_list= nullptr,field_list,value_list,update_list; List many_values; List var_list; List stmt_var_list; //SET_STATEMENT values diff --git a/sql/sql_load.cc b/sql/sql_load.cc index be3063e5..7a82e0ce 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -107,23 +107,41 @@ public: class Wsrep_load_data_split { public: - Wsrep_load_data_split(THD *thd) + Wsrep_load_data_split(THD *thd, TABLE *table) : m_thd(thd) - , m_load_data_splitting(wsrep_load_data_splitting) + , m_load_data_splitting(false) , m_fragment_unit(thd->wsrep_trx().streaming_context().fragment_unit()) , m_fragment_size(thd->wsrep_trx().streaming_context().fragment_size()) { - if (WSREP(m_thd) && m_load_data_splitting) + /* + We support load data splitting for InnoDB only as it will use + streaming replication (SR). + */ + if (WSREP(thd) && wsrep_load_data_splitting) { - /* Override streaming settings with backward compatible values for - load data splitting */ - m_thd->wsrep_cs().streaming_params(wsrep::streaming_context::row, 10000); + handlerton *ht= table->s->db_type(); + // For partitioned tables find underlying hton + if (table->file->partition_ht()) + ht= table->file->partition_ht(); + if (ht->db_type != DB_TYPE_INNODB) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_NOT_SUPPORTED_YET, + "wsrep_load_data_splitting for other than InnoDB tables"); + } + else + { + /* Override streaming settings with backward compatible values for + load data splitting */ + m_thd->wsrep_cs().streaming_params(wsrep::streaming_context::row, 10000); + m_load_data_splitting= true; + } } } ~Wsrep_load_data_split() { - if (WSREP(m_thd) && m_load_data_splitting) + if (m_load_data_splitting) { /* Restore original settings */ m_thd->wsrep_cs().streaming_params(m_fragment_unit, m_fragment_size); @@ -348,6 +366,7 @@ int mysql_load(THD *thd, const sql_exchange *ex, TABLE_LIST *table_list, bool is_concurrent; #endif const char *db= table_list->db.str; // This is never null + /* If path for file is not defined, we will use the current database. If this is not set, we will use the directory where the table to be @@ -358,9 +377,6 @@ int mysql_load(THD *thd, const sql_exchange *ex, TABLE_LIST *table_list, bool transactional_table __attribute__((unused)); DBUG_ENTER("mysql_load"); -#ifdef WITH_WSREP - Wsrep_load_data_split wsrep_load_data_split(thd); -#endif /* WITH_WSREP */ /* Bug #34283 mysqlbinlog leaves tmpfile after termination if binlog contains @@ -425,6 +441,11 @@ int mysql_load(THD *thd, const sql_exchange *ex, TABLE_LIST *table_list, { DBUG_RETURN(TRUE); } + +#ifdef WITH_WSREP + Wsrep_load_data_split wsrep_load_data_split(thd, table_list->table); +#endif /* WITH_WSREP */ + thd_proc_info(thd, "Executing"); /* Let us emit an error if we are loading data to table which is used diff --git a/sql/sql_manager.cc b/sql/sql_manager.cc index 3d3728b9..b3d95c9e 100644 --- a/sql/sql_manager.cc +++ b/sql/sql_manager.cc @@ -26,7 +26,11 @@ #include "sql_manager.h" #include "sql_base.h" // flush_tables -static bool volatile manager_thread_in_use = 0; +/* + Values for manager_thread_in_use: 0 means "not started". 1 means "started + and active". 2 means "stopped". +*/ +static int volatile manager_thread_in_use = 0; static bool abort_manager = false; pthread_t manager_thread; @@ -44,7 +48,7 @@ static struct handler_cb *cb_list; // protected by LOCK_manager bool mysql_manager_submit(void (*action)(void *), void *data) { bool result= FALSE; - DBUG_ASSERT(manager_thread_in_use); + DBUG_ASSERT(manager_thread_in_use == 1); struct handler_cb **cb; mysql_mutex_lock(&LOCK_manager); cb= &cb_list; @@ -76,7 +80,9 @@ pthread_handler_t handle_manager(void *arg __attribute__((unused))) pthread_detach_this_thread(); manager_thread = pthread_self(); mysql_mutex_lock(&LOCK_manager); - while (!abort_manager) + manager_thread_in_use = 1; + mysql_cond_signal(&COND_manager); + while (!abort_manager || cb_list) { /* XXX: This will need to be made more general to handle different * polling needs. */ @@ -116,7 +122,8 @@ pthread_handler_t handle_manager(void *arg __attribute__((unused))) } mysql_mutex_lock(&LOCK_manager); } - manager_thread_in_use = 0; + DBUG_ASSERT(cb_list == NULL); + manager_thread_in_use = 2; mysql_mutex_unlock(&LOCK_manager); mysql_mutex_destroy(&LOCK_manager); mysql_cond_destroy(&COND_manager); @@ -135,12 +142,28 @@ void start_handle_manager() pthread_t hThread; int err; DBUG_EXECUTE_IF("delay_start_handle_manager", my_sleep(1000);); - manager_thread_in_use = 1; mysql_cond_init(key_COND_manager, &COND_manager,NULL); mysql_mutex_init(key_LOCK_manager, &LOCK_manager, NULL); if ((err= mysql_thread_create(key_thread_handle_manager, &hThread, &connection_attrib, handle_manager, 0))) + { sql_print_warning("Can't create handle_manager thread (errno: %M)", err); + DBUG_VOID_RETURN; + } + + mysql_mutex_lock(&LOCK_manager); + /* + Wait for manager thread to have started, otherwise in extreme cases the + server may start up and have initiated shutdown at the time the manager + thread even starts to run. + + Allow both values 1 and 2 for manager_thread_in_use, so that we will not + get stuck here if the manager thread somehow manages to start up and + abort again before we have time to test it here. + */ + while (!manager_thread_in_use) + mysql_cond_wait(&COND_manager, &LOCK_manager); + mysql_mutex_unlock(&LOCK_manager); } DBUG_VOID_RETURN; } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index f9da2c40..339fea26 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2250,6 +2250,7 @@ dispatch_command_return dispatch_command(enum enum_server_command command, THD * my_eof(thd); kill_mysql(thd); error=TRUE; + DBUG_EXECUTE_IF("simulate_slow_client_at_shutdown", my_sleep(2000000);); break; } #endif @@ -2407,6 +2408,11 @@ resume: } #endif /* WITH_WSREP */ + if (thd->reset_sp_cache) + { + thd->sp_caches_empty(); + thd->reset_sp_cache= false; + } if (do_end_of_statement) { @@ -2483,6 +2489,7 @@ resume: MYSQL_COMMAND_DONE(res); } DEBUG_SYNC(thd,"dispatch_command_end"); + DEBUG_SYNC(thd,"dispatch_command_end2"); /* Check that some variables are reset properly */ DBUG_ASSERT(thd->abort_on_warning == 0); @@ -4649,10 +4656,15 @@ mysql_execute_command(THD *thd, bool is_called_from_prepared_stmt) if ((res= insert_precheck(thd, all_tables))) break; + #ifdef WITH_WSREP - if (WSREP(thd) && thd->wsrep_consistency_check == CONSISTENCY_CHECK_DECLARED) + bool wsrep_toi= false; + const bool wsrep= WSREP(thd); + + if (wsrep && thd->wsrep_consistency_check == CONSISTENCY_CHECK_DECLARED) { thd->wsrep_consistency_check = CONSISTENCY_CHECK_RUNNING; + wsrep_toi= true; WSREP_TO_ISOLATION_BEGIN(first_table->db.str, first_table->table_name.str, NULL); } #endif /* WITH_WSREP */ @@ -4687,6 +4699,27 @@ mysql_execute_command(THD *thd, bool is_called_from_prepared_stmt) if (!(res=open_and_lock_tables(thd, all_tables, TRUE, 0))) { MYSQL_INSERT_SELECT_START(thd->query()); + +#ifdef WITH_WSREP + if (wsrep && !first_table->view) + { + bool is_innodb= (first_table->table->file->ht->db_type == DB_TYPE_INNODB); + + // For consistency check inserted table needs to be InnoDB + if (!is_innodb && thd->wsrep_consistency_check != NO_CONSISTENCY_CHECK) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + HA_ERR_UNSUPPORTED, + "Galera cluster does support consistency check only" + " for InnoDB tables."); + thd->wsrep_consistency_check= NO_CONSISTENCY_CHECK; + } + + // For !InnoDB we start TOI if it is not yet started and hope for the best + if (!is_innodb && !wsrep_toi) + WSREP_TO_ISOLATION_BEGIN(first_table->db.str, first_table->table_name.str, NULL); + } +#endif /* WITH_WSREP */ /* Only the INSERT table should be merged. Other will be handled by select. @@ -5864,7 +5897,7 @@ mysql_execute_command(THD *thd, bool is_called_from_prepared_stmt) if (sph->sp_resolve_package_routine(thd, thd->lex->sphead, lex->spname, &sph, &pkgname)) return true; - if (sph->sp_cache_routine(thd, lex->spname, false, &sp)) + if (sph->sp_cache_routine(thd, lex->spname, &sp)) goto error; if (!sp || sp->show_routine_code(thd)) { @@ -6141,13 +6174,11 @@ finish: if (unlikely(thd->is_error()) || (thd->variables.option_bits & OPTION_MASTER_SQL_ERROR)) { - THD_STAGE_INFO(thd, stage_rollback); trans_rollback_stmt(thd); } else { /* If commit fails, we should be able to reset the OK status. */ - THD_STAGE_INFO(thd, stage_commit); thd->get_stmt_da()->set_overwrite_status(true); trans_commit_stmt(thd); thd->get_stmt_da()->set_overwrite_status(false); @@ -6174,7 +6205,6 @@ finish: one of storage engines (e.g. due to deadlock). Rollback transaction in all storage engines including binary log. */ - THD_STAGE_INFO(thd, stage_rollback_implicit); trans_rollback_implicit(thd); thd->release_transactional_locks(); } @@ -6184,7 +6214,6 @@ finish: DBUG_ASSERT(! thd->in_sub_stmt); if (!(thd->variables.option_bits & OPTION_GTID_BEGIN)) { - THD_STAGE_INFO(thd, stage_commit_implicit); /* If commit fails, we should be able to reset the OK status. */ thd->get_stmt_da()->set_overwrite_status(true); /* Commit the normal transaction if one is active. */ @@ -8241,10 +8270,6 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, List *partition_names, LEX_STRING *option) { - TABLE_LIST *ptr; - TABLE_LIST *UNINIT_VAR(previous_table_ref); /* The table preceding the current one. */ - LEX_CSTRING alias_str; - LEX *lex= thd->lex; DBUG_ENTER("add_table_to_list"); DBUG_PRINT("enter", ("Table '%s' (%p) Select %p (%u)", (alias ? alias->str : table->table.str), @@ -8254,9 +8279,7 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, if (unlikely(!table)) DBUG_RETURN(0); // End of memory - alias_str= alias ? *alias : table->table; - DBUG_ASSERT(alias_str.str); - if (!MY_TEST(table_options & TL_OPTION_ALIAS) && + if (!(table_options & TL_OPTION_ALIAS) && unlikely(check_table_name(table->table.str, table->table.length, FALSE))) { my_error(ER_WRONG_TABLE_NAME, MYF(0), table->table.str); @@ -8271,6 +8294,34 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, DBUG_RETURN(0); } + LEX_CSTRING db{0, 0}; + bool fqtn= false; + LEX *lex= thd->lex; + if (table->db.str) + { + fqtn= TRUE; + db= table->db; + } + else if (!lex->with_cte_resolution && lex->copy_db_to(&db)) + DBUG_RETURN(0); + else + fqtn= FALSE; + bool info_schema= is_infoschema_db(&db); + if (!table->sel && info_schema && + (table_options & TL_OPTION_UPDATING) && + /* Special cases which are processed by commands itself */ + lex->sql_command != SQLCOM_CHECK && + lex->sql_command != SQLCOM_CHECKSUM) + { + my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), + thd->security_ctx->priv_user, + thd->security_ctx->priv_host, + INFORMATION_SCHEMA_NAME.str); + DBUG_RETURN(0); + } + + LEX_CSTRING alias_str= alias ? *alias : table->table; + DBUG_ASSERT(alias_str.str); if (!alias) /* Alias is case sensitive */ { if (unlikely(table->sel)) @@ -8283,65 +8334,15 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, if (unlikely(!(alias_str.str= (char*) thd->memdup(alias_str.str, alias_str.length+1)))) DBUG_RETURN(0); } - if (unlikely(!(ptr = (TABLE_LIST *) thd->calloc(sizeof(TABLE_LIST))))) - DBUG_RETURN(0); /* purecov: inspected */ - if (table->db.str) - { - ptr->is_fqtn= TRUE; - ptr->db= table->db; - } - else if (!lex->with_cte_resolution && lex->copy_db_to(&ptr->db)) - DBUG_RETURN(0); - else - ptr->is_fqtn= FALSE; - - ptr->alias= alias_str; - ptr->is_alias= alias ? TRUE : FALSE; - if (lower_case_table_names) - { - if (table->table.length) - table->table.length= my_casedn_str(files_charset_info, - (char*) table->table.str); - if (ptr->db.length && ptr->db.str != any_db.str) - ptr->db.length= my_casedn_str(files_charset_info, (char*) ptr->db.str); - } - - ptr->table_name= table->table; - ptr->lock_type= lock_type; - ptr->mdl_type= mdl_type; - ptr->table_options= table_options; - ptr->updating= MY_TEST(table_options & TL_OPTION_UPDATING); - /* TODO: remove TL_OPTION_FORCE_INDEX as it looks like it's not used */ - ptr->force_index= MY_TEST(table_options & TL_OPTION_FORCE_INDEX); - ptr->ignore_leaves= MY_TEST(table_options & TL_OPTION_IGNORE_LEAVES); - ptr->sequence= MY_TEST(table_options & TL_OPTION_SEQUENCE); - ptr->derived= table->sel; - if (!ptr->derived && is_infoschema_db(&ptr->db)) - { - if (ptr->updating && - /* Special cases which are processed by commands itself */ - lex->sql_command != SQLCOM_CHECK && - lex->sql_command != SQLCOM_CHECKSUM) - { - my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), - thd->security_ctx->priv_user, - thd->security_ctx->priv_host, - INFORMATION_SCHEMA_NAME.str); - DBUG_RETURN(0); - } - ST_SCHEMA_TABLE *schema_table; - schema_table= find_schema_table(thd, &ptr->table_name); - ptr->schema_table_name= ptr->table_name; - ptr->schema_table= schema_table; - } - ptr->select_lex= this; - /* - We can't cache internal temporary tables between prepares as the - table may be deleted before next exection. - */ - ptr->cacheable_table= !table->is_derived_table(); - ptr->index_hints= index_hints_arg; - ptr->option= option ? option->str : 0; + + bool has_alias_ptr= alias != nullptr; + void *memregion= thd->calloc(sizeof(TABLE_LIST)); + TABLE_LIST *ptr= new (memregion) TABLE_LIST(thd, db, fqtn, alias_str, + has_alias_ptr, table, lock_type, + mdl_type, table_options, + info_schema, this, + index_hints_arg, option); + /* check that used name is unique. Sequences are ignored */ if (lock_type != TL_IGNORE && !ptr->sequence) { @@ -8364,6 +8365,7 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, } } /* Store the table reference preceding the current one. */ + TABLE_LIST *UNINIT_VAR(previous_table_ref); /* The table preceding the current one. */ if (table_list.elements > 0 && likely(!ptr->sequence)) { /* diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 3c1a803c..590c2a50 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -1080,7 +1080,7 @@ void check_range_capable_PF(TABLE *table) static bool set_up_partition_bitmaps(THD *thd, partition_info *part_info) { - uint32 *bitmap_buf; + my_bitmap_map *bitmap_buf; uint bitmap_bits= part_info->num_subparts? (part_info->num_subparts* part_info->num_parts): part_info->num_parts; @@ -1091,14 +1091,15 @@ static bool set_up_partition_bitmaps(THD *thd, partition_info *part_info) /* Allocate for both read and lock_partitions */ if (unlikely(!(bitmap_buf= - (uint32*) alloc_root(&part_info->table->mem_root, - bitmap_bytes * 2)))) + (my_bitmap_map*) alloc_root(&part_info->table->mem_root, + bitmap_bytes * 2)))) DBUG_RETURN(TRUE); my_bitmap_init(&part_info->read_partitions, bitmap_buf, bitmap_bits); /* Use the second half of the allocated buffer for lock_partitions */ - my_bitmap_init(&part_info->lock_partitions, bitmap_buf + (bitmap_bytes / 4), - bitmap_bits); + my_bitmap_init(&part_info->lock_partitions, + (my_bitmap_map*) (((char*) bitmap_buf) + bitmap_bytes), + bitmap_bits); part_info->bitmaps_are_initialized= TRUE; part_info->set_partition_bitmaps(NULL); DBUG_RETURN(FALSE); @@ -7752,7 +7753,7 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, ERROR_INJECT("add_partition_1") || mysql_write_frm(lpt, WFRM_WRITE_SHADOW) || ERROR_INJECT("add_partition_2") || - wait_while_table_is_used(thd, table, HA_EXTRA_NOT_USED) || + wait_while_table_is_used(thd, table, HA_EXTRA_PREPARE_FOR_RENAME) || ERROR_INJECT("add_partition_3") || write_log_add_change_partition(lpt) || ERROR_INJECT("add_partition_4") || diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index c968637d..f4ce4a4d 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -1505,7 +1505,7 @@ static int plugin_initialize(MEM_ROOT *tmp_root, struct st_plugin_int *plugin, else ret= plugin_do_initialize(plugin, state); - if (ret) + if (ret && ret != HA_ERR_RETRY_INIT) plugin_variables_deinit(plugin); mysql_mutex_lock(&LOCK_plugin); @@ -1786,6 +1786,7 @@ int plugin_init(int *argc, char **argv, int flags) uint state= plugin_ptr->state; mysql_mutex_unlock(&LOCK_plugin); error= plugin_do_initialize(plugin_ptr, state); + DBUG_EXECUTE_IF("fail_spider_init_retry", error= 1;); mysql_mutex_lock(&LOCK_plugin); plugin_ptr->state= state; if (error == HA_ERR_RETRY_INIT) @@ -4261,7 +4262,7 @@ static int test_plugin_options(MEM_ROOT *tmp_root, struct st_plugin_int *tmp, if (unlikely(error)) { - sql_print_error("Parsing options for plugin '%s' failed.", + sql_print_error("Parsing options for plugin '%s' failed. Disabling plugin", tmp->name.str); goto err; } diff --git a/sql/sql_plugin_services.inl b/sql/sql_plugin_services.inl index 5ac06e76..b291bf5c 100644 --- a/sql/sql_plugin_services.inl +++ b/sql/sql_plugin_services.inl @@ -18,6 +18,7 @@ #include #include #include +#include struct st_service_ref { const char *name; @@ -219,6 +220,11 @@ static struct my_print_error_service_st my_print_error_handler= my_printv_error }; +static struct print_check_msg_service_st print_check_msg_handler= +{ + print_check_msg +}; + static struct json_service_st json_handler= { json_type, @@ -336,6 +342,7 @@ static struct st_service_ref list_of_services[]= { "my_crypt_service", VERSION_my_crypt, &crypt_handler}, { "my_md5_service", VERSION_my_md5, &my_md5_handler}, { "my_print_error_service", VERSION_my_print_error, &my_print_error_handler}, + { "print_check_msg_service", VERSION_print_check_msg, &print_check_msg_handler}, { "my_sha1_service", VERSION_my_sha1, &my_sha1_handler}, { "my_sha2_service", VERSION_my_sha2, &my_sha2_handler}, { "my_snprintf_service", VERSION_my_snprintf, &my_snprintf_handler }, diff --git a/sql/sql_priv.h b/sql/sql_priv.h index 99e1d65d..adddca3d 100644 --- a/sql/sql_priv.h +++ b/sql/sql_priv.h @@ -272,6 +272,13 @@ OPTIMIZER_SWITCH_COND_PUSHDOWN_FROM_HAVING | \ OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE) +/* + See adjust_secondary_key_cost in sys_vars.cc for symbolic names. +*/ +#define OPTIMIZER_ADJ_SEC_KEY_COST (1) +#define OPTIMIZER_ADJ_DISABLE_MAX_SEEKS (2) +#define OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY (4) + /* Replication uses 8 bytes to store SQL_MODE in the binary log. The day you use strictly more than 64 bits by adding one more define above, you should diff --git a/sql/sql_reload.cc b/sql/sql_reload.cc index 8f0f15a9..f6f5cf20 100644 --- a/sql/sql_reload.cc +++ b/sql/sql_reload.cc @@ -68,6 +68,15 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options, bool result=0; select_errors=0; /* Write if more errors */ int tmp_write_to_binlog= *write_to_binlog= 1; +#ifndef DBUG_OFF + /* + When invoked for handling a SIGHUP by rpl_shutdown_sighup.test, we need to + force the signal handler to wait after REFRESH_TABLES, as that will check + for a killed server, and we need to call hostname_cache_refresh after + server cleanup has happened to trigger MDEV-30260. + */ + int do_dbug_sleep= 0; +#endif DBUG_ASSERT(!thd || !thd->in_sub_stmt); @@ -100,6 +109,15 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options, */ my_error(ER_UNKNOWN_ERROR, MYF(0)); } + +#ifndef DBUG_OFF + DBUG_EXECUTE_IF("hold_sighup_log_refresh", { + DBUG_ASSERT(!debug_sync_set_action( + thd, STRING_WITH_LEN("now SIGNAL in_reload_acl_and_cache " + "WAIT_FOR refresh_logs"))); + do_dbug_sleep= 1; + }); +#endif } opt_noacl= 0; @@ -352,6 +370,11 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options, } my_dbopt_cleanup(); } + +#ifndef DBUG_OFF + if (do_dbug_sleep) + my_sleep(3000000); // 3s +#endif if (options & REFRESH_HOSTS) hostname_cache_refresh(); if (thd && (options & REFRESH_STATUS)) @@ -370,7 +393,7 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options, } } #endif -#ifdef HAVE_OPENSSL +#ifdef HAVE_des if (options & REFRESH_DES_KEY_FILE) { if (des_key_file && load_des_key_file(des_key_file)) diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index ad71bf6f..114c36a5 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -221,7 +221,7 @@ static int fake_rotate_event(binlog_send_info *info, ulonglong position, char* p = info->log_file_name+dirname_length(info->log_file_name); uint ident_len = (uint) strlen(p); String *packet= info->packet; - ha_checksum crc; + ha_checksum crc= 0; /* reset transmit packet for the fake rotate event below */ if (reset_transmit_packet(info, info->flags, &ev_offset, &info->errmsg)) @@ -262,7 +262,7 @@ static int fake_gtid_list_event(binlog_send_info *info, { my_bool do_checksum; int err; - ha_checksum crc; + ha_checksum crc= 0; char buf[128]; String str(buf, sizeof(buf), system_charset_info); String* packet= info->packet; @@ -2828,12 +2828,6 @@ static int send_one_binlog_file(binlog_send_info *info, */ if (send_events(info, log, linfo, end_pos)) return 1; - DBUG_EXECUTE_IF("Notify_binlog_EOF", - { - const char act[]= "now signal eof_reached"; - DBUG_ASSERT(!debug_sync_set_action(current_thd, - STRING_WITH_LEN(act))); - };); } return 1; @@ -3876,13 +3870,7 @@ bool change_master(THD* thd, Master_info* mi, bool *master_info_added) if (lex_mi->use_gtid_opt == LEX_MASTER_INFO::LEX_GTID_SLAVE_POS) mi->using_gtid= Master_info::USE_GTID_SLAVE_POS; else if (lex_mi->use_gtid_opt == LEX_MASTER_INFO::LEX_GTID_CURRENT_POS) - { mi->using_gtid= Master_info::USE_GTID_CURRENT_POS; - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT, - ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), - "master_use_gtid=current_pos", "master_demote_to_slave=1"); - } else if (lex_mi->use_gtid_opt == LEX_MASTER_INFO::LEX_GTID_NO || lex_mi->log_file_name || lex_mi->pos || lex_mi->relay_log_name || lex_mi->relay_log_pos) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index c3ce21d1..593ee900 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -289,8 +289,6 @@ static void update_tmptable_sum_func(Item_sum **func,TABLE *tmp_table); static void copy_sum_funcs(Item_sum **func_ptr, Item_sum **end); static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab); static bool setup_sum_funcs(THD *thd, Item_sum **func_ptr); -static bool prepare_sum_aggregators(THD *thd, Item_sum **func_ptr, - bool need_distinct); static bool init_sum_functions(Item_sum **func, Item_sum **end); static bool update_sum_func(Item_sum **func); static void select_describe(JOIN *join, bool need_tmp_table,bool need_order, @@ -810,37 +808,57 @@ void remove_redundant_subquery_clauses(st_select_lex *subq_select_lex) if (subq_select_lex->group_list.elements && !subq_select_lex->with_sum_func && !subq_select_lex->join->having) { + /* + Temporary workaround for MDEV-28621: Do not remove GROUP BY expression + if it has any subqueries in it. + */ + bool have_subquery= false; for (ORDER *ord= subq_select_lex->group_list.first; ord; ord= ord->next) { - /* - Do not remove the item if it is used in select list and then referred - from GROUP BY clause by its name or number. Example: - - select (select ... ) as SUBQ ... group by SUBQ + if ((*ord->item)->with_subquery()) + { + have_subquery= true; + break; + } + } - Here SUBQ cannot be removed. - */ - if (!ord->in_field_list) + if (!have_subquery) + { + for (ORDER *ord= subq_select_lex->group_list.first; ord; ord= ord->next) { - (*ord->item)->walk(&Item::eliminate_subselect_processor, FALSE, NULL); /* - Remove from the JOIN::all_fields list any reference to the elements - of the eliminated GROUP BY list unless it is 'in_field_list'. - This is needed in order not to confuse JOIN::make_aggr_tables_info() - when it constructs different structure for execution phase. - */ - List_iterator li(subq_select_lex->join->all_fields); - Item *item; - while ((item= li++)) - { - if (item == *ord->item) - li.remove(); - } + Do not remove the item if it is used in select list and then referred + from GROUP BY clause by its name or number. Example: + + select (select ... ) as SUBQ ... group by SUBQ + + Here SUBQ cannot be removed. + */ + if (!ord->in_field_list) + { + /* + Not necessary due to workaround for MDEV-28621: + (*ord->item)->walk(&Item::eliminate_subselect_processor, FALSE, NULL); + */ + /* + Remove from the JOIN::all_fields list any reference to the elements + of the eliminated GROUP BY list unless it is 'in_field_list'. + This is needed in order not to confuse JOIN::make_aggr_tables_info() + when it constructs different structure for execution phase. + */ + List_iterator li(subq_select_lex->join->all_fields); + Item *item; + while ((item= li++)) + { + if (item == *ord->item) + li.remove(); + } + } } + subq_select_lex->join->group_list= NULL; + subq_select_lex->group_list.empty(); + DBUG_PRINT("info", ("GROUP BY removed")); } - subq_select_lex->join->group_list= NULL; - subq_select_lex->group_list.empty(); - DBUG_PRINT("info", ("GROUP BY removed")); } /* @@ -2351,6 +2369,10 @@ JOIN::optimize_inner() select_lex->attach_to_conds, &cond_value); sel->attach_to_conds.empty(); + Json_writer_object wrapper(thd); + Json_writer_object pushd(thd, "condition_pushdown_from_having"); + pushd.add("conds", conds); + pushd.add("having", having); } } @@ -3594,7 +3616,7 @@ bool JOIN::make_aggr_tables_info() distinct in the engine, so we do this for all queries, not only GROUP BY queries. */ - if (tables_list && top_join_tab_count && !procedure) + if (tables_list && top_join_tab_count && !only_const_tables() && !procedure) { /* At the moment we only support push down for queries where @@ -4225,7 +4247,7 @@ JOIN::create_postjoin_aggr_table(JOIN_TAB *tab, List *table_fields, if (make_sum_func_list(all_fields, fields_list, true)) goto err; if (prepare_sum_aggregators(thd, sum_funcs, - !(tables_list && + !(tables_list && join_tab->is_using_agg_loose_index_scan()))) goto err; if (setup_sum_funcs(thd, sum_funcs)) @@ -5948,7 +5970,8 @@ make_join_statistics(JOIN *join, List &tables_list, */ /* Largest integer that can be stored in double (no compiler warning) */ s->worst_seeks= (double) (1ULL << 53); - if (thd->variables.optimizer_adjust_secondary_key_costs != 2) + if ((thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_DISABLE_MAX_SEEKS) == 0) { s->worst_seeks= MY_MIN((double) s->found_records / 10, (double) s->read_time*3); @@ -7935,7 +7958,8 @@ double cost_for_index_read(const THD *thd, const TABLE *table, uint key, { cost= ((file->keyread_time(key, 0, records) + file->read_time(key, 1, MY_MIN(records, worst_seeks)))); - if (thd->variables.optimizer_adjust_secondary_key_costs == 1 && + if ((thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_SEC_KEY_COST) && file->is_clustering_key(0)) { /* @@ -8131,8 +8155,9 @@ best_access_path(JOIN *join, higher to ensure that ref|filter is not less than range over same number of rows */ - double filter_setup_cost= (thd->variables. - optimizer_adjust_secondary_key_costs == 2 ? + double filter_setup_cost= ((thd->variables. + optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_DISABLE_MAX_SEEKS) ? 1.0 : 0.0); MY_BITMAP *eq_join_set= &s->table->eq_join_set; KEYUSE *hj_start_key= 0; @@ -13884,7 +13909,8 @@ end_sj_materialize(JOIN *join, JOIN_TAB *join_tab, bool end_of_records) if (item->is_null()) DBUG_RETURN(NESTED_LOOP_OK); } - fill_record(thd, table, table->field, sjm->sjm_table_cols, TRUE, FALSE); + fill_record(thd, table, table->field, sjm->sjm_table_cols, true, false, + true); if (unlikely(thd->is_error())) DBUG_RETURN(NESTED_LOOP_ERROR); /* purecov: inspected */ if (unlikely((error= table->file->ha_write_tmp_row(table->record[0])))) @@ -17249,6 +17275,7 @@ Item *eliminate_item_equal(THD *thd, COND *cond, COND_EQUAL *upper_levels, if (!eq_item || eq_item->set_cmp_func(thd)) return 0; + eq_item->eval_not_null_tables(0); eq_item->quick_fix_field(); } current_sjm= field_sjm; @@ -17306,6 +17333,7 @@ Item *eliminate_item_equal(THD *thd, COND *cond, COND_EQUAL *upper_levels, { res->quick_fix_field(); res->update_used_tables(); + res->eval_not_null_tables(0); } return res; @@ -18939,6 +18967,12 @@ Item_cond::remove_eq_conds(THD *thd, Item::cond_result *cond_value, bool and_level= functype() == Item_func::COND_AND_FUNC; List *cond_arg_list= argument_list(); + if (check_stack_overrun(thd, STACK_MIN_SIZE, NULL)) + { + *cond_value= Item::COND_FALSE; + return (COND*) 0; // Fatal error flag is set! + } + if (and_level) { /* @@ -21502,7 +21536,7 @@ create_internal_tmp_table_from_heap(THD *thd, TABLE *table, if (open_tmp_table(&new_table)) goto err1; if (table->file->indexes_are_disabled()) - new_table.file->ha_disable_indexes(HA_KEY_SWITCH_ALL); + new_table.file->ha_disable_indexes(key_map(0), false); table->file->ha_index_or_rnd_end(); if (table->file->ha_rnd_init_with_error(1)) DBUG_RETURN(1); @@ -27668,15 +27702,86 @@ static bool setup_sum_funcs(THD *thd, Item_sum **func_ptr) } -static bool prepare_sum_aggregators(THD *thd,Item_sum **func_ptr, - bool need_distinct) +/* + @brief + Setup aggregate functions. + + @param thd Thread descriptor + @param func_ptr Array of pointers to aggregate functions + @param need_distinct FALSE means that the table access method already + guarantees that arguments of all aggregate functions + will be unique. (This is the case for Loose Scan) + TRUE - Otherwise. + @return + false Ok + true Error +*/ + +bool JOIN::prepare_sum_aggregators(THD *thd, Item_sum **func_ptr, + bool need_distinct) { Item_sum *func; DBUG_ENTER("prepare_sum_aggregators"); while ((func= *(func_ptr++))) { - if (func->set_aggregator(thd, - need_distinct && func->has_with_distinct() ? + bool need_distinct_aggregator= need_distinct && func->has_with_distinct(); + if (need_distinct_aggregator && table_count - const_tables == 1) + { + /* + We are doing setup for an aggregate with DISTINCT, like + + SELECT agg_func(DISTINCT col1, col2 ...) FROM ... + + In general case, agg_func will need to use Aggregator_distinct to + remove duplicates from its arguments. + We won't have to remove duplicates if we know the arguments are already + unique. This is true when + 1. the join operation has only one non-const table (checked above) + 2. the argument list covers a PRIMARY or a UNIQUE index. + + Example: here the values of t1.pk are unique: + + SELECT agg_func(DISTINCT t1.pk, ...) FROM t1 + + and so the whole argument of agg_func is unique. + */ + List arg_fields; + for (uint i= 0; i < func->argument_count(); i++) + { + if (func->arguments()[i]->real_item()->type() == Item::FIELD_ITEM) + arg_fields.push_back(func->arguments()[i]); + } + + /* + If the query has a GROUP BY, then it's sufficient that a unique + key is covered by a concatenation of {argument_list, group_by_list}. + + Example: Suppose t1 has PRIMARY KEY(pk1, pk2). Then: + + SELECT agg_func(DISTINCT t1.pk1, ...) FROM t1 GROUP BY t1.pk2 + + Each GROUP BY group will have t1.pk2 fixed. Then, the values of t1.pk1 + will be unique, and no de-duplication will be needed. + */ + for (ORDER *group= group_list; group ; group= group->next) + { + if ((*group->item)->real_item()->type() == Item::FIELD_ITEM) + arg_fields.push_back(*group->item); + } + + if (list_contains_unique_index(join_tab[const_tables].table, + find_field_in_item_list, + (void *) &arg_fields)) + need_distinct_aggregator= false; + } + Json_writer_object trace_wrapper(thd); + Json_writer_object trace_aggr(thd, "prepare_sum_aggregators"); + trace_aggr.add("function", func); + trace_aggr.add("aggregator_type", + (need_distinct_aggregator || + func->uses_non_standard_aggregator_for_distinct()) ? + "distinct" : "simple"); + if (func->set_aggregator(thd, need_distinct_aggregator ? Aggregator::DISTINCT_AGGREGATOR : Aggregator::SIMPLE_AGGREGATOR)) DBUG_RETURN(TRUE); @@ -30604,12 +30709,13 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table, uint best_key_parts= 0; int best_key_direction= 0; ha_rows best_records= 0; - double read_time; + double read_time, records; int best_key= -1; bool is_best_covering= FALSE; double fanout= 1; ha_rows table_records= table->stat_records(); bool group= join && join->group && order == join->group_list; + bool group_forces_index_usage= group; ha_rows refkey_rows_estimate= table->opt_range_condition_rows; const bool has_limit= (select_limit_arg != HA_POS_ERROR); THD* thd= join ? join->thd : table->in_use; @@ -30646,6 +30752,7 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table, { uint tablenr= (uint)(tab - join->join_tab); read_time= join->best_positions[tablenr].read_time; + records= join->best_positions[tablenr].records_read; for (uint i= tablenr+1; i < join->table_count; i++) { fanout*= join->best_positions[i].records_read; // fanout is always >= 1 @@ -30654,8 +30761,23 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table, } } else + { read_time= table->file->scan_time(); + records= rows2double(table_records); + } + if ((thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY) && group) + { + /* + read_time does not include TIME_FOR_COMPARE while opt_range.cost, which + is used by index_scan_time contains it. + Ensure that read_time and index_scan_time always include it to make + costs comparable. + */ + read_time+= records/TIME_FOR_COMPARE; + } + trace_cheaper_ordering.add("fanout", fanout); /* TODO: add cost of sorting here. @@ -30847,30 +30969,62 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table, possible_key.add("updated_limit", select_limit); rec_per_key= keyinfo->actual_rec_per_key(keyinfo->user_defined_key_parts-1); set_if_bigger(rec_per_key, 1); - /* - Here we take into account the fact that rows are - accessed in sequences rec_per_key records in each. - Rows in such a sequence are supposed to be ordered - by rowid/primary key. When reading the data - in a sequence we'll touch not more pages than the - table file contains. - TODO. Use the formula for a disk sweep sequential access - to calculate the cost of accessing data rows for one - index entry. - */ - index_scan_time= select_limit/rec_per_key * - MY_MIN(rec_per_key, table->file->scan_time()); - double range_scan_time; - if (get_range_limit_read_cost(tab, table, table_records, nr, - select_limit, &range_scan_time)) + + if ((thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY) && group) { - possible_key.add("range_scan_time", range_scan_time); - if (range_scan_time < index_scan_time) - index_scan_time= range_scan_time; + /* Special optimization to avoid forcing an index when group by is used */ + group_forces_index_usage= 0; + + if (table->opt_range_keys.is_set(nr)) + { + /* opt_range includes TIME_FOR_COMPARE */ + index_scan_time= (double) table->opt_range[nr].cost; + } + else + { + /* Enable secondary_key_cost and disable max_seek option */ + ulonglong save= thd->variables.optimizer_adjust_secondary_key_costs; + thd->variables.optimizer_adjust_secondary_key_costs|= + OPTIMIZER_ADJ_SEC_KEY_COST | OPTIMIZER_ADJ_DISABLE_MAX_SEEKS; + + index_scan_time= cost_for_index_read(thd, table, nr, + table_records, HA_ROWS_MAX); + index_scan_time+= rows2double(table_records) / TIME_FOR_COMPARE; + thd->variables.optimizer_adjust_secondary_key_costs= save; + } + /* Assume data is proportionalyl distributed */ + index_scan_time*= MY_MIN(select_limit, rec_per_key) / rec_per_key; + } + else + { + /* + Here we take into account the fact that rows are + accessed in sequences rec_per_key records in each. + Rows in such a sequence are supposed to be ordered + by rowid/primary key. When reading the data + in a sequence we'll touch not more pages than the + table file contains. + TODO. Use the formula for a disk sweep sequential access + to calculate the cost of accessing data rows for one + index entry. + */ + index_scan_time= select_limit/rec_per_key * + MY_MIN(rec_per_key, table->file->scan_time()); + + double range_scan_time; + if (get_range_limit_read_cost(tab, table, table_records, nr, + select_limit, &range_scan_time)) + { + possible_key.add("range_scan_time", range_scan_time); + if (range_scan_time < index_scan_time) + index_scan_time= range_scan_time; + } } possible_key.add("index_scan_time", index_scan_time); - if ((ref_key < 0 && (group || table->force_index || is_covering)) || + if ((ref_key < 0 && + (group_forces_index_usage || table->force_index || is_covering)) || index_scan_time < read_time) { ha_rows quick_records= table_records; @@ -30892,6 +31046,7 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table, possible_key.add("cause", "ref estimates better"); continue; } + if (table->opt_range_keys.is_set(nr)) quick_records= table->opt_range[nr].rows; possible_key.add("records", quick_records); @@ -30910,6 +31065,9 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table, is_best_covering= is_covering; best_key_direction= direction; best_select_limit= select_limit; + if ((thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY) && group) + set_if_smaller(read_time, index_scan_time); } else { @@ -31772,7 +31930,26 @@ void JOIN::init_join_cache_and_keyread() if (!(table->file->index_flags(table->file->keyread, 0, 1) & HA_CLUSTERED_INDEX)) table->mark_index_columns(table->file->keyread, table->read_set); } - if (tab->cache && tab->cache->init(select_options & SELECT_DESCRIBE)) + bool init_for_explain= false; + + /* + Can we use lightweight initalization mode just for EXPLAINs? We can if + we're certain that the optimizer will not execute the subquery. + The optimzier will not execute the subquery if it's too expensive. For + the exact criteria, see Item_subselect::is_expensive(). + Note that the subquery might be a UNION and we might not yet know if it + is expensive. + What we do know is that if this SELECT is too expensive, then the whole + subquery will be too expensive as well. + So, we can use lightweight initialization (init_for_explain=true) if this + SELECT examines more than @@expensive_subquery_limit rows. + */ + if ((select_options & SELECT_DESCRIBE) && + get_examined_rows() >= thd->variables.expensive_subquery_limit) + { + init_for_explain= true; + } + if (tab->cache && tab->cache->init(init_for_explain)) revise_cache_usage(tab); else tab->remove_redundant_bnl_scan_conds(); diff --git a/sql/sql_select.h b/sql/sql_select.h index 4f2719f1..6d1d4626 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -1866,6 +1866,8 @@ private: bool add_fields_for_current_rowid(JOIN_TAB *cur, List *fields); void free_pushdown_handlers(List& join_list); void init_join_cache_and_keyread(); + bool prepare_sum_aggregators(THD *thd,Item_sum **func_ptr, + bool need_distinct); bool transform_in_predicates_into_equalities(THD *thd); bool transform_all_conds_and_on_exprs(THD *thd, Item_transformer transformer); diff --git a/sql/sql_sequence.cc b/sql/sql_sequence.cc index f6d7c310..b1d59aac 100644 --- a/sql/sql_sequence.cc +++ b/sql/sql_sequence.cc @@ -28,6 +28,9 @@ #include "sql_acl.h" #ifdef WITH_WSREP #include "wsrep_mysqld.h" +bool wsrep_check_sequence(THD* thd, + const sequence_definition *seq, + const bool used_engine); #endif struct Field_definition @@ -942,7 +945,8 @@ bool Sql_cmd_alter_sequence::execute(THD *thd) #ifdef WITH_WSREP if (WSREP(thd) && wsrep_thd_is_local(thd)) { - if (wsrep_check_sequence(thd, new_seq)) + const bool used_engine= lex->create_info.used_fields & HA_CREATE_USED_ENGINE; + if (wsrep_check_sequence(thd, new_seq, used_engine)) DBUG_RETURN(TRUE); if (wsrep_to_isolation_begin(thd, first_table->db.str, diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 980c2fa7..c09de58c 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2805,9 +2805,10 @@ static my_bool list_callback(THD *tmp, list_callback_arg *arg) thd_info->thread_id=tmp->thread_id; thd_info->os_thread_id=tmp->os_thread_id; - thd_info->user= arg->thd->strdup(tmp_sctx->user ? tmp_sctx->user : - (tmp->system_thread ? - "system user" : "unauthenticated user")); + thd_info->user= arg->thd->strdup(tmp_sctx->user && tmp_sctx->user != slave_user ? + tmp_sctx->user : + (tmp->system_thread ? + "system user" : "unauthenticated user")); if (tmp->peer_port && (tmp_sctx->host || tmp_sctx->ip) && arg->thd->security_ctx->host_or_ip[0]) { @@ -3029,7 +3030,7 @@ int select_result_explain_buffer::send_data(List &items) Show_explain_request::call_in_target_thread, is this necessary anymore?) */ set_current_thd(thd); - fill_record(thd, dst_table, dst_table->field, items, TRUE, FALSE); + fill_record(thd, dst_table, dst_table->field, items, true, false, false); res= dst_table->file->ha_write_tmp_row(dst_table->record[0]); set_current_thd(cur_thd); DBUG_RETURN(MY_TEST(res)); @@ -3310,7 +3311,7 @@ static my_bool processlist_callback(THD *tmp, processlist_callback_arg *arg) /* ID */ arg->table->field[0]->store((longlong) tmp->thread_id, TRUE); /* USER */ - val= tmp_sctx->user ? tmp_sctx->user : + val= tmp_sctx->user && tmp_sctx->user != slave_user ? tmp_sctx->user : (tmp->system_thread ? "system user" : "unauthenticated user"); arg->table->field[1]->store(val, strlen(val), cs); /* HOST */ @@ -9608,7 +9609,7 @@ ST_FIELD_INFO stat_fields_info[]= Column("PACKED", Varchar(10), NULLABLE, "Packed", OPEN_FRM_ONLY), Column("NULLABLE", Varchar(3), NOT_NULL, "Null", OPEN_FRM_ONLY), Column("INDEX_TYPE", Varchar(16), NOT_NULL, "Index_type", OPEN_FULL_TABLE), - Column("COMMENT", Varchar(16), NULLABLE, "Comment", OPEN_FRM_ONLY), + Column("COMMENT", Varchar(16), NULLABLE, "Comment", OPEN_FULL_TABLE), Column("INDEX_COMMENT", Varchar(INDEX_COMMENT_MAXLEN), NOT_NULL, "Index_comment",OPEN_FRM_ONLY), Column("IGNORED", Varchar(3), NOT_NULL, "Ignored", OPEN_FRM_ONLY), @@ -10196,6 +10197,7 @@ ST_SCHEMA_TABLE schema_tables[]= int initialize_schema_table(st_plugin_int *plugin) { ST_SCHEMA_TABLE *schema_table; + int err; DBUG_ENTER("initialize_schema_table"); if (!(schema_table= (ST_SCHEMA_TABLE *)my_malloc(key_memory_ST_SCHEMA_TABLE, @@ -10212,12 +10214,15 @@ int initialize_schema_table(st_plugin_int *plugin) /* Make the name available to the init() function. */ schema_table->table_name= plugin->name.str; - if (plugin->plugin->init(schema_table)) + if ((err= plugin->plugin->init(schema_table))) { - sql_print_error("Plugin '%s' init function returned error.", - plugin->name.str); + if (err != HA_ERR_RETRY_INIT) + sql_print_error("Plugin '%s' init function returned error.", + plugin->name.str); plugin->data= NULL; my_free(schema_table); + if (err == HA_ERR_RETRY_INIT) + DBUG_RETURN(err); DBUG_RETURN(1); } diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index ec369006..e552bab0 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -2906,6 +2906,9 @@ int collect_statistics_for_table(THD *thd, TABLE *table) After having been updated the statistical system tables are closed. */ +/* Stack usage 20248 from clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int update_statistics_for_table(THD *thd, TABLE *table) { TABLE_LIST tables[STATISTICS_TABLES]; @@ -2990,6 +2993,7 @@ int update_statistics_for_table(THD *thd, TABLE *table) new_trans.restore_old_transaction(); DBUG_RETURN(rc); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** @@ -3397,6 +3401,9 @@ end: The function is called when executing the statement DROP TABLE 'tab'. */ +/* Stack size 20248 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int delete_statistics_for_table(THD *thd, const LEX_CSTRING *db, const LEX_CSTRING *tab) { @@ -3465,6 +3472,7 @@ int delete_statistics_for_table(THD *thd, const LEX_CSTRING *db, new_trans.restore_old_transaction(); DBUG_RETURN(rc); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** @@ -4009,6 +4017,9 @@ int rename_indexes_in_stat_table(THD *thd, TABLE *tab, The function is called when executing any statement that renames a table */ +/* Stack size 20968 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int rename_table_in_stat_tables(THD *thd, const LEX_CSTRING *db, const LEX_CSTRING *tab, const LEX_CSTRING *new_db, @@ -4086,6 +4097,7 @@ int rename_table_in_stat_tables(THD *thd, const LEX_CSTRING *db, new_trans.restore_old_transaction(); DBUG_RETURN(rc); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 25521bb3..f5edb1a5 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -1145,26 +1145,45 @@ bool String::append_for_single_quote(const char *st, size_t len) int chlen; for (; st < end; st++) { - switch (*st) + char ch2= (char) (uchar) escaped_wc_for_single_quote((uchar) *st); + if (ch2) { - case '\\': APPEND(STRING_WITH_LEN("\\\\")); break; - case '\0': APPEND(STRING_WITH_LEN("\\0")); break; - case '\'': APPEND(STRING_WITH_LEN("\\'")); break; - case '\n': APPEND(STRING_WITH_LEN("\\n")); break; - case '\r': APPEND(STRING_WITH_LEN("\\r")); break; - case '\032': APPEND(STRING_WITH_LEN("\\Z")); break; - default: if ((chlen=charset()->charlen(st, end)) > 0) - { - APPEND(st, chlen); - st+= chlen-1; - } - else - APPEND(*st); + if (append('\\') || append(ch2)) + return true; + continue; } + if ((chlen= charset()->charlen(st, end)) > 0) + { + APPEND(st, chlen); + st+= chlen-1; + } + else + APPEND(*st); } return 0; } + +bool String::append_for_single_quote_using_mb_wc(const char *src, + size_t length, + CHARSET_INFO *cs) +{ + DBUG_ASSERT(&my_charset_bin != charset()); + DBUG_ASSERT(&my_charset_bin != cs); + const uchar *str= (const uchar *) src; + const uchar *end= (const uchar *) src + length; + int chlen; + my_wc_t wc; + for ( ; (chlen= cs->cset->mb_wc(cs, &wc, str, end)) > 0; str+= chlen) + { + my_wc_t wc2= escaped_wc_for_single_quote(wc); + if (wc2 ? (append_wc('\\') || append_wc(wc2)) : append_wc(wc)) + return true; + } + return false; +} + + void String::print(String *str) const { str->append_for_single_quote(Ptr, str_length); diff --git a/sql/sql_string.h b/sql/sql_string.h index 20073592..3b90f2c4 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -1188,6 +1188,42 @@ public: print_with_conversion(to, cs); } + static my_wc_t escaped_wc_for_single_quote(my_wc_t ch) + { + switch (ch) + { + case '\\': return '\\'; + case '\0': return '0'; + case '\'': return '\''; + case '\n': return 'n'; + case '\r': return 'r'; + case '\032': return 'Z'; + } + return 0; + } + + // Append for single quote using mb_wc/wc_mb Unicode conversion + bool append_for_single_quote_using_mb_wc(const char *str, size_t length, + CHARSET_INFO *cs); + + // Append for single quote with optional mb_wc/wc_mb conversion + bool append_for_single_quote_opt_convert(const char *str, + size_t length, + CHARSET_INFO *cs) + { + return charset() == &my_charset_bin || cs == &my_charset_bin || + my_charset_same(charset(), cs) ? + append_for_single_quote(str, length) : + append_for_single_quote_using_mb_wc(str, length, cs); + } + + bool append_for_single_quote_opt_convert(const String &str) + { + return append_for_single_quote_opt_convert(str.ptr(), + str.length(), + str.charset()); + } + bool append_for_single_quote(const char *st, size_t len); bool append_for_single_quote(const String *s) { diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 7e4d271b..c2306c53 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1468,6 +1468,7 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, temporary_table_was_dropped= 1; } is_temporary= 1; + thd->reset_sp_cache= true; } if ((drop_temporary && if_exists) || temporary_table_was_dropped) @@ -1841,8 +1842,11 @@ report_error: } DBUG_PRINT("table", ("table: %p s: %p", table->table, table->table ? table->table->s : NULL)); + if (is_temporary_table(table)) + thd->reset_sp_cache= true; } DEBUG_SYNC(thd, "rm_table_no_locks_before_binlog"); + thd->used|= THD::THREAD_SPECIFIC_USED; error= 0; @@ -4678,6 +4682,7 @@ int create_table_impl(THD *thd, if (is_trans != NULL) *is_trans= table->file->has_transactions(); + thd->reset_sp_cache= true; thd->used|= THD::THREAD_SPECIFIC_USED; create_info->table= table; // Store pointer to table } @@ -4804,18 +4809,21 @@ int mysql_create_table_no_lock(THD *thd, #ifdef WITH_WSREP /** Additional sequence checks for Galera cluster. -@param thd thread handle -@param seq sequence definition +@param thd thread handle +@param seq sequence definition +@param used_engine create used ENGINE= @retval false success @retval true failure */ -bool wsrep_check_sequence(THD* thd, const sequence_definition *seq) +bool wsrep_check_sequence(THD* thd, + const sequence_definition *seq, + const bool used_engine) { enum legacy_db_type db_type; DBUG_ASSERT(WSREP(thd)); - if (thd->lex->create_info.used_fields & HA_CREATE_USED_ENGINE) + if (used_engine) { db_type= thd->lex->create_info.db_type->db_type; } @@ -4846,6 +4854,57 @@ bool wsrep_check_sequence(THD* thd, const sequence_definition *seq) return (false); } + +/** Additional CREATE TABLE/SEQUENCE checks for Galera cluster. + +@param thd thread handle +@param wsrep_ctas CREATE TABLE AS SELECT ? +@param used_engine CREATE TABLE ... ENGINE = ? +@param create_info Create information + +@retval false Galera cluster does support used clause +@retval true Galera cluster does not support used clause +*/ +static +bool wsrep_check_support(THD* thd, + const bool wsrep_ctas, + const bool used_engine, + const HA_CREATE_INFO* create_info) +{ + /* CREATE TABLE ... AS SELECT */ + if (wsrep_ctas && + thd->variables.wsrep_trx_fragment_size > 0) + { + my_message(ER_NOT_ALLOWED_COMMAND, + "CREATE TABLE AS SELECT is not supported with streaming replication", + MYF(0)); + return true; + } + /* CREATE TABLE .. WITH SYSTEM VERSIONING AS SELECT + is not supported in Galera cluster. + */ + if (wsrep_ctas && + create_info->versioned()) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "SYSTEM VERSIONING AS SELECT in Galera cluster"); + return true; + } + /* + CREATE TABLE ... ENGINE=SEQUENCE is not supported in + Galera cluster. + CREATE SEQUENCE ... ENGINE=xxx Galera cluster supports + only InnoDB-sequences. + */ + if (((used_engine && create_info->db_type && + (create_info->db_type->db_type == DB_TYPE_SEQUENCE || + create_info->db_type->db_type >= DB_TYPE_FIRST_DYNAMIC)) || + thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE) && + wsrep_check_sequence(thd, create_info->seq_create_info, used_engine)) + return true; + + return false; +} #endif /* WITH_WSREP */ /** @@ -4921,15 +4980,6 @@ bool mysql_create_table(THD *thd, TABLE_LIST *create_table, if (!(thd->variables.option_bits & OPTION_EXPLICIT_DEF_TIMESTAMP)) promote_first_timestamp_column(&alter_info->create_list); -#ifdef WITH_WSREP - if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && - WSREP(thd) && wsrep_thd_is_local_toi(thd)) - { - if (wsrep_check_sequence(thd, create_info->seq_create_info)) - DBUG_RETURN(true); - } -#endif /* WITH_WSREP */ - /* We can abort create table for any table type */ thd->abort_on_warning= thd->is_strict_mode(); @@ -5121,7 +5171,8 @@ static bool make_unique_constraint_name(THD *thd, LEX_CSTRING *name, if (!check) // Found unique name { name->length= (size_t) (real_end - buff); - name->str= strmake_root(thd->stmt_arena->mem_root, buff, name->length); + name->str= thd->strmake(buff, name->length); + return (name->str == NULL); } } @@ -6556,8 +6607,6 @@ static KEY *find_key_ci(const char *key_name, KEY *key_start, KEY *key_end) @param thd Thread @param table The original table. - @param varchar Indicates that new definition has new - VARCHAR column. @param[in/out] ha_alter_info Data structure which already contains basic information about create options, field and keys for the new version of @@ -6592,7 +6641,7 @@ static KEY *find_key_ci(const char *key_name, KEY *key_start, KEY *key_end) @retval false success */ -static bool fill_alter_inplace_info(THD *thd, TABLE *table, bool varchar, +static bool fill_alter_inplace_info(THD *thd, TABLE *table, Alter_inplace_info *ha_alter_info) { Field **f_ptr, *field; @@ -6642,13 +6691,6 @@ static bool fill_alter_inplace_info(THD *thd, TABLE *table, bool varchar, if (alter_info->flags & ALTER_CHANGE_COLUMN) ha_alter_info->handler_flags|= ALTER_COLUMN_DEFAULT; - /* - If we altering table with old VARCHAR fields we will be automatically - upgrading VARCHAR column types. - */ - if (table->s->frm_version < FRM_VER_TRUE_VARCHAR && varchar) - ha_alter_info->handler_flags|= ALTER_STORED_COLUMN_TYPE; - DBUG_PRINT("info", ("handler_flags: %llu", ha_alter_info->handler_flags)); /* @@ -6690,6 +6732,30 @@ static bool fill_alter_inplace_info(THD *thd, TABLE *table, bool varchar, Check if type of column has changed. */ bool is_equal= field->is_equal(*new_field); + + if (is_equal) + { + const Type_handler *th= field->type_handler(); + if (th != th->type_handler_for_implicit_upgrade()) + { + /* + The field data type says it wants upgrade. + This should not be possible: + - if this is a new column definition, e.g. from statements like: + ALTER TABLE t1 ADD a INT; + ALTER TABLE t1 MODIFY a INT; + then it's coming from the parser, which returns + only up-to-date data types. + - if this is an old column definition, e.g. from: + ALTER TABLE t1 COMMENT 'new comment'; + it should have ealier called Column_definition_implicit_upgrade(), + which replaces old data types to up-to-date data types. + */ + DBUG_ASSERT(0); + is_equal= false; + } + } + if (!is_equal) { if (field->table->file->can_convert_nocopy(*field, *new_field)) @@ -7341,14 +7407,28 @@ bool alter_table_manage_keys(TABLE *table, int indexes_were_disabled, switch (keys_onoff) { case Alter_info::ENABLE: DEBUG_SYNC(table->in_use, "alter_table_enable_indexes"); - error= table->file->ha_enable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE); + error= table->file->ha_enable_indexes(key_map(table->s->keys), true); break; case Alter_info::LEAVE_AS_IS: if (!indexes_were_disabled) break; /* fall through */ case Alter_info::DISABLE: - error= table->file->ha_disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE); + { + key_map map= table->s->keys_in_use; + bool do_clear= false; + for (uint i=0; i < table->s->keys; i++) + { + if (!(table->s->key_info[i].flags & HA_NOSAME) && + i != table->s->next_number_index) + { + map.clear_bit(i); + do_clear= true; + } + } + if (do_clear) + error= table->file->ha_disable_indexes(map, true); + } } if (unlikely(error)) @@ -9093,7 +9173,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, case Alter_drop::CHECK_CONSTRAINT: case Alter_drop::PERIOD: my_error(ER_CANT_DROP_FIELD_OR_KEY, MYF(0), drop->type_name(), - alter_info->drop_list.head()->name); + drop->name); goto err; case Alter_drop::FOREIGN_KEY: // Leave the DROP FOREIGN KEY names in the alter_info->drop_list. @@ -10060,12 +10140,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, */ KEY *key_info; uint key_count; - /* - Remember if the new definition has new VARCHAR column; - create_info->varchar will be reset in create_table_impl()/ - mysql_prepare_create_table(). - */ - bool varchar= create_info->varchar, table_creation_was_logged= 0; + bool table_creation_was_logged= 0; bool binlog_as_create_select= 0, log_if_exists= 0; uint tables_opened; handlerton *new_db_type= create_info->db_type, *old_db_type; @@ -10095,6 +10170,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, TODO: this design is obsolete and will be removed. */ int table_kind= check_if_log_table(table_list, FALSE, NullS); + const bool used_engine= create_info->used_fields & HA_CREATE_USED_ENGINE; if (table_kind) { @@ -10106,7 +10182,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, } /* Disable alter of log tables to unsupported engine */ - if ((create_info->used_fields & HA_CREATE_USED_ENGINE) && + if ((used_engine) && (!create_info->db_type || /* unknown engine */ !(create_info->db_type->flags & HTON_SUPPORT_LOG_TABLES))) { @@ -10196,14 +10272,14 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, if we can support implementing storage engine. */ if (WSREP(thd) && table && table->s->sequence && - wsrep_check_sequence(thd, thd->lex->create_info.seq_create_info)) + wsrep_check_sequence(thd, create_info->seq_create_info, used_engine)) DBUG_RETURN(TRUE); - if (WSREP(thd) && + if (WSREP(thd) && table && (thd->lex->sql_command == SQLCOM_ALTER_TABLE || thd->lex->sql_command == SQLCOM_CREATE_INDEX || thd->lex->sql_command == SQLCOM_DROP_INDEX) && - !wsrep_should_replicate_ddl(thd, table_list->table->s->db_type())) + !wsrep_should_replicate_ddl(thd, table->s->db_type())) DBUG_RETURN(true); #endif /* WITH_WSREP */ @@ -10701,12 +10777,10 @@ do_continue:; #endif #ifdef WITH_WSREP + // ALTER TABLE for sequence object, check can we support it if (table->s->sequence && WSREP(thd) && - wsrep_thd_is_local_toi(thd)) - { - if (wsrep_check_sequence(thd, create_info->seq_create_info)) + wsrep_check_sequence(thd, create_info->seq_create_info, used_engine)) DBUG_RETURN(TRUE); - } #endif /* WITH_WSREP */ /* @@ -10884,7 +10958,7 @@ do_continue:; bool use_inplace= true; /* Fill the Alter_inplace_info structure. */ - if (fill_alter_inplace_info(thd, table, varchar, &ha_alter_info)) + if (fill_alter_inplace_info(thd, table, &ha_alter_info)) goto err_new_table_cleanup; alter_ctx.tmp_storage_engine_name_partitioned= @@ -12501,17 +12575,11 @@ bool Sql_cmd_create_table_like::execute(THD *thd) #endif #ifdef WITH_WSREP - if (wsrep_ctas) + if (WSREP(thd) && + wsrep_check_support(thd, wsrep_ctas, used_engine, &create_info)) { - if (thd->variables.wsrep_trx_fragment_size > 0) - { - my_message( - ER_NOT_ALLOWED_COMMAND, - "CREATE TABLE AS SELECT is not supported with streaming replication", - MYF(0)); - res= 1; - goto end_with_restore_list; - } + res= 1; + goto end_with_restore_list; } #endif /* WITH_WSREP */ @@ -12663,6 +12731,7 @@ bool Sql_cmd_create_table_like::execute(THD *thd) create_table->table_name, create_table->db)) goto end_with_restore_list; +#ifdef WITH_WSREP /* In STATEMENT format, we probably have to replicate also temporary tables, like mysql replication does. Also check if the requested @@ -12671,33 +12740,32 @@ bool Sql_cmd_create_table_like::execute(THD *thd) if (WSREP(thd)) { handlerton *orig_ht= create_info.db_type; + if (!check_engine(thd, create_table->db.str, create_table->table_name.str, &create_info) && (!thd->is_current_stmt_binlog_format_row() || !create_info.tmp_table())) { -#ifdef WITH_WSREP if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && - wsrep_check_sequence(thd, lex->create_info.seq_create_info)) + wsrep_check_sequence(thd, lex->create_info.seq_create_info, used_engine)) DBUG_RETURN(true); - WSREP_TO_ISOLATION_BEGIN_ALTER(create_table->db.str, - create_table->table_name.str, - first_table, &alter_info, NULL, - &create_info) - { - WSREP_WARN("CREATE TABLE isolation failure"); + WSREP_TO_ISOLATION_BEGIN_ALTER(create_table->db.str, create_table->table_name.str, + first_table, &alter_info, NULL, &create_info) + { + WSREP_WARN("CREATE TABLE isolation failure"); res= true; goto end_with_restore_list; - } -#endif /* WITH_WSREP */ + } } // check_engine will set db_type to NULL if e.g. TEMPORARY is // not supported by the storage engine, this case is checked // again in mysql_create_table create_info.db_type= orig_ht; } +#endif /* WITH_WSREP */ + /* Regular CREATE TABLE */ res= mysql_create_table(thd, create_table, &create_info, &alter_info); } diff --git a/sql/sql_table.h b/sql/sql_table.h index fded8353..a75fa58a 100644 --- a/sql/sql_table.h +++ b/sql/sql_table.h @@ -216,8 +216,4 @@ extern MYSQL_PLUGIN_IMPORT const LEX_CSTRING primary_key_name; bool check_engine(THD *, const char *, const char *, HA_CREATE_INFO *); -#ifdef WITH_WSREP -bool wsrep_check_sequence(THD* thd, const class sequence_definition *seq); -#endif - #endif /* SQL_TABLE_INCLUDED */ diff --git a/sql/sql_type.cc b/sql/sql_type.cc index a086e338..b1911c79 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -41,6 +41,7 @@ Named_type_handler type_handler_bool("boolean"); Named_type_handler type_handler_stiny("tinyint"); Named_type_handler type_handler_sshort("smallint"); Named_type_handler type_handler_slong("int"); +Named_type_handler type_handler_slong_ge0("int"); Named_type_handler type_handler_sint24("mediumint"); Named_type_handler type_handler_slonglong("bigint"); Named_type_handler type_handler_utiny("tiny unsigned"); @@ -4620,6 +4621,10 @@ bool Type_handler_general_purpose_int:: bool unsigned_flag= items[0]->unsigned_flag; for (uint i= 1; i < nitems; i++) { + /* + TODO: avoid creating DECIMAL for a mix of ulong and slong_ge0. + It's too late for 10.5. Let's do it in a higher version. + */ if (unsigned_flag != items[i]->unsigned_flag) { // Convert a mixture of signed and unsigned int to decimal @@ -4629,6 +4634,21 @@ bool Type_handler_general_purpose_int:: } } func->aggregate_attributes_int(items, nitems); + for (uint i= 0; i < nitems; i++) + { + if (items[i]->type_handler() == &type_handler_slong_ge0) + { + /* + A slong_ge0 argument found. + We need to add an extra character for the sign. + TODO: rewrite aggregate_attributes_int() to find + the maximum decimal_precision() instead of the maximum max_length. + This change is too late for 10.5, so let's do it in a higher version. + */ + uint digits_and_sign= items[i]->decimal_precision() + 1; + set_if_bigger(func->max_length, digits_and_sign); + } + } handler->set_handler(func->unsigned_flag ? handler->type_handler()->type_handler_unsigned() : handler->type_handler()->type_handler_signed()); @@ -4924,6 +4944,13 @@ bool Type_handler_real_result:: /*************************************************************************/ +bool Type_handler_long_ge0:: + Item_sum_hybrid_fix_length_and_dec(Item_sum_hybrid *func) const +{ + return func->fix_length_and_dec_sint_ge0(); +} + + bool Type_handler_int_result:: Item_sum_hybrid_fix_length_and_dec(Item_sum_hybrid *func) const { @@ -6366,6 +6393,14 @@ bool Type_handler_int_result:: } +bool Type_handler_long_ge0:: + Item_func_round_fix_length_and_dec(Item_func_round *item) const +{ + item->fix_arg_slong_ge0(); + return false; +} + + bool Type_handler_year:: Item_func_round_fix_length_and_dec(Item_func_round *item) const { @@ -6587,6 +6622,14 @@ bool Type_handler_int_result:: } +bool Type_handler_long_ge0:: + Item_func_abs_fix_length_and_dec(Item_func_abs *item) const +{ + item->fix_length_and_dec_sint_ge0(); + return false; +} + + bool Type_handler_real_result:: Item_func_abs_fix_length_and_dec(Item_func_abs *item) const { @@ -6697,6 +6740,22 @@ bool Type_handler:: } +bool Type_handler_long_ge0:: + Item_func_signed_fix_length_and_dec(Item_func_signed *item) const +{ + item->fix_length_and_dec_sint_ge0(); + return false; +} + + +bool Type_handler_long_ge0:: + Item_func_unsigned_fix_length_and_dec(Item_func_unsigned *item) const +{ + item->fix_length_and_dec_sint_ge0(); + return false; +} + + bool Type_handler_string_result:: Item_func_signed_fix_length_and_dec(Item_func_signed *item) const { @@ -7182,6 +7241,18 @@ decimal_digits_t Type_handler_int_result::Item_decimal_precision(const Item *ite return (decimal_digits_t) MY_MIN(prec, DECIMAL_MAX_PRECISION); } +decimal_digits_t Type_handler_long_ge0::Item_decimal_precision(const Item *item) const +{ + DBUG_ASSERT(item->max_length); + DBUG_ASSERT(!item->decimals); + /* + Unlinke in Type_handler_long, Type_handler_long_ge does + not reserve one character for the sign. All max_length + characters are digits. + */ + return MY_MIN(item->max_length, DECIMAL_MAX_PRECISION); +} + decimal_digits_t Type_handler_time_common::Item_decimal_precision(const Item *item) const { return (decimal_digits_t) (7 + MY_MIN(item->decimals, TIME_SECOND_PART_DIGITS)); @@ -8183,6 +8254,26 @@ Field *Type_handler_long:: } +Field *Type_handler_long_ge0:: + make_table_field_from_def(TABLE_SHARE *share, MEM_ROOT *mem_root, + const LEX_CSTRING *name, + const Record_addr &rec, const Bit_addr &bit, + const Column_definition_attributes *attr, + uint32 flags) const +{ + /* + We're converting signed long_ge0 to signed long. + So add one character for the sign. + */ + return new (mem_root) + Field_long(rec.ptr(), (uint32) attr->length + 1/*sign*/, + rec.null_ptr(), rec.null_bit(), + attr->unireg_check, name, + f_is_zerofill(attr->pack_flag) != 0, + f_is_dec(attr->pack_flag) == 0); +} + + Field *Type_handler_longlong:: make_table_field_from_def(TABLE_SHARE *share, MEM_ROOT *mem_root, const LEX_CSTRING *name, @@ -8804,41 +8895,48 @@ bool Type_handler_string_result::union_element_finalize(Item_type_holder* item) /***************************************************************************/ -void Type_handler_var_string:: - Column_definition_implicit_upgrade(Column_definition *c) const + +const Type_handler * +Type_handler_var_string::type_handler_for_implicit_upgrade() const +{ + return &type_handler_varchar; +} + + +void Type_handler:: + Column_definition_implicit_upgrade_to_this(Column_definition *old) const { - // Change old VARCHAR to new VARCHAR - c->set_handler(&type_handler_varchar); + old->set_handler(this); } void Type_handler_time_common:: - Column_definition_implicit_upgrade(Column_definition *c) const + Column_definition_implicit_upgrade_to_this(Column_definition *old) const { if (opt_mysql56_temporal_format) - c->set_handler(&type_handler_time2); + old->set_handler(&type_handler_time2); else - c->set_handler(&type_handler_time); + old->set_handler(&type_handler_time); } void Type_handler_datetime_common:: - Column_definition_implicit_upgrade(Column_definition *c) const + Column_definition_implicit_upgrade_to_this(Column_definition *old) const { if (opt_mysql56_temporal_format) - c->set_handler(&type_handler_datetime2); + old->set_handler(&type_handler_datetime2); else - c->set_handler(&type_handler_datetime); + old->set_handler(&type_handler_datetime); } void Type_handler_timestamp_common:: - Column_definition_implicit_upgrade(Column_definition *c) const + Column_definition_implicit_upgrade_to_this(Column_definition *old) const { if (opt_mysql56_temporal_format) - c->set_handler(&type_handler_timestamp2); + old->set_handler(&type_handler_timestamp2); else - c->set_handler(&type_handler_timestamp); + old->set_handler(&type_handler_timestamp); } diff --git a/sql/sql_type.h b/sql/sql_type.h index 5ce17447..b092433b 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -3836,6 +3836,16 @@ public: const Type_handler *res= type_handler_base(); return res ? res : this; } + /* + In 10.11.8 the semantics of this method has changed to the opposite. + It used to be called with the old data type handler as "this". + Now it's called with the new data type hander as "this". + To avoid problems during merges, the method name was renamed. + */ + virtual const Type_handler *type_handler_for_implicit_upgrade() const + { + return this; + } virtual const Type_handler *type_handler_for_comparison() const= 0; virtual const Type_handler *type_handler_for_native_format() const { @@ -3981,9 +3991,13 @@ public: virtual bool validate_implicit_default_value(THD *thd, const Column_definition &def) const; - // Automatic upgrade, e.g. for ALTER TABLE t1 FORCE - virtual void Column_definition_implicit_upgrade(Column_definition *c) const - { } + /* + Automatic upgrade, e.g. for REPAIR or ALTER TABLE t1 FORCE + - from the data type specified in old->type_handler() + - to the data type specified in "this" + */ + virtual void Column_definition_implicit_upgrade_to_this( + Column_definition *old) const; // Validate CHECK constraint after the parser virtual bool Column_definition_validate_check_constraint(THD *thd, Column_definition *c) @@ -5773,6 +5787,38 @@ public: }; +/* + The expression of this type reports itself as signed, + however it's known not to return negative values. + Items of this data type count only digits in Item::max_length, + without adding +1 for the sign. This allows expressions + of this type convert nicely to VARCHAR and DECIMAL. + For example, YEAR(now()) is: + - VARCHAR(4) in a string context + - DECIMAL(4,0) in a decimal context + - but INT(5) in an integer context +*/ +class Type_handler_long_ge0: public Type_handler_long +{ +public: + decimal_digits_t Item_decimal_precision(const Item *item) const override; + bool Item_func_signed_fix_length_and_dec(Item_func_signed *item) + const override; + bool Item_func_unsigned_fix_length_and_dec(Item_func_unsigned *item) + const override; + bool Item_func_abs_fix_length_and_dec(Item_func_abs *) const override; + bool Item_func_round_fix_length_and_dec(Item_func_round *) const override; + bool Item_sum_hybrid_fix_length_and_dec(Item_sum_hybrid *func) const override; + Field *make_table_field_from_def(TABLE_SHARE *share, + MEM_ROOT *mem_root, + const LEX_CSTRING *name, + const Record_addr &addr, + const Bit_addr &bit, + const Column_definition_attributes *attr, + uint32 flags) const override; +}; + + class Type_handler_ulong: public Type_handler_long { public: @@ -6188,7 +6234,8 @@ public: const Type_handler *type_handler_for_comparison() const override; int stored_field_cmp_to_item(THD *thd, Field *field, Item *item) const override; - void Column_definition_implicit_upgrade(Column_definition *c) const override; + void Column_definition_implicit_upgrade_to_this( + Column_definition *old) const override; bool Column_definition_fix_attributes(Column_definition *c) const override; bool Column_definition_attributes_frm_unpack(Column_definition_attributes *attr, @@ -6512,7 +6559,8 @@ public: const Type_cast_attributes &attr) const override; bool validate_implicit_default_value(THD *thd, const Column_definition &def) const override; - void Column_definition_implicit_upgrade(Column_definition *c) const override; + void Column_definition_implicit_upgrade_to_this( + Column_definition *old) const override; bool Column_definition_fix_attributes(Column_definition *c) const override; bool Column_definition_attributes_frm_unpack(Column_definition_attributes *attr, @@ -6650,7 +6698,8 @@ public: { return true; } - void Column_definition_implicit_upgrade(Column_definition *c) const override; + void Column_definition_implicit_upgrade_to_this( + Column_definition *old) const override; bool Column_definition_attributes_frm_unpack(Column_definition_attributes *attr, TABLE_SHARE *share, @@ -7000,6 +7049,7 @@ public: { return MYSQL_TYPE_VARCHAR; } + const Type_handler *type_handler_for_implicit_upgrade() const override; const Type_handler *type_handler_for_tmp_table(const Item *item) const override { return varstring_type_handler(item); @@ -7007,7 +7057,6 @@ public: uint32 max_display_length_for_field(const Conv_source &src) const override; void show_binlog_type(const Conv_source &src, const Field &dst, String *str) const override; - void Column_definition_implicit_upgrade(Column_definition *c) const override; bool Column_definition_fix_attributes(Column_definition *c) const override; bool Column_definition_prepare_stage2(Column_definition *c, handler *file, @@ -7607,6 +7656,7 @@ extern MYSQL_PLUGIN_IMPORT Named_type_handler type_han extern MYSQL_PLUGIN_IMPORT Named_type_handler type_handler_sshort; extern MYSQL_PLUGIN_IMPORT Named_type_handler type_handler_sint24; extern MYSQL_PLUGIN_IMPORT Named_type_handler type_handler_slong; +extern MYSQL_PLUGIN_IMPORT Named_type_handler type_handler_slong_ge0; extern MYSQL_PLUGIN_IMPORT Named_type_handler type_handler_slonglong; extern Named_type_handler type_handler_utiny; diff --git a/sql/sql_type_fixedbin.h b/sql/sql_type_fixedbin.h index 65418c34..a05b0849 100644 --- a/sql/sql_type_fixedbin.h +++ b/sql/sql_type_fixedbin.h @@ -1125,6 +1125,11 @@ public: return FbtImpl::max_char_length(); } + const Type_handler *type_handler_for_implicit_upgrade() const override + { + return TypeCollectionImpl::singleton()-> + type_handler_for_implicit_upgrade(this); + } const Type_handler *type_handler_for_comparison() const override { return this; @@ -1943,6 +1948,12 @@ public: return NULL; } + const Type_handler *type_handler_for_implicit_upgrade( + const Type_handler *from) const + { + return from; + } + static Type_collection_fbt *singleton() { static Type_collection_fbt tc; diff --git a/sql/sql_udf.h b/sql/sql_udf.h index cb195435..5bd2c6e5 100644 --- a/sql/sql_udf.h +++ b/sql/sql_udf.h @@ -147,6 +147,20 @@ class udf_handler :public Sql_alloc *null_value= (my_bool) (is_null || error); } String *val_str(String *str,String *save_str); + + udf_handler(const udf_handler &orig) + { + u_d = orig.u_d; + buffers = orig.buffers; + f_args = orig.f_args; + initid = orig.initid; + num_buffer = orig.num_buffer; + error = orig.error; + is_null = orig.is_null; + initialized = orig.initialized; + args = orig.args; + not_original = true; + } }; diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 6e839409..3413b840 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -116,12 +116,12 @@ int select_unit::send_data(List &values) if (table->no_rows_with_nulls) table->null_catch_flags= CHECK_ROW_FOR_NULLS_TO_REJECT; - fill_record(thd, table, table->field + addon_cnt, values, true, false); + fill_record(thd, table, table->field + addon_cnt, values, true, false, true); /* set up initial values for records to be written */ if (addon_cnt && step == UNION_TYPE) { DBUG_ASSERT(addon_cnt == 1); - table->field[0]->store((longlong) curr_step, 1); + table->field[0]->store((ulonglong) curr_step, 1); } if (unlikely(thd->is_error())) @@ -485,7 +485,7 @@ bool select_unit_ext::disable_index_if_needed(SELECT_LEX *curr_sl) !curr_sl->next_select()) ) { is_index_enabled= false; - if (table->file->ha_disable_indexes(HA_KEY_SWITCH_ALL)) + if (table->file->ha_disable_indexes(key_map(0), false)) return false; table->no_keyread=1; return true; @@ -619,7 +619,7 @@ int select_unit_ext::send_data(List &values) if (table->no_rows_with_nulls) table->null_catch_flags= CHECK_ROW_FOR_NULLS_TO_REJECT; - fill_record(thd, table, table->field + addon_cnt, values, true, false); + fill_record(thd, table, table->field + addon_cnt, values, true, false, true); /* set up initial values for records to be written */ if ( step == UNION_TYPE ) { @@ -1003,7 +1003,7 @@ int select_union_direct::send_data(List &items) } send_records++; - fill_record(thd, table, table->field, items, true, false); + fill_record(thd, table, table->field, items, true, false, true); if (unlikely(thd->is_error())) return true; /* purecov: inspected */ @@ -1265,26 +1265,21 @@ bool st_select_lex_unit::join_union_item_types(THD *thd_arg, } -bool init_item_int(THD* thd, Item_int* &item) +static bool init_item_int(THD* thd, Item_int* &item) { if (!item) { - Query_arena *arena, backup_arena; - arena= thd->activate_stmt_arena_if_needed(&backup_arena); - item= new (thd->mem_root) Item_int(thd, 0); - if (arena) - thd->restore_active_arena(arena, &backup_arena); - if (!item) - return false; + return true; } else { item->value= 0; } - return true; + + return false; } @@ -1760,8 +1755,12 @@ cont: for(uint i= 0; i< hidden; i++) { - init_item_int(thd, addon_fields[i]); - types.push_front(addon_fields[i]); + if (init_item_int(thd, addon_fields[i]) || + types.push_front(addon_fields[i])) + { + types.empty(); + goto err; + } addon_fields[i]->name.str= i ? "__CNT_1" : "__CNT_2"; addon_fields[i]->name.length= 7; } @@ -2085,7 +2084,7 @@ bool st_select_lex_unit::optimize() /* re-enabling indexes for next subselect iteration */ if ((union_result->force_enable_index_if_needed() || union_distinct)) { - if(table->file->ha_enable_indexes(HA_KEY_SWITCH_ALL)) + if(table->file->ha_enable_indexes(key_map(table->s->keys), false)) DBUG_ASSERT(0); else table->no_keyread= 0; @@ -2185,7 +2184,7 @@ bool st_select_lex_unit::exec() union_result->table && union_result->table->is_created()) { union_result->table->file->ha_delete_all_rows(); - union_result->table->file->ha_enable_indexes(HA_KEY_SWITCH_ALL); + union_result->table->file->ha_enable_indexes(key_map(table->s->keys), false); } } @@ -2252,7 +2251,7 @@ bool st_select_lex_unit::exec() { // This is UNION DISTINCT, so there should be a fake_select_lex DBUG_ASSERT(fake_select_lex != NULL); - if (unlikely(table->file->ha_disable_indexes(HA_KEY_SWITCH_ALL))) + if (table->file->ha_disable_indexes(key_map(0), false)) DBUG_RETURN(TRUE); table->no_keyread=1; } diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 145299ac..6acea2d5 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -257,7 +257,7 @@ static void prepare_record_for_error_message(int error, TABLE *table) Field *field; uint keynr; MY_BITMAP unique_map; /* Fields in offended unique. */ - my_bitmap_map unique_map_buf[bitmap_buffer_size(MAX_FIELDS)]; + my_bitmap_map unique_map_buf[bitmap_buffer_size(MAX_FIELDS)/sizeof(my_bitmap_map)]; DBUG_ENTER("prepare_record_for_error_message"); /* @@ -2182,6 +2182,10 @@ int multi_update::prepare(List ¬_used_values, { Item *value= value_it++; uint offset= item->field->table->pos_in_table_list->shared; + + if (value->associate_with_target_field(thd, item)) + DBUG_RETURN(1); + fields_for_table[offset]->push_back(item, thd->mem_root); values_for_table[offset]->push_back(value, thd->mem_root); } @@ -2680,7 +2684,7 @@ int multi_update::send_data(List ¬_used_values) tmp_table_param[offset].func_count); fill_record(thd, tmp_table, tmp_table->field + 1 + unupdated_check_opt_tables.elements, - *values_for_table[offset], TRUE, FALSE); + *values_for_table[offset], true, false, false); /* Write row, ignoring duplicated updates to a row */ error= tmp_table->file->ha_write_tmp_row(tmp_table->record[0]); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index dcf0e995..577c90e6 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -80,6 +80,9 @@ #pragma GCC diagnostic ignored "-Wunused-label" /* yyexhaustedlab: */ #endif +/* Stack size 28200 with clang for MYSQLparse() and ORAparse() */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int yylex(void *yylval, void *yythd); #define yyoverflow(A,B,C,D,E,F) \ diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index dce04c59..0b873777 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -2937,17 +2937,28 @@ static Sys_var_ulong Sys_optimizer_trace_max_mem_size( SESSION_VAR(optimizer_trace_max_mem_size), CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, ULONG_MAX), DEFAULT(1024 * 1024), BLOCK_SIZE(1)); -static Sys_var_ulong Sys_optimizer_adjust_secondary_key_costs( + +/* + Symbolic names for OPTIMIZER_ADJ_* flags in sql_priv.h +*/ +static const char *adjust_secondary_key_cost[]= +{ + "adjust_secondary_key_cost", "disable_max_seek", "disable_forced_index_in_group_by", 0 +}; + + +static Sys_var_set Sys_optimizer_adjust_secondary_key_costs( "optimizer_adjust_secondary_key_costs", - "0 = No changes. " - "1 = Update secondary key costs for ranges to be at least 5x of clustered " - "primary key costs. " - "2 = Remove 'max_seek optimization' for secondary keys and slight " + "A bit field with the following values: " + "adjust_secondary_key_cost = Update secondary key costs for ranges to be at least " + "5x of clustered primary key costs. " + "disable_max_seek = Disable 'max_seek optimization' for secondary keys and slight " "adjustment of filter cost. " - "This option will be deleted in MariaDB 11.0 as it is not needed with the " + "disable_forced_index_in_group_by = Disable automatic forced index in GROUP BY. " + "This variable will be deleted in MariaDB 11.0 as it is not needed with the " "new 11.0 optimizer.", SESSION_VAR(optimizer_adjust_secondary_key_costs), CMD_LINE(REQUIRED_ARG), - VALID_RANGE(0, 2), DEFAULT(0), BLOCK_SIZE(1)); + adjust_secondary_key_cost, DEFAULT(0)); static Sys_var_charptr_fscs Sys_pid_file( diff --git a/sql/sys_vars.inl b/sql/sys_vars.inl index 2fd6d042..932b12fc 100644 --- a/sql/sys_vars.inl +++ b/sql/sys_vars.inl @@ -947,21 +947,10 @@ public: { option.var_type|= GET_STR; } bool do_check(THD *thd, set_var *var) { - char buff[STRING_BUFFER_USUAL_SIZE]; - String str(buff, sizeof(buff), system_charset_info), *res; - - if (!(res=var->value->val_str(&str))) - { + bool rc= Sys_var_charptr::do_string_check(thd, var, charset(thd)); + if (var->save_result.string_value.str == nullptr) var->save_result.string_value.str= const_cast(""); - var->save_result.string_value.length= 0; - } - else - { - size_t len= res->length(); - var->save_result.string_value.str= thd->strmake(res->ptr(), len); - var->save_result.string_value.length= len; - } - return false; + return rc; } bool session_update(THD *thd, set_var *var) { diff --git a/sql/table.cc b/sql/table.cc index 88b65fe0..3f4b529f 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -50,6 +50,7 @@ #include "wsrep_schema.h" #endif #include "log_event.h" // MAX_TABLE_MAP_ID +#include "sql_class.h" /* For MySQL 5.7 virtual fields */ #define MYSQL57_GENERATED_FIELD 128 @@ -3331,6 +3332,8 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, goto err; // Wrong field definition reg_field->flags |= AUTO_INCREMENT_FLAG; } + else + share->next_number_index= MAX_KEY; if (share->blob_fields) { @@ -5868,6 +5871,59 @@ void TABLE::reset_item_list(List *item_list, uint skip) const } } +TABLE_LIST::TABLE_LIST(THD *thd, + LEX_CSTRING db_str, + bool fqtn, + LEX_CSTRING alias_str, + bool has_alias_ptr, + Table_ident *table_ident, + thr_lock_type lock_t, + enum_mdl_type mdl_t, + ulong table_opts, + bool info_schema, + st_select_lex *sel, + List *index_hints_ptr, + LEX_STRING *option_ptr) +{ + db= db_str; + is_fqtn= fqtn; + alias= alias_str; + is_alias= has_alias_ptr; + if (lower_case_table_names) + { + if (table_ident->table.length) + table_ident->table.length= my_casedn_str(files_charset_info, + (char*) table_ident->table.str); + if (db.length && db.str != any_db.str) + db.length= my_casedn_str(files_charset_info, (char*) db.str); + } + + table_name= table_ident->table; + lock_type= lock_t; + mdl_type= mdl_t; + table_options= table_opts; + updating= table_options & TL_OPTION_UPDATING; + /* TODO: remove TL_OPTION_FORCE_INDEX as it looks like it's not used */ + force_index= table_options & TL_OPTION_FORCE_INDEX; + ignore_leaves= table_options & TL_OPTION_IGNORE_LEAVES; + sequence= table_options & TL_OPTION_SEQUENCE; + derived= table_ident->sel; + + if (!table_ident->sel && info_schema) + { + schema_table= find_schema_table(thd, &table_name); + schema_table_name= table_name; + } + select_lex= sel; + /* + We can't cache internal temporary tables between prepares as the + table may be deleted before next exection. + */ + cacheable_table= !table_ident->is_derived_table(); + index_hints= index_hints_ptr; + option= option_ptr ? option_ptr->str : 0; +} + /* calculate md5 of query @@ -9159,10 +9215,9 @@ int TABLE::update_default_fields(bool ignore_errors) int TABLE::update_generated_fields() { int res= 0; - if (found_next_number_field) + if (next_number_field) { - next_number_field= found_next_number_field; - res= found_next_number_field->set_default(); + res= next_number_field->set_default(); if (likely(!res)) res= file->update_auto_increment(); next_number_field= NULL; @@ -9177,6 +9232,18 @@ int TABLE::update_generated_fields() return res; } +void TABLE::period_prepare_autoinc() +{ + if (!found_next_number_field) + return; + /* Don't generate a new value if the autoinc index is WITHOUT OVERLAPS */ + DBUG_ASSERT(s->next_number_index < MAX_KEY); + if (key_info[s->next_number_index].without_overlaps) + return; + + next_number_field= found_next_number_field; +} + int TABLE::period_make_insert(Item *src, Field *dst) { THD *thd= in_use; @@ -9186,7 +9253,10 @@ int TABLE::period_make_insert(Item *src, Field *dst) int res= src->save_in_field(dst, true); if (likely(!res)) + { + period_prepare_autoinc(); res= update_generated_fields(); + } if (likely(!res) && triggers) res= triggers->process_triggers(thd, TRG_EVENT_INSERT, @@ -9511,7 +9581,8 @@ bool TABLE::insert_all_rows_into_tmp_table(THD *thd, } if (file->indexes_are_disabled()) - tmp_table->file->ha_disable_indexes(HA_KEY_SWITCH_ALL); + tmp_table->file->ha_disable_indexes(key_map(0), false); + file->ha_index_or_rnd_end(); if (unlikely(file->ha_rnd_init_with_error(1))) diff --git a/sql/table.h b/sql/table.h index ebf582c1..b0b0f032 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1840,6 +1840,7 @@ public: #endif int update_generated_fields(); + void period_prepare_autoinc(); int period_make_insert(Item *src, Field *dst); int insert_portion_of_time(THD *thd, const vers_select_conds_t &period_conds, ha_rows *rows_inserted); @@ -2219,8 +2220,23 @@ struct TABLE_CHAIN void set_end_pos(TABLE_LIST **pos) { end_pos= pos; } }; +class Table_ident; struct TABLE_LIST { + TABLE_LIST(THD *thd, + LEX_CSTRING db_str, + bool fqtn, + LEX_CSTRING alias_str, + bool has_alias_ptr, + Table_ident *table_ident, + thr_lock_type lock_t, + enum_mdl_type mdl_t, + ulong table_opts, + bool info_schema, + st_select_lex *sel, + List *index_hints_ptr, + LEX_STRING *option_ptr); + TABLE_LIST() = default; /* Remove gcc warning */ enum prelocking_types diff --git a/sql/temporary_tables.cc b/sql/temporary_tables.cc index fa9abf7b..a018ba5a 100644 --- a/sql/temporary_tables.cc +++ b/sql/temporary_tables.cc @@ -1128,11 +1128,16 @@ TABLE *THD::open_temporary_table(TMP_TABLE_SHARE *share, DBUG_RETURN(NULL); /* Out of memory */ } + uint flags= ha_open_options | (open_options & HA_OPEN_FOR_CREATE); + /* + In replication, temporary tables are not confined to a single + thread/THD. + */ + if (slave_thread) + flags|= HA_OPEN_GLOBAL_TMP_TABLE; if (open_table_from_share(this, share, &alias, (uint) HA_OPEN_KEYFILE, - EXTRA_RECORD, - (ha_open_options | - (open_options & HA_OPEN_FOR_CREATE)), + EXTRA_RECORD, flags, table, false)) { my_free(table); diff --git a/sql/threadpool_generic.cc b/sql/threadpool_generic.cc index 7261eabf..0a653474 100644 --- a/sql/threadpool_generic.cc +++ b/sql/threadpool_generic.cc @@ -107,7 +107,7 @@ struct pool_timer_t mysql_cond_t cond; volatile uint64 current_microtime; std::atomic next_timeout_check; - int tick_interval; + uint tick_interval; bool shutdown; pthread_t timer_thread_id; }; @@ -569,7 +569,7 @@ static void* timer_thread(void *param) struct timespec ts; int err; - set_timespec_nsec(ts,timer->tick_interval*1000000); + set_timespec_nsec(ts, timer->tick_interval*1000000LL); mysql_mutex_lock(&timer->mutex); err= mysql_cond_timedwait(&timer->cond, &timer->mutex, &ts); if (timer->shutdown) diff --git a/sql/threadpool_win.cc b/sql/threadpool_win.cc index ed68e31c..65e40598 100644 --- a/sql/threadpool_win.cc +++ b/sql/threadpool_win.cc @@ -355,10 +355,13 @@ int TP_pool_win::init() if (IS_SYSVAR_AUTOSIZE(&threadpool_max_threads)) { /* - Nr 500 comes from Microsoft documentation, - there is no API for GetThreadpoolThreadMaxThreads() + Default 500 comes from Microsoft documentation, + there is no API for GetThreadpoolThreadMaxThreads(). + + To avoid deadlocks, allow at least max_connections + safety + margin threads in the pool. */ - SYSVAR_AUTOSIZE(threadpool_max_threads,500); + SYSVAR_AUTOSIZE(threadpool_max_threads,std::max(500U,(uint)max_connections + 10)); } else { diff --git a/sql/transaction.cc b/sql/transaction.cc index a6dbf57c..f34307ac 100644 --- a/sql/transaction.cc +++ b/sql/transaction.cc @@ -255,11 +255,15 @@ bool trans_begin(THD *thd, uint flags) bool trans_commit(THD *thd) { int res; + PSI_stage_info org_stage; DBUG_ENTER("trans_commit"); if (trans_check(thd)) DBUG_RETURN(TRUE); + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_commit); + thd->server_status&= ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); @@ -288,6 +292,7 @@ bool trans_commit(THD *thd) DBUG_ASSERT(thd->m_transaction_psi == NULL); trans_track_end_trx(thd); + THD_STAGE_INFO(thd, org_stage); DBUG_RETURN(MY_TEST(res)); } @@ -320,6 +325,10 @@ bool trans_commit_implicit(THD *thd) if (thd->in_multi_stmt_transaction_mode() || (thd->variables.option_bits & OPTION_TABLE_LOCK)) { + PSI_stage_info org_stage; + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_commit_implicit); + /* Safety if one did "drop table" on locked tables */ if (!thd->locked_tables_mode) thd->variables.option_bits&= ~OPTION_TABLE_LOCK; @@ -327,6 +336,8 @@ bool trans_commit_implicit(THD *thd) ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); res= MY_TEST(ha_commit_trans(thd, TRUE)); + + THD_STAGE_INFO(thd, org_stage); } thd->variables.option_bits&= ~(OPTION_BEGIN | OPTION_BINLOG_THIS_TRX); @@ -361,11 +372,15 @@ bool trans_commit_implicit(THD *thd) bool trans_rollback(THD *thd) { int res; + PSI_stage_info org_stage; DBUG_ENTER("trans_rollback"); if (trans_check(thd)) DBUG_RETURN(TRUE); + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_rollback); + thd->server_status&= ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); @@ -384,6 +399,7 @@ bool trans_rollback(THD *thd) trans_track_end_trx(thd); + THD_STAGE_INFO(thd, org_stage); DBUG_RETURN(MY_TEST(res)); } @@ -406,8 +422,12 @@ bool trans_rollback(THD *thd) bool trans_rollback_implicit(THD *thd) { int res; + PSI_stage_info org_stage; DBUG_ENTER("trans_rollback_implict"); + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_rollback_implicit); + /* Always commit/rollback statement transaction before manipulating with the normal one. @@ -434,6 +454,7 @@ bool trans_rollback_implicit(THD *thd) trans_track_end_trx(thd); + THD_STAGE_INFO(thd, org_stage); DBUG_RETURN(MY_TEST(res)); } @@ -469,11 +490,17 @@ bool trans_commit_stmt(THD *thd) if (thd->transaction->stmt.ha_list) { + PSI_stage_info org_stage; + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_commit); + res= ha_commit_trans(thd, FALSE); if (! thd->in_active_multi_stmt_transaction()) { trans_reset_one_shot_chistics(thd); } + + THD_STAGE_INFO(thd, org_stage); } mysql_mutex_assert_not_owner(&LOCK_prepare_ordered); @@ -532,9 +559,15 @@ bool trans_rollback_stmt(THD *thd) if (thd->transaction->stmt.ha_list) { + PSI_stage_info org_stage; + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_rollback); + ha_rollback_trans(thd, FALSE); if (! thd->in_active_multi_stmt_transaction()) trans_reset_one_shot_chistics(thd); + + THD_STAGE_INFO(thd, org_stage); } #ifdef HAVE_REPLICATION diff --git a/sql/tztime.cc b/sql/tztime.cc index 8ddb9f0e..e6cebbbd 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -2725,6 +2725,8 @@ static const char *lock_tables= " time_zone_transition WRITE,\n" " time_zone_transition_type WRITE"; static const char *trunc_tables_const= + "SET @old_alter_alg=@@SESSION.alter_algorithm;\n" + "SET session alter_algorithm='COPY';\n" "TRUNCATE TABLE time_zone;\n" "TRUNCATE TABLE time_zone_name;\n" "TRUNCATE TABLE time_zone_transition;\n" @@ -2873,6 +2875,9 @@ main(int argc, char **argv) "concat('ALTER TABLE time_zone_transition_type ENGINE=', " "@time_zone_transition_type_engine, ', ORDER BY Time_zone_id, Transition_type_id'), 'do 0');\n"); + if (argc == 1 && !opt_leap) + printf("SET session alter_algorithm=@old_alter_alg;\n"); + free_allocated_data(); my_end(0); return 0; diff --git a/sql/unireg.cc b/sql/unireg.cc index ea0b94eb..05a4fbb1 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -806,7 +806,15 @@ static bool pack_vcols(THD *thd, String *buf, List &create_fields, ? VCOL_GENERATED_STORED : VCOL_GENERATED_VIRTUAL)) return 1; if (field->has_default_expression() && !field->has_default_now_unireg_check()) - if (pack_expression(buf, field->default_value, field_nr, VCOL_DEFAULT)) + if (pack_expression(buf, field->default_value, field_nr, VCOL_DEFAULT) || + /* + field->has_default_expression() can return error (e.g. because + the method Item_param::basic_const_item invokes + invalid_default_param() + in case either DEFAULT_VALUE or IGNORE_VALUE is handled). + Take this fact into account and return error in this case. + */ + thd->is_error()) return 1; if (field->check_constraint) if (pack_expression(buf, field->check_constraint, field_nr, diff --git a/sql/unireg.h b/sql/unireg.h index 1eec3585..fa657a26 100644 --- a/sql/unireg.h +++ b/sql/unireg.h @@ -217,7 +217,7 @@ LEX_CUSTRING build_frm_image(THD *thd, const LEX_CSTRING &table, #define FRM_FORMINFO_SIZE 288 #define FRM_MAX_SIZE (1024*1024) -static inline bool is_binary_frm_header(uchar *head) +static inline bool is_binary_frm_header(const uchar *head) { return head[0] == 254 && head[1] == 1 diff --git a/sql/winmain.cc b/sql/winmain.cc index 2ed43130..ff409a6d 100644 --- a/sql/winmain.cc +++ b/sql/winmain.cc @@ -220,6 +220,25 @@ static const char *get_svc_name(const char *arg) return arg ? arg : "MySQL"; } +/* + Disable CPU throttling for the process. + + Windows 11 heuristics misdetects server as a background process and runs it + on "efficiency" cores, in hybrid architectures such as Alder Lake (12th + generation Intel Core).This results in serious performance degradation. +*/ +void disable_cpu_throttling() +{ +#ifdef PROCESS_POWER_THROTTLING_EXECUTION_SPEED + PROCESS_POWER_THROTTLING_STATE power_throttling{}; + power_throttling.Version= PROCESS_POWER_THROTTLING_CURRENT_VERSION; + power_throttling.ControlMask= PROCESS_POWER_THROTTLING_EXECUTION_SPEED; + power_throttling.StateMask= 0; + SetProcessInformation(GetCurrentProcess(), ProcessPowerThrottling, + &power_throttling, sizeof(power_throttling)); +#endif +} + /* Main function on Windows. Runs mysqld as normal process, or as a service. @@ -231,6 +250,7 @@ __declspec(dllexport) int mysqld_win_main(int argc, char **argv) save_argv= argv; save_argc= argc; + disable_cpu_throttling(); /* If no special arguments are given, service name is nor present run as normal program. diff --git a/sql/wsrep_applier.cc b/sql/wsrep_applier.cc index 8767f698..eee9dc02 100644 --- a/sql/wsrep_applier.cc +++ b/sql/wsrep_applier.cc @@ -177,8 +177,7 @@ int wsrep_apply_events(THD* thd, break; } - - if (!thd->variables.gtid_seq_no && wsrep_thd_is_toi(thd) && + if (!thd->variables.gtid_seq_no && wsrep_thd_is_toi(thd) && (ev->get_type_code() == QUERY_EVENT)) { uint64 seqno= wsrep_gtid_server.seqno_inc(); @@ -188,18 +187,10 @@ int wsrep_apply_events(THD* thd, thd->variables.gtid_seq_no= seqno; } } + /* Use the original server id for logging. */ thd->set_server_id(ev->server_id); - thd->set_time(); // time the query - thd->transaction->start_time.reset(thd); thd->lex->current_select= 0; - if (!ev->when) - { - my_hrtime_t hrtime= my_hrtime(); - ev->when= hrtime_to_my_time(hrtime); - ev->when_sec_part= hrtime_sec_part(hrtime); - } - thd->variables.option_bits= (thd->variables.option_bits & ~OPTION_SKIP_REPLICATION) | (ev->flags & LOG_EVENT_SKIP_REPLICATION_F ? OPTION_SKIP_REPLICATION : 0); diff --git a/sql/wsrep_client_service.h b/sql/wsrep_client_service.h index 253d2f43..b74c52b0 100644 --- a/sql/wsrep_client_service.h +++ b/sql/wsrep_client_service.h @@ -57,6 +57,10 @@ public: { return false; } + bool is_prepared_xa() + { + return false; + } bool is_xa_rollback() { return false; diff --git a/sql/wsrep_high_priority_service.cc b/sql/wsrep_high_priority_service.cc index ecb0e487..7eb3f078 100644 --- a/sql/wsrep_high_priority_service.cc +++ b/sql/wsrep_high_priority_service.cc @@ -214,6 +214,7 @@ int Wsrep_high_priority_service::start_transaction( const wsrep::ws_handle& ws_handle, const wsrep::ws_meta& ws_meta) { DBUG_ENTER(" Wsrep_high_priority_service::start_transaction"); + m_thd->set_time(); DBUG_RETURN(m_thd->wsrep_cs().start_transaction(ws_handle, ws_meta) || trans_begin(m_thd)); } @@ -425,6 +426,7 @@ int Wsrep_high_priority_service::apply_toi(const wsrep::ws_meta& ws_meta, };); #endif + thd->set_time(); int ret= apply_events(thd, m_rli, data, err); wsrep_thd_set_ignored_error(thd, false); trans_commit(thd); diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 68649a95..5c2e0cb9 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1128,10 +1128,8 @@ void wsrep_recover() } } - -void wsrep_stop_replication(THD *thd) +static void wsrep_stop_replication_common(THD *thd) { - WSREP_INFO("Stop replication by %llu", (thd) ? thd->thread_id : 0); if (Wsrep_server_state::instance().state() != Wsrep_server_state::s_disconnected) { @@ -1144,10 +1142,10 @@ void wsrep_stop_replication(THD *thd) } } - /* my connection, should not terminate with wsrep_close_client_connection(), - make transaction to rollback - */ - if (thd && !thd->wsrep_applier) trans_rollback(thd); + /* my connection, should not terminate with + wsrep_close_client_connections(), make transaction to rollback */ + if (thd && !thd->wsrep_applier) + trans_rollback(thd); wsrep_close_client_connections(TRUE, thd); /* wait until appliers have stopped */ @@ -1156,26 +1154,16 @@ void wsrep_stop_replication(THD *thd) node_uuid= WSREP_UUID_UNDEFINED; } +void wsrep_stop_replication(THD *thd) +{ + WSREP_INFO("Stop replication by %llu", (thd) ? thd->thread_id : 0); + wsrep_stop_replication_common(thd); +} + void wsrep_shutdown_replication() { WSREP_INFO("Shutdown replication"); - if (Wsrep_server_state::instance().state() != wsrep::server_state::s_disconnected) - { - WSREP_DEBUG("Disconnect provider"); - Wsrep_server_state::instance().disconnect(); - if (Wsrep_server_state::instance().wait_until_state( - Wsrep_server_state::s_disconnected)) - { - WSREP_WARN("Wsrep interrupted while waiting for disconnected state"); - } - } - - wsrep_close_client_connections(TRUE); - - /* wait until appliers have stopped */ - wsrep_wait_appliers_close(NULL); - node_uuid= WSREP_UUID_UNDEFINED; - + wsrep_stop_replication_common(nullptr); /* Undocking the thread specific data. */ set_current_thd(nullptr); } @@ -3243,7 +3231,9 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx, } } else if (granted_thd->lex->sql_command == SQLCOM_FLUSH || - granted_thd->mdl_context.has_explicit_locks()) + /* System transactions with explicit locks are BACKUP. */ + (granted_thd->system_thread != NON_SYSTEM_THREAD && + granted_thd->mdl_context.has_explicit_locks())) { WSREP_DEBUG("BF thread waiting for FLUSH for %s", wsrep_thd_query(request_thd)); @@ -3348,14 +3338,20 @@ static my_bool have_client_connections(THD *thd, void*) { DBUG_PRINT("quit",("Informing thread %lld that it's time to die", (longlong) thd->thread_id)); - if (is_client_connection(thd) && - (thd->killed == KILL_CONNECTION || - thd->killed == KILL_CONNECTION_HARD)) + if (is_client_connection(thd)) { - (void)abort_replicated(thd); - return 1; + if (thd->killed == KILL_CONNECTION || + thd->killed == KILL_CONNECTION_HARD) + { + (void)abort_replicated(thd); + return true; + } + if (thd->get_stmt_da()->is_eof()) + { + return true; + } } - return 0; + return false; } static void wsrep_close_thread(THD *thd) @@ -3393,14 +3389,24 @@ static my_bool kill_all_threads(THD *thd, THD *caller_thd) /* We skip slave threads & scheduler on this first loop through. */ if (is_client_connection(thd) && thd != caller_thd) { + if (thd->get_stmt_da()->is_eof()) + { + return 0; + } + if (is_replaying_connection(thd)) + { thd->set_killed(KILL_CONNECTION_HARD); - else if (!abort_replicated(thd)) + return 0; + } + + if (!abort_replicated(thd)) { /* replicated transactions must be skipped */ WSREP_DEBUG("closing connection %lld", (longlong) thd->thread_id); /* instead of wsrep_close_thread() we do now soft kill by THD::awake */ thd->awake(KILL_CONNECTION_HARD); + return 0; } } return 0; @@ -3412,6 +3418,7 @@ static my_bool kill_remaining_threads(THD *thd, THD *caller_thd) if (is_client_connection(thd) && !abort_replicated(thd) && !is_replaying_connection(thd) && + !thd->get_stmt_da()->is_eof() && thd_is_connection_alive(thd) && thd != caller_thd) { @@ -3906,7 +3913,7 @@ void wsrep_ready_set(bool ready_value) mysql_mutex_lock(&LOCK_wsrep_ready); wsrep_ready= ready_value; // Signal if we have reached ready state - if (wsrep_ready) + if (ready_value) mysql_cond_signal(&COND_wsrep_ready); mysql_mutex_unlock(&LOCK_wsrep_ready); } @@ -3921,21 +3928,11 @@ void wsrep_ready_set(bool ready_value) step is performed to leave the wsrep transaction in the state as it never existed. - This should not be an inline functions as it requires a lot of stack space - because of WSREP_DBUG() usage. It's also not a function that is - frequently called. */ void wsrep_commit_empty(THD* thd, bool all) { DBUG_ENTER("wsrep_commit_empty"); - WSREP_DEBUG("wsrep_commit_empty for %llu client_state %s client_mode" - " %s trans_state %s sql %s", - thd_get_thread_id(thd), - wsrep::to_c_string(thd->wsrep_cs().state()), - wsrep::to_c_string(thd->wsrep_cs().mode()), - wsrep::to_c_string(thd->wsrep_cs().transaction().state()), - wsrep_thd_query(thd)); if (wsrep_is_real(thd, all) && wsrep_thd_is_local(thd) && @@ -3943,14 +3940,40 @@ void wsrep_commit_empty(THD* thd, bool all) !thd->internal_transaction() && thd->wsrep_trx().state() != wsrep::transaction::s_committed) { - /* Here transaction is either empty (i.e. no changes) or - it was CREATE TABLE with no row binlog format or - we have already aborted transaction e.g. because max writeset size - has been reached. */ - DBUG_ASSERT(!wsrep_has_changes(thd) || - (thd->lex->sql_command == SQLCOM_CREATE_TABLE && - !thd->is_current_stmt_binlog_format_row()) || - thd->wsrep_cs().transaction().state() == wsrep::transaction::s_aborted); +#ifndef DBUG_OFF + const bool empty= !wsrep_has_changes(thd); + const bool create= thd->lex->sql_command == SQLCOM_CREATE_TABLE && + !thd->is_current_stmt_binlog_format_row(); + const bool aborted= thd->wsrep_cs().transaction().state() == wsrep::transaction::s_aborted; + const bool ddl_replay= ((sql_command_flags[thd->lex->sql_command] & + (CF_SCHEMA_CHANGE | CF_ADMIN_COMMAND)) && + thd->wsrep_cs().transaction().state() == wsrep::transaction::s_must_replay); + /* Here transaction is either + (1) empty (i.e. no changes) or + (2) it was CREATE TABLE with no row binlog format or + (3) we have already aborted transaction e.g. because max writeset size + has been reached or + (4) it was DDL and got BF aborted and must replay. + */ + if(!(empty || create || aborted || ddl_replay)) + { + WSREP_DEBUG("wsrep_commit_empty: thread: %llu client_state: %s client_mode:" + " %s trans_state: %s error: %s empty: %d create: %d aborted:" + " %d ddl_replay: %d sql: %s", + thd_get_thread_id(thd), + wsrep::to_c_string(thd->wsrep_cs().state()), + wsrep::to_c_string(thd->wsrep_cs().mode()), + wsrep::to_c_string(thd->wsrep_cs().transaction().state()), + wsrep::to_c_string(thd->wsrep_cs().current_error()), + empty, create, aborted, ddl_replay, + wsrep_thd_query(thd)); + + DBUG_ASSERT(empty || // 1 + create || // 2 + aborted || // 3 + ddl_replay); // 4 + } +#endif /* DBUG_OFF */ bool have_error= wsrep_current_error(thd); int ret= wsrep_before_rollback(thd, all) || wsrep_after_rollback(thd, all) || @@ -3964,10 +3987,10 @@ void wsrep_commit_empty(THD* thd, bool all) DBUG_ASSERT(wsrep_current_error(thd) == wsrep::e_deadlock_error); thd->wsrep_cs().reset_error(); } + if (ret) - { - WSREP_DEBUG("wsrep_commit_empty failed: %d", wsrep_current_error(thd)); - } + WSREP_DEBUG("wsrep_commit_empty failed: %s", + wsrep::to_c_string(thd->wsrep_cs().current_error())); } DBUG_VOID_RETURN; } diff --git a/sql/wsrep_notify.cc b/sql/wsrep_notify.cc index 6cf4fc4c..fd086ce4 100644 --- a/sql/wsrep_notify.cc +++ b/sql/wsrep_notify.cc @@ -28,7 +28,7 @@ void wsrep_notify_status(enum wsrep::server_state::state status, if (!view) { WSREP_DEBUG("wsrep_notify_status server not yet ready : wsrep_ready=%d status %d", - wsrep_ready, (int)status); + (int) wsrep_ready_get(), (int)status); return; } diff --git a/sql/wsrep_schema.cc b/sql/wsrep_schema.cc index c6e45340..d9baf699 100644 --- a/sql/wsrep_schema.cc +++ b/sql/wsrep_schema.cc @@ -272,25 +272,17 @@ static void finish_stmt(THD* thd) { close_thread_tables(thd); } -static int open_table(THD* thd, - const LEX_CSTRING *schema_name, - const LEX_CSTRING *table_name, - enum thr_lock_type const lock_type, - TABLE** table) { - assert(table); - *table= NULL; - +static int open_table(THD *thd, const LEX_CSTRING *schema_name, + const LEX_CSTRING *table_name, + enum thr_lock_type const lock_type, + TABLE_LIST *table_list) +{ + assert(table_list); DBUG_ENTER("Wsrep_schema::open_table()"); - - TABLE_LIST tables; - uint flags= (MYSQL_OPEN_IGNORE_GLOBAL_READ_LOCK | - MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY | - MYSQL_OPEN_IGNORE_FLUSH | - MYSQL_LOCK_IGNORE_TIMEOUT); - - tables.init_one_table(schema_name, - table_name, - NULL, lock_type); + const uint flags= (MYSQL_OPEN_IGNORE_GLOBAL_READ_LOCK | + MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY | + MYSQL_OPEN_IGNORE_FLUSH | MYSQL_LOCK_IGNORE_TIMEOUT); + table_list->init_one_table(schema_name, table_name, NULL, lock_type); thd->lex->query_tables_own_last= 0; // No need to open table if the query was bf aborted, @@ -300,37 +292,39 @@ static int open_table(THD* thd, (thd->get_stmt_da()->sql_errno() == ER_QUERY_INTERRUPTED)); if (interrupted || - !open_n_lock_single_table(thd, &tables, tables.lock_type, flags)) { + !open_n_lock_single_table(thd, table_list, table_list->lock_type, flags)) + { close_thread_tables(thd); DBUG_RETURN(1); } - *table= tables.table; - (*table)->use_all_columns(); + table_list->table->use_all_columns(); DBUG_RETURN(0); } - -static int open_for_write(THD* thd, const char* table_name, TABLE** table) { +static int open_for_write(THD* thd, const char* table_name, TABLE_LIST* table_list) +{ LEX_CSTRING schema_str= { wsrep_schema_str.c_str(), wsrep_schema_str.length() }; LEX_CSTRING table_str= { table_name, strlen(table_name) }; if (Wsrep_schema_impl::open_table(thd, &schema_str, &table_str, TL_WRITE, - table)) { + table_list)) + { // No need to log an error if the query was bf aborted, // thd client will get ER_LOCK_DEADLOCK in the end. const bool interrupted= thd->killed || (thd->is_error() && (thd->get_stmt_da()->sql_errno() == ER_QUERY_INTERRUPTED)); - if (!interrupted) { + if (!interrupted) + { WSREP_ERROR("Failed to open table %s.%s for writing", schema_str.str, table_name); } return 1; } - empty_record(*table); - (*table)->use_all_columns(); - restore_record(*table, s->default_values); + empty_record(table_list->table); + table_list->table->use_all_columns(); + restore_record(table_list->table, s->default_values); return 0; } @@ -479,19 +473,21 @@ static int delete_row(TABLE* table) { return 0; } -static int open_for_read(THD* thd, const char* table_name, TABLE** table) { - +static int open_for_read(THD *thd, const char *table_name, + TABLE_LIST *table_list) +{ LEX_CSTRING schema_str= { wsrep_schema_str.c_str(), wsrep_schema_str.length() }; LEX_CSTRING table_str= { table_name, strlen(table_name) }; if (Wsrep_schema_impl::open_table(thd, &schema_str, &table_str, TL_READ, - table)) { + table_list)) + { WSREP_ERROR("Failed to open table %s.%s for reading", schema_str.str, table_name); return 1; } - empty_record(*table); - (*table)->use_all_columns(); - restore_record(*table, s->default_values); + empty_record(table_list->table); + table_list->table->use_all_columns(); + restore_record(table_list->table, s->default_values); return 0; } @@ -752,8 +748,10 @@ int Wsrep_schema::store_view(THD* thd, const Wsrep_view& view) assert(view.status() == Wsrep_view::primary); int ret= 1; int error; + TABLE_LIST cluster_table_l; TABLE* cluster_table= 0; - TABLE* members_table= 0; + TABLE_LIST members_table_l; + TABLE* members_table = 0; #ifdef WSREP_SCHEMA_MEMBERS_HISTORY TABLE* members_history_table= 0; #endif /* WSREP_SCHEMA_MEMBERS_HISTORY */ @@ -778,11 +776,13 @@ int Wsrep_schema::store_view(THD* thd, const Wsrep_view& view) Store cluster view info */ Wsrep_schema_impl::init_stmt(thd); - if (Wsrep_schema_impl::open_for_write(thd, cluster_table_str.c_str(), &cluster_table)) + if (Wsrep_schema_impl::open_for_write(thd, cluster_table_str.c_str(), &cluster_table_l)) { goto out; } + cluster_table= cluster_table_l.table; + Wsrep_schema_impl::store(cluster_table, 0, view.state_id().id()); Wsrep_schema_impl::store(cluster_table, 1, view.view_seqno().get()); Wsrep_schema_impl::store(cluster_table, 2, view.state_id().seqno().get()); @@ -802,12 +802,14 @@ int Wsrep_schema::store_view(THD* thd, const Wsrep_view& view) */ Wsrep_schema_impl::init_stmt(thd); if (Wsrep_schema_impl::open_for_write(thd, members_table_str.c_str(), - &members_table)) + &members_table_l)) { WSREP_ERROR("failed to open wsrep.members table"); goto out; } + members_table= members_table_l.table; + for (size_t i= 0; i < view.members().size(); ++i) { Wsrep_schema_impl::store(members_table, 0, view.members()[i].id()); @@ -861,8 +863,10 @@ Wsrep_view Wsrep_schema::restore_view(THD* thd, const Wsrep_id& own_id) const { int ret= 1; int error; + TABLE_LIST cluster_table_l; TABLE* cluster_table= 0; bool end_cluster_scan= false; + TABLE_LIST members_table_l; TABLE* members_table= 0; bool end_members_scan= false; @@ -888,8 +892,12 @@ Wsrep_view Wsrep_schema::restore_view(THD* thd, const Wsrep_id& own_id) const { Read cluster info from cluster table */ Wsrep_schema_impl::init_stmt(thd); - if (Wsrep_schema_impl::open_for_read(thd, cluster_table_str.c_str(), &cluster_table) || - Wsrep_schema_impl::init_for_scan(cluster_table)) { + if (Wsrep_schema_impl::open_for_read(thd, cluster_table_str.c_str(), &cluster_table_l)) { + goto out; + } + cluster_table = cluster_table_l.table; + + if (Wsrep_schema_impl::init_for_scan(cluster_table)) { goto out; } @@ -913,8 +921,14 @@ Wsrep_view Wsrep_schema::restore_view(THD* thd, const Wsrep_id& own_id) const { Read members from members table */ Wsrep_schema_impl::init_stmt(thd); - if (Wsrep_schema_impl::open_for_read(thd, members_table_str.c_str(), &members_table) || - Wsrep_schema_impl::init_for_scan(members_table)) { + if (Wsrep_schema_impl::open_for_read(thd, members_table_str.c_str(), + &members_table_l)) + { + goto out; + } + + members_table= members_table_l.table; + if (Wsrep_schema_impl::init_for_scan(members_table)) { goto out; } end_members_scan= true; @@ -1018,14 +1032,15 @@ int Wsrep_schema::append_fragment(THD* thd, Wsrep_schema_impl::sql_safe_updates sql_safe_updates(thd); Wsrep_schema_impl::init_stmt(thd); - TABLE* frag_table= 0; - if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table)) + TABLE_LIST frag_table_l; + if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table_l)) { trans_rollback_stmt(thd); thd->lex->restore_backup_query_tables_list(&query_tables_list_backup); DBUG_RETURN(1); } + TABLE* frag_table= frag_table_l.table; Wsrep_schema_impl::store(frag_table, 0, server_id); Wsrep_schema_impl::store(frag_table, 1, transaction_id.get()); Wsrep_schema_impl::store(frag_table, 2, seqno.get()); @@ -1069,13 +1084,15 @@ int Wsrep_schema::update_fragment_meta(THD* thd, uchar *key=NULL; key_part_map key_map= 0; TABLE* frag_table= 0; + TABLE_LIST frag_table_l; Wsrep_schema_impl::init_stmt(thd); - if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table)) + if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table_l)) { thd->lex->restore_backup_query_tables_list(&query_tables_list_backup); DBUG_RETURN(1); } + frag_table= frag_table_l.table; /* Find record with the given uuid, trx id, and seqno -1 */ Wsrep_schema_impl::store(frag_table, 0, ws_meta.server_id()); @@ -1163,7 +1180,10 @@ static int remove_fragment(THD* thd, seqno.get(), error); } - ret= error; + else + { + ret= error; + } } else if (Wsrep_schema_impl::delete_row(frag_table)) { @@ -1195,12 +1215,14 @@ int Wsrep_schema::remove_fragments(THD* thd, thd->reset_n_backup_open_tables_state(&open_tables_backup); TABLE* frag_table= 0; - if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table)) + TABLE_LIST frag_table_l; + if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table_l)) { ret= 1; } else { + frag_table= frag_table_l.table; for (std::vector::const_iterator i= fragments.begin(); i != fragments.end(); ++i) { @@ -1243,40 +1265,35 @@ int Wsrep_schema::remove_fragments(THD* thd, DBUG_RETURN(ret); } -int Wsrep_schema::replay_transaction(THD* orig_thd, - Relay_log_info* rli, - const wsrep::ws_meta& ws_meta, - const std::vector& fragments) +static int replay_transaction(THD* thd, + THD* orig_thd, + Relay_log_info* rli, + const wsrep::ws_meta& ws_meta, + const std::vector& fragments) { - DBUG_ENTER("Wsrep_schema::replay_transaction"); - DBUG_ASSERT(!fragments.empty()); - - THD thd(next_thread_id(), true); - thd.thread_stack= (orig_thd ? orig_thd->thread_stack : - (char*) &thd); - wsrep_assign_from_threadvars(&thd); - - Wsrep_schema_impl::wsrep_off wsrep_off(&thd); - Wsrep_schema_impl::binlog_off binlog_off(&thd); - Wsrep_schema_impl::sql_safe_updates sql_safe_updates(&thd); - Wsrep_schema_impl::thd_context_switch thd_context_switch(orig_thd, &thd); + Wsrep_schema_impl::wsrep_off wsrep_off(thd); + Wsrep_schema_impl::binlog_off binlog_off(thd); + Wsrep_schema_impl::sql_safe_updates sql_safe_updates(thd); + Wsrep_schema_impl::thd_context_switch thd_context_switch(orig_thd, thd); int ret= 1; int error; TABLE* frag_table= 0; + TABLE_LIST frag_table_l; uchar *key=NULL; key_part_map key_map= 0; for (std::vector::const_iterator i= fragments.begin(); i != fragments.end(); ++i) { - Wsrep_schema_impl::init_stmt(&thd); - if ((error= Wsrep_schema_impl::open_for_read(&thd, sr_table_str.c_str(), &frag_table))) + Wsrep_schema_impl::init_stmt(thd); + if ((error= Wsrep_schema_impl::open_for_read(thd, sr_table_str.c_str(), &frag_table_l))) { WSREP_WARN("Could not open SR table for read: %d", error); - Wsrep_schema_impl::finish_stmt(&thd); - DBUG_RETURN(1); + Wsrep_schema_impl::finish_stmt(thd); + return 1; } + frag_table= frag_table_l.table; Wsrep_schema_impl::store(frag_table, 0, ws_meta.server_id()); Wsrep_schema_impl::store(frag_table, 1, ws_meta.transaction_id().get()); @@ -1305,7 +1322,7 @@ int Wsrep_schema::replay_transaction(THD* orig_thd, frag_table->field[4]->val_str(&buf); { - Wsrep_schema_impl::thd_context_switch thd_context_switch(&thd, orig_thd); + Wsrep_schema_impl::thd_context_switch thd_context_switch(thd, orig_thd); ret= wsrep_apply_events(orig_thd, rli, buf.ptr(), buf.length()); if (ret) @@ -1316,18 +1333,20 @@ int Wsrep_schema::replay_transaction(THD* orig_thd, } Wsrep_schema_impl::end_index_scan(frag_table); - Wsrep_schema_impl::finish_stmt(&thd); + Wsrep_schema_impl::finish_stmt(thd); - Wsrep_schema_impl::init_stmt(&thd); + Wsrep_schema_impl::init_stmt(thd); - if ((error= Wsrep_schema_impl::open_for_write(&thd, + if ((error= Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), - &frag_table))) + &frag_table_l))) { WSREP_WARN("Could not open SR table for write: %d", error); - Wsrep_schema_impl::finish_stmt(&thd); - DBUG_RETURN(1); + Wsrep_schema_impl::finish_stmt(thd); + ret= 1; + break; } + frag_table= frag_table_l.table; error= Wsrep_schema_impl::init_for_index_scan(frag_table, key, @@ -1351,86 +1370,120 @@ int Wsrep_schema::replay_transaction(THD* orig_thd, break; } Wsrep_schema_impl::end_index_scan(frag_table); - Wsrep_schema_impl::finish_stmt(&thd); + Wsrep_schema_impl::finish_stmt(thd); my_free(key); key= NULL; } if (key) my_free(key); + + return ret; +} + +int Wsrep_schema::replay_transaction(THD* orig_thd, + Relay_log_info* rli, + const wsrep::ws_meta& ws_meta, + const std::vector& fragments) +{ + DBUG_ENTER("Wsrep_schema::replay_transaction"); + DBUG_ASSERT(!fragments.empty()); + + THD *thd= new THD(next_thread_id(), true); + if (!thd) + { + WSREP_WARN("Could not allocate memory for THD"); + DBUG_RETURN(1); + } + + thd->thread_stack= (orig_thd ? orig_thd->thread_stack : (char *) &thd); + wsrep_assign_from_threadvars(thd); + + int ret= ::replay_transaction(thd, orig_thd, rli, ws_meta, fragments); + + delete thd; DBUG_RETURN(ret); } -int Wsrep_schema::recover_sr_transactions(THD *orig_thd) +static int recover_sr_transactions(THD* storage_thd, THD* orig_thd) { - DBUG_ENTER("Wsrep_schema::recover_sr_transactions"); - THD storage_thd(next_thread_id(), true); - storage_thd.thread_stack= (orig_thd ? orig_thd->thread_stack : - (char*) &storage_thd); - wsrep_assign_from_threadvars(&storage_thd); TABLE* frag_table= 0; + TABLE_LIST frag_table_l; TABLE* cluster_table= 0; - Wsrep_storage_service storage_service(&storage_thd); - Wsrep_schema_impl::binlog_off binlog_off(&storage_thd); - Wsrep_schema_impl::wsrep_off wsrep_off(&storage_thd); - Wsrep_schema_impl::sql_safe_updates sql_safe_updates(&storage_thd); + TABLE_LIST cluster_table_l; + Wsrep_storage_service storage_service(storage_thd); + Wsrep_schema_impl::binlog_off binlog_off(storage_thd); + Wsrep_schema_impl::wsrep_off wsrep_off(storage_thd); + Wsrep_schema_impl::sql_safe_updates sql_safe_updates(storage_thd); Wsrep_schema_impl::thd_context_switch thd_context_switch(orig_thd, - &storage_thd); + storage_thd); Wsrep_server_state& server_state(Wsrep_server_state::instance()); int ret= 1; int error; wsrep::id cluster_id; - Wsrep_schema_impl::init_stmt(&storage_thd); - storage_thd.wsrep_skip_locking= FALSE; - if (Wsrep_schema_impl::open_for_read(&storage_thd, - cluster_table_str.c_str(), - &cluster_table) || - Wsrep_schema_impl::init_for_scan(cluster_table)) + Wsrep_schema_impl::init_stmt(storage_thd); + storage_thd->wsrep_skip_locking= FALSE; + if (Wsrep_schema_impl::open_for_read(storage_thd, cluster_table_str.c_str(), + &cluster_table_l)) { - Wsrep_schema_impl::finish_stmt(&storage_thd); - DBUG_RETURN(1); + Wsrep_schema_impl::finish_stmt(storage_thd); + return 1; + } + cluster_table= cluster_table_l.table; + + if (Wsrep_schema_impl::init_for_scan(cluster_table)) + { + Wsrep_schema_impl::finish_stmt(storage_thd); + return 1; } if ((error= Wsrep_schema_impl::next_record(cluster_table))) { Wsrep_schema_impl::end_scan(cluster_table); - Wsrep_schema_impl::finish_stmt(&storage_thd); - trans_commit(&storage_thd); + Wsrep_schema_impl::finish_stmt(storage_thd); + trans_commit(storage_thd); if (error == HA_ERR_END_OF_FILE) { WSREP_INFO("Cluster table is empty, not recovering transactions"); - DBUG_RETURN(0); + return 0; } else { WSREP_ERROR("Failed to read cluster table: %d", error); - DBUG_RETURN(1); + return 1; } } Wsrep_schema_impl::scan(cluster_table, 0, cluster_id); Wsrep_schema_impl::end_scan(cluster_table); - Wsrep_schema_impl::finish_stmt(&storage_thd); + Wsrep_schema_impl::finish_stmt(storage_thd); std::ostringstream os; os << cluster_id; WSREP_INFO("Recovered cluster id %s", os.str().c_str()); - storage_thd.wsrep_skip_locking= TRUE; - Wsrep_schema_impl::init_stmt(&storage_thd); + storage_thd->wsrep_skip_locking= TRUE; + Wsrep_schema_impl::init_stmt(storage_thd); /* Open the table for reading and writing so that fragments without valid seqno can be deleted. */ - if (Wsrep_schema_impl::open_for_write(&storage_thd, sr_table_str.c_str(), &frag_table) || - Wsrep_schema_impl::init_for_scan(frag_table)) + if (Wsrep_schema_impl::open_for_write(storage_thd, sr_table_str.c_str(), + &frag_table_l)) { WSREP_ERROR("Failed to open SR table for write"); goto out; } + frag_table= frag_table_l.table; + + if (Wsrep_schema_impl::init_for_scan(frag_table)) + { + WSREP_ERROR("Failed to init for index scan"); + goto out; + } while (0 == error) { @@ -1474,7 +1527,7 @@ int Wsrep_schema::recover_sr_transactions(THD *orig_thd) transaction_id))) { DBUG_ASSERT(wsrep::starts_transaction(flags)); - applier = wsrep_create_streaming_applier(&storage_thd, "recovery"); + applier = wsrep_create_streaming_applier(storage_thd, "recovery"); server_state.start_streaming_applier(server_id, transaction_id, applier); applier->start_transaction(wsrep::ws_handle(transaction_id, 0), @@ -1502,10 +1555,30 @@ int Wsrep_schema::recover_sr_transactions(THD *orig_thd) } } Wsrep_schema_impl::end_scan(frag_table); - Wsrep_schema_impl::finish_stmt(&storage_thd); - trans_commit(&storage_thd); - storage_thd.set_mysys_var(0); + Wsrep_schema_impl::finish_stmt(storage_thd); + trans_commit(storage_thd); + storage_thd->set_mysys_var(0); out: + return ret; +} + +int Wsrep_schema::recover_sr_transactions(THD *orig_thd) +{ + DBUG_ENTER("Wsrep_schema::recover_sr_transactions"); + + THD *storage_thd= new THD(next_thread_id(), true); + if (!storage_thd) + { + WSREP_WARN("Could not allocate memory for THD"); + DBUG_RETURN(1); + } + storage_thd->thread_stack= + (orig_thd ? orig_thd->thread_stack : (char *) &storage_thd); + wsrep_assign_from_threadvars(storage_thd); + + int ret= ::recover_sr_transactions(storage_thd, orig_thd); + + delete storage_thd; DBUG_RETURN(ret); } @@ -1521,13 +1594,15 @@ void Wsrep_schema::clear_allowlist() thd->thread_stack= (char*)&thd; wsrep_init_thd_for_schema(thd); TABLE* allowlist_table= 0; + TABLE_LIST allowlist_table_l; int error= 0; Wsrep_schema_impl::init_stmt(thd); if (Wsrep_schema_impl::open_for_write(thd, allowlist_table_str.c_str(), - &allowlist_table) || - Wsrep_schema_impl::init_for_scan(allowlist_table)) + &allowlist_table_l) || + (allowlist_table= allowlist_table_l.table, + Wsrep_schema_impl::init_for_scan(allowlist_table))) { WSREP_ERROR("Failed to open mysql.wsrep_allowlist table"); goto out; @@ -1567,14 +1642,16 @@ void Wsrep_schema::store_allowlist(std::vector& ip_allowlist) thd->thread_stack= (char*)&thd; wsrep_init_thd_for_schema(thd); TABLE* allowlist_table= 0; + TABLE_LIST allowlist_table_l; int error; Wsrep_schema_impl::init_stmt(thd); if (Wsrep_schema_impl::open_for_write(thd, allowlist_table_str.c_str(), - &allowlist_table)) + &allowlist_table_l)) { WSREP_ERROR("Failed to open mysql.wsrep_allowlist table"); goto out; } + allowlist_table= allowlist_table_l.table; for (size_t i= 0; i < ip_allowlist.size(); ++i) { Wsrep_schema_impl::store(allowlist_table, 0, ip_allowlist[i]); @@ -1618,6 +1695,7 @@ static void *allowlist_check_thread(void *param) int error; TABLE *allowlist_table= 0; + TABLE_LIST allowlist_table_l; bool match_found_or_empty= false; bool table_have_rows= false; char row[64]= { @@ -1629,8 +1707,9 @@ static void *allowlist_check_thread(void *param) */ Wsrep_schema_impl::init_stmt(&thd); if (Wsrep_schema_impl::open_for_read(&thd, allowlist_table_str.c_str(), - &allowlist_table) || - Wsrep_schema_impl::init_for_scan(allowlist_table)) + &allowlist_table_l) || + (allowlist_table= allowlist_table_l.table, + Wsrep_schema_impl::init_for_scan(allowlist_table))) { goto out; } diff --git a/sql/wsrep_server_service.cc b/sql/wsrep_server_service.cc index c3df6e9f..19fa4470 100644 --- a/sql/wsrep_server_service.cc +++ b/sql/wsrep_server_service.cc @@ -345,7 +345,6 @@ void Wsrep_server_service::log_state_change( switch (current_state) { case Wsrep_server_state::s_synced: - wsrep_ready= TRUE; WSREP_INFO("Synchronized with group, ready for connections"); wsrep_ready_set(true); /* fall through */ diff --git a/sql/yy_mariadb.cc b/sql/yy_mariadb.cc new file mode 100644 index 00000000..0223e459 --- /dev/null +++ b/sql/yy_mariadb.cc @@ -0,0 +1,52206 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + 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 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 General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output, and Bison version. */ +#define YYBISON 30802 + +/* Bison version string. */ +#define YYBISON_VERSION "3.8.2" + +/* Skeleton name. */ +#define YYSKELETON_NAME "/home/buildbot/git/mkdist/sql/myskel.m4" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + +/* Substitute the variable and function names. */ +#define yyparse MYSQLparse +#define yylex MYSQLlex +#define yyerror MYSQLerror +#define yydebug MYSQLdebug +#define yynerrs MYSQLnerrs + +/* First part of user prologue. */ +#line 25 "/home/buildbot/git/sql/sql_yacc.yy" + +#define YYLIP (& thd->m_parser_state->m_lip) +#define YYPS (& thd->m_parser_state->m_yacc) +#define YYCSCL (thd->variables.character_set_client) + +#define MYSQL_YACC +#define YYINITDEPTH 100 +#define YYMAXDEPTH 3200 /* Because of 64K stack */ +#define Lex (thd->lex) + +#define Select Lex->current_select +#include "mariadb.h" +#include "sql_priv.h" +#include "sql_parse.h" /* comp_*_creator */ +#include "sql_table.h" /* primary_key_name */ +#include "sql_partition.h" /* partition_info, HASH_PARTITION */ +#include "sql_class.h" /* Key_part_spec, enum_filetype, Diag_condition_item_name */ +#include "slave.h" +#include "lex_symbol.h" +#include "item_create.h" +#include "sp_head.h" +#include "sp_rcontext.h" +#include "sp.h" +#include "sql_show.h" +#include "sql_alter.h" // Sql_cmd_alter_table* +#include "sql_truncate.h" // Sql_cmd_truncate_table +#include "sql_admin.h" // Sql_cmd_analyze/Check..._table +#include "sql_partition_admin.h" // Sql_cmd_alter_table_*_part. +#include "sql_handler.h" // Sql_cmd_handler_* +#include "sql_signal.h" +#include "sql_get_diagnostics.h" // Sql_cmd_get_diagnostics +#include "sql_cte.h" +#include "sql_window.h" +#include "item_windowfunc.h" +#include "event_parse_data.h" +#include "create_options.h" +#include +#include +#include "keycaches.h" +#include "set_var.h" +#include "rpl_mi.h" +#include "lex_token.h" +#include "sql_lex.h" +#include "sql_sequence.h" +#include "my_base.h" +#include "sql_type_json.h" +#include "json_table.h" + +/* this is to get the bison compilation windows warnings out */ +#ifdef _MSC_VER +/* warning C4065: switch statement contains 'default' but no 'case' labels */ +/* warning C4102: 'yyexhaustedlab': unreferenced label */ +#pragma warning (disable : 4065 4102) +#endif +#if defined (__GNUC__) || defined (__clang__) +#pragma GCC diagnostic ignored "-Wunused-label" /* yyexhaustedlab: */ +#endif + +/* Stack size 28200 with clang for MYSQLparse() and ORAparse() */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + +int yylex(void *yylval, void *yythd); + +#define yyoverflow(A,B,C,D,E,F) \ + { \ + size_t val= *(F); \ + if (unlikely(my_yyoverflow((B), (D), &val))) \ + { \ + yyerror(thd, (char*) (A)); \ + return 2; \ + } \ + else \ + { \ + *(F)= (YYSIZE_T)val; \ + } \ + } + +#define MYSQL_YYABORT \ + do \ + { \ + YYABORT; \ + } while (0) + +#define MYSQL_YYABORT_UNLESS(A) \ + if (unlikely(!(A))) \ + { \ + thd->parse_error(); \ + MYSQL_YYABORT; \ + } + +#define my_yyabort_error(A) \ + do { my_error A; MYSQL_YYABORT; } while(0) + +#ifndef DBUG_OFF +#define YYDEBUG 1 +#else +#define YYDEBUG 0 +#endif + + +static Item* escape(THD *thd) +{ + thd->lex->escape_used= false; + const char *esc= thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES ? "" : "\\"; + return new (thd->mem_root) Item_string_ascii(thd, esc, MY_TEST(esc[0])); +} + + +/** + @brief Bison callback to report a syntax/OOM error + + This function is invoked by the bison-generated parser + when a syntax error, a parse error or an out-of-memory + condition occurs. This function is not invoked when the + parser is requested to abort by semantic action code + by means of YYABORT or YYACCEPT macros. This is why these + macros should not be used (use MYSQL_YYABORT/MYSQL_YYACCEPT + instead). + + The parser will abort immediately after invoking this callback. + + This function is not for use in semantic actions and is internal to + the parser, as it performs some pre-return cleanup. + In semantic actions, please use thd->parse_error() or my_error to + push an error into the error stack and MYSQL_YYABORT + to abort from the parser. +*/ + +static void yyerror(THD *thd, const char *s) +{ + /* "parse error" changed into "syntax error" between bison 1.75 and 1.875 */ + if (strcmp(s,"parse error") == 0 || strcmp(s,"syntax error") == 0) + s= ER_THD(thd, ER_SYNTAX_ERROR); + thd->parse_error(s, 0); +} + + +#ifndef DBUG_OFF +#define __CONCAT_UNDERSCORED(x,y) x ## _ ## y +#define _CONCAT_UNDERSCORED(x,y) __CONCAT_UNDERSCORED(x,y) +void _CONCAT_UNDERSCORED(turn_parser_debug_on,yyparse)() +{ + /* + MYSQLdebug is in sql/yy_*.cc, in bison generated code. + Turning this option on is **VERY** verbose, and should be + used when investigating a syntax error problem only. + + The syntax to run with bison traces is as follows : + - Starting a server manually : + mysqld --debug-dbug="d,parser_debug" ... + - Running a test : + mysql-test-run.pl --mysqld="--debug-dbug=d,parser_debug" ... + + The result will be in the process stderr (var/log/master.err) + */ + +#ifndef _AIX + extern int yydebug; +#else + static int yydebug; +#endif + yydebug= 1; +} +#endif + + + +#line 244 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +#include "yy_mariadb.hh" +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_3_ = 3, /* '@' */ + YYSYMBOL_ABORT_SYM = 4, /* ABORT_SYM */ + YYSYMBOL_IMPOSSIBLE_ACTION = 5, /* IMPOSSIBLE_ACTION */ + YYSYMBOL_FORCE_LOOKAHEAD = 6, /* FORCE_LOOKAHEAD */ + YYSYMBOL_END_OF_INPUT = 7, /* END_OF_INPUT */ + YYSYMBOL_COLON_ORACLE_SYM = 8, /* COLON_ORACLE_SYM */ + YYSYMBOL_PARAM_MARKER = 9, /* PARAM_MARKER */ + YYSYMBOL_FOR_SYSTEM_TIME_SYM = 10, /* FOR_SYSTEM_TIME_SYM */ + YYSYMBOL_LEFT_PAREN_ALT = 11, /* LEFT_PAREN_ALT */ + YYSYMBOL_LEFT_PAREN_WITH = 12, /* LEFT_PAREN_WITH */ + YYSYMBOL_LEFT_PAREN_LIKE = 13, /* LEFT_PAREN_LIKE */ + YYSYMBOL_ORACLE_CONCAT_SYM = 14, /* ORACLE_CONCAT_SYM */ + YYSYMBOL_PERCENT_ORACLE_SYM = 15, /* PERCENT_ORACLE_SYM */ + YYSYMBOL_WITH_CUBE_SYM = 16, /* WITH_CUBE_SYM */ + YYSYMBOL_WITH_ROLLUP_SYM = 17, /* WITH_ROLLUP_SYM */ + YYSYMBOL_WITH_SYSTEM_SYM = 18, /* WITH_SYSTEM_SYM */ + YYSYMBOL_IDENT = 19, /* IDENT */ + YYSYMBOL_IDENT_QUOTED = 20, /* IDENT_QUOTED */ + YYSYMBOL_LEX_HOSTNAME = 21, /* LEX_HOSTNAME */ + YYSYMBOL_UNDERSCORE_CHARSET = 22, /* UNDERSCORE_CHARSET */ + YYSYMBOL_BIN_NUM = 23, /* BIN_NUM */ + YYSYMBOL_DECIMAL_NUM = 24, /* DECIMAL_NUM */ + YYSYMBOL_FLOAT_NUM = 25, /* FLOAT_NUM */ + YYSYMBOL_HEX_NUM = 26, /* HEX_NUM */ + YYSYMBOL_HEX_STRING = 27, /* HEX_STRING */ + YYSYMBOL_LONG_NUM = 28, /* LONG_NUM */ + YYSYMBOL_NCHAR_STRING = 29, /* NCHAR_STRING */ + YYSYMBOL_NUM = 30, /* NUM */ + YYSYMBOL_TEXT_STRING = 31, /* TEXT_STRING */ + YYSYMBOL_ULONGLONG_NUM = 32, /* ULONGLONG_NUM */ + YYSYMBOL_AND_AND_SYM = 33, /* AND_AND_SYM */ + YYSYMBOL_DOT_DOT_SYM = 34, /* DOT_DOT_SYM */ + YYSYMBOL_EQUAL_SYM = 35, /* EQUAL_SYM */ + YYSYMBOL_GE = 36, /* GE */ + YYSYMBOL_LE = 37, /* LE */ + YYSYMBOL_MYSQL_CONCAT_SYM = 38, /* MYSQL_CONCAT_SYM */ + YYSYMBOL_NE = 39, /* NE */ + YYSYMBOL_NOT2_SYM = 40, /* NOT2_SYM */ + YYSYMBOL_OR2_SYM = 41, /* OR2_SYM */ + YYSYMBOL_SET_VAR = 42, /* SET_VAR */ + YYSYMBOL_SHIFT_LEFT = 43, /* SHIFT_LEFT */ + YYSYMBOL_SHIFT_RIGHT = 44, /* SHIFT_RIGHT */ + YYSYMBOL_ACCESSIBLE_SYM = 45, /* ACCESSIBLE_SYM */ + YYSYMBOL_ADD = 46, /* ADD */ + YYSYMBOL_ALL = 47, /* ALL */ + YYSYMBOL_ALTER = 48, /* ALTER */ + YYSYMBOL_ANALYZE_SYM = 49, /* ANALYZE_SYM */ + YYSYMBOL_AND_SYM = 50, /* AND_SYM */ + YYSYMBOL_ASC = 51, /* ASC */ + YYSYMBOL_ASENSITIVE_SYM = 52, /* ASENSITIVE_SYM */ + YYSYMBOL_AS = 53, /* AS */ + YYSYMBOL_BEFORE_SYM = 54, /* BEFORE_SYM */ + YYSYMBOL_BETWEEN_SYM = 55, /* BETWEEN_SYM */ + YYSYMBOL_BIGINT = 56, /* BIGINT */ + YYSYMBOL_BINARY = 57, /* BINARY */ + YYSYMBOL_BIT_AND = 58, /* BIT_AND */ + YYSYMBOL_BIT_OR = 59, /* BIT_OR */ + YYSYMBOL_BIT_XOR = 60, /* BIT_XOR */ + YYSYMBOL_BLOB_MARIADB_SYM = 61, /* BLOB_MARIADB_SYM */ + YYSYMBOL_BLOB_ORACLE_SYM = 62, /* BLOB_ORACLE_SYM */ + YYSYMBOL_BODY_ORACLE_SYM = 63, /* BODY_ORACLE_SYM */ + YYSYMBOL_BOTH = 64, /* BOTH */ + YYSYMBOL_BY = 65, /* BY */ + YYSYMBOL_CALL_SYM = 66, /* CALL_SYM */ + YYSYMBOL_CASCADE = 67, /* CASCADE */ + YYSYMBOL_CASE_SYM = 68, /* CASE_SYM */ + YYSYMBOL_CAST_SYM = 69, /* CAST_SYM */ + YYSYMBOL_CHANGE = 70, /* CHANGE */ + YYSYMBOL_CHAR_SYM = 71, /* CHAR_SYM */ + YYSYMBOL_CHECK_SYM = 72, /* CHECK_SYM */ + YYSYMBOL_COLLATE_SYM = 73, /* COLLATE_SYM */ + YYSYMBOL_CONDITION_SYM = 74, /* CONDITION_SYM */ + YYSYMBOL_CONSTRAINT = 75, /* CONSTRAINT */ + YYSYMBOL_CONTINUE_MARIADB_SYM = 76, /* CONTINUE_MARIADB_SYM */ + YYSYMBOL_CONTINUE_ORACLE_SYM = 77, /* CONTINUE_ORACLE_SYM */ + YYSYMBOL_CONVERT_SYM = 78, /* CONVERT_SYM */ + YYSYMBOL_COUNT_SYM = 79, /* COUNT_SYM */ + YYSYMBOL_CREATE = 80, /* CREATE */ + YYSYMBOL_CROSS = 81, /* CROSS */ + YYSYMBOL_CUME_DIST_SYM = 82, /* CUME_DIST_SYM */ + YYSYMBOL_CURDATE = 83, /* CURDATE */ + YYSYMBOL_CURRENT_ROLE = 84, /* CURRENT_ROLE */ + YYSYMBOL_CURRENT_USER = 85, /* CURRENT_USER */ + YYSYMBOL_CURSOR_SYM = 86, /* CURSOR_SYM */ + YYSYMBOL_CURTIME = 87, /* CURTIME */ + YYSYMBOL_DATABASE = 88, /* DATABASE */ + YYSYMBOL_DATABASES = 89, /* DATABASES */ + YYSYMBOL_DATE_ADD_INTERVAL = 90, /* DATE_ADD_INTERVAL */ + YYSYMBOL_DATE_SUB_INTERVAL = 91, /* DATE_SUB_INTERVAL */ + YYSYMBOL_DAY_HOUR_SYM = 92, /* DAY_HOUR_SYM */ + YYSYMBOL_DAY_MICROSECOND_SYM = 93, /* DAY_MICROSECOND_SYM */ + YYSYMBOL_DAY_MINUTE_SYM = 94, /* DAY_MINUTE_SYM */ + YYSYMBOL_DAY_SECOND_SYM = 95, /* DAY_SECOND_SYM */ + YYSYMBOL_DECIMAL_SYM = 96, /* DECIMAL_SYM */ + YYSYMBOL_DECLARE_MARIADB_SYM = 97, /* DECLARE_MARIADB_SYM */ + YYSYMBOL_DECLARE_ORACLE_SYM = 98, /* DECLARE_ORACLE_SYM */ + YYSYMBOL_DEFAULT = 99, /* DEFAULT */ + YYSYMBOL_DELETE_DOMAIN_ID_SYM = 100, /* DELETE_DOMAIN_ID_SYM */ + YYSYMBOL_DELETE_SYM = 101, /* DELETE_SYM */ + YYSYMBOL_DENSE_RANK_SYM = 102, /* DENSE_RANK_SYM */ + YYSYMBOL_DESCRIBE = 103, /* DESCRIBE */ + YYSYMBOL_DESC = 104, /* DESC */ + YYSYMBOL_DETERMINISTIC_SYM = 105, /* DETERMINISTIC_SYM */ + YYSYMBOL_DISTINCT = 106, /* DISTINCT */ + YYSYMBOL_DIV_SYM = 107, /* DIV_SYM */ + YYSYMBOL_DO_DOMAIN_IDS_SYM = 108, /* DO_DOMAIN_IDS_SYM */ + YYSYMBOL_DOUBLE_SYM = 109, /* DOUBLE_SYM */ + YYSYMBOL_DROP = 110, /* DROP */ + YYSYMBOL_DUAL_SYM = 111, /* DUAL_SYM */ + YYSYMBOL_EACH_SYM = 112, /* EACH_SYM */ + YYSYMBOL_ELSEIF_MARIADB_SYM = 113, /* ELSEIF_MARIADB_SYM */ + YYSYMBOL_ELSE = 114, /* ELSE */ + YYSYMBOL_ELSIF_ORACLE_SYM = 115, /* ELSIF_ORACLE_SYM */ + YYSYMBOL_EMPTY_SYM = 116, /* EMPTY_SYM */ + YYSYMBOL_ENCLOSED = 117, /* ENCLOSED */ + YYSYMBOL_ESCAPED = 118, /* ESCAPED */ + YYSYMBOL_EXCEPT_SYM = 119, /* EXCEPT_SYM */ + YYSYMBOL_EXISTS = 120, /* EXISTS */ + YYSYMBOL_EXTRACT_SYM = 121, /* EXTRACT_SYM */ + YYSYMBOL_FALSE_SYM = 122, /* FALSE_SYM */ + YYSYMBOL_FETCH_SYM = 123, /* FETCH_SYM */ + YYSYMBOL_FIRST_VALUE_SYM = 124, /* FIRST_VALUE_SYM */ + YYSYMBOL_FLOAT_SYM = 125, /* FLOAT_SYM */ + YYSYMBOL_FOREIGN = 126, /* FOREIGN */ + YYSYMBOL_FOR_SYM = 127, /* FOR_SYM */ + YYSYMBOL_FROM = 128, /* FROM */ + YYSYMBOL_FULLTEXT_SYM = 129, /* FULLTEXT_SYM */ + YYSYMBOL_GOTO_ORACLE_SYM = 130, /* GOTO_ORACLE_SYM */ + YYSYMBOL_GRANT = 131, /* GRANT */ + YYSYMBOL_GROUP_CONCAT_SYM = 132, /* GROUP_CONCAT_SYM */ + YYSYMBOL_JSON_ARRAYAGG_SYM = 133, /* JSON_ARRAYAGG_SYM */ + YYSYMBOL_JSON_OBJECTAGG_SYM = 134, /* JSON_OBJECTAGG_SYM */ + YYSYMBOL_JSON_TABLE_SYM = 135, /* JSON_TABLE_SYM */ + YYSYMBOL_GROUP_SYM = 136, /* GROUP_SYM */ + YYSYMBOL_HAVING = 137, /* HAVING */ + YYSYMBOL_HOUR_MICROSECOND_SYM = 138, /* HOUR_MICROSECOND_SYM */ + YYSYMBOL_HOUR_MINUTE_SYM = 139, /* HOUR_MINUTE_SYM */ + YYSYMBOL_HOUR_SECOND_SYM = 140, /* HOUR_SECOND_SYM */ + YYSYMBOL_IF_SYM = 141, /* IF_SYM */ + YYSYMBOL_IGNORE_DOMAIN_IDS_SYM = 142, /* IGNORE_DOMAIN_IDS_SYM */ + YYSYMBOL_IGNORE_SYM = 143, /* IGNORE_SYM */ + YYSYMBOL_IGNORED_SYM = 144, /* IGNORED_SYM */ + YYSYMBOL_INDEX_SYM = 145, /* INDEX_SYM */ + YYSYMBOL_INFILE = 146, /* INFILE */ + YYSYMBOL_INNER_SYM = 147, /* INNER_SYM */ + YYSYMBOL_INOUT_SYM = 148, /* INOUT_SYM */ + YYSYMBOL_INSENSITIVE_SYM = 149, /* INSENSITIVE_SYM */ + YYSYMBOL_INSERT = 150, /* INSERT */ + YYSYMBOL_IN_SYM = 151, /* IN_SYM */ + YYSYMBOL_INTERSECT_SYM = 152, /* INTERSECT_SYM */ + YYSYMBOL_INTERVAL_SYM = 153, /* INTERVAL_SYM */ + YYSYMBOL_INTO = 154, /* INTO */ + YYSYMBOL_INT_SYM = 155, /* INT_SYM */ + YYSYMBOL_IS = 156, /* IS */ + YYSYMBOL_ITERATE_SYM = 157, /* ITERATE_SYM */ + YYSYMBOL_JOIN_SYM = 158, /* JOIN_SYM */ + YYSYMBOL_KEYS = 159, /* KEYS */ + YYSYMBOL_KEY_SYM = 160, /* KEY_SYM */ + YYSYMBOL_KILL_SYM = 161, /* KILL_SYM */ + YYSYMBOL_LAG_SYM = 162, /* LAG_SYM */ + YYSYMBOL_LEADING = 163, /* LEADING */ + YYSYMBOL_LEAD_SYM = 164, /* LEAD_SYM */ + YYSYMBOL_LEAVE_SYM = 165, /* LEAVE_SYM */ + YYSYMBOL_LEFT = 166, /* LEFT */ + YYSYMBOL_LIKE = 167, /* LIKE */ + YYSYMBOL_LIMIT = 168, /* LIMIT */ + YYSYMBOL_LINEAR_SYM = 169, /* LINEAR_SYM */ + YYSYMBOL_LINES = 170, /* LINES */ + YYSYMBOL_LOAD = 171, /* LOAD */ + YYSYMBOL_LOCATOR_SYM = 172, /* LOCATOR_SYM */ + YYSYMBOL_LOCK_SYM = 173, /* LOCK_SYM */ + YYSYMBOL_LONGBLOB = 174, /* LONGBLOB */ + YYSYMBOL_LONG_SYM = 175, /* LONG_SYM */ + YYSYMBOL_LONGTEXT = 176, /* LONGTEXT */ + YYSYMBOL_LOOP_SYM = 177, /* LOOP_SYM */ + YYSYMBOL_LOW_PRIORITY = 178, /* LOW_PRIORITY */ + YYSYMBOL_MASTER_SSL_VERIFY_SERVER_CERT_SYM = 179, /* MASTER_SSL_VERIFY_SERVER_CERT_SYM */ + YYSYMBOL_MATCH = 180, /* MATCH */ + YYSYMBOL_MAX_SYM = 181, /* MAX_SYM */ + YYSYMBOL_MAXVALUE_SYM = 182, /* MAXVALUE_SYM */ + YYSYMBOL_MEDIAN_SYM = 183, /* MEDIAN_SYM */ + YYSYMBOL_MEDIUMBLOB = 184, /* MEDIUMBLOB */ + YYSYMBOL_MEDIUMINT = 185, /* MEDIUMINT */ + YYSYMBOL_MEDIUMTEXT = 186, /* MEDIUMTEXT */ + YYSYMBOL_MIN_SYM = 187, /* MIN_SYM */ + YYSYMBOL_MINUS_ORACLE_SYM = 188, /* MINUS_ORACLE_SYM */ + YYSYMBOL_MINUTE_MICROSECOND_SYM = 189, /* MINUTE_MICROSECOND_SYM */ + YYSYMBOL_MINUTE_SECOND_SYM = 190, /* MINUTE_SECOND_SYM */ + YYSYMBOL_MODIFIES_SYM = 191, /* MODIFIES_SYM */ + YYSYMBOL_MOD_SYM = 192, /* MOD_SYM */ + YYSYMBOL_NATURAL = 193, /* NATURAL */ + YYSYMBOL_NEG = 194, /* NEG */ + YYSYMBOL_NESTED_SYM = 195, /* NESTED_SYM */ + YYSYMBOL_NOT_SYM = 196, /* NOT_SYM */ + YYSYMBOL_NO_WRITE_TO_BINLOG = 197, /* NO_WRITE_TO_BINLOG */ + YYSYMBOL_NOW_SYM = 198, /* NOW_SYM */ + YYSYMBOL_NTH_VALUE_SYM = 199, /* NTH_VALUE_SYM */ + YYSYMBOL_NTILE_SYM = 200, /* NTILE_SYM */ + YYSYMBOL_NULL_SYM = 201, /* NULL_SYM */ + YYSYMBOL_NUMERIC_SYM = 202, /* NUMERIC_SYM */ + YYSYMBOL_ON = 203, /* ON */ + YYSYMBOL_OPTIMIZE = 204, /* OPTIMIZE */ + YYSYMBOL_OPTIONALLY = 205, /* OPTIONALLY */ + YYSYMBOL_ORDER_SYM = 206, /* ORDER_SYM */ + YYSYMBOL_ORDINALITY_SYM = 207, /* ORDINALITY_SYM */ + YYSYMBOL_OR_SYM = 208, /* OR_SYM */ + YYSYMBOL_OTHERS_ORACLE_SYM = 209, /* OTHERS_ORACLE_SYM */ + YYSYMBOL_OUTER = 210, /* OUTER */ + YYSYMBOL_OUTFILE = 211, /* OUTFILE */ + YYSYMBOL_OUT_SYM = 212, /* OUT_SYM */ + YYSYMBOL_OVER_SYM = 213, /* OVER_SYM */ + YYSYMBOL_PACKAGE_ORACLE_SYM = 214, /* PACKAGE_ORACLE_SYM */ + YYSYMBOL_PAGE_CHECKSUM_SYM = 215, /* PAGE_CHECKSUM_SYM */ + YYSYMBOL_PARSE_VCOL_EXPR_SYM = 216, /* PARSE_VCOL_EXPR_SYM */ + YYSYMBOL_PARTITION_SYM = 217, /* PARTITION_SYM */ + YYSYMBOL_PATH_SYM = 218, /* PATH_SYM */ + YYSYMBOL_PERCENTILE_CONT_SYM = 219, /* PERCENTILE_CONT_SYM */ + YYSYMBOL_PERCENTILE_DISC_SYM = 220, /* PERCENTILE_DISC_SYM */ + YYSYMBOL_PERCENT_RANK_SYM = 221, /* PERCENT_RANK_SYM */ + YYSYMBOL_PORTION_SYM = 222, /* PORTION_SYM */ + YYSYMBOL_POSITION_SYM = 223, /* POSITION_SYM */ + YYSYMBOL_PRECISION = 224, /* PRECISION */ + YYSYMBOL_PRIMARY_SYM = 225, /* PRIMARY_SYM */ + YYSYMBOL_PROCEDURE_SYM = 226, /* PROCEDURE_SYM */ + YYSYMBOL_PURGE = 227, /* PURGE */ + YYSYMBOL_RAISE_ORACLE_SYM = 228, /* RAISE_ORACLE_SYM */ + YYSYMBOL_RANGE_SYM = 229, /* RANGE_SYM */ + YYSYMBOL_RANK_SYM = 230, /* RANK_SYM */ + YYSYMBOL_READS_SYM = 231, /* READS_SYM */ + YYSYMBOL_READ_SYM = 232, /* READ_SYM */ + YYSYMBOL_READ_WRITE_SYM = 233, /* READ_WRITE_SYM */ + YYSYMBOL_REAL = 234, /* REAL */ + YYSYMBOL_RECURSIVE_SYM = 235, /* RECURSIVE_SYM */ + YYSYMBOL_REFERENCES = 236, /* REFERENCES */ + YYSYMBOL_REF_SYSTEM_ID_SYM = 237, /* REF_SYSTEM_ID_SYM */ + YYSYMBOL_REGEXP = 238, /* REGEXP */ + YYSYMBOL_RELEASE_SYM = 239, /* RELEASE_SYM */ + YYSYMBOL_RENAME = 240, /* RENAME */ + YYSYMBOL_REPEAT_SYM = 241, /* REPEAT_SYM */ + YYSYMBOL_REQUIRE_SYM = 242, /* REQUIRE_SYM */ + YYSYMBOL_RESIGNAL_SYM = 243, /* RESIGNAL_SYM */ + YYSYMBOL_RESTRICT = 244, /* RESTRICT */ + YYSYMBOL_RETURNING_SYM = 245, /* RETURNING_SYM */ + YYSYMBOL_RETURN_MARIADB_SYM = 246, /* RETURN_MARIADB_SYM */ + YYSYMBOL_RETURN_ORACLE_SYM = 247, /* RETURN_ORACLE_SYM */ + YYSYMBOL_REVOKE = 248, /* REVOKE */ + YYSYMBOL_RIGHT = 249, /* RIGHT */ + YYSYMBOL_ROW_NUMBER_SYM = 250, /* ROW_NUMBER_SYM */ + YYSYMBOL_ROWS_SYM = 251, /* ROWS_SYM */ + YYSYMBOL_ROWTYPE_ORACLE_SYM = 252, /* ROWTYPE_ORACLE_SYM */ + YYSYMBOL_SECOND_MICROSECOND_SYM = 253, /* SECOND_MICROSECOND_SYM */ + YYSYMBOL_SELECT_SYM = 254, /* SELECT_SYM */ + YYSYMBOL_SENSITIVE_SYM = 255, /* SENSITIVE_SYM */ + YYSYMBOL_SEPARATOR_SYM = 256, /* SEPARATOR_SYM */ + YYSYMBOL_SERVER_OPTIONS = 257, /* SERVER_OPTIONS */ + YYSYMBOL_SET = 258, /* SET */ + YYSYMBOL_SHOW = 259, /* SHOW */ + YYSYMBOL_SIGNAL_SYM = 260, /* SIGNAL_SYM */ + YYSYMBOL_SMALLINT = 261, /* SMALLINT */ + YYSYMBOL_SPATIAL_SYM = 262, /* SPATIAL_SYM */ + YYSYMBOL_SPECIFIC_SYM = 263, /* SPECIFIC_SYM */ + YYSYMBOL_SQL_BIG_RESULT = 264, /* SQL_BIG_RESULT */ + YYSYMBOL_SQLEXCEPTION_SYM = 265, /* SQLEXCEPTION_SYM */ + YYSYMBOL_SQL_SMALL_RESULT = 266, /* SQL_SMALL_RESULT */ + YYSYMBOL_SQLSTATE_SYM = 267, /* SQLSTATE_SYM */ + YYSYMBOL_SQL_SYM = 268, /* SQL_SYM */ + YYSYMBOL_SQLWARNING_SYM = 269, /* SQLWARNING_SYM */ + YYSYMBOL_SSL_SYM = 270, /* SSL_SYM */ + YYSYMBOL_STARTING = 271, /* STARTING */ + YYSYMBOL_STATS_AUTO_RECALC_SYM = 272, /* STATS_AUTO_RECALC_SYM */ + YYSYMBOL_STATS_PERSISTENT_SYM = 273, /* STATS_PERSISTENT_SYM */ + YYSYMBOL_STATS_SAMPLE_PAGES_SYM = 274, /* STATS_SAMPLE_PAGES_SYM */ + YYSYMBOL_STDDEV_SAMP_SYM = 275, /* STDDEV_SAMP_SYM */ + YYSYMBOL_STD_SYM = 276, /* STD_SYM */ + YYSYMBOL_STRAIGHT_JOIN = 277, /* STRAIGHT_JOIN */ + YYSYMBOL_SUM_SYM = 278, /* SUM_SYM */ + YYSYMBOL_SYSDATE = 279, /* SYSDATE */ + YYSYMBOL_TABLE_REF_PRIORITY = 280, /* TABLE_REF_PRIORITY */ + YYSYMBOL_TABLE_SYM = 281, /* TABLE_SYM */ + YYSYMBOL_TERMINATED = 282, /* TERMINATED */ + YYSYMBOL_THEN_SYM = 283, /* THEN_SYM */ + YYSYMBOL_TINYBLOB = 284, /* TINYBLOB */ + YYSYMBOL_TINYINT = 285, /* TINYINT */ + YYSYMBOL_TINYTEXT = 286, /* TINYTEXT */ + YYSYMBOL_TO_SYM = 287, /* TO_SYM */ + YYSYMBOL_TRAILING = 288, /* TRAILING */ + YYSYMBOL_TRIGGER_SYM = 289, /* TRIGGER_SYM */ + YYSYMBOL_TRUE_SYM = 290, /* TRUE_SYM */ + YYSYMBOL_UNDO_SYM = 291, /* UNDO_SYM */ + YYSYMBOL_UNION_SYM = 292, /* UNION_SYM */ + YYSYMBOL_UNIQUE_SYM = 293, /* UNIQUE_SYM */ + YYSYMBOL_UNLOCK_SYM = 294, /* UNLOCK_SYM */ + YYSYMBOL_UNSIGNED = 295, /* UNSIGNED */ + YYSYMBOL_UPDATE_SYM = 296, /* UPDATE_SYM */ + YYSYMBOL_USAGE = 297, /* USAGE */ + YYSYMBOL_USE_SYM = 298, /* USE_SYM */ + YYSYMBOL_USING = 299, /* USING */ + YYSYMBOL_UTC_DATE_SYM = 300, /* UTC_DATE_SYM */ + YYSYMBOL_UTC_TIMESTAMP_SYM = 301, /* UTC_TIMESTAMP_SYM */ + YYSYMBOL_UTC_TIME_SYM = 302, /* UTC_TIME_SYM */ + YYSYMBOL_VALUES_IN_SYM = 303, /* VALUES_IN_SYM */ + YYSYMBOL_VALUES_LESS_SYM = 304, /* VALUES_LESS_SYM */ + YYSYMBOL_VALUES = 305, /* VALUES */ + YYSYMBOL_VARBINARY = 306, /* VARBINARY */ + YYSYMBOL_VARCHAR = 307, /* VARCHAR */ + YYSYMBOL_VARIANCE_SYM = 308, /* VARIANCE_SYM */ + YYSYMBOL_VAR_SAMP_SYM = 309, /* VAR_SAMP_SYM */ + YYSYMBOL_VARYING = 310, /* VARYING */ + YYSYMBOL_WHEN_SYM = 311, /* WHEN_SYM */ + YYSYMBOL_WHERE = 312, /* WHERE */ + YYSYMBOL_WHILE_SYM = 313, /* WHILE_SYM */ + YYSYMBOL_WITH = 314, /* WITH */ + YYSYMBOL_XOR = 315, /* XOR */ + YYSYMBOL_YEAR_MONTH_SYM = 316, /* YEAR_MONTH_SYM */ + YYSYMBOL_ZEROFILL = 317, /* ZEROFILL */ + YYSYMBOL_BODY_MARIADB_SYM = 318, /* BODY_MARIADB_SYM */ + YYSYMBOL_ELSEIF_ORACLE_SYM = 319, /* ELSEIF_ORACLE_SYM */ + YYSYMBOL_ELSIF_MARIADB_SYM = 320, /* ELSIF_MARIADB_SYM */ + YYSYMBOL_EXCEPTION_ORACLE_SYM = 321, /* EXCEPTION_ORACLE_SYM */ + YYSYMBOL_GOTO_MARIADB_SYM = 322, /* GOTO_MARIADB_SYM */ + YYSYMBOL_OTHERS_MARIADB_SYM = 323, /* OTHERS_MARIADB_SYM */ + YYSYMBOL_PACKAGE_MARIADB_SYM = 324, /* PACKAGE_MARIADB_SYM */ + YYSYMBOL_RAISE_MARIADB_SYM = 325, /* RAISE_MARIADB_SYM */ + YYSYMBOL_ROWTYPE_MARIADB_SYM = 326, /* ROWTYPE_MARIADB_SYM */ + YYSYMBOL_ROWNUM_SYM = 327, /* ROWNUM_SYM */ + YYSYMBOL_REPLACE = 328, /* REPLACE */ + YYSYMBOL_SUBSTRING = 329, /* SUBSTRING */ + YYSYMBOL_TRIM = 330, /* TRIM */ + YYSYMBOL_ACCOUNT_SYM = 331, /* ACCOUNT_SYM */ + YYSYMBOL_ACTION = 332, /* ACTION */ + YYSYMBOL_ADMIN_SYM = 333, /* ADMIN_SYM */ + YYSYMBOL_ADDDATE_SYM = 334, /* ADDDATE_SYM */ + YYSYMBOL_AFTER_SYM = 335, /* AFTER_SYM */ + YYSYMBOL_AGAINST = 336, /* AGAINST */ + YYSYMBOL_AGGREGATE_SYM = 337, /* AGGREGATE_SYM */ + YYSYMBOL_ALGORITHM_SYM = 338, /* ALGORITHM_SYM */ + YYSYMBOL_ALWAYS_SYM = 339, /* ALWAYS_SYM */ + YYSYMBOL_ANY_SYM = 340, /* ANY_SYM */ + YYSYMBOL_ASCII_SYM = 341, /* ASCII_SYM */ + YYSYMBOL_AT_SYM = 342, /* AT_SYM */ + YYSYMBOL_ATOMIC_SYM = 343, /* ATOMIC_SYM */ + YYSYMBOL_AUTHORS_SYM = 344, /* AUTHORS_SYM */ + YYSYMBOL_AUTOEXTEND_SIZE_SYM = 345, /* AUTOEXTEND_SIZE_SYM */ + YYSYMBOL_AUTO_INC = 346, /* AUTO_INC */ + YYSYMBOL_AUTO_SYM = 347, /* AUTO_SYM */ + YYSYMBOL_AVG_ROW_LENGTH = 348, /* AVG_ROW_LENGTH */ + YYSYMBOL_AVG_SYM = 349, /* AVG_SYM */ + YYSYMBOL_BACKUP_SYM = 350, /* BACKUP_SYM */ + YYSYMBOL_BEGIN_MARIADB_SYM = 351, /* BEGIN_MARIADB_SYM */ + YYSYMBOL_BEGIN_ORACLE_SYM = 352, /* BEGIN_ORACLE_SYM */ + YYSYMBOL_BINLOG_SYM = 353, /* BINLOG_SYM */ + YYSYMBOL_BIT_SYM = 354, /* BIT_SYM */ + YYSYMBOL_BLOCK_SYM = 355, /* BLOCK_SYM */ + YYSYMBOL_BOOL_SYM = 356, /* BOOL_SYM */ + YYSYMBOL_BOOLEAN_SYM = 357, /* BOOLEAN_SYM */ + YYSYMBOL_BTREE_SYM = 358, /* BTREE_SYM */ + YYSYMBOL_BYTE_SYM = 359, /* BYTE_SYM */ + YYSYMBOL_CACHE_SYM = 360, /* CACHE_SYM */ + YYSYMBOL_CASCADED = 361, /* CASCADED */ + YYSYMBOL_CATALOG_NAME_SYM = 362, /* CATALOG_NAME_SYM */ + YYSYMBOL_CHAIN_SYM = 363, /* CHAIN_SYM */ + YYSYMBOL_CHANGED = 364, /* CHANGED */ + YYSYMBOL_CHANNEL_SYM = 365, /* CHANNEL_SYM */ + YYSYMBOL_CHARSET = 366, /* CHARSET */ + YYSYMBOL_CHECKPOINT_SYM = 367, /* CHECKPOINT_SYM */ + YYSYMBOL_CHECKSUM_SYM = 368, /* CHECKSUM_SYM */ + YYSYMBOL_CIPHER_SYM = 369, /* CIPHER_SYM */ + YYSYMBOL_CLASS_ORIGIN_SYM = 370, /* CLASS_ORIGIN_SYM */ + YYSYMBOL_CLIENT_SYM = 371, /* CLIENT_SYM */ + YYSYMBOL_CLOB_MARIADB_SYM = 372, /* CLOB_MARIADB_SYM */ + YYSYMBOL_CLOB_ORACLE_SYM = 373, /* CLOB_ORACLE_SYM */ + YYSYMBOL_CLOSE_SYM = 374, /* CLOSE_SYM */ + YYSYMBOL_COALESCE = 375, /* COALESCE */ + YYSYMBOL_CODE_SYM = 376, /* CODE_SYM */ + YYSYMBOL_COLLATION_SYM = 377, /* COLLATION_SYM */ + YYSYMBOL_COLUMNS = 378, /* COLUMNS */ + YYSYMBOL_COLUMN_ADD_SYM = 379, /* COLUMN_ADD_SYM */ + YYSYMBOL_COLUMN_CHECK_SYM = 380, /* COLUMN_CHECK_SYM */ + YYSYMBOL_COLUMN_CREATE_SYM = 381, /* COLUMN_CREATE_SYM */ + YYSYMBOL_COLUMN_DELETE_SYM = 382, /* COLUMN_DELETE_SYM */ + YYSYMBOL_COLUMN_GET_SYM = 383, /* COLUMN_GET_SYM */ + YYSYMBOL_COLUMN_SYM = 384, /* COLUMN_SYM */ + YYSYMBOL_COLUMN_NAME_SYM = 385, /* COLUMN_NAME_SYM */ + YYSYMBOL_COMMENT_SYM = 386, /* COMMENT_SYM */ + YYSYMBOL_COMMITTED_SYM = 387, /* COMMITTED_SYM */ + YYSYMBOL_COMMIT_SYM = 388, /* COMMIT_SYM */ + YYSYMBOL_COMPACT_SYM = 389, /* COMPACT_SYM */ + YYSYMBOL_COMPLETION_SYM = 390, /* COMPLETION_SYM */ + YYSYMBOL_COMPRESSED_SYM = 391, /* COMPRESSED_SYM */ + YYSYMBOL_CONCURRENT = 392, /* CONCURRENT */ + YYSYMBOL_CONNECTION_SYM = 393, /* CONNECTION_SYM */ + YYSYMBOL_CONSISTENT_SYM = 394, /* CONSISTENT_SYM */ + YYSYMBOL_CONSTRAINT_CATALOG_SYM = 395, /* CONSTRAINT_CATALOG_SYM */ + YYSYMBOL_CONSTRAINT_NAME_SYM = 396, /* CONSTRAINT_NAME_SYM */ + YYSYMBOL_CONSTRAINT_SCHEMA_SYM = 397, /* CONSTRAINT_SCHEMA_SYM */ + YYSYMBOL_CONTAINS_SYM = 398, /* CONTAINS_SYM */ + YYSYMBOL_CONTEXT_SYM = 399, /* CONTEXT_SYM */ + YYSYMBOL_CONTRIBUTORS_SYM = 400, /* CONTRIBUTORS_SYM */ + YYSYMBOL_CPU_SYM = 401, /* CPU_SYM */ + YYSYMBOL_CUBE_SYM = 402, /* CUBE_SYM */ + YYSYMBOL_CURRENT_SYM = 403, /* CURRENT_SYM */ + YYSYMBOL_CURRENT_POS_SYM = 404, /* CURRENT_POS_SYM */ + YYSYMBOL_CURSOR_NAME_SYM = 405, /* CURSOR_NAME_SYM */ + YYSYMBOL_CYCLE_SYM = 406, /* CYCLE_SYM */ + YYSYMBOL_DATAFILE_SYM = 407, /* DATAFILE_SYM */ + YYSYMBOL_DATA_SYM = 408, /* DATA_SYM */ + YYSYMBOL_DATETIME = 409, /* DATETIME */ + YYSYMBOL_DATE_SYM = 410, /* DATE_SYM */ + YYSYMBOL_DAY_SYM = 411, /* DAY_SYM */ + YYSYMBOL_DEALLOCATE_SYM = 412, /* DEALLOCATE_SYM */ + YYSYMBOL_DEFINER_SYM = 413, /* DEFINER_SYM */ + YYSYMBOL_DELAYED_SYM = 414, /* DELAYED_SYM */ + YYSYMBOL_DELAY_KEY_WRITE_SYM = 415, /* DELAY_KEY_WRITE_SYM */ + YYSYMBOL_DES_KEY_FILE = 416, /* DES_KEY_FILE */ + YYSYMBOL_DIAGNOSTICS_SYM = 417, /* DIAGNOSTICS_SYM */ + YYSYMBOL_DIRECTORY_SYM = 418, /* DIRECTORY_SYM */ + YYSYMBOL_DISABLE_SYM = 419, /* DISABLE_SYM */ + YYSYMBOL_DISCARD = 420, /* DISCARD */ + YYSYMBOL_DISK_SYM = 421, /* DISK_SYM */ + YYSYMBOL_DO_SYM = 422, /* DO_SYM */ + YYSYMBOL_DUMPFILE = 423, /* DUMPFILE */ + YYSYMBOL_DUPLICATE_SYM = 424, /* DUPLICATE_SYM */ + YYSYMBOL_DYNAMIC_SYM = 425, /* DYNAMIC_SYM */ + YYSYMBOL_ENABLE_SYM = 426, /* ENABLE_SYM */ + YYSYMBOL_END = 427, /* END */ + YYSYMBOL_ENDS_SYM = 428, /* ENDS_SYM */ + YYSYMBOL_ENGINES_SYM = 429, /* ENGINES_SYM */ + YYSYMBOL_ENGINE_SYM = 430, /* ENGINE_SYM */ + YYSYMBOL_ENUM = 431, /* ENUM */ + YYSYMBOL_ERROR_SYM = 432, /* ERROR_SYM */ + YYSYMBOL_ERRORS = 433, /* ERRORS */ + YYSYMBOL_ESCAPE_SYM = 434, /* ESCAPE_SYM */ + YYSYMBOL_EVENTS_SYM = 435, /* EVENTS_SYM */ + YYSYMBOL_EVENT_SYM = 436, /* EVENT_SYM */ + YYSYMBOL_EVERY_SYM = 437, /* EVERY_SYM */ + YYSYMBOL_EXCHANGE_SYM = 438, /* EXCHANGE_SYM */ + YYSYMBOL_EXAMINED_SYM = 439, /* EXAMINED_SYM */ + YYSYMBOL_EXCLUDE_SYM = 440, /* EXCLUDE_SYM */ + YYSYMBOL_EXECUTE_SYM = 441, /* EXECUTE_SYM */ + YYSYMBOL_EXCEPTION_MARIADB_SYM = 442, /* EXCEPTION_MARIADB_SYM */ + YYSYMBOL_EXIT_MARIADB_SYM = 443, /* EXIT_MARIADB_SYM */ + YYSYMBOL_EXIT_ORACLE_SYM = 444, /* EXIT_ORACLE_SYM */ + YYSYMBOL_EXPANSION_SYM = 445, /* EXPANSION_SYM */ + YYSYMBOL_EXPIRE_SYM = 446, /* EXPIRE_SYM */ + YYSYMBOL_EXPORT_SYM = 447, /* EXPORT_SYM */ + YYSYMBOL_EXTENDED_SYM = 448, /* EXTENDED_SYM */ + YYSYMBOL_EXTENT_SIZE_SYM = 449, /* EXTENT_SIZE_SYM */ + YYSYMBOL_FAST_SYM = 450, /* FAST_SYM */ + YYSYMBOL_FAULTS_SYM = 451, /* FAULTS_SYM */ + YYSYMBOL_FEDERATED_SYM = 452, /* FEDERATED_SYM */ + YYSYMBOL_FILE_SYM = 453, /* FILE_SYM */ + YYSYMBOL_FIRST_SYM = 454, /* FIRST_SYM */ + YYSYMBOL_FIXED_SYM = 455, /* FIXED_SYM */ + YYSYMBOL_FLUSH_SYM = 456, /* FLUSH_SYM */ + YYSYMBOL_FOLLOWS_SYM = 457, /* FOLLOWS_SYM */ + YYSYMBOL_FOLLOWING_SYM = 458, /* FOLLOWING_SYM */ + YYSYMBOL_FORCE_SYM = 459, /* FORCE_SYM */ + YYSYMBOL_FORMAT_SYM = 460, /* FORMAT_SYM */ + YYSYMBOL_FOUND_SYM = 461, /* FOUND_SYM */ + YYSYMBOL_FULL = 462, /* FULL */ + YYSYMBOL_FUNCTION_SYM = 463, /* FUNCTION_SYM */ + YYSYMBOL_GENERAL = 464, /* GENERAL */ + YYSYMBOL_GENERATED_SYM = 465, /* GENERATED_SYM */ + YYSYMBOL_GET_FORMAT = 466, /* GET_FORMAT */ + YYSYMBOL_GET_SYM = 467, /* GET_SYM */ + YYSYMBOL_GLOBAL_SYM = 468, /* GLOBAL_SYM */ + YYSYMBOL_GRANTS = 469, /* GRANTS */ + YYSYMBOL_HANDLER_SYM = 470, /* HANDLER_SYM */ + YYSYMBOL_HARD_SYM = 471, /* HARD_SYM */ + YYSYMBOL_HASH_SYM = 472, /* HASH_SYM */ + YYSYMBOL_HELP_SYM = 473, /* HELP_SYM */ + YYSYMBOL_HIGH_PRIORITY = 474, /* HIGH_PRIORITY */ + YYSYMBOL_HISTORY_SYM = 475, /* HISTORY_SYM */ + YYSYMBOL_HOST_SYM = 476, /* HOST_SYM */ + YYSYMBOL_HOSTS_SYM = 477, /* HOSTS_SYM */ + YYSYMBOL_HOUR_SYM = 478, /* HOUR_SYM */ + YYSYMBOL_ID_SYM = 479, /* ID_SYM */ + YYSYMBOL_IDENTIFIED_SYM = 480, /* IDENTIFIED_SYM */ + YYSYMBOL_IGNORE_SERVER_IDS_SYM = 481, /* IGNORE_SERVER_IDS_SYM */ + YYSYMBOL_IMMEDIATE_SYM = 482, /* IMMEDIATE_SYM */ + YYSYMBOL_IMPORT = 483, /* IMPORT */ + YYSYMBOL_INCREMENT_SYM = 484, /* INCREMENT_SYM */ + YYSYMBOL_INDEXES = 485, /* INDEXES */ + YYSYMBOL_INITIAL_SIZE_SYM = 486, /* INITIAL_SIZE_SYM */ + YYSYMBOL_INSERT_METHOD = 487, /* INSERT_METHOD */ + YYSYMBOL_INSTALL_SYM = 488, /* INSTALL_SYM */ + YYSYMBOL_INVOKER_SYM = 489, /* INVOKER_SYM */ + YYSYMBOL_IO_SYM = 490, /* IO_SYM */ + YYSYMBOL_IPC_SYM = 491, /* IPC_SYM */ + YYSYMBOL_ISOLATION = 492, /* ISOLATION */ + YYSYMBOL_ISOPEN_SYM = 493, /* ISOPEN_SYM */ + YYSYMBOL_ISSUER_SYM = 494, /* ISSUER_SYM */ + YYSYMBOL_INVISIBLE_SYM = 495, /* INVISIBLE_SYM */ + YYSYMBOL_JSON_SYM = 496, /* JSON_SYM */ + YYSYMBOL_KEY_BLOCK_SIZE = 497, /* KEY_BLOCK_SIZE */ + YYSYMBOL_LANGUAGE_SYM = 498, /* LANGUAGE_SYM */ + YYSYMBOL_LAST_SYM = 499, /* LAST_SYM */ + YYSYMBOL_LAST_VALUE = 500, /* LAST_VALUE */ + YYSYMBOL_LASTVAL_SYM = 501, /* LASTVAL_SYM */ + YYSYMBOL_LEAVES = 502, /* LEAVES */ + YYSYMBOL_LESS_SYM = 503, /* LESS_SYM */ + YYSYMBOL_LEVEL_SYM = 504, /* LEVEL_SYM */ + YYSYMBOL_LIST_SYM = 505, /* LIST_SYM */ + YYSYMBOL_LOCAL_SYM = 506, /* LOCAL_SYM */ + YYSYMBOL_LOCKED_SYM = 507, /* LOCKED_SYM */ + YYSYMBOL_LOCKS_SYM = 508, /* LOCKS_SYM */ + YYSYMBOL_LOGFILE_SYM = 509, /* LOGFILE_SYM */ + YYSYMBOL_LOGS_SYM = 510, /* LOGS_SYM */ + YYSYMBOL_MASTER_CONNECT_RETRY_SYM = 511, /* MASTER_CONNECT_RETRY_SYM */ + YYSYMBOL_MASTER_DELAY_SYM = 512, /* MASTER_DELAY_SYM */ + YYSYMBOL_MASTER_GTID_POS_SYM = 513, /* MASTER_GTID_POS_SYM */ + YYSYMBOL_MASTER_HOST_SYM = 514, /* MASTER_HOST_SYM */ + YYSYMBOL_MASTER_LOG_FILE_SYM = 515, /* MASTER_LOG_FILE_SYM */ + YYSYMBOL_MASTER_LOG_POS_SYM = 516, /* MASTER_LOG_POS_SYM */ + YYSYMBOL_MASTER_PASSWORD_SYM = 517, /* MASTER_PASSWORD_SYM */ + YYSYMBOL_MASTER_PORT_SYM = 518, /* MASTER_PORT_SYM */ + YYSYMBOL_MASTER_SERVER_ID_SYM = 519, /* MASTER_SERVER_ID_SYM */ + YYSYMBOL_MASTER_SSL_CAPATH_SYM = 520, /* MASTER_SSL_CAPATH_SYM */ + YYSYMBOL_MASTER_SSL_CA_SYM = 521, /* MASTER_SSL_CA_SYM */ + YYSYMBOL_MASTER_SSL_CERT_SYM = 522, /* MASTER_SSL_CERT_SYM */ + YYSYMBOL_MASTER_SSL_CIPHER_SYM = 523, /* MASTER_SSL_CIPHER_SYM */ + YYSYMBOL_MASTER_SSL_CRL_SYM = 524, /* MASTER_SSL_CRL_SYM */ + YYSYMBOL_MASTER_SSL_CRLPATH_SYM = 525, /* MASTER_SSL_CRLPATH_SYM */ + YYSYMBOL_MASTER_SSL_KEY_SYM = 526, /* MASTER_SSL_KEY_SYM */ + YYSYMBOL_MASTER_SSL_SYM = 527, /* MASTER_SSL_SYM */ + YYSYMBOL_MASTER_SYM = 528, /* MASTER_SYM */ + YYSYMBOL_MASTER_USER_SYM = 529, /* MASTER_USER_SYM */ + YYSYMBOL_MASTER_USE_GTID_SYM = 530, /* MASTER_USE_GTID_SYM */ + YYSYMBOL_MASTER_HEARTBEAT_PERIOD_SYM = 531, /* MASTER_HEARTBEAT_PERIOD_SYM */ + YYSYMBOL_MASTER_DEMOTE_TO_SLAVE_SYM = 532, /* MASTER_DEMOTE_TO_SLAVE_SYM */ + YYSYMBOL_MAX_CONNECTIONS_PER_HOUR = 533, /* MAX_CONNECTIONS_PER_HOUR */ + YYSYMBOL_MAX_QUERIES_PER_HOUR = 534, /* MAX_QUERIES_PER_HOUR */ + YYSYMBOL_MAX_ROWS = 535, /* MAX_ROWS */ + YYSYMBOL_MAX_SIZE_SYM = 536, /* MAX_SIZE_SYM */ + YYSYMBOL_MAX_UPDATES_PER_HOUR = 537, /* MAX_UPDATES_PER_HOUR */ + YYSYMBOL_MAX_STATEMENT_TIME_SYM = 538, /* MAX_STATEMENT_TIME_SYM */ + YYSYMBOL_MAX_USER_CONNECTIONS_SYM = 539, /* MAX_USER_CONNECTIONS_SYM */ + YYSYMBOL_MEDIUM_SYM = 540, /* MEDIUM_SYM */ + YYSYMBOL_MEMORY_SYM = 541, /* MEMORY_SYM */ + YYSYMBOL_MERGE_SYM = 542, /* MERGE_SYM */ + YYSYMBOL_MESSAGE_TEXT_SYM = 543, /* MESSAGE_TEXT_SYM */ + YYSYMBOL_MICROSECOND_SYM = 544, /* MICROSECOND_SYM */ + YYSYMBOL_MIGRATE_SYM = 545, /* MIGRATE_SYM */ + YYSYMBOL_MINUTE_SYM = 546, /* MINUTE_SYM */ + YYSYMBOL_MINVALUE_SYM = 547, /* MINVALUE_SYM */ + YYSYMBOL_MIN_ROWS = 548, /* MIN_ROWS */ + YYSYMBOL_MODE_SYM = 549, /* MODE_SYM */ + YYSYMBOL_MODIFY_SYM = 550, /* MODIFY_SYM */ + YYSYMBOL_MONITOR_SYM = 551, /* MONITOR_SYM */ + YYSYMBOL_MONTH_SYM = 552, /* MONTH_SYM */ + YYSYMBOL_MUTEX_SYM = 553, /* MUTEX_SYM */ + YYSYMBOL_MYSQL_SYM = 554, /* MYSQL_SYM */ + YYSYMBOL_MYSQL_ERRNO_SYM = 555, /* MYSQL_ERRNO_SYM */ + YYSYMBOL_NAMES_SYM = 556, /* NAMES_SYM */ + YYSYMBOL_NAME_SYM = 557, /* NAME_SYM */ + YYSYMBOL_NATIONAL_SYM = 558, /* NATIONAL_SYM */ + YYSYMBOL_NCHAR_SYM = 559, /* NCHAR_SYM */ + YYSYMBOL_NEVER_SYM = 560, /* NEVER_SYM */ + YYSYMBOL_NEXT_SYM = 561, /* NEXT_SYM */ + YYSYMBOL_NEXTVAL_SYM = 562, /* NEXTVAL_SYM */ + YYSYMBOL_NOCACHE_SYM = 563, /* NOCACHE_SYM */ + YYSYMBOL_NOCYCLE_SYM = 564, /* NOCYCLE_SYM */ + YYSYMBOL_NODEGROUP_SYM = 565, /* NODEGROUP_SYM */ + YYSYMBOL_NONE_SYM = 566, /* NONE_SYM */ + YYSYMBOL_NOTFOUND_SYM = 567, /* NOTFOUND_SYM */ + YYSYMBOL_NO_SYM = 568, /* NO_SYM */ + YYSYMBOL_NOMAXVALUE_SYM = 569, /* NOMAXVALUE_SYM */ + YYSYMBOL_NOMINVALUE_SYM = 570, /* NOMINVALUE_SYM */ + YYSYMBOL_NO_WAIT_SYM = 571, /* NO_WAIT_SYM */ + YYSYMBOL_NOWAIT_SYM = 572, /* NOWAIT_SYM */ + YYSYMBOL_NUMBER_MARIADB_SYM = 573, /* NUMBER_MARIADB_SYM */ + YYSYMBOL_NUMBER_ORACLE_SYM = 574, /* NUMBER_ORACLE_SYM */ + YYSYMBOL_NVARCHAR_SYM = 575, /* NVARCHAR_SYM */ + YYSYMBOL_OF_SYM = 576, /* OF_SYM */ + YYSYMBOL_OFFSET_SYM = 577, /* OFFSET_SYM */ + YYSYMBOL_OLD_PASSWORD_SYM = 578, /* OLD_PASSWORD_SYM */ + YYSYMBOL_ONE_SYM = 579, /* ONE_SYM */ + YYSYMBOL_ONLY_SYM = 580, /* ONLY_SYM */ + YYSYMBOL_ONLINE_SYM = 581, /* ONLINE_SYM */ + YYSYMBOL_OPEN_SYM = 582, /* OPEN_SYM */ + YYSYMBOL_OPTIONS_SYM = 583, /* OPTIONS_SYM */ + YYSYMBOL_OPTION = 584, /* OPTION */ + YYSYMBOL_OVERLAPS_SYM = 585, /* OVERLAPS_SYM */ + YYSYMBOL_OWNER_SYM = 586, /* OWNER_SYM */ + YYSYMBOL_PACK_KEYS_SYM = 587, /* PACK_KEYS_SYM */ + YYSYMBOL_PAGE_SYM = 588, /* PAGE_SYM */ + YYSYMBOL_PARSER_SYM = 589, /* PARSER_SYM */ + YYSYMBOL_PARTIAL = 590, /* PARTIAL */ + YYSYMBOL_PARTITIONS_SYM = 591, /* PARTITIONS_SYM */ + YYSYMBOL_PARTITIONING_SYM = 592, /* PARTITIONING_SYM */ + YYSYMBOL_PASSWORD_SYM = 593, /* PASSWORD_SYM */ + YYSYMBOL_PERIOD_SYM = 594, /* PERIOD_SYM */ + YYSYMBOL_PERSISTENT_SYM = 595, /* PERSISTENT_SYM */ + YYSYMBOL_PHASE_SYM = 596, /* PHASE_SYM */ + YYSYMBOL_PLUGINS_SYM = 597, /* PLUGINS_SYM */ + YYSYMBOL_PLUGIN_SYM = 598, /* PLUGIN_SYM */ + YYSYMBOL_PORT_SYM = 599, /* PORT_SYM */ + YYSYMBOL_PRECEDES_SYM = 600, /* PRECEDES_SYM */ + YYSYMBOL_PRECEDING_SYM = 601, /* PRECEDING_SYM */ + YYSYMBOL_PREPARE_SYM = 602, /* PREPARE_SYM */ + YYSYMBOL_PRESERVE_SYM = 603, /* PRESERVE_SYM */ + YYSYMBOL_PREV_SYM = 604, /* PREV_SYM */ + YYSYMBOL_PREVIOUS_SYM = 605, /* PREVIOUS_SYM */ + YYSYMBOL_PRIVILEGES = 606, /* PRIVILEGES */ + YYSYMBOL_PROCESS = 607, /* PROCESS */ + YYSYMBOL_PROCESSLIST_SYM = 608, /* PROCESSLIST_SYM */ + YYSYMBOL_PROFILE_SYM = 609, /* PROFILE_SYM */ + YYSYMBOL_PROFILES_SYM = 610, /* PROFILES_SYM */ + YYSYMBOL_PROXY_SYM = 611, /* PROXY_SYM */ + YYSYMBOL_QUARTER_SYM = 612, /* QUARTER_SYM */ + YYSYMBOL_QUERY_SYM = 613, /* QUERY_SYM */ + YYSYMBOL_QUICK = 614, /* QUICK */ + YYSYMBOL_RAW_MARIADB_SYM = 615, /* RAW_MARIADB_SYM */ + YYSYMBOL_RAW_ORACLE_SYM = 616, /* RAW_ORACLE_SYM */ + YYSYMBOL_READ_ONLY_SYM = 617, /* READ_ONLY_SYM */ + YYSYMBOL_REBUILD_SYM = 618, /* REBUILD_SYM */ + YYSYMBOL_RECOVER_SYM = 619, /* RECOVER_SYM */ + YYSYMBOL_REDOFILE_SYM = 620, /* REDOFILE_SYM */ + YYSYMBOL_REDO_BUFFER_SIZE_SYM = 621, /* REDO_BUFFER_SIZE_SYM */ + YYSYMBOL_REDUNDANT_SYM = 622, /* REDUNDANT_SYM */ + YYSYMBOL_RELAY = 623, /* RELAY */ + YYSYMBOL_RELAYLOG_SYM = 624, /* RELAYLOG_SYM */ + YYSYMBOL_RELAY_LOG_FILE_SYM = 625, /* RELAY_LOG_FILE_SYM */ + YYSYMBOL_RELAY_LOG_POS_SYM = 626, /* RELAY_LOG_POS_SYM */ + YYSYMBOL_RELAY_THREAD = 627, /* RELAY_THREAD */ + YYSYMBOL_RELOAD = 628, /* RELOAD */ + YYSYMBOL_REMOVE_SYM = 629, /* REMOVE_SYM */ + YYSYMBOL_REORGANIZE_SYM = 630, /* REORGANIZE_SYM */ + YYSYMBOL_REPAIR = 631, /* REPAIR */ + YYSYMBOL_REPEATABLE_SYM = 632, /* REPEATABLE_SYM */ + YYSYMBOL_REPLAY_SYM = 633, /* REPLAY_SYM */ + YYSYMBOL_REPLICATION = 634, /* REPLICATION */ + YYSYMBOL_RESET_SYM = 635, /* RESET_SYM */ + YYSYMBOL_RESTART_SYM = 636, /* RESTART_SYM */ + YYSYMBOL_RESOURCES = 637, /* RESOURCES */ + YYSYMBOL_RESTORE_SYM = 638, /* RESTORE_SYM */ + YYSYMBOL_RESUME_SYM = 639, /* RESUME_SYM */ + YYSYMBOL_RETURNED_SQLSTATE_SYM = 640, /* RETURNED_SQLSTATE_SYM */ + YYSYMBOL_RETURNS_SYM = 641, /* RETURNS_SYM */ + YYSYMBOL_REUSE_SYM = 642, /* REUSE_SYM */ + YYSYMBOL_REVERSE_SYM = 643, /* REVERSE_SYM */ + YYSYMBOL_ROLE_SYM = 644, /* ROLE_SYM */ + YYSYMBOL_ROLLBACK_SYM = 645, /* ROLLBACK_SYM */ + YYSYMBOL_ROLLUP_SYM = 646, /* ROLLUP_SYM */ + YYSYMBOL_ROUTINE_SYM = 647, /* ROUTINE_SYM */ + YYSYMBOL_ROWCOUNT_SYM = 648, /* ROWCOUNT_SYM */ + YYSYMBOL_ROW_SYM = 649, /* ROW_SYM */ + YYSYMBOL_ROW_COUNT_SYM = 650, /* ROW_COUNT_SYM */ + YYSYMBOL_ROW_FORMAT_SYM = 651, /* ROW_FORMAT_SYM */ + YYSYMBOL_RTREE_SYM = 652, /* RTREE_SYM */ + YYSYMBOL_SAVEPOINT_SYM = 653, /* SAVEPOINT_SYM */ + YYSYMBOL_SCHEDULE_SYM = 654, /* SCHEDULE_SYM */ + YYSYMBOL_SCHEMA_NAME_SYM = 655, /* SCHEMA_NAME_SYM */ + YYSYMBOL_SECOND_SYM = 656, /* SECOND_SYM */ + YYSYMBOL_SECURITY_SYM = 657, /* SECURITY_SYM */ + YYSYMBOL_SEQUENCE_SYM = 658, /* SEQUENCE_SYM */ + YYSYMBOL_SERIALIZABLE_SYM = 659, /* SERIALIZABLE_SYM */ + YYSYMBOL_SERIAL_SYM = 660, /* SERIAL_SYM */ + YYSYMBOL_SESSION_SYM = 661, /* SESSION_SYM */ + YYSYMBOL_SERVER_SYM = 662, /* SERVER_SYM */ + YYSYMBOL_SETVAL_SYM = 663, /* SETVAL_SYM */ + YYSYMBOL_SHARE_SYM = 664, /* SHARE_SYM */ + YYSYMBOL_SHUTDOWN = 665, /* SHUTDOWN */ + YYSYMBOL_SIGNED_SYM = 666, /* SIGNED_SYM */ + YYSYMBOL_SIMPLE_SYM = 667, /* SIMPLE_SYM */ + YYSYMBOL_SKIP_SYM = 668, /* SKIP_SYM */ + YYSYMBOL_SLAVE = 669, /* SLAVE */ + YYSYMBOL_SLAVES = 670, /* SLAVES */ + YYSYMBOL_SLAVE_POS_SYM = 671, /* SLAVE_POS_SYM */ + YYSYMBOL_SLOW = 672, /* SLOW */ + YYSYMBOL_SNAPSHOT_SYM = 673, /* SNAPSHOT_SYM */ + YYSYMBOL_SOCKET_SYM = 674, /* SOCKET_SYM */ + YYSYMBOL_SOFT_SYM = 675, /* SOFT_SYM */ + YYSYMBOL_SONAME_SYM = 676, /* SONAME_SYM */ + YYSYMBOL_SOUNDS_SYM = 677, /* SOUNDS_SYM */ + YYSYMBOL_SOURCE_SYM = 678, /* SOURCE_SYM */ + YYSYMBOL_SQL_BUFFER_RESULT = 679, /* SQL_BUFFER_RESULT */ + YYSYMBOL_SQL_CACHE_SYM = 680, /* SQL_CACHE_SYM */ + YYSYMBOL_SQL_CALC_FOUND_ROWS = 681, /* SQL_CALC_FOUND_ROWS */ + YYSYMBOL_SQL_NO_CACHE_SYM = 682, /* SQL_NO_CACHE_SYM */ + YYSYMBOL_SQL_THREAD = 683, /* SQL_THREAD */ + YYSYMBOL_STAGE_SYM = 684, /* STAGE_SYM */ + YYSYMBOL_STARTS_SYM = 685, /* STARTS_SYM */ + YYSYMBOL_START_SYM = 686, /* START_SYM */ + YYSYMBOL_STATEMENT_SYM = 687, /* STATEMENT_SYM */ + YYSYMBOL_STATUS_SYM = 688, /* STATUS_SYM */ + YYSYMBOL_STOP_SYM = 689, /* STOP_SYM */ + YYSYMBOL_STORAGE_SYM = 690, /* STORAGE_SYM */ + YYSYMBOL_STORED_SYM = 691, /* STORED_SYM */ + YYSYMBOL_STRING_SYM = 692, /* STRING_SYM */ + YYSYMBOL_SUBCLASS_ORIGIN_SYM = 693, /* SUBCLASS_ORIGIN_SYM */ + YYSYMBOL_SUBDATE_SYM = 694, /* SUBDATE_SYM */ + YYSYMBOL_SUBJECT_SYM = 695, /* SUBJECT_SYM */ + YYSYMBOL_SUBPARTITIONS_SYM = 696, /* SUBPARTITIONS_SYM */ + YYSYMBOL_SUBPARTITION_SYM = 697, /* SUBPARTITION_SYM */ + YYSYMBOL_SUPER_SYM = 698, /* SUPER_SYM */ + YYSYMBOL_SUSPEND_SYM = 699, /* SUSPEND_SYM */ + YYSYMBOL_SWAPS_SYM = 700, /* SWAPS_SYM */ + YYSYMBOL_SWITCHES_SYM = 701, /* SWITCHES_SYM */ + YYSYMBOL_SYSTEM = 702, /* SYSTEM */ + YYSYMBOL_SYSTEM_TIME_SYM = 703, /* SYSTEM_TIME_SYM */ + YYSYMBOL_TABLES = 704, /* TABLES */ + YYSYMBOL_TABLESPACE = 705, /* TABLESPACE */ + YYSYMBOL_TABLE_CHECKSUM_SYM = 706, /* TABLE_CHECKSUM_SYM */ + YYSYMBOL_TABLE_NAME_SYM = 707, /* TABLE_NAME_SYM */ + YYSYMBOL_TEMPORARY = 708, /* TEMPORARY */ + YYSYMBOL_TEMPTABLE_SYM = 709, /* TEMPTABLE_SYM */ + YYSYMBOL_TEXT_SYM = 710, /* TEXT_SYM */ + YYSYMBOL_THAN_SYM = 711, /* THAN_SYM */ + YYSYMBOL_TIES_SYM = 712, /* TIES_SYM */ + YYSYMBOL_TIMESTAMP = 713, /* TIMESTAMP */ + YYSYMBOL_TIMESTAMP_ADD = 714, /* TIMESTAMP_ADD */ + YYSYMBOL_TIMESTAMP_DIFF = 715, /* TIMESTAMP_DIFF */ + YYSYMBOL_TIME_SYM = 716, /* TIME_SYM */ + YYSYMBOL_TRANSACTION_SYM = 717, /* TRANSACTION_SYM */ + YYSYMBOL_TRANSACTIONAL_SYM = 718, /* TRANSACTIONAL_SYM */ + YYSYMBOL_THREADS_SYM = 719, /* THREADS_SYM */ + YYSYMBOL_TRIGGERS_SYM = 720, /* TRIGGERS_SYM */ + YYSYMBOL_TRIM_ORACLE = 721, /* TRIM_ORACLE */ + YYSYMBOL_TRUNCATE_SYM = 722, /* TRUNCATE_SYM */ + YYSYMBOL_TYPE_SYM = 723, /* TYPE_SYM */ + YYSYMBOL_UDF_RETURNS_SYM = 724, /* UDF_RETURNS_SYM */ + YYSYMBOL_UNBOUNDED_SYM = 725, /* UNBOUNDED_SYM */ + YYSYMBOL_UNCOMMITTED_SYM = 726, /* UNCOMMITTED_SYM */ + YYSYMBOL_UNDEFINED_SYM = 727, /* UNDEFINED_SYM */ + YYSYMBOL_UNDOFILE_SYM = 728, /* UNDOFILE_SYM */ + YYSYMBOL_UNDO_BUFFER_SIZE_SYM = 729, /* UNDO_BUFFER_SIZE_SYM */ + YYSYMBOL_UNICODE_SYM = 730, /* UNICODE_SYM */ + YYSYMBOL_UNINSTALL_SYM = 731, /* UNINSTALL_SYM */ + YYSYMBOL_UNKNOWN_SYM = 732, /* UNKNOWN_SYM */ + YYSYMBOL_UNTIL_SYM = 733, /* UNTIL_SYM */ + YYSYMBOL_UPGRADE_SYM = 734, /* UPGRADE_SYM */ + YYSYMBOL_USER_SYM = 735, /* USER_SYM */ + YYSYMBOL_USE_FRM = 736, /* USE_FRM */ + YYSYMBOL_VALUE_SYM = 737, /* VALUE_SYM */ + YYSYMBOL_VARCHAR2_MARIADB_SYM = 738, /* VARCHAR2_MARIADB_SYM */ + YYSYMBOL_VARCHAR2_ORACLE_SYM = 739, /* VARCHAR2_ORACLE_SYM */ + YYSYMBOL_VARIABLES = 740, /* VARIABLES */ + YYSYMBOL_VERSIONING_SYM = 741, /* VERSIONING_SYM */ + YYSYMBOL_VIA_SYM = 742, /* VIA_SYM */ + YYSYMBOL_VIEW_SYM = 743, /* VIEW_SYM */ + YYSYMBOL_VISIBLE_SYM = 744, /* VISIBLE_SYM */ + YYSYMBOL_VIRTUAL_SYM = 745, /* VIRTUAL_SYM */ + YYSYMBOL_WAIT_SYM = 746, /* WAIT_SYM */ + YYSYMBOL_WARNINGS = 747, /* WARNINGS */ + YYSYMBOL_WEEK_SYM = 748, /* WEEK_SYM */ + YYSYMBOL_WEIGHT_STRING_SYM = 749, /* WEIGHT_STRING_SYM */ + YYSYMBOL_WINDOW_SYM = 750, /* WINDOW_SYM */ + YYSYMBOL_WITHIN = 751, /* WITHIN */ + YYSYMBOL_WITHOUT = 752, /* WITHOUT */ + YYSYMBOL_WORK_SYM = 753, /* WORK_SYM */ + YYSYMBOL_WRAPPER_SYM = 754, /* WRAPPER_SYM */ + YYSYMBOL_WRITE_SYM = 755, /* WRITE_SYM */ + YYSYMBOL_X509_SYM = 756, /* X509_SYM */ + YYSYMBOL_XA_SYM = 757, /* XA_SYM */ + YYSYMBOL_XML_SYM = 758, /* XML_SYM */ + YYSYMBOL_YEAR_SYM = 759, /* YEAR_SYM */ + YYSYMBOL_CONDITIONLESS_JOIN = 760, /* CONDITIONLESS_JOIN */ + YYSYMBOL_ON_SYM = 761, /* ON_SYM */ + YYSYMBOL_PREC_BELOW_NOT = 762, /* PREC_BELOW_NOT */ + YYSYMBOL_763_ = 763, /* '=' */ + YYSYMBOL_764_ = 764, /* '>' */ + YYSYMBOL_765_ = 765, /* '<' */ + YYSYMBOL_766_ = 766, /* '|' */ + YYSYMBOL_767_ = 767, /* '&' */ + YYSYMBOL_768_ = 768, /* '-' */ + YYSYMBOL_769_ = 769, /* '+' */ + YYSYMBOL_770_ = 770, /* '*' */ + YYSYMBOL_771_ = 771, /* '/' */ + YYSYMBOL_772_ = 772, /* '%' */ + YYSYMBOL_773_ = 773, /* '^' */ + YYSYMBOL_774_ = 774, /* '~' */ + YYSYMBOL_SUBQUERY_AS_EXPR = 775, /* SUBQUERY_AS_EXPR */ + YYSYMBOL_PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE = 776, /* PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE */ + YYSYMBOL_USER = 777, /* USER */ + YYSYMBOL_PREC_BELOW_CONTRACTION_TOKEN2 = 778, /* PREC_BELOW_CONTRACTION_TOKEN2 */ + YYSYMBOL_779_ = 779, /* '(' */ + YYSYMBOL_780_ = 780, /* ')' */ + YYSYMBOL_EMPTY_FROM_CLAUSE = 781, /* EMPTY_FROM_CLAUSE */ + YYSYMBOL_782_ = 782, /* ',' */ + YYSYMBOL_783_ = 783, /* '!' */ + YYSYMBOL_784_ = 784, /* '{' */ + YYSYMBOL_785_ = 785, /* '}' */ + YYSYMBOL_786_ = 786, /* ';' */ + YYSYMBOL_787_ = 787, /* '.' */ + YYSYMBOL_788_ = 788, /* ':' */ + YYSYMBOL_YYACCEPT = 789, /* $accept */ + YYSYMBOL_query = 790, /* query */ + YYSYMBOL_791_1 = 791, /* $@1 */ + YYSYMBOL_opt_end_of_input = 792, /* opt_end_of_input */ + YYSYMBOL_directly_executable_statement = 793, /* directly_executable_statement */ + YYSYMBOL_verb_clause = 794, /* verb_clause */ + YYSYMBOL_deallocate = 795, /* deallocate */ + YYSYMBOL_deallocate_or_drop = 796, /* deallocate_or_drop */ + YYSYMBOL_prepare = 797, /* prepare */ + YYSYMBOL_798_2 = 798, /* $@2 */ + YYSYMBOL_execute = 799, /* execute */ + YYSYMBOL_800_3 = 800, /* $@3 */ + YYSYMBOL_801_4 = 801, /* $@4 */ + YYSYMBOL_execute_using = 802, /* execute_using */ + YYSYMBOL_803_5 = 803, /* $@5 */ + YYSYMBOL_execute_params = 804, /* execute_params */ + YYSYMBOL_help = 805, /* help */ + YYSYMBOL_806_6 = 806, /* $@6 */ + YYSYMBOL_change = 807, /* change */ + YYSYMBOL_808_7 = 808, /* $@7 */ + YYSYMBOL_master_defs = 809, /* master_defs */ + YYSYMBOL_master_def = 810, /* master_def */ + YYSYMBOL_ignore_server_id_list = 811, /* ignore_server_id_list */ + YYSYMBOL_ignore_server_id = 812, /* ignore_server_id */ + YYSYMBOL_do_domain_id_list = 813, /* do_domain_id_list */ + YYSYMBOL_do_domain_id = 814, /* do_domain_id */ + YYSYMBOL_ignore_domain_id_list = 815, /* ignore_domain_id_list */ + YYSYMBOL_ignore_domain_id = 816, /* ignore_domain_id */ + YYSYMBOL_master_file_def = 817, /* master_file_def */ + YYSYMBOL_optional_connection_name = 818, /* optional_connection_name */ + YYSYMBOL_connection_name = 819, /* connection_name */ + YYSYMBOL_optional_for_channel = 820, /* optional_for_channel */ + YYSYMBOL_for_channel = 821, /* for_channel */ + YYSYMBOL_create = 822, /* create */ + YYSYMBOL_823_8 = 823, /* $@8 */ + YYSYMBOL_824_9 = 824, /* $@9 */ + YYSYMBOL_825_10 = 825, /* $@10 */ + YYSYMBOL_826_11 = 826, /* $@11 */ + YYSYMBOL_827_12 = 827, /* $@12 */ + YYSYMBOL_828_13 = 828, /* $@13 */ + YYSYMBOL_829_14 = 829, /* $@14 */ + YYSYMBOL_830_15 = 830, /* $@15 */ + YYSYMBOL_831_16 = 831, /* $@16 */ + YYSYMBOL_832_17 = 832, /* $@17 */ + YYSYMBOL_833_18 = 833, /* $@18 */ + YYSYMBOL_834_19 = 834, /* $@19 */ + YYSYMBOL_835_20 = 835, /* $@20 */ + YYSYMBOL_836_21 = 836, /* $@21 */ + YYSYMBOL_837_22 = 837, /* $@22 */ + YYSYMBOL_838_23 = 838, /* $@23 */ + YYSYMBOL_839_24 = 839, /* $@24 */ + YYSYMBOL_opt_sequence = 840, /* opt_sequence */ + YYSYMBOL_sequence_defs = 841, /* sequence_defs */ + YYSYMBOL_sequence_def = 842, /* sequence_def */ + YYSYMBOL_force_lookahead = 843, /* force_lookahead */ + YYSYMBOL_server_def = 844, /* server_def */ + YYSYMBOL_845_25 = 845, /* $@25 */ + YYSYMBOL_server_options_list = 846, /* server_options_list */ + YYSYMBOL_server_option = 847, /* server_option */ + YYSYMBOL_event_tail = 848, /* event_tail */ + YYSYMBOL_849_26 = 849, /* $@26 */ + YYSYMBOL_ev_schedule_time = 850, /* ev_schedule_time */ + YYSYMBOL_851_27 = 851, /* $@27 */ + YYSYMBOL_opt_ev_status = 852, /* opt_ev_status */ + YYSYMBOL_ev_starts = 853, /* ev_starts */ + YYSYMBOL_ev_ends = 854, /* ev_ends */ + YYSYMBOL_opt_ev_on_completion = 855, /* opt_ev_on_completion */ + YYSYMBOL_ev_on_completion = 856, /* ev_on_completion */ + YYSYMBOL_opt_ev_comment = 857, /* opt_ev_comment */ + YYSYMBOL_ev_sql_stmt = 858, /* ev_sql_stmt */ + YYSYMBOL_859_28 = 859, /* $@28 */ + YYSYMBOL_clear_privileges = 860, /* clear_privileges */ + YYSYMBOL_opt_aggregate = 861, /* opt_aggregate */ + YYSYMBOL_sp_handler = 862, /* sp_handler */ + YYSYMBOL_sp_name = 863, /* sp_name */ + YYSYMBOL_sp_a_chistics = 864, /* sp_a_chistics */ + YYSYMBOL_sp_c_chistics = 865, /* sp_c_chistics */ + YYSYMBOL_sp_chistic = 866, /* sp_chistic */ + YYSYMBOL_sp_c_chistic = 867, /* sp_c_chistic */ + YYSYMBOL_sp_suid = 868, /* sp_suid */ + YYSYMBOL_call = 869, /* call */ + YYSYMBOL_870_29 = 870, /* $@29 */ + YYSYMBOL_871_30 = 871, /* $@30 */ + YYSYMBOL_872_31 = 872, /* $@31 */ + YYSYMBOL_opt_sp_cparam_list = 873, /* opt_sp_cparam_list */ + YYSYMBOL_opt_sp_cparams = 874, /* opt_sp_cparams */ + YYSYMBOL_sp_cparams = 875, /* sp_cparams */ + YYSYMBOL_sp_fdparam_list = 876, /* sp_fdparam_list */ + YYSYMBOL_877_32 = 877, /* $@32 */ + YYSYMBOL_sp_fdparams = 878, /* sp_fdparams */ + YYSYMBOL_sp_param_name = 879, /* sp_param_name */ + YYSYMBOL_sp_pdparam_list = 880, /* sp_pdparam_list */ + YYSYMBOL_sp_pdparams = 881, /* sp_pdparams */ + YYSYMBOL_sp_parameter_type = 882, /* sp_parameter_type */ + YYSYMBOL_sp_parenthesized_pdparam_list = 883, /* sp_parenthesized_pdparam_list */ + YYSYMBOL_884_33 = 884, /* $@33 */ + YYSYMBOL_sp_parenthesized_fdparam_list = 885, /* sp_parenthesized_fdparam_list */ + YYSYMBOL_sp_proc_stmts = 886, /* sp_proc_stmts */ + YYSYMBOL_sp_proc_stmts1 = 887, /* sp_proc_stmts1 */ + YYSYMBOL_optionally_qualified_column_ident = 888, /* optionally_qualified_column_ident */ + YYSYMBOL_row_field_definition = 889, /* row_field_definition */ + YYSYMBOL_row_field_definition_list = 890, /* row_field_definition_list */ + YYSYMBOL_row_type_body = 891, /* row_type_body */ + YYSYMBOL_sp_decl_idents_init_vars = 892, /* sp_decl_idents_init_vars */ + YYSYMBOL_sp_decl_variable_list = 893, /* sp_decl_variable_list */ + YYSYMBOL_894_34 = 894, /* $@34 */ + YYSYMBOL_sp_decl_handler = 895, /* sp_decl_handler */ + YYSYMBOL_896_35 = 896, /* $@35 */ + YYSYMBOL_opt_parenthesized_cursor_formal_parameters = 897, /* opt_parenthesized_cursor_formal_parameters */ + YYSYMBOL_sp_cursor_stmt_lex = 898, /* sp_cursor_stmt_lex */ + YYSYMBOL_sp_cursor_stmt = 899, /* sp_cursor_stmt */ + YYSYMBOL_900_36 = 900, /* $@36 */ + YYSYMBOL_sp_handler_type = 901, /* sp_handler_type */ + YYSYMBOL_sp_hcond_list = 902, /* sp_hcond_list */ + YYSYMBOL_sp_hcond_element = 903, /* sp_hcond_element */ + YYSYMBOL_sp_cond = 904, /* sp_cond */ + YYSYMBOL_sqlstate = 905, /* sqlstate */ + YYSYMBOL_opt_value = 906, /* opt_value */ + YYSYMBOL_sp_hcond = 907, /* sp_hcond */ + YYSYMBOL_raise_stmt_oracle = 908, /* raise_stmt_oracle */ + YYSYMBOL_signal_stmt = 909, /* signal_stmt */ + YYSYMBOL_signal_value = 910, /* signal_value */ + YYSYMBOL_opt_signal_value = 911, /* opt_signal_value */ + YYSYMBOL_opt_set_signal_information = 912, /* opt_set_signal_information */ + YYSYMBOL_signal_information_item_list = 913, /* signal_information_item_list */ + YYSYMBOL_signal_allowed_expr = 914, /* signal_allowed_expr */ + YYSYMBOL_signal_condition_information_item_name = 915, /* signal_condition_information_item_name */ + YYSYMBOL_resignal_stmt = 916, /* resignal_stmt */ + YYSYMBOL_get_diagnostics = 917, /* get_diagnostics */ + YYSYMBOL_which_area = 918, /* which_area */ + YYSYMBOL_diagnostics_information = 919, /* diagnostics_information */ + YYSYMBOL_statement_information = 920, /* statement_information */ + YYSYMBOL_statement_information_item = 921, /* statement_information_item */ + YYSYMBOL_simple_target_specification = 922, /* simple_target_specification */ + YYSYMBOL_statement_information_item_name = 923, /* statement_information_item_name */ + YYSYMBOL_condition_number = 924, /* condition_number */ + YYSYMBOL_condition_information = 925, /* condition_information */ + YYSYMBOL_condition_information_item = 926, /* condition_information_item */ + YYSYMBOL_condition_information_item_name = 927, /* condition_information_item_name */ + YYSYMBOL_sp_decl_ident = 928, /* sp_decl_ident */ + YYSYMBOL_sp_decl_idents = 929, /* sp_decl_idents */ + YYSYMBOL_sp_proc_stmt_if = 930, /* sp_proc_stmt_if */ + YYSYMBOL_931_37 = 931, /* $@37 */ + YYSYMBOL_sp_proc_stmt_statement = 932, /* sp_proc_stmt_statement */ + YYSYMBOL_933_38 = 933, /* $@38 */ + YYSYMBOL_RETURN_ALLMODES_SYM = 934, /* RETURN_ALLMODES_SYM */ + YYSYMBOL_sp_proc_stmt_return = 935, /* sp_proc_stmt_return */ + YYSYMBOL_936_39 = 936, /* $@39 */ + YYSYMBOL_sp_proc_stmt_exit_oracle = 937, /* sp_proc_stmt_exit_oracle */ + YYSYMBOL_938_40 = 938, /* $@40 */ + YYSYMBOL_939_41 = 939, /* $@41 */ + YYSYMBOL_sp_proc_stmt_continue_oracle = 940, /* sp_proc_stmt_continue_oracle */ + YYSYMBOL_941_42 = 941, /* $@42 */ + YYSYMBOL_942_43 = 942, /* $@43 */ + YYSYMBOL_sp_proc_stmt_leave = 943, /* sp_proc_stmt_leave */ + YYSYMBOL_sp_proc_stmt_iterate = 944, /* sp_proc_stmt_iterate */ + YYSYMBOL_sp_proc_stmt_goto_oracle = 945, /* sp_proc_stmt_goto_oracle */ + YYSYMBOL_expr_lex = 946, /* expr_lex */ + YYSYMBOL_947_44 = 947, /* @44 */ + YYSYMBOL_assignment_source_lex = 948, /* assignment_source_lex */ + YYSYMBOL_assignment_source_expr = 949, /* assignment_source_expr */ + YYSYMBOL_950_45 = 950, /* $@45 */ + YYSYMBOL_for_loop_bound_expr = 951, /* for_loop_bound_expr */ + YYSYMBOL_952_46 = 952, /* $@46 */ + YYSYMBOL_cursor_actual_parameters = 953, /* cursor_actual_parameters */ + YYSYMBOL_opt_parenthesized_cursor_actual_parameters = 954, /* opt_parenthesized_cursor_actual_parameters */ + YYSYMBOL_sp_proc_stmt_with_cursor = 955, /* sp_proc_stmt_with_cursor */ + YYSYMBOL_sp_proc_stmt_open = 956, /* sp_proc_stmt_open */ + YYSYMBOL_sp_proc_stmt_fetch_head = 957, /* sp_proc_stmt_fetch_head */ + YYSYMBOL_sp_proc_stmt_fetch = 958, /* sp_proc_stmt_fetch */ + YYSYMBOL_sp_proc_stmt_close = 959, /* sp_proc_stmt_close */ + YYSYMBOL_sp_fetch_list = 960, /* sp_fetch_list */ + YYSYMBOL_sp_if = 961, /* sp_if */ + YYSYMBOL_962_47 = 962, /* $@47 */ + YYSYMBOL_963_48 = 963, /* $@48 */ + YYSYMBOL_sp_elseifs = 964, /* sp_elseifs */ + YYSYMBOL_case_stmt_specification = 965, /* case_stmt_specification */ + YYSYMBOL_966_49 = 966, /* $@49 */ + YYSYMBOL_case_stmt_body = 967, /* case_stmt_body */ + YYSYMBOL_968_50 = 968, /* $@50 */ + YYSYMBOL_simple_when_clause_list = 969, /* simple_when_clause_list */ + YYSYMBOL_searched_when_clause_list = 970, /* searched_when_clause_list */ + YYSYMBOL_simple_when_clause = 971, /* simple_when_clause */ + YYSYMBOL_972_51 = 972, /* $@51 */ + YYSYMBOL_searched_when_clause = 973, /* searched_when_clause */ + YYSYMBOL_974_52 = 974, /* $@52 */ + YYSYMBOL_else_clause_opt = 975, /* else_clause_opt */ + YYSYMBOL_sp_opt_label = 976, /* sp_opt_label */ + YYSYMBOL_opt_sp_for_loop_direction = 977, /* opt_sp_for_loop_direction */ + YYSYMBOL_sp_for_loop_index_and_bounds = 978, /* sp_for_loop_index_and_bounds */ + YYSYMBOL_sp_for_loop_bounds = 979, /* sp_for_loop_bounds */ + YYSYMBOL_loop_body = 980, /* loop_body */ + YYSYMBOL_repeat_body = 981, /* repeat_body */ + YYSYMBOL_pop_sp_loop_label = 982, /* pop_sp_loop_label */ + YYSYMBOL_sp_labeled_control = 983, /* sp_labeled_control */ + YYSYMBOL_984_53 = 984, /* $@53 */ + YYSYMBOL_985_54 = 985, /* $@54 */ + YYSYMBOL_986_55 = 986, /* $@55 */ + YYSYMBOL_987_56 = 987, /* $@56 */ + YYSYMBOL_988_57 = 988, /* $@57 */ + YYSYMBOL_989_58 = 989, /* $@58 */ + YYSYMBOL_sp_unlabeled_control = 990, /* sp_unlabeled_control */ + YYSYMBOL_991_59 = 991, /* $@59 */ + YYSYMBOL_992_60 = 992, /* $@60 */ + YYSYMBOL_993_61 = 993, /* $@61 */ + YYSYMBOL_994_62 = 994, /* $@62 */ + YYSYMBOL_995_63 = 995, /* $@63 */ + YYSYMBOL_trg_action_time = 996, /* trg_action_time */ + YYSYMBOL_trg_event = 997, /* trg_event */ + YYSYMBOL_create_body = 998, /* create_body */ + YYSYMBOL_999_64 = 999, /* $@64 */ + YYSYMBOL_create_like = 1000, /* create_like */ + YYSYMBOL_opt_create_select = 1001, /* opt_create_select */ + YYSYMBOL_create_select_query_expression = 1002, /* create_select_query_expression */ + YYSYMBOL_opt_create_partitioning = 1003, /* opt_create_partitioning */ + YYSYMBOL_opt_partitioning = 1004, /* opt_partitioning */ + YYSYMBOL_partitioning = 1005, /* partitioning */ + YYSYMBOL_1006_65 = 1006, /* $@65 */ + YYSYMBOL_have_partitioning = 1007, /* have_partitioning */ + YYSYMBOL_partition_entry = 1008, /* partition_entry */ + YYSYMBOL_1009_66 = 1009, /* $@66 */ + YYSYMBOL_partition = 1010, /* partition */ + YYSYMBOL_1011_67 = 1011, /* $@67 */ + YYSYMBOL_part_type_def = 1012, /* part_type_def */ + YYSYMBOL_1013_68 = 1013, /* $@68 */ + YYSYMBOL_1014_69 = 1014, /* $@69 */ + YYSYMBOL_1015_70 = 1015, /* $@70 */ + YYSYMBOL_opt_linear = 1016, /* opt_linear */ + YYSYMBOL_opt_key_algo = 1017, /* opt_key_algo */ + YYSYMBOL_part_field_list = 1018, /* part_field_list */ + YYSYMBOL_part_field_item_list = 1019, /* part_field_item_list */ + YYSYMBOL_part_field_item = 1020, /* part_field_item */ + YYSYMBOL_part_column_list = 1021, /* part_column_list */ + YYSYMBOL_part_func = 1022, /* part_func */ + YYSYMBOL_sub_part_func = 1023, /* sub_part_func */ + YYSYMBOL_opt_num_parts = 1024, /* opt_num_parts */ + YYSYMBOL_opt_sub_part = 1025, /* opt_sub_part */ + YYSYMBOL_1026_71 = 1026, /* $@71 */ + YYSYMBOL_1027_72 = 1027, /* $@72 */ + YYSYMBOL_sub_part_field_list = 1028, /* sub_part_field_list */ + YYSYMBOL_sub_part_field_item = 1029, /* sub_part_field_item */ + YYSYMBOL_part_func_expr = 1030, /* part_func_expr */ + YYSYMBOL_opt_num_subparts = 1031, /* opt_num_subparts */ + YYSYMBOL_part_defs = 1032, /* part_defs */ + YYSYMBOL_part_def_list = 1033, /* part_def_list */ + YYSYMBOL_opt_partition = 1034, /* opt_partition */ + YYSYMBOL_part_definition = 1035, /* part_definition */ + YYSYMBOL_1036_73 = 1036, /* $@73 */ + YYSYMBOL_part_name = 1037, /* part_name */ + YYSYMBOL_opt_part_values = 1038, /* opt_part_values */ + YYSYMBOL_1039_74 = 1039, /* $@74 */ + YYSYMBOL_1040_75 = 1040, /* $@75 */ + YYSYMBOL_part_func_max = 1041, /* part_func_max */ + YYSYMBOL_part_values_in = 1042, /* part_values_in */ + YYSYMBOL_part_value_list = 1043, /* part_value_list */ + YYSYMBOL_part_value_item = 1044, /* part_value_item */ + YYSYMBOL_1045_76 = 1045, /* $@76 */ + YYSYMBOL_1046_77 = 1046, /* $@77 */ + YYSYMBOL_part_value_item_list = 1047, /* part_value_item_list */ + YYSYMBOL_part_value_expr_item = 1048, /* part_value_expr_item */ + YYSYMBOL_opt_sub_partition = 1049, /* opt_sub_partition */ + YYSYMBOL_sub_part_list = 1050, /* sub_part_list */ + YYSYMBOL_sub_part_definition = 1051, /* sub_part_definition */ + YYSYMBOL_1052_78 = 1052, /* $@78 */ + YYSYMBOL_sub_name = 1053, /* sub_name */ + YYSYMBOL_opt_part_options = 1054, /* opt_part_options */ + YYSYMBOL_part_option_list = 1055, /* part_option_list */ + YYSYMBOL_part_option = 1056, /* part_option */ + YYSYMBOL_opt_subpart_options = 1057, /* opt_subpart_options */ + YYSYMBOL_subpart_option_list = 1058, /* subpart_option_list */ + YYSYMBOL_server_part_option = 1059, /* server_part_option */ + YYSYMBOL_opt_versioning_rotation = 1060, /* opt_versioning_rotation */ + YYSYMBOL_1061_79 = 1061, /* $@79 */ + YYSYMBOL_opt_versioning_interval_start = 1062, /* opt_versioning_interval_start */ + YYSYMBOL_opt_vers_auto_part = 1063, /* opt_vers_auto_part */ + YYSYMBOL_opt_as = 1064, /* opt_as */ + YYSYMBOL_opt_create_database_options = 1065, /* opt_create_database_options */ + YYSYMBOL_create_database_options = 1066, /* create_database_options */ + YYSYMBOL_create_database_option = 1067, /* create_database_option */ + YYSYMBOL_opt_if_not_exists_table_element = 1068, /* opt_if_not_exists_table_element */ + YYSYMBOL_opt_if_not_exists = 1069, /* opt_if_not_exists */ + YYSYMBOL_create_or_replace = 1070, /* create_or_replace */ + YYSYMBOL_opt_create_table_options = 1071, /* opt_create_table_options */ + YYSYMBOL_create_table_options_space_separated = 1072, /* create_table_options_space_separated */ + YYSYMBOL_create_table_options = 1073, /* create_table_options */ + YYSYMBOL_create_table_option = 1074, /* create_table_option */ + YYSYMBOL_1075_80 = 1075, /* $@80 */ + YYSYMBOL_engine_defined_option = 1076, /* engine_defined_option */ + YYSYMBOL_opt_versioning_option = 1077, /* opt_versioning_option */ + YYSYMBOL_versioning_option = 1078, /* versioning_option */ + YYSYMBOL_default_charset = 1079, /* default_charset */ + YYSYMBOL_default_collation = 1080, /* default_collation */ + YYSYMBOL_storage_engines = 1081, /* storage_engines */ + YYSYMBOL_known_storage_engines = 1082, /* known_storage_engines */ + YYSYMBOL_row_types = 1083, /* row_types */ + YYSYMBOL_merge_insert_types = 1084, /* merge_insert_types */ + YYSYMBOL_udf_type = 1085, /* udf_type */ + YYSYMBOL_create_field_list = 1086, /* create_field_list */ + YYSYMBOL_create_field_list_parens = 1087, /* create_field_list_parens */ + YYSYMBOL_field_list = 1088, /* field_list */ + YYSYMBOL_field_list_item = 1089, /* field_list_item */ + YYSYMBOL_column_def = 1090, /* column_def */ + YYSYMBOL_key_def = 1091, /* key_def */ + YYSYMBOL_1092_81 = 1092, /* $@81 */ + YYSYMBOL_1093_82 = 1093, /* $@82 */ + YYSYMBOL_1094_83 = 1094, /* $@83 */ + YYSYMBOL_1095_84 = 1095, /* $@84 */ + YYSYMBOL_1096_85 = 1096, /* $@85 */ + YYSYMBOL_1097_86 = 1097, /* $@86 */ + YYSYMBOL_1098_87 = 1098, /* $@87 */ + YYSYMBOL_constraint_def = 1099, /* constraint_def */ + YYSYMBOL_period_for_system_time = 1100, /* period_for_system_time */ + YYSYMBOL_period_for_application_time = 1101, /* period_for_application_time */ + YYSYMBOL_opt_check_constraint = 1102, /* opt_check_constraint */ + YYSYMBOL_check_constraint = 1103, /* check_constraint */ + YYSYMBOL_opt_constraint_no_id = 1104, /* opt_constraint_no_id */ + YYSYMBOL_opt_constraint = 1105, /* opt_constraint */ + YYSYMBOL_constraint = 1106, /* constraint */ + YYSYMBOL_field_spec = 1107, /* field_spec */ + YYSYMBOL_1108_88 = 1108, /* @88 */ + YYSYMBOL_field_type_or_serial = 1109, /* field_type_or_serial */ + YYSYMBOL_1110_89 = 1110, /* $@89 */ + YYSYMBOL_1111_90 = 1111, /* $@90 */ + YYSYMBOL_opt_serial_attribute = 1112, /* opt_serial_attribute */ + YYSYMBOL_opt_serial_attribute_list = 1113, /* opt_serial_attribute_list */ + YYSYMBOL_opt_asrow_attribute = 1114, /* opt_asrow_attribute */ + YYSYMBOL_opt_asrow_attribute_list = 1115, /* opt_asrow_attribute_list */ + YYSYMBOL_field_def = 1116, /* field_def */ + YYSYMBOL_1117_91 = 1117, /* $@91 */ + YYSYMBOL_opt_generated_always = 1118, /* opt_generated_always */ + YYSYMBOL_vcol_opt_specifier = 1119, /* vcol_opt_specifier */ + YYSYMBOL_vcol_opt_attribute = 1120, /* vcol_opt_attribute */ + YYSYMBOL_vcol_opt_attribute_list = 1121, /* vcol_opt_attribute_list */ + YYSYMBOL_vcol_attribute = 1122, /* vcol_attribute */ + YYSYMBOL_parse_vcol_expr = 1123, /* parse_vcol_expr */ + YYSYMBOL_1124_92 = 1124, /* $@92 */ + YYSYMBOL_parenthesized_expr = 1125, /* parenthesized_expr */ + YYSYMBOL_virtual_column_func = 1126, /* virtual_column_func */ + YYSYMBOL_expr_or_literal = 1127, /* expr_or_literal */ + YYSYMBOL_column_default_expr = 1128, /* column_default_expr */ + YYSYMBOL_field_type = 1129, /* field_type */ + YYSYMBOL_qualified_field_type = 1130, /* qualified_field_type */ + YYSYMBOL_udt_name = 1131, /* udt_name */ + YYSYMBOL_field_type_all = 1132, /* field_type_all */ + YYSYMBOL_field_type_numeric = 1133, /* field_type_numeric */ + YYSYMBOL_opt_binary_and_compression = 1134, /* opt_binary_and_compression */ + YYSYMBOL_field_type_string = 1135, /* field_type_string */ + YYSYMBOL_field_type_temporal = 1136, /* field_type_temporal */ + YYSYMBOL_field_type_lob = 1137, /* field_type_lob */ + YYSYMBOL_field_type_misc = 1138, /* field_type_misc */ + YYSYMBOL_char = 1139, /* char */ + YYSYMBOL_nchar = 1140, /* nchar */ + YYSYMBOL_varchar = 1141, /* varchar */ + YYSYMBOL_nvarchar = 1142, /* nvarchar */ + YYSYMBOL_int_type = 1143, /* int_type */ + YYSYMBOL_real_type = 1144, /* real_type */ + YYSYMBOL_srid_option = 1145, /* srid_option */ + YYSYMBOL_float_options = 1146, /* float_options */ + YYSYMBOL_precision = 1147, /* precision */ + YYSYMBOL_field_options = 1148, /* field_options */ + YYSYMBOL_last_field_options = 1149, /* last_field_options */ + YYSYMBOL_field_length_str = 1150, /* field_length_str */ + YYSYMBOL_field_length = 1151, /* field_length */ + YYSYMBOL_field_scale = 1152, /* field_scale */ + YYSYMBOL_opt_field_length = 1153, /* opt_field_length */ + YYSYMBOL_opt_field_scale = 1154, /* opt_field_scale */ + YYSYMBOL_opt_precision = 1155, /* opt_precision */ + YYSYMBOL_attribute_list = 1156, /* attribute_list */ + YYSYMBOL_attribute = 1157, /* attribute */ + YYSYMBOL_opt_compression_method = 1158, /* opt_compression_method */ + YYSYMBOL_opt_compressed = 1159, /* opt_compressed */ + YYSYMBOL_opt_enable = 1160, /* opt_enable */ + YYSYMBOL_compressed = 1161, /* compressed */ + YYSYMBOL_compressed_deprecated_data_type_attribute = 1162, /* compressed_deprecated_data_type_attribute */ + YYSYMBOL_compressed_deprecated_column_attribute = 1163, /* compressed_deprecated_column_attribute */ + YYSYMBOL_asrow_attribute = 1164, /* asrow_attribute */ + YYSYMBOL_serial_attribute = 1165, /* serial_attribute */ + YYSYMBOL_with_or_without_system = 1166, /* with_or_without_system */ + YYSYMBOL_charset = 1167, /* charset */ + YYSYMBOL_charset_name = 1168, /* charset_name */ + YYSYMBOL_charset_name_or_default = 1169, /* charset_name_or_default */ + YYSYMBOL_opt_load_data_charset = 1170, /* opt_load_data_charset */ + YYSYMBOL_old_or_new_charset_name = 1171, /* old_or_new_charset_name */ + YYSYMBOL_old_or_new_charset_name_or_default = 1172, /* old_or_new_charset_name_or_default */ + YYSYMBOL_collation_name = 1173, /* collation_name */ + YYSYMBOL_collation_name_or_default = 1174, /* collation_name_or_default */ + YYSYMBOL_opt_default = 1175, /* opt_default */ + YYSYMBOL_charset_or_alias = 1176, /* charset_or_alias */ + YYSYMBOL_opt_binary = 1177, /* opt_binary */ + YYSYMBOL_binary = 1178, /* binary */ + YYSYMBOL_opt_bin_mod = 1179, /* opt_bin_mod */ + YYSYMBOL_ws_nweights = 1180, /* ws_nweights */ + YYSYMBOL_1181_93 = 1181, /* $@93 */ + YYSYMBOL_ws_level_flag_desc = 1182, /* ws_level_flag_desc */ + YYSYMBOL_ws_level_flag_reverse = 1183, /* ws_level_flag_reverse */ + YYSYMBOL_ws_level_flags = 1184, /* ws_level_flags */ + YYSYMBOL_ws_level_number = 1185, /* ws_level_number */ + YYSYMBOL_ws_level_list_item = 1186, /* ws_level_list_item */ + YYSYMBOL_ws_level_list = 1187, /* ws_level_list */ + YYSYMBOL_ws_level_range = 1188, /* ws_level_range */ + YYSYMBOL_ws_level_list_or_range = 1189, /* ws_level_list_or_range */ + YYSYMBOL_opt_ws_levels = 1190, /* opt_ws_levels */ + YYSYMBOL_opt_primary = 1191, /* opt_primary */ + YYSYMBOL_references = 1192, /* references */ + YYSYMBOL_opt_ref_list = 1193, /* opt_ref_list */ + YYSYMBOL_ref_list = 1194, /* ref_list */ + YYSYMBOL_opt_match_clause = 1195, /* opt_match_clause */ + YYSYMBOL_opt_on_update_delete = 1196, /* opt_on_update_delete */ + YYSYMBOL_delete_option = 1197, /* delete_option */ + YYSYMBOL_constraint_key_type = 1198, /* constraint_key_type */ + YYSYMBOL_key_or_index = 1199, /* key_or_index */ + YYSYMBOL_opt_key_or_index = 1200, /* opt_key_or_index */ + YYSYMBOL_keys_or_index = 1201, /* keys_or_index */ + YYSYMBOL_fulltext = 1202, /* fulltext */ + YYSYMBOL_spatial = 1203, /* spatial */ + YYSYMBOL_normal_key_options = 1204, /* normal_key_options */ + YYSYMBOL_fulltext_key_options = 1205, /* fulltext_key_options */ + YYSYMBOL_spatial_key_options = 1206, /* spatial_key_options */ + YYSYMBOL_normal_key_opts = 1207, /* normal_key_opts */ + YYSYMBOL_spatial_key_opts = 1208, /* spatial_key_opts */ + YYSYMBOL_fulltext_key_opts = 1209, /* fulltext_key_opts */ + YYSYMBOL_opt_USING_key_algorithm = 1210, /* opt_USING_key_algorithm */ + YYSYMBOL_opt_key_algorithm_clause = 1211, /* opt_key_algorithm_clause */ + YYSYMBOL_key_using_alg = 1212, /* key_using_alg */ + YYSYMBOL_all_key_opt = 1213, /* all_key_opt */ + YYSYMBOL_normal_key_opt = 1214, /* normal_key_opt */ + YYSYMBOL_spatial_key_opt = 1215, /* spatial_key_opt */ + YYSYMBOL_fulltext_key_opt = 1216, /* fulltext_key_opt */ + YYSYMBOL_btree_or_rtree = 1217, /* btree_or_rtree */ + YYSYMBOL_ignorability = 1218, /* ignorability */ + YYSYMBOL_key_list = 1219, /* key_list */ + YYSYMBOL_opt_without_overlaps = 1220, /* opt_without_overlaps */ + YYSYMBOL_key_part = 1221, /* key_part */ + YYSYMBOL_opt_ident = 1222, /* opt_ident */ + YYSYMBOL_string_list = 1223, /* string_list */ + YYSYMBOL_alter = 1224, /* alter */ + YYSYMBOL_1225_94 = 1225, /* $@94 */ + YYSYMBOL_1226_95 = 1226, /* $@95 */ + YYSYMBOL_1227_96 = 1227, /* $@96 */ + YYSYMBOL_1228_97 = 1228, /* $@97 */ + YYSYMBOL_1229_98 = 1229, /* $@98 */ + YYSYMBOL_1230_99 = 1230, /* $@99 */ + YYSYMBOL_1231_100 = 1231, /* $@100 */ + YYSYMBOL_1232_101 = 1232, /* $@101 */ + YYSYMBOL_1233_102 = 1233, /* $@102 */ + YYSYMBOL_1234_103 = 1234, /* $@103 */ + YYSYMBOL_1235_104 = 1235, /* $@104 */ + YYSYMBOL_1236_105 = 1236, /* $@105 */ + YYSYMBOL_1237_106 = 1237, /* $@106 */ + YYSYMBOL_account_locking_option = 1238, /* account_locking_option */ + YYSYMBOL_opt_password_expire_option = 1239, /* opt_password_expire_option */ + YYSYMBOL_opt_account_locking_and_opt_password_expiration = 1240, /* opt_account_locking_and_opt_password_expiration */ + YYSYMBOL_ev_alter_on_schedule_completion = 1241, /* ev_alter_on_schedule_completion */ + YYSYMBOL_opt_ev_rename_to = 1242, /* opt_ev_rename_to */ + YYSYMBOL_opt_ev_sql_stmt = 1243, /* opt_ev_sql_stmt */ + YYSYMBOL_ident_or_empty = 1244, /* ident_or_empty */ + YYSYMBOL_alter_commands = 1245, /* alter_commands */ + YYSYMBOL_1246_107 = 1246, /* $@107 */ + YYSYMBOL_1247_108 = 1247, /* $@108 */ + YYSYMBOL_1248_109 = 1248, /* $@109 */ + YYSYMBOL_1249_110 = 1249, /* $@110 */ + YYSYMBOL_remove_partitioning = 1250, /* remove_partitioning */ + YYSYMBOL_all_or_alt_part_name_list = 1251, /* all_or_alt_part_name_list */ + YYSYMBOL_add_partition_rule = 1252, /* add_partition_rule */ + YYSYMBOL_1253_111 = 1253, /* $@111 */ + YYSYMBOL_add_part_extra = 1254, /* add_part_extra */ + YYSYMBOL_reorg_partition_rule = 1255, /* reorg_partition_rule */ + YYSYMBOL_1256_112 = 1256, /* $@112 */ + YYSYMBOL_reorg_parts_rule = 1257, /* reorg_parts_rule */ + YYSYMBOL_1258_113 = 1258, /* $@113 */ + YYSYMBOL_alt_part_name_list = 1259, /* alt_part_name_list */ + YYSYMBOL_alt_part_name_item = 1260, /* alt_part_name_item */ + YYSYMBOL_alter_list = 1261, /* alter_list */ + YYSYMBOL_add_column = 1262, /* add_column */ + YYSYMBOL_alter_list_item = 1263, /* alter_list_item */ + YYSYMBOL_opt_index_lock_algorithm = 1264, /* opt_index_lock_algorithm */ + YYSYMBOL_alter_algorithm_option = 1265, /* alter_algorithm_option */ + YYSYMBOL_alter_lock_option = 1266, /* alter_lock_option */ + YYSYMBOL_opt_column = 1267, /* opt_column */ + YYSYMBOL_opt_ignore = 1268, /* opt_ignore */ + YYSYMBOL_alter_options = 1269, /* alter_options */ + YYSYMBOL_1270_114 = 1270, /* $@114 */ + YYSYMBOL_alter_options_part2 = 1271, /* alter_options_part2 */ + YYSYMBOL_alter_option_list = 1272, /* alter_option_list */ + YYSYMBOL_alter_option = 1273, /* alter_option */ + YYSYMBOL_opt_restrict = 1274, /* opt_restrict */ + YYSYMBOL_opt_place = 1275, /* opt_place */ + YYSYMBOL_opt_to = 1276, /* opt_to */ + YYSYMBOL_slave = 1277, /* slave */ + YYSYMBOL_1278_115 = 1278, /* $@115 */ + YYSYMBOL_1279_116 = 1279, /* $@116 */ + YYSYMBOL_start = 1280, /* start */ + YYSYMBOL_opt_start_transaction_option_list = 1281, /* opt_start_transaction_option_list */ + YYSYMBOL_start_transaction_option_list = 1282, /* start_transaction_option_list */ + YYSYMBOL_start_transaction_option = 1283, /* start_transaction_option */ + YYSYMBOL_slave_thread_opts = 1284, /* slave_thread_opts */ + YYSYMBOL_1285_117 = 1285, /* $@117 */ + YYSYMBOL_slave_thread_opt_list = 1286, /* slave_thread_opt_list */ + YYSYMBOL_slave_thread_opt = 1287, /* slave_thread_opt */ + YYSYMBOL_slave_until = 1288, /* slave_until */ + YYSYMBOL_slave_until_opts = 1289, /* slave_until_opts */ + YYSYMBOL_checksum = 1290, /* checksum */ + YYSYMBOL_1291_118 = 1291, /* $@118 */ + YYSYMBOL_opt_checksum_type = 1292, /* opt_checksum_type */ + YYSYMBOL_repair_table_or_view = 1293, /* repair_table_or_view */ + YYSYMBOL_1294_119 = 1294, /* $@119 */ + YYSYMBOL_repair = 1295, /* repair */ + YYSYMBOL_1296_120 = 1296, /* $@120 */ + YYSYMBOL_opt_mi_repair_type = 1297, /* opt_mi_repair_type */ + YYSYMBOL_mi_repair_types = 1298, /* mi_repair_types */ + YYSYMBOL_mi_repair_type = 1299, /* mi_repair_type */ + YYSYMBOL_opt_view_repair_type = 1300, /* opt_view_repair_type */ + YYSYMBOL_analyze = 1301, /* analyze */ + YYSYMBOL_1302_121 = 1302, /* $@121 */ + YYSYMBOL_analyze_table_list = 1303, /* analyze_table_list */ + YYSYMBOL_analyze_table_elem_spec = 1304, /* analyze_table_elem_spec */ + YYSYMBOL_opt_persistent_stat_clause = 1305, /* opt_persistent_stat_clause */ + YYSYMBOL_persistent_stat_spec = 1306, /* persistent_stat_spec */ + YYSYMBOL_persistent_column_stat_spec = 1307, /* persistent_column_stat_spec */ + YYSYMBOL_1308_122 = 1308, /* $@122 */ + YYSYMBOL_persistent_index_stat_spec = 1309, /* persistent_index_stat_spec */ + YYSYMBOL_1310_123 = 1310, /* $@123 */ + YYSYMBOL_table_column_list = 1311, /* table_column_list */ + YYSYMBOL_table_index_list = 1312, /* table_index_list */ + YYSYMBOL_table_index_name = 1313, /* table_index_name */ + YYSYMBOL_binlog_base64_event = 1314, /* binlog_base64_event */ + YYSYMBOL_check_view_or_table = 1315, /* check_view_or_table */ + YYSYMBOL_1316_124 = 1316, /* $@124 */ + YYSYMBOL_check = 1317, /* check */ + YYSYMBOL_1318_125 = 1318, /* $@125 */ + YYSYMBOL_opt_mi_check_type = 1319, /* opt_mi_check_type */ + YYSYMBOL_mi_check_types = 1320, /* mi_check_types */ + YYSYMBOL_mi_check_type = 1321, /* mi_check_type */ + YYSYMBOL_opt_view_check_type = 1322, /* opt_view_check_type */ + YYSYMBOL_optimize = 1323, /* optimize */ + YYSYMBOL_1324_126 = 1324, /* $@126 */ + YYSYMBOL_opt_no_write_to_binlog = 1325, /* opt_no_write_to_binlog */ + YYSYMBOL_rename = 1326, /* rename */ + YYSYMBOL_1327_127 = 1327, /* $@127 */ + YYSYMBOL_rename_list = 1328, /* rename_list */ + YYSYMBOL_table_to_table_list = 1329, /* table_to_table_list */ + YYSYMBOL_table_to_table = 1330, /* table_to_table */ + YYSYMBOL_keycache = 1331, /* keycache */ + YYSYMBOL_1332_128 = 1332, /* $@128 */ + YYSYMBOL_keycache_list_or_parts = 1333, /* keycache_list_or_parts */ + YYSYMBOL_keycache_list = 1334, /* keycache_list */ + YYSYMBOL_assign_to_keycache = 1335, /* assign_to_keycache */ + YYSYMBOL_assign_to_keycache_parts = 1336, /* assign_to_keycache_parts */ + YYSYMBOL_key_cache_name = 1337, /* key_cache_name */ + YYSYMBOL_preload = 1338, /* preload */ + YYSYMBOL_1339_129 = 1339, /* $@129 */ + YYSYMBOL_preload_list_or_parts = 1340, /* preload_list_or_parts */ + YYSYMBOL_preload_list = 1341, /* preload_list */ + YYSYMBOL_preload_keys = 1342, /* preload_keys */ + YYSYMBOL_preload_keys_parts = 1343, /* preload_keys_parts */ + YYSYMBOL_adm_partition = 1344, /* adm_partition */ + YYSYMBOL_1345_130 = 1345, /* $@130 */ + YYSYMBOL_cache_keys_spec = 1346, /* cache_keys_spec */ + YYSYMBOL_1347_131 = 1347, /* $@131 */ + YYSYMBOL_cache_key_list_or_empty = 1348, /* cache_key_list_or_empty */ + YYSYMBOL_opt_ignore_leaves = 1349, /* opt_ignore_leaves */ + YYSYMBOL_select = 1350, /* select */ + YYSYMBOL_1351_132 = 1351, /* $@132 */ + YYSYMBOL_1352_133 = 1352, /* $@133 */ + YYSYMBOL_select_into = 1353, /* select_into */ + YYSYMBOL_1354_134 = 1354, /* $@134 */ + YYSYMBOL_1355_135 = 1355, /* $@135 */ + YYSYMBOL_simple_table = 1356, /* simple_table */ + YYSYMBOL_table_value_constructor = 1357, /* table_value_constructor */ + YYSYMBOL_1358_136 = 1358, /* $@136 */ + YYSYMBOL_query_specification_start = 1359, /* query_specification_start */ + YYSYMBOL_1360_137 = 1360, /* $@137 */ + YYSYMBOL_1361_138 = 1361, /* $@138 */ + YYSYMBOL_query_specification = 1362, /* query_specification */ + YYSYMBOL_select_into_query_specification = 1363, /* select_into_query_specification */ + YYSYMBOL_query_expression = 1364, /* query_expression */ + YYSYMBOL_query_expression_no_with_clause = 1365, /* query_expression_no_with_clause */ + YYSYMBOL_query_expression_body_ext = 1366, /* query_expression_body_ext */ + YYSYMBOL_1367_139 = 1367, /* $@139 */ + YYSYMBOL_1368_140 = 1368, /* $@140 */ + YYSYMBOL_query_expression_body_ext_parens = 1369, /* query_expression_body_ext_parens */ + YYSYMBOL_query_expression_body = 1370, /* query_expression_body */ + YYSYMBOL_1371_141 = 1371, /* $@141 */ + YYSYMBOL_query_primary = 1372, /* query_primary */ + YYSYMBOL_query_simple = 1373, /* query_simple */ + YYSYMBOL_subselect = 1374, /* subselect */ + YYSYMBOL_subquery = 1375, /* subquery */ + YYSYMBOL_opt_from_clause = 1376, /* opt_from_clause */ + YYSYMBOL_from_clause = 1377, /* from_clause */ + YYSYMBOL_table_reference_list = 1378, /* table_reference_list */ + YYSYMBOL_select_options = 1379, /* select_options */ + YYSYMBOL_opt_history_unit = 1380, /* opt_history_unit */ + YYSYMBOL_history_point = 1381, /* history_point */ + YYSYMBOL_for_portion_of_time_clause = 1382, /* for_portion_of_time_clause */ + YYSYMBOL_opt_for_portion_of_time_clause = 1383, /* opt_for_portion_of_time_clause */ + YYSYMBOL_opt_for_system_time_clause = 1384, /* opt_for_system_time_clause */ + YYSYMBOL_system_time_expr = 1385, /* system_time_expr */ + YYSYMBOL_select_option_list = 1386, /* select_option_list */ + YYSYMBOL_select_option = 1387, /* select_option */ + YYSYMBOL_select_lock_type = 1388, /* select_lock_type */ + YYSYMBOL_opt_select_lock_type = 1389, /* opt_select_lock_type */ + YYSYMBOL_opt_lock_wait_timeout_new = 1390, /* opt_lock_wait_timeout_new */ + YYSYMBOL_select_item_list = 1391, /* select_item_list */ + YYSYMBOL_select_item = 1392, /* select_item */ + YYSYMBOL_remember_tok_start = 1393, /* remember_tok_start */ + YYSYMBOL_remember_name = 1394, /* remember_name */ + YYSYMBOL_remember_end = 1395, /* remember_end */ + YYSYMBOL_select_alias = 1396, /* select_alias */ + YYSYMBOL_opt_default_time_precision = 1397, /* opt_default_time_precision */ + YYSYMBOL_opt_time_precision = 1398, /* opt_time_precision */ + YYSYMBOL_optional_braces = 1399, /* optional_braces */ + YYSYMBOL_expr = 1400, /* expr */ + YYSYMBOL_boolean_test = 1401, /* boolean_test */ + YYSYMBOL_predicate = 1402, /* predicate */ + YYSYMBOL_bit_expr = 1403, /* bit_expr */ + YYSYMBOL_or = 1404, /* or */ + YYSYMBOL_and = 1405, /* and */ + YYSYMBOL_not = 1406, /* not */ + YYSYMBOL_not2 = 1407, /* not2 */ + YYSYMBOL_comp_op = 1408, /* comp_op */ + YYSYMBOL_all_or_any = 1409, /* all_or_any */ + YYSYMBOL_opt_dyncol_type = 1410, /* opt_dyncol_type */ + YYSYMBOL_dyncol_type = 1411, /* dyncol_type */ + YYSYMBOL_numeric_dyncol_type = 1412, /* numeric_dyncol_type */ + YYSYMBOL_temporal_dyncol_type = 1413, /* temporal_dyncol_type */ + YYSYMBOL_string_dyncol_type = 1414, /* string_dyncol_type */ + YYSYMBOL_dyncall_create_element = 1415, /* dyncall_create_element */ + YYSYMBOL_dyncall_create_list = 1416, /* dyncall_create_list */ + YYSYMBOL_plsql_cursor_attr = 1417, /* plsql_cursor_attr */ + YYSYMBOL_explicit_cursor_attr = 1418, /* explicit_cursor_attr */ + YYSYMBOL_trim_operands = 1419, /* trim_operands */ + YYSYMBOL_trim_operands_regular = 1420, /* trim_operands_regular */ + YYSYMBOL_trim_operands_special = 1421, /* trim_operands_special */ + YYSYMBOL_column_default_non_parenthesized_expr = 1422, /* column_default_non_parenthesized_expr */ + YYSYMBOL_primary_expr = 1423, /* primary_expr */ + YYSYMBOL_string_factor_expr = 1424, /* string_factor_expr */ + YYSYMBOL_simple_expr = 1425, /* simple_expr */ + YYSYMBOL_mysql_concatenation_expr = 1426, /* mysql_concatenation_expr */ + YYSYMBOL_function_call_keyword_timestamp = 1427, /* function_call_keyword_timestamp */ + YYSYMBOL_function_call_keyword = 1428, /* function_call_keyword */ + YYSYMBOL_substring_operands = 1429, /* substring_operands */ + YYSYMBOL_substring_operands_regular = 1430, /* substring_operands_regular */ + YYSYMBOL_substring_operands_special = 1431, /* substring_operands_special */ + YYSYMBOL_function_call_nonkeyword = 1432, /* function_call_nonkeyword */ + YYSYMBOL_function_call_conflict = 1433, /* function_call_conflict */ + YYSYMBOL_function_call_generic = 1434, /* function_call_generic */ + YYSYMBOL_1435_142 = 1435, /* @142 */ + YYSYMBOL_fulltext_options = 1436, /* fulltext_options */ + YYSYMBOL_opt_natural_language_mode = 1437, /* opt_natural_language_mode */ + YYSYMBOL_opt_query_expansion = 1438, /* opt_query_expansion */ + YYSYMBOL_opt_udf_expr_list = 1439, /* opt_udf_expr_list */ + YYSYMBOL_udf_expr_list = 1440, /* udf_expr_list */ + YYSYMBOL_udf_expr = 1441, /* udf_expr */ + YYSYMBOL_sum_expr = 1442, /* sum_expr */ + YYSYMBOL_1443_143 = 1443, /* $@143 */ + YYSYMBOL_1444_144 = 1444, /* $@144 */ + YYSYMBOL_1445_145 = 1445, /* $@145 */ + YYSYMBOL_1446_146 = 1446, /* $@146 */ + YYSYMBOL_1447_147 = 1447, /* $@147 */ + YYSYMBOL_window_func_expr = 1448, /* window_func_expr */ + YYSYMBOL_window_func = 1449, /* window_func */ + YYSYMBOL_simple_window_func = 1450, /* simple_window_func */ + YYSYMBOL_inverse_distribution_function = 1451, /* inverse_distribution_function */ + YYSYMBOL_percentile_function = 1452, /* percentile_function */ + YYSYMBOL_1453_148 = 1453, /* $@148 */ + YYSYMBOL_inverse_distribution_function_def = 1454, /* inverse_distribution_function_def */ + YYSYMBOL_order_by_single_element_list = 1455, /* order_by_single_element_list */ + YYSYMBOL_window_name = 1456, /* window_name */ + YYSYMBOL_variable = 1457, /* variable */ + YYSYMBOL_1458_149 = 1458, /* $@149 */ + YYSYMBOL_variable_aux = 1459, /* variable_aux */ + YYSYMBOL_opt_distinct = 1460, /* opt_distinct */ + YYSYMBOL_opt_gconcat_separator = 1461, /* opt_gconcat_separator */ + YYSYMBOL_opt_gorder_clause = 1462, /* opt_gorder_clause */ + YYSYMBOL_gorder_list = 1463, /* gorder_list */ + YYSYMBOL_opt_glimit_clause = 1464, /* opt_glimit_clause */ + YYSYMBOL_glimit_clause = 1465, /* glimit_clause */ + YYSYMBOL_glimit_options = 1466, /* glimit_options */ + YYSYMBOL_in_sum_expr = 1467, /* in_sum_expr */ + YYSYMBOL_1468_150 = 1468, /* $@150 */ + YYSYMBOL_cast_type = 1469, /* cast_type */ + YYSYMBOL_cast_type_numeric = 1470, /* cast_type_numeric */ + YYSYMBOL_cast_type_temporal = 1471, /* cast_type_temporal */ + YYSYMBOL_opt_expr_list = 1472, /* opt_expr_list */ + YYSYMBOL_expr_list = 1473, /* expr_list */ + YYSYMBOL_ident_list_arg = 1474, /* ident_list_arg */ + YYSYMBOL_ident_list = 1475, /* ident_list */ + YYSYMBOL_when_list = 1476, /* when_list */ + YYSYMBOL_when_list_opt_else = 1477, /* when_list_opt_else */ + YYSYMBOL_table_ref = 1478, /* table_ref */ + YYSYMBOL_json_text_literal = 1479, /* json_text_literal */ + YYSYMBOL_json_text_literal_or_num = 1480, /* json_text_literal_or_num */ + YYSYMBOL_join_table_list = 1481, /* join_table_list */ + YYSYMBOL_json_table_columns_clause = 1482, /* json_table_columns_clause */ + YYSYMBOL_json_table_columns_list = 1483, /* json_table_columns_list */ + YYSYMBOL_json_table_column = 1484, /* json_table_column */ + YYSYMBOL_1485_151 = 1485, /* $@151 */ + YYSYMBOL_1486_152 = 1486, /* $@152 */ + YYSYMBOL_json_table_column_type = 1487, /* json_table_column_type */ + YYSYMBOL_json_table_field_type = 1488, /* json_table_field_type */ + YYSYMBOL_json_opt_on_empty_or_error = 1489, /* json_opt_on_empty_or_error */ + YYSYMBOL_json_on_response = 1490, /* json_on_response */ + YYSYMBOL_json_on_error_response = 1491, /* json_on_error_response */ + YYSYMBOL_json_on_empty_response = 1492, /* json_on_empty_response */ + YYSYMBOL_table_function = 1493, /* table_function */ + YYSYMBOL_1494_153 = 1494, /* $@153 */ + YYSYMBOL_1495_154 = 1495, /* $@154 */ + YYSYMBOL_esc_table_ref = 1496, /* esc_table_ref */ + YYSYMBOL_derived_table_list = 1497, /* derived_table_list */ + YYSYMBOL_join_table = 1498, /* join_table */ + YYSYMBOL_1499_155 = 1499, /* $@155 */ + YYSYMBOL_1500_156 = 1500, /* $@156 */ + YYSYMBOL_1501_157 = 1501, /* $@157 */ + YYSYMBOL_1502_158 = 1502, /* $@158 */ + YYSYMBOL_1503_159 = 1503, /* $@159 */ + YYSYMBOL_1504_160 = 1504, /* $@160 */ + YYSYMBOL_inner_join = 1505, /* inner_join */ + YYSYMBOL_normal_join = 1506, /* normal_join */ + YYSYMBOL_opt_use_partition = 1507, /* opt_use_partition */ + YYSYMBOL_use_partition = 1508, /* use_partition */ + YYSYMBOL_table_factor = 1509, /* table_factor */ + YYSYMBOL_table_primary_ident_opt_parens = 1510, /* table_primary_ident_opt_parens */ + YYSYMBOL_table_primary_derived_opt_parens = 1511, /* table_primary_derived_opt_parens */ + YYSYMBOL_table_reference_list_parens = 1512, /* table_reference_list_parens */ + YYSYMBOL_nested_table_reference_list = 1513, /* nested_table_reference_list */ + YYSYMBOL_join_table_parens = 1514, /* join_table_parens */ + YYSYMBOL_table_primary_ident = 1515, /* table_primary_ident */ + YYSYMBOL_table_primary_derived = 1516, /* table_primary_derived */ + YYSYMBOL_opt_outer = 1517, /* opt_outer */ + YYSYMBOL_index_hint_clause = 1518, /* index_hint_clause */ + YYSYMBOL_index_hint_type = 1519, /* index_hint_type */ + YYSYMBOL_index_hint_definition = 1520, /* index_hint_definition */ + YYSYMBOL_1521_161 = 1521, /* $@161 */ + YYSYMBOL_1522_162 = 1522, /* $@162 */ + YYSYMBOL_index_hints_list = 1523, /* index_hints_list */ + YYSYMBOL_opt_index_hints_list = 1524, /* opt_index_hints_list */ + YYSYMBOL_1525_163 = 1525, /* $@163 */ + YYSYMBOL_opt_key_definition = 1526, /* opt_key_definition */ + YYSYMBOL_1527_164 = 1527, /* $@164 */ + YYSYMBOL_opt_key_usage_list = 1528, /* opt_key_usage_list */ + YYSYMBOL_key_usage_element = 1529, /* key_usage_element */ + YYSYMBOL_key_usage_list = 1530, /* key_usage_list */ + YYSYMBOL_using_list = 1531, /* using_list */ + YYSYMBOL_interval = 1532, /* interval */ + YYSYMBOL_interval_time_stamp = 1533, /* interval_time_stamp */ + YYSYMBOL_date_time_type = 1534, /* date_time_type */ + YYSYMBOL_table_alias = 1535, /* table_alias */ + YYSYMBOL_opt_table_alias_clause = 1536, /* opt_table_alias_clause */ + YYSYMBOL_table_alias_clause = 1537, /* table_alias_clause */ + YYSYMBOL_opt_all = 1538, /* opt_all */ + YYSYMBOL_opt_where_clause = 1539, /* opt_where_clause */ + YYSYMBOL_1540_165 = 1540, /* $@165 */ + YYSYMBOL_opt_having_clause = 1541, /* opt_having_clause */ + YYSYMBOL_1542_166 = 1542, /* $@166 */ + YYSYMBOL_opt_group_clause = 1543, /* opt_group_clause */ + YYSYMBOL_group_list = 1544, /* group_list */ + YYSYMBOL_olap_opt = 1545, /* olap_opt */ + YYSYMBOL_opt_window_clause = 1546, /* opt_window_clause */ + YYSYMBOL_window_def_list = 1547, /* window_def_list */ + YYSYMBOL_window_def = 1548, /* window_def */ + YYSYMBOL_window_spec = 1549, /* window_spec */ + YYSYMBOL_1550_167 = 1550, /* $@167 */ + YYSYMBOL_opt_window_ref = 1551, /* opt_window_ref */ + YYSYMBOL_opt_window_partition_clause = 1552, /* opt_window_partition_clause */ + YYSYMBOL_opt_window_order_clause = 1553, /* opt_window_order_clause */ + YYSYMBOL_opt_window_frame_clause = 1554, /* opt_window_frame_clause */ + YYSYMBOL_window_frame_units = 1555, /* window_frame_units */ + YYSYMBOL_window_frame_extent = 1556, /* window_frame_extent */ + YYSYMBOL_window_frame_start = 1557, /* window_frame_start */ + YYSYMBOL_window_frame_bound = 1558, /* window_frame_bound */ + YYSYMBOL_opt_window_frame_exclusion = 1559, /* opt_window_frame_exclusion */ + YYSYMBOL_alter_order_clause = 1560, /* alter_order_clause */ + YYSYMBOL_alter_order_list = 1561, /* alter_order_list */ + YYSYMBOL_alter_order_item = 1562, /* alter_order_item */ + YYSYMBOL_opt_order_clause = 1563, /* opt_order_clause */ + YYSYMBOL_order_clause = 1564, /* order_clause */ + YYSYMBOL_1565_168 = 1565, /* $@168 */ + YYSYMBOL_order_list = 1566, /* order_list */ + YYSYMBOL_order_dir = 1567, /* order_dir */ + YYSYMBOL_opt_limit_clause = 1568, /* opt_limit_clause */ + YYSYMBOL_limit_clause = 1569, /* limit_clause */ + YYSYMBOL_fetch_first_clause = 1570, /* fetch_first_clause */ + YYSYMBOL_first_or_next = 1571, /* first_or_next */ + YYSYMBOL_row_or_rows = 1572, /* row_or_rows */ + YYSYMBOL_only_or_with_ties = 1573, /* only_or_with_ties */ + YYSYMBOL_opt_global_limit_clause = 1574, /* opt_global_limit_clause */ + YYSYMBOL_limit_options = 1575, /* limit_options */ + YYSYMBOL_limit_option = 1576, /* limit_option */ + YYSYMBOL_limit_rows_option = 1577, /* limit_rows_option */ + YYSYMBOL_delete_limit_clause = 1578, /* delete_limit_clause */ + YYSYMBOL_order_limit_lock = 1579, /* order_limit_lock */ + YYSYMBOL_opt_order_limit_lock = 1580, /* opt_order_limit_lock */ + YYSYMBOL_query_expression_tail = 1581, /* query_expression_tail */ + YYSYMBOL_opt_query_expression_tail = 1582, /* opt_query_expression_tail */ + YYSYMBOL_opt_procedure_or_into = 1583, /* opt_procedure_or_into */ + YYSYMBOL_order_or_limit = 1584, /* order_or_limit */ + YYSYMBOL_opt_plus = 1585, /* opt_plus */ + YYSYMBOL_int_num = 1586, /* int_num */ + YYSYMBOL_ulong_num = 1587, /* ulong_num */ + YYSYMBOL_real_ulong_num = 1588, /* real_ulong_num */ + YYSYMBOL_longlong_num = 1589, /* longlong_num */ + YYSYMBOL_ulonglong_num = 1590, /* ulonglong_num */ + YYSYMBOL_real_ulonglong_num = 1591, /* real_ulonglong_num */ + YYSYMBOL_dec_num_error = 1592, /* dec_num_error */ + YYSYMBOL_dec_num = 1593, /* dec_num */ + YYSYMBOL_choice = 1594, /* choice */ + YYSYMBOL_bool = 1595, /* bool */ + YYSYMBOL_procedure_clause = 1596, /* procedure_clause */ + YYSYMBOL_1597_169 = 1597, /* $@169 */ + YYSYMBOL_procedure_list = 1598, /* procedure_list */ + YYSYMBOL_procedure_list2 = 1599, /* procedure_list2 */ + YYSYMBOL_procedure_item = 1600, /* procedure_item */ + YYSYMBOL_select_var_list_init = 1601, /* select_var_list_init */ + YYSYMBOL_1602_170 = 1602, /* $@170 */ + YYSYMBOL_select_var_list = 1603, /* select_var_list */ + YYSYMBOL_select_var_ident = 1604, /* select_var_ident */ + YYSYMBOL_select_outvar = 1605, /* select_outvar */ + YYSYMBOL_into = 1606, /* into */ + YYSYMBOL_into_destination = 1607, /* into_destination */ + YYSYMBOL_1608_171 = 1608, /* $@171 */ + YYSYMBOL_1609_172 = 1609, /* $@172 */ + YYSYMBOL_do = 1610, /* do */ + YYSYMBOL_1611_173 = 1611, /* $@173 */ + YYSYMBOL_drop = 1612, /* drop */ + YYSYMBOL_1613_174 = 1613, /* $@174 */ + YYSYMBOL_1614_175 = 1614, /* $@175 */ + YYSYMBOL_1615_176 = 1615, /* $@176 */ + YYSYMBOL_1616_177 = 1616, /* $@177 */ + YYSYMBOL_table_list = 1617, /* table_list */ + YYSYMBOL_table_name = 1618, /* table_name */ + YYSYMBOL_table_name_with_opt_use_partition = 1619, /* table_name_with_opt_use_partition */ + YYSYMBOL_table_alias_ref_list = 1620, /* table_alias_ref_list */ + YYSYMBOL_table_alias_ref = 1621, /* table_alias_ref */ + YYSYMBOL_opt_if_exists_table_element = 1622, /* opt_if_exists_table_element */ + YYSYMBOL_opt_if_exists = 1623, /* opt_if_exists */ + YYSYMBOL_opt_temporary = 1624, /* opt_temporary */ + YYSYMBOL_insert = 1625, /* insert */ + YYSYMBOL_1626_178 = 1626, /* $@178 */ + YYSYMBOL_1627_179 = 1627, /* $@179 */ + YYSYMBOL_replace = 1628, /* replace */ + YYSYMBOL_1629_180 = 1629, /* $@180 */ + YYSYMBOL_1630_181 = 1630, /* $@181 */ + YYSYMBOL_insert_start = 1631, /* insert_start */ + YYSYMBOL_stmt_end = 1632, /* stmt_end */ + YYSYMBOL_insert_lock_option = 1633, /* insert_lock_option */ + YYSYMBOL_replace_lock_option = 1634, /* replace_lock_option */ + YYSYMBOL_insert_replace_option = 1635, /* insert_replace_option */ + YYSYMBOL_opt_into = 1636, /* opt_into */ + YYSYMBOL_insert_table = 1637, /* insert_table */ + YYSYMBOL_1638_182 = 1638, /* $@182 */ + YYSYMBOL_insert_field_spec = 1639, /* insert_field_spec */ + YYSYMBOL_1640_183 = 1640, /* $@183 */ + YYSYMBOL_insert_field_list = 1641, /* insert_field_list */ + YYSYMBOL_opt_fields = 1642, /* opt_fields */ + YYSYMBOL_fields = 1643, /* fields */ + YYSYMBOL_insert_values = 1644, /* insert_values */ + YYSYMBOL_values_list = 1645, /* values_list */ + YYSYMBOL_ident_eq_list = 1646, /* ident_eq_list */ + YYSYMBOL_ident_eq_value = 1647, /* ident_eq_value */ + YYSYMBOL_equal = 1648, /* equal */ + YYSYMBOL_opt_equal = 1649, /* opt_equal */ + YYSYMBOL_opt_with = 1650, /* opt_with */ + YYSYMBOL_opt_by = 1651, /* opt_by */ + YYSYMBOL_no_braces = 1652, /* no_braces */ + YYSYMBOL_1653_184 = 1653, /* $@184 */ + YYSYMBOL_no_braces_with_names = 1654, /* no_braces_with_names */ + YYSYMBOL_1655_185 = 1655, /* $@185 */ + YYSYMBOL_opt_values = 1656, /* opt_values */ + YYSYMBOL_opt_values_with_names = 1657, /* opt_values_with_names */ + YYSYMBOL_values = 1658, /* values */ + YYSYMBOL_values_with_names = 1659, /* values_with_names */ + YYSYMBOL_expr_or_ignore = 1660, /* expr_or_ignore */ + YYSYMBOL_expr_or_ignore_or_default = 1661, /* expr_or_ignore_or_default */ + YYSYMBOL_opt_insert_update = 1662, /* opt_insert_update */ + YYSYMBOL_1663_186 = 1663, /* $@186 */ + YYSYMBOL_1664_187 = 1664, /* $@187 */ + YYSYMBOL_update_table_list = 1665, /* update_table_list */ + YYSYMBOL_update = 1666, /* update */ + YYSYMBOL_1667_188 = 1667, /* $@188 */ + YYSYMBOL_1668_189 = 1668, /* $@189 */ + YYSYMBOL_1669_190 = 1669, /* $@190 */ + YYSYMBOL_update_list = 1670, /* update_list */ + YYSYMBOL_update_elem = 1671, /* update_elem */ + YYSYMBOL_insert_update_list = 1672, /* insert_update_list */ + YYSYMBOL_insert_update_elem = 1673, /* insert_update_elem */ + YYSYMBOL_opt_low_priority = 1674, /* opt_low_priority */ + YYSYMBOL_delete = 1675, /* delete */ + YYSYMBOL_1676_191 = 1676, /* $@191 */ + YYSYMBOL_opt_delete_system_time = 1677, /* opt_delete_system_time */ + YYSYMBOL_delete_part2 = 1678, /* delete_part2 */ + YYSYMBOL_delete_single_table = 1679, /* delete_single_table */ + YYSYMBOL_delete_single_table_for_period = 1680, /* delete_single_table_for_period */ + YYSYMBOL_single_multi = 1681, /* single_multi */ + YYSYMBOL_1682_192 = 1682, /* $@192 */ + YYSYMBOL_1683_193 = 1683, /* $@193 */ + YYSYMBOL_1684_194 = 1684, /* $@194 */ + YYSYMBOL_1685_195 = 1685, /* $@195 */ + YYSYMBOL_opt_returning = 1686, /* opt_returning */ + YYSYMBOL_1687_196 = 1687, /* $@196 */ + YYSYMBOL_table_wild_list = 1688, /* table_wild_list */ + YYSYMBOL_table_wild_one = 1689, /* table_wild_one */ + YYSYMBOL_opt_wild = 1690, /* opt_wild */ + YYSYMBOL_opt_delete_options = 1691, /* opt_delete_options */ + YYSYMBOL_opt_delete_option = 1692, /* opt_delete_option */ + YYSYMBOL_truncate = 1693, /* truncate */ + YYSYMBOL_1694_197 = 1694, /* $@197 */ + YYSYMBOL_1695_198 = 1695, /* $@198 */ + YYSYMBOL_opt_table_sym = 1696, /* opt_table_sym */ + YYSYMBOL_opt_profile_defs = 1697, /* opt_profile_defs */ + YYSYMBOL_profile_defs = 1698, /* profile_defs */ + YYSYMBOL_profile_def = 1699, /* profile_def */ + YYSYMBOL_opt_profile_args = 1700, /* opt_profile_args */ + YYSYMBOL_show = 1701, /* show */ + YYSYMBOL_1702_199 = 1702, /* $@199 */ + YYSYMBOL_show_param = 1703, /* show_param */ + YYSYMBOL_1704_200 = 1704, /* $@200 */ + YYSYMBOL_1705_201 = 1705, /* $@201 */ + YYSYMBOL_show_engine_param = 1706, /* show_engine_param */ + YYSYMBOL_master_or_binary = 1707, /* master_or_binary */ + YYSYMBOL_opt_storage = 1708, /* opt_storage */ + YYSYMBOL_opt_db = 1709, /* opt_db */ + YYSYMBOL_opt_full = 1710, /* opt_full */ + YYSYMBOL_from_or_in = 1711, /* from_or_in */ + YYSYMBOL_binlog_in = 1712, /* binlog_in */ + YYSYMBOL_binlog_from = 1713, /* binlog_from */ + YYSYMBOL_wild_and_where = 1714, /* wild_and_where */ + YYSYMBOL_describe = 1715, /* describe */ + YYSYMBOL_1716_202 = 1716, /* $@202 */ + YYSYMBOL_1717_203 = 1717, /* $@203 */ + YYSYMBOL_explainable_command = 1718, /* explainable_command */ + YYSYMBOL_describe_command = 1719, /* describe_command */ + YYSYMBOL_analyze_stmt_command = 1720, /* analyze_stmt_command */ + YYSYMBOL_opt_extended_describe = 1721, /* opt_extended_describe */ + YYSYMBOL_opt_format_json = 1722, /* opt_format_json */ + YYSYMBOL_opt_describe_column = 1723, /* opt_describe_column */ + YYSYMBOL_explain_for_connection = 1724, /* explain_for_connection */ + YYSYMBOL_flush = 1725, /* flush */ + YYSYMBOL_1726_204 = 1726, /* $@204 */ + YYSYMBOL_flush_options = 1727, /* flush_options */ + YYSYMBOL_1728_205 = 1728, /* $@205 */ + YYSYMBOL_opt_flush_lock = 1729, /* opt_flush_lock */ + YYSYMBOL_flush_lock = 1730, /* flush_lock */ + YYSYMBOL_1731_206 = 1731, /* $@206 */ + YYSYMBOL_flush_options_list = 1732, /* flush_options_list */ + YYSYMBOL_flush_option = 1733, /* flush_option */ + YYSYMBOL_opt_table_list = 1734, /* opt_table_list */ + YYSYMBOL_backup = 1735, /* backup */ + YYSYMBOL_backup_statements = 1736, /* backup_statements */ + YYSYMBOL_1737_207 = 1737, /* $@207 */ + YYSYMBOL_opt_delete_gtid_domain = 1738, /* opt_delete_gtid_domain */ + YYSYMBOL_delete_domain_id_list = 1739, /* delete_domain_id_list */ + YYSYMBOL_delete_domain_id = 1740, /* delete_domain_id */ + YYSYMBOL_optional_flush_tables_arguments = 1741, /* optional_flush_tables_arguments */ + YYSYMBOL_reset = 1742, /* reset */ + YYSYMBOL_1743_208 = 1743, /* $@208 */ + YYSYMBOL_reset_options = 1744, /* reset_options */ + YYSYMBOL_reset_option = 1745, /* reset_option */ + YYSYMBOL_1746_209 = 1746, /* $@209 */ + YYSYMBOL_1747_210 = 1747, /* $@210 */ + YYSYMBOL_slave_reset_options = 1748, /* slave_reset_options */ + YYSYMBOL_master_reset_options = 1749, /* master_reset_options */ + YYSYMBOL_purge = 1750, /* purge */ + YYSYMBOL_1751_211 = 1751, /* $@211 */ + YYSYMBOL_kill = 1752, /* kill */ + YYSYMBOL_1753_212 = 1753, /* $@212 */ + YYSYMBOL_kill_type = 1754, /* kill_type */ + YYSYMBOL_kill_option = 1755, /* kill_option */ + YYSYMBOL_opt_connection = 1756, /* opt_connection */ + YYSYMBOL_kill_expr = 1757, /* kill_expr */ + YYSYMBOL_shutdown = 1758, /* shutdown */ + YYSYMBOL_1759_213 = 1759, /* $@213 */ + YYSYMBOL_shutdown_option = 1760, /* shutdown_option */ + YYSYMBOL_use = 1761, /* use */ + YYSYMBOL_load = 1762, /* load */ + YYSYMBOL_1763_214 = 1763, /* $@214 */ + YYSYMBOL_1764_215 = 1764, /* $@215 */ + YYSYMBOL_1765_216 = 1765, /* $@216 */ + YYSYMBOL_1766_217 = 1766, /* $@217 */ + YYSYMBOL_data_or_xml = 1767, /* data_or_xml */ + YYSYMBOL_opt_local = 1768, /* opt_local */ + YYSYMBOL_load_data_lock = 1769, /* load_data_lock */ + YYSYMBOL_opt_duplicate = 1770, /* opt_duplicate */ + YYSYMBOL_opt_field_term = 1771, /* opt_field_term */ + YYSYMBOL_field_term_list = 1772, /* field_term_list */ + YYSYMBOL_field_term = 1773, /* field_term */ + YYSYMBOL_opt_line_term = 1774, /* opt_line_term */ + YYSYMBOL_line_term_list = 1775, /* line_term_list */ + YYSYMBOL_line_term = 1776, /* line_term */ + YYSYMBOL_opt_xml_rows_identified_by = 1777, /* opt_xml_rows_identified_by */ + YYSYMBOL_opt_ignore_lines = 1778, /* opt_ignore_lines */ + YYSYMBOL_lines_or_rows = 1779, /* lines_or_rows */ + YYSYMBOL_opt_field_or_var_spec = 1780, /* opt_field_or_var_spec */ + YYSYMBOL_fields_or_vars = 1781, /* fields_or_vars */ + YYSYMBOL_field_or_var = 1782, /* field_or_var */ + YYSYMBOL_opt_load_data_set_spec = 1783, /* opt_load_data_set_spec */ + YYSYMBOL_load_data_set_list = 1784, /* load_data_set_list */ + YYSYMBOL_load_data_set_elem = 1785, /* load_data_set_elem */ + YYSYMBOL_text_literal = 1786, /* text_literal */ + YYSYMBOL_text_string = 1787, /* text_string */ + YYSYMBOL_hex_or_bin_String = 1788, /* hex_or_bin_String */ + YYSYMBOL_param_marker = 1789, /* param_marker */ + YYSYMBOL_signed_literal = 1790, /* signed_literal */ + YYSYMBOL_literal = 1791, /* literal */ + YYSYMBOL_NUM_literal = 1792, /* NUM_literal */ + YYSYMBOL_temporal_literal = 1793, /* temporal_literal */ + YYSYMBOL_with_clause = 1794, /* with_clause */ + YYSYMBOL_1795_218 = 1795, /* $@218 */ + YYSYMBOL_opt_recursive = 1796, /* opt_recursive */ + YYSYMBOL_with_list = 1797, /* with_list */ + YYSYMBOL_with_list_element = 1798, /* with_list_element */ + YYSYMBOL_opt_cycle = 1799, /* opt_cycle */ + YYSYMBOL_1800_219 = 1800, /* $@219 */ + YYSYMBOL_opt_with_column_list = 1801, /* opt_with_column_list */ + YYSYMBOL_with_column_list = 1802, /* with_column_list */ + YYSYMBOL_ident_sys_alloc = 1803, /* ident_sys_alloc */ + YYSYMBOL_comma_separated_ident_list = 1804, /* comma_separated_ident_list */ + YYSYMBOL_with_element_head = 1805, /* with_element_head */ + YYSYMBOL_insert_ident = 1806, /* insert_ident */ + YYSYMBOL_table_wild = 1807, /* table_wild */ + YYSYMBOL_select_sublist_qualified_asterisk = 1808, /* select_sublist_qualified_asterisk */ + YYSYMBOL_order_ident = 1809, /* order_ident */ + YYSYMBOL_simple_ident = 1810, /* simple_ident */ + YYSYMBOL_simple_ident_nospvar = 1811, /* simple_ident_nospvar */ + YYSYMBOL_field_ident = 1812, /* field_ident */ + YYSYMBOL_table_ident = 1813, /* table_ident */ + YYSYMBOL_table_ident_opt_wild = 1814, /* table_ident_opt_wild */ + YYSYMBOL_table_ident_nodb = 1815, /* table_ident_nodb */ + YYSYMBOL_IDENT_cli = 1816, /* IDENT_cli */ + YYSYMBOL_ident_cli = 1817, /* ident_cli */ + YYSYMBOL_IDENT_sys = 1818, /* IDENT_sys */ + YYSYMBOL_ident_cli_func = 1819, /* ident_cli_func */ + YYSYMBOL_ident_func = 1820, /* ident_func */ + YYSYMBOL_TEXT_STRING_sys = 1821, /* TEXT_STRING_sys */ + YYSYMBOL_TEXT_STRING_literal = 1822, /* TEXT_STRING_literal */ + YYSYMBOL_TEXT_STRING_filesystem = 1823, /* TEXT_STRING_filesystem */ + YYSYMBOL_ident_table_alias = 1824, /* ident_table_alias */ + YYSYMBOL_ident_cli_set_usual_case = 1825, /* ident_cli_set_usual_case */ + YYSYMBOL_ident_sysvar_name = 1826, /* ident_sysvar_name */ + YYSYMBOL_ident = 1827, /* ident */ + YYSYMBOL_label_ident = 1828, /* label_ident */ + YYSYMBOL_ident_or_text = 1829, /* ident_or_text */ + YYSYMBOL_user_maybe_role = 1830, /* user_maybe_role */ + YYSYMBOL_user_or_role = 1831, /* user_or_role */ + YYSYMBOL_user = 1832, /* user */ + YYSYMBOL_keyword_table_alias = 1833, /* keyword_table_alias */ + YYSYMBOL_keyword_ident = 1834, /* keyword_ident */ + YYSYMBOL_keyword_sysvar_name = 1835, /* keyword_sysvar_name */ + YYSYMBOL_keyword_set_usual_case = 1836, /* keyword_set_usual_case */ + YYSYMBOL_non_reserved_keyword_udt = 1837, /* non_reserved_keyword_udt */ + YYSYMBOL_keyword_sp_var_not_label = 1838, /* keyword_sp_var_not_label */ + YYSYMBOL_keyword_sp_head = 1839, /* keyword_sp_head */ + YYSYMBOL_keyword_verb_clause = 1840, /* keyword_verb_clause */ + YYSYMBOL_keyword_set_special_case = 1841, /* keyword_set_special_case */ + YYSYMBOL_keyword_sysvar_type = 1842, /* keyword_sysvar_type */ + YYSYMBOL_keyword_data_type = 1843, /* keyword_data_type */ + YYSYMBOL_keyword_cast_type = 1844, /* keyword_cast_type */ + YYSYMBOL_keyword_func_sp_var_and_label = 1845, /* keyword_func_sp_var_and_label */ + YYSYMBOL_keyword_func_sp_var_not_label = 1846, /* keyword_func_sp_var_not_label */ + YYSYMBOL_keyword_sp_var_and_label = 1847, /* keyword_sp_var_and_label */ + YYSYMBOL_reserved_keyword_udt_not_param_type = 1848, /* reserved_keyword_udt_not_param_type */ + YYSYMBOL_set = 1849, /* set */ + YYSYMBOL_1850_220 = 1850, /* $@220 */ + YYSYMBOL_set_param = 1851, /* set_param */ + YYSYMBOL_1852_221 = 1852, /* $@221 */ + YYSYMBOL_1853_222 = 1853, /* $@222 */ + YYSYMBOL_1854_223 = 1854, /* $@223 */ + YYSYMBOL_set_stmt_option_list = 1855, /* set_stmt_option_list */ + YYSYMBOL_start_option_value_list_following_option_type = 1856, /* start_option_value_list_following_option_type */ + YYSYMBOL_1857_224 = 1857, /* $@224 */ + YYSYMBOL_option_value_list = 1858, /* option_value_list */ + YYSYMBOL_option_value = 1859, /* option_value */ + YYSYMBOL_1860_225 = 1860, /* $@225 */ + YYSYMBOL_option_type = 1861, /* option_type */ + YYSYMBOL_opt_var_type = 1862, /* opt_var_type */ + YYSYMBOL_opt_var_ident_type = 1863, /* opt_var_ident_type */ + YYSYMBOL_set_stmt_option = 1864, /* set_stmt_option */ + YYSYMBOL_1865_226 = 1865, /* $@226 */ + YYSYMBOL_1866_227 = 1866, /* $@227 */ + YYSYMBOL_1867_228 = 1867, /* $@228 */ + YYSYMBOL_option_value_following_option_type = 1868, /* option_value_following_option_type */ + YYSYMBOL_1869_229 = 1869, /* $@229 */ + YYSYMBOL_1870_230 = 1870, /* $@230 */ + YYSYMBOL_1871_231 = 1871, /* $@231 */ + YYSYMBOL_option_value_no_option_type = 1872, /* option_value_no_option_type */ + YYSYMBOL_1873_232 = 1873, /* $@232 */ + YYSYMBOL_1874_233 = 1874, /* $@233 */ + YYSYMBOL_1875_234 = 1875, /* $@234 */ + YYSYMBOL_1876_235 = 1876, /* $@235 */ + YYSYMBOL_1877_236 = 1877, /* $@236 */ + YYSYMBOL_1878_237 = 1878, /* $@237 */ + YYSYMBOL_1879_238 = 1879, /* $@238 */ + YYSYMBOL_1880_239 = 1880, /* $@239 */ + YYSYMBOL_1881_240 = 1881, /* $@240 */ + YYSYMBOL_1882_241 = 1882, /* $@241 */ + YYSYMBOL_transaction_characteristics = 1883, /* transaction_characteristics */ + YYSYMBOL_transaction_access_mode = 1884, /* transaction_access_mode */ + YYSYMBOL_isolation_level = 1885, /* isolation_level */ + YYSYMBOL_transaction_access_mode_types = 1886, /* transaction_access_mode_types */ + YYSYMBOL_isolation_types = 1887, /* isolation_types */ + YYSYMBOL_text_or_password = 1888, /* text_or_password */ + YYSYMBOL_set_expr_or_default = 1889, /* set_expr_or_default */ + YYSYMBOL_lock = 1890, /* lock */ + YYSYMBOL_1891_242 = 1891, /* $@242 */ + YYSYMBOL_opt_lock_wait_timeout = 1892, /* opt_lock_wait_timeout */ + YYSYMBOL_table_or_tables = 1893, /* table_or_tables */ + YYSYMBOL_table_lock_list = 1894, /* table_lock_list */ + YYSYMBOL_table_lock = 1895, /* table_lock */ + YYSYMBOL_lock_option = 1896, /* lock_option */ + YYSYMBOL_unlock = 1897, /* unlock */ + YYSYMBOL_1898_243 = 1898, /* $@243 */ + YYSYMBOL_handler = 1899, /* handler */ + YYSYMBOL_1900_244 = 1900, /* $@244 */ + YYSYMBOL_handler_tail = 1901, /* handler_tail */ + YYSYMBOL_1902_245 = 1902, /* $@245 */ + YYSYMBOL_handler_read_or_scan = 1903, /* handler_read_or_scan */ + YYSYMBOL_handler_scan_function = 1904, /* handler_scan_function */ + YYSYMBOL_handler_rkey_function = 1905, /* handler_rkey_function */ + YYSYMBOL_1906_246 = 1906, /* $@246 */ + YYSYMBOL_handler_rkey_mode = 1907, /* handler_rkey_mode */ + YYSYMBOL_revoke = 1908, /* revoke */ + YYSYMBOL_revoke_command = 1909, /* revoke_command */ + YYSYMBOL_admin_option_for_role = 1910, /* admin_option_for_role */ + YYSYMBOL_grant = 1911, /* grant */ + YYSYMBOL_grant_command = 1912, /* grant_command */ + YYSYMBOL_opt_with_admin = 1913, /* opt_with_admin */ + YYSYMBOL_opt_with_admin_option = 1914, /* opt_with_admin_option */ + YYSYMBOL_role_list = 1915, /* role_list */ + YYSYMBOL_current_role = 1916, /* current_role */ + YYSYMBOL_role_name = 1917, /* role_name */ + YYSYMBOL_grant_role = 1918, /* grant_role */ + YYSYMBOL_opt_table = 1919, /* opt_table */ + YYSYMBOL_grant_privileges = 1920, /* grant_privileges */ + YYSYMBOL_opt_privileges = 1921, /* opt_privileges */ + YYSYMBOL_object_privilege_list = 1922, /* object_privilege_list */ + YYSYMBOL_column_list_privilege = 1923, /* column_list_privilege */ + YYSYMBOL_column_privilege = 1924, /* column_privilege */ + YYSYMBOL_object_privilege = 1925, /* object_privilege */ + YYSYMBOL_opt_and = 1926, /* opt_and */ + YYSYMBOL_require_list = 1927, /* require_list */ + YYSYMBOL_require_list_element = 1928, /* require_list_element */ + YYSYMBOL_grant_ident = 1929, /* grant_ident */ + YYSYMBOL_user_list = 1930, /* user_list */ + YYSYMBOL_grant_list = 1931, /* grant_list */ + YYSYMBOL_user_and_role_list = 1932, /* user_and_role_list */ + YYSYMBOL_via_or_with = 1933, /* via_or_with */ + YYSYMBOL_using_or_as = 1934, /* using_or_as */ + YYSYMBOL_grant_user = 1935, /* grant_user */ + YYSYMBOL_auth_expression = 1936, /* auth_expression */ + YYSYMBOL_auth_token = 1937, /* auth_token */ + YYSYMBOL_opt_auth_str = 1938, /* opt_auth_str */ + YYSYMBOL_opt_require_clause = 1939, /* opt_require_clause */ + YYSYMBOL_resource_option = 1940, /* resource_option */ + YYSYMBOL_resource_option_list = 1941, /* resource_option_list */ + YYSYMBOL_opt_resource_options = 1942, /* opt_resource_options */ + YYSYMBOL_opt_grant_options = 1943, /* opt_grant_options */ + YYSYMBOL_opt_grant_option = 1944, /* opt_grant_option */ + YYSYMBOL_grant_option_list = 1945, /* grant_option_list */ + YYSYMBOL_grant_option = 1946, /* grant_option */ + YYSYMBOL_begin_stmt_mariadb = 1947, /* begin_stmt_mariadb */ + YYSYMBOL_1948_247 = 1948, /* $@247 */ + YYSYMBOL_compound_statement = 1949, /* compound_statement */ + YYSYMBOL_opt_not = 1950, /* opt_not */ + YYSYMBOL_opt_work = 1951, /* opt_work */ + YYSYMBOL_opt_chain = 1952, /* opt_chain */ + YYSYMBOL_opt_release = 1953, /* opt_release */ + YYSYMBOL_commit = 1954, /* commit */ + YYSYMBOL_rollback = 1955, /* rollback */ + YYSYMBOL_savepoint = 1956, /* savepoint */ + YYSYMBOL_release = 1957, /* release */ + YYSYMBOL_unit_type_decl = 1958, /* unit_type_decl */ + YYSYMBOL_union_option = 1959, /* union_option */ + YYSYMBOL_query_expression_option = 1960, /* query_expression_option */ + YYSYMBOL_definer_opt = 1961, /* definer_opt */ + YYSYMBOL_no_definer = 1962, /* no_definer */ + YYSYMBOL_definer = 1963, /* definer */ + YYSYMBOL_view_algorithm = 1964, /* view_algorithm */ + YYSYMBOL_opt_view_suid = 1965, /* opt_view_suid */ + YYSYMBOL_view_suid = 1966, /* view_suid */ + YYSYMBOL_view_list_opt = 1967, /* view_list_opt */ + YYSYMBOL_view_list = 1968, /* view_list */ + YYSYMBOL_view_select = 1969, /* view_select */ + YYSYMBOL_1970_248 = 1970, /* $@248 */ + YYSYMBOL_view_check_option = 1971, /* view_check_option */ + YYSYMBOL_trigger_action_order = 1972, /* trigger_action_order */ + YYSYMBOL_trigger_follows_precedes_clause = 1973, /* trigger_follows_precedes_clause */ + YYSYMBOL_trigger_tail = 1974, /* trigger_tail */ + YYSYMBOL_1975_249 = 1975, /* $@249 */ + YYSYMBOL_1976_250 = 1976, /* $@250 */ + YYSYMBOL_1977_251 = 1977, /* $@251 */ + YYSYMBOL_1978_252 = 1978, /* $@252 */ + YYSYMBOL_1979_253 = 1979, /* $@253 */ + YYSYMBOL_sf_return_type = 1980, /* sf_return_type */ + YYSYMBOL_1981_254 = 1981, /* $@254 */ + YYSYMBOL_xa = 1982, /* xa */ + YYSYMBOL_opt_format_xid = 1983, /* opt_format_xid */ + YYSYMBOL_xid = 1984, /* xid */ + YYSYMBOL_begin_or_start = 1985, /* begin_or_start */ + YYSYMBOL_opt_join_or_resume = 1986, /* opt_join_or_resume */ + YYSYMBOL_opt_one_phase = 1987, /* opt_one_phase */ + YYSYMBOL_opt_suspend = 1988, /* opt_suspend */ + YYSYMBOL_1989_255 = 1989, /* $@255 */ + YYSYMBOL_opt_migrate = 1990, /* opt_migrate */ + YYSYMBOL_install = 1991, /* install */ + YYSYMBOL_uninstall = 1992, /* uninstall */ + YYSYMBOL_keep_gcc_happy = 1993, /* keep_gcc_happy */ + YYSYMBOL__empty = 1994, /* _empty */ + YYSYMBOL_statement = 1995, /* statement */ + YYSYMBOL_sp_statement = 1996, /* sp_statement */ + YYSYMBOL_sp_if_then_statements = 1997, /* sp_if_then_statements */ + YYSYMBOL_sp_case_then_statements = 1998, /* sp_case_then_statements */ + YYSYMBOL_reserved_keyword_udt_param_type = 1999, /* reserved_keyword_udt_param_type */ + YYSYMBOL_reserved_keyword_udt = 2000, /* reserved_keyword_udt */ + YYSYMBOL_keyword_sp_block_section = 2001, /* keyword_sp_block_section */ + YYSYMBOL_keyword_label = 2002, /* keyword_label */ + YYSYMBOL_keyword_sp_decl = 2003, /* keyword_sp_decl */ + YYSYMBOL_opt_truncate_table_storage_clause = 2004, /* opt_truncate_table_storage_clause */ + YYSYMBOL_ident_for_loop_index = 2005, /* ident_for_loop_index */ + YYSYMBOL_row_field_name = 2006, /* row_field_name */ + YYSYMBOL_while_body = 2007, /* while_body */ + YYSYMBOL_2008_256 = 2008, /* $@256 */ + YYSYMBOL_for_loop_statements = 2009, /* for_loop_statements */ + YYSYMBOL_sp_label = 2010, /* sp_label */ + YYSYMBOL_sp_control_label = 2011, /* sp_control_label */ + YYSYMBOL_sp_block_label = 2012, /* sp_block_label */ + YYSYMBOL_sp_opt_default = 2013, /* sp_opt_default */ + YYSYMBOL_sp_decl_variable_list_anchored = 2014, /* sp_decl_variable_list_anchored */ + YYSYMBOL_sp_param_name_and_mode = 2015, /* sp_param_name_and_mode */ + YYSYMBOL_sp_param = 2016, /* sp_param */ + YYSYMBOL_sp_param_anchored = 2017, /* sp_param_anchored */ + YYSYMBOL_sf_c_chistics_and_body_standalone = 2018, /* sf_c_chistics_and_body_standalone */ + YYSYMBOL_2019_257 = 2019, /* $@257 */ + YYSYMBOL_sp_tail_standalone = 2020, /* sp_tail_standalone */ + YYSYMBOL_2021_258 = 2021, /* $@258 */ + YYSYMBOL_2022_259 = 2022, /* $@259 */ + YYSYMBOL_drop_routine = 2023, /* drop_routine */ + YYSYMBOL_create_routine = 2024, /* create_routine */ + YYSYMBOL_2025_260 = 2025, /* $@260 */ + YYSYMBOL_2026_261 = 2026, /* $@261 */ + YYSYMBOL_2027_262 = 2027, /* $@262 */ + YYSYMBOL_sp_decls = 2028, /* sp_decls */ + YYSYMBOL_sp_decl = 2029, /* sp_decl */ + YYSYMBOL_sp_decl_body = 2030, /* sp_decl_body */ + YYSYMBOL_2031_263 = 2031, /* $@263 */ + YYSYMBOL_sp_proc_stmt_in_returns_clause = 2032, /* sp_proc_stmt_in_returns_clause */ + YYSYMBOL_sp_proc_stmt = 2033, /* sp_proc_stmt */ + YYSYMBOL_sp_proc_stmt_compound_ok = 2034, /* sp_proc_stmt_compound_ok */ + YYSYMBOL_sp_labeled_block = 2035, /* sp_labeled_block */ + YYSYMBOL_2036_264 = 2036, /* $@264 */ + YYSYMBOL_sp_unlabeled_block = 2037, /* sp_unlabeled_block */ + YYSYMBOL_2038_265 = 2038, /* $@265 */ + YYSYMBOL_sp_unlabeled_block_not_atomic = 2039, /* sp_unlabeled_block_not_atomic */ + YYSYMBOL_2040_266 = 2040 /* $@266 */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; + + +/* Second part of user prologue. */ +#line 330 "/home/buildbot/git/sql/sql_yacc.yy" + +/* avoid unintentional %union size increases, it's what a parser stack made of */ +static_assert(sizeof(YYSTYPE) == sizeof(void*)*2+8, "%union size check"); +bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); + +#line 2324 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + + +#ifdef short +# undef short +#endif + +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif +#endif + +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; +#else +typedef short yytype_int16; +#endif + +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 +#endif + +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; +#else +typedef short yytype_uint8; +#endif + +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; +#else +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned +# endif +#endif + +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_int16 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YY_USE(E) ((void) (E)) +#else +# define YY_USE(E) /* empty */ +#endif + +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + + +#define YY_ASSERT(E) ((void) (0 && (E))) + +#if !defined yyoverflow + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* !defined yyoverflow */ + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yy_state_t yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYPTRDIFF_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 740 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 112981 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 789 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 1252 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 3718 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 6225 + +/* YYMAXUTOK -- Last valid token kind. */ +#define YYMAXUTOK 1021 + + +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_int16 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 783, 2, 2, 2, 772, 767, 2, + 779, 780, 770, 769, 782, 768, 787, 771, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 788, 786, + 765, 763, 764, 2, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 773, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 784, 766, 785, 774, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, + 756, 757, 758, 759, 760, 761, 762, 775, 776, 777, + 778, 781 +}; + +#if YYDEBUG +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_int16 yyrline[] = +{ + 0, 1975, 1975, 1985, 1984, 2009, 2016, 2018, 2022, 2023, + 2024, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, + 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, + 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, + 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, + 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, + 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, + 2088, 2092, 2099, 2100, 2105, 2104, 2115, 2121, 2123, 2120, + 2132, 2134, 2133, 2143, 2148, 2160, 2159, 2176, 2175, 2185, + 2186, 2190, 2194, 2198, 2202, 2206, 2210, 2220, 2225, 2229, + 2233, 2237, 2241, 2245, 2250, 2254, 2259, 2287, 2291, 2295, + 2300, 2303, 2305, 2306, 2310, 2316, 2318, 2319, 2323, 2329, + 2331, 2332, 2336, 2343, 2347, 2362, 2366, 2372, 2378, 2384, + 2390, 2398, 2402, 2406, 2418, 2421, 2426, 2448, 2460, 2447, + 2483, 2482, 2538, 2545, 2537, 2557, 2564, 2556, 2577, 2583, + 2576, 2595, 2601, 2594, 2613, 2612, 2626, 2624, 2640, 2638, + 2652, 2651, 2662, 2661, 2671, 2678, 2685, 2685, 2688, 2692, + 2693, 2697, 2698, 2702, 2707, 2713, 2719, 2727, 2733, 2739, + 2747, 2755, 2763, 2771, 2779, 2787, 2799, 2815, 2815, 2819, + 2818, 2830, 2831, 2835, 2840, 2845, 2850, 2855, 2860, 2865, + 2873, 2872, 2905, 2904, 2911, 2918, 2919, 2925, 2931, 2941, + 2947, 2953, 2955, 2962, 2963, 2967, 2977, 2978, 2986, 2986, + 3028, 3037, 3038, 3043, 3044, 3045, 3046, 3051, 3056, 3064, + 3065, 3069, 3070, 3075, 3077, 3079, 3081, 3083, 3085, 3087, + 3093, 3094, 3098, 3099, 3104, 3103, 3114, 3113, 3124, 3123, + 3136, 3138, 3141, 3143, 3147, 3151, 3160, 3165, 3165, 3175, + 3176, 3180, 3188, 3190, 3194, 3195, 3199, 3200, 3201, 3206, + 3205, 3217, 3221, 3222, 3226, 3227, 3232, 3238, 3244, 3254, + 3262, 3267, 3275, 3279, 3288, 3286, 3300, 3308, 3313, 3312, + 3326, 3328, 3333, 3343, 3342, 3361, 3362, 3363, 3364, 3369, + 3371, 3376, 3391, 3399, 3403, 3423, 3424, 3428, 3432, 3438, + 3444, 3450, 3456, 3466, 3471, 3479, 3487, 3492, 3498, 3499, + 3505, 3508, 3512, 3520, 3537, 3539, 3557, 3563, 3565, 3567, + 3569, 3571, 3573, 3575, 3577, 3579, 3581, 3583, 3585, 3587, + 3592, 3600, 3616, 3617, 3622, 3628, 3637, 3644, 3653, 3662, + 3667, 3681, 3683, 3685, 3694, 3699, 3706, 3715, 3724, 3726, + 3728, 3730, 3732, 3734, 3736, 3738, 3740, 3742, 3744, 3746, + 3748, 3750, 3755, 3756, 3764, 3776, 3792, 3791, 3802, 3802, + 3824, 3825, 3830, 3829, 3837, 3848, 3853, 3859, 3858, 3865, + 3864, 3873, 3878, 3884, 3883, 3890, 3889, 3899, 3907, 3915, + 3924, 3924, 3947, 3957, 3956, 3977, 3976, 3996, 4002, 4010, + 4011, 4015, 4016, 4017, 4021, 4029, 4034, 4039, 4047, 4048, + 4056, 4074, 4090, 4110, 4115, 4109, 4127, 4129, 4130, 4131, + 4136, 4135, 4206, 4205, 4212, 4217, 4218, 4222, 4223, 4228, + 4227, 4243, 4242, 4257, 4267, 4271, 4272, 4277, 4278, 4282, + 4290, 4295, 4302, 4311, 4325, 4333, 4342, 4341, 4349, 4348, + 4356, 4361, 4368, 4355, 4378, 4377, 4388, 4387, 4397, 4396, + 4406, 4413, 4405, 4428, 4427, 4439, 4441, 4446, 4448, 4450, + 4456, 4455, 4458, 4459, 4473, 4474, 4478, 4479, 4489, 4494, + 4505, 4542, 4543, 4548, 4547, 4563, 4578, 4577, 4599, 4598, + 4604, 4612, 4611, 4614, 4616, 4619, 4618, 4627, 4630, 4629, + 4638, 4639, 4645, 4646, 4663, 4664, 4668, 4669, 4673, 4687, + 4697, 4708, 4717, 4718, 4731, 4733, 4732, 4737, 4735, 4746, + 4747, 4751, 4765, 4777, 4778, 4791, 4800, 4822, 4823, 4826, + 4828, 4833, 4832, 4856, 4868, 4884, 4883, 4898, 4897, 4911, + 4918, 4925, 4945, 4963, 4967, 4994, 5006, 5007, 5012, 5021, + 5011, 5046, 5047, 5051, 5062, 5081, 5094, 5120, 5121, 5126, + 5125, 5162, 5171, 5172, 5176, 5177, 5181, 5182, 5190, 5191, + 5195, 5196, 5200, 5202, 5208, 5214, 5216, 5218, 5220, 5222, + 5224, 5229, 5230, 5230, 5239, 5251, 5254, 5262, 5265, 5275, + 5276, 5280, 5281, 5285, 5286, 5290, 5291, 5292, 5301, 5304, + 5312, 5315, 5322, 5326, 5332, 5334, 5338, 5339, 5343, 5344, + 5345, 5349, 5364, 5369, 5374, 5379, 5384, 5389, 5394, 5409, + 5415, 5430, 5435, 5450, 5456, 5474, 5479, 5484, 5489, 5494, + 5499, 5505, 5504, 5530, 5531, 5532, 5537, 5542, 5547, 5549, + 5551, 5553, 5559, 5564, 5569, 5573, 5578, 5582, 5589, 5596, + 5601, 5608, 5610, 5614, 5633, 5641, 5650, 5660, 5671, 5672, + 5673, 5674, 5675, 5676, 5677, 5681, 5682, 5683, 5687, 5688, + 5689, 5690, 5695, 5702, 5709, 5710, 5714, 5715, 5716, 5717, + 5718, 5722, 5724, 5735, 5734, 5742, 5741, 5749, 5748, 5756, + 5755, 5765, 5762, 5773, 5771, 5780, 5779, 5798, 5806, 5814, + 5822, 5823, 5827, 5837, 5838, 5842, 5843, 5847, 5852, 5851, + 5890, 5889, 5902, 5901, 5912, 5913, 5917, 5918, 5922, 5923, + 5927, 5928, 5932, 5933, 5934, 5935, 5941, 5940, 5948, 5954, + 5963, 5964, 5969, 5972, 5976, 5980, 5987, 5988, 5992, 5993, + 5997, 6003, 6009, 6010, 6018, 6017, 6039, 6040, 6050, 6058, + 6070, 6070, 6073, 6074, 6081, 6088, 6092, 6100, 6101, 6102, + 6106, 6107, 6108, 6109, 6110, 6111, 6119, 6123, 6124, 6138, + 6142, 6146, 6150, 6152, 6159, 6161, 6167, 6168, 6169, 6170, + 6174, 6178, 6183, 6187, 6191, 6195, 6200, 6204, 6211, 6227, + 6228, 6235, 6242, 6250, 6254, 6258, 6262, 6266, 6270, 6274, + 6278, 6280, 6282, 6284, 6286, 6288, 6290, 6292, 6299, 6301, + 6306, 6310, 6311, 6315, 6316, 6320, 6321, 6322, 6323, 6324, + 6328, 6329, 6330, 6331, 6332, 6336, 6342, 6343, 6348, 6350, + 6357, 6358, 6359, 6363, 6367, 6368, 6369, 6370, 6371, 6372, + 6376, 6380, 6381, 6382, 6383, 6386, 6390, 6395, 6396, 6400, + 6401, 6405, 6406, 6411, 6416, 6420, 6426, 6431, 6439, 6440, + 6447, 6451, 6455, 6456, 6460, 6461, 6465, 6466, 6470, 6478, + 6486, 6495, 6499, 6505, 6509, 6510, 6514, 6527, 6533, 6543, + 6544, 6548, 6555, 6559, 6560, 6564, 6565, 6569, 6578, 6582, + 6583, 6587, 6595, 6596, 6600, 6601, 6605, 6606, 6607, 6615, + 6616, 6620, 6624, 6628, 6633, 6634, 6639, 6643, 6649, 6653, + 6660, 6661, 6666, 6665, 6678, 6679, 6683, 6686, 6687, 6688, + 6689, 6693, 6701, 6708, 6709, 6713, 6723, 6724, 6728, 6729, + 6732, 6734, 6738, 6750, 6751, 6755, 6762, 6775, 6776, 6778, + 6780, 6786, 6791, 6797, 6803, 6810, 6820, 6821, 6822, 6823, + 6824, 6828, 6829, 6833, 6834, 6838, 6839, 6843, 6844, 6845, + 6849, 6853, 6865, 6866, 6870, 6871, 6875, 6876, 6880, 6881, + 6885, 6886, 6890, 6891, 6895, 6896, 6901, 6902, 6903, 6907, + 6909, 6914, 6919, 6921, 6925, 6929, 6936, 6937, 6941, 6945, + 6946, 6956, 6957, 6958, 6962, 6963, 6967, 6972, 6980, 6981, + 6989, 6995, 7007, 7008, 7012, 7014, 7024, 7040, 7023, 7063, + 7062, 7079, 7078, 7093, 7102, 7101, 7109, 7108, 7116, 7115, + 7129, 7123, 7137, 7136, 7176, 7175, 7182, 7189, 7197, 7207, + 7188, 7216, 7220, 7228, 7231, 7235, 7239, 7247, 7249, 7250, + 7251, 7252, 7256, 7257, 7258, 7259, 7263, 7264, 7276, 7277, + 7282, 7283, 7286, 7288, 7296, 7304, 7306, 7308, 7309, 7317, + 7318, 7324, 7333, 7331, 7344, 7357, 7356, 7369, 7367, 7380, + 7387, 7397, 7398, 7404, 7416, 7415, 7455, 7462, 7466, 7472, + 7470, 7487, 7489, 7494, 7502, 7501, 7515, 7519, 7518, 7530, + 7531, 7535, 7548, 7549, 7553, 7557, 7564, 7569, 7573, 7580, + 7587, 7591, 7596, 7604, 7612, 7622, 7633, 7643, 7654, 7664, + 7670, 7676, 7683, 7693, 7698, 7704, 7709, 7719, 7724, 7730, + 7735, 7739, 7744, 7745, 7746, 7751, 7756, 7760, 7770, 7772, + 7773, 7774, 7775, 7779, 7784, 7792, 7797, 7805, 7806, 7810, + 7811, 7815, 7815, 7818, 7820, 7824, 7825, 7829, 7830, 7838, + 7839, 7840, 7844, 7845, 7850, 7859, 7860, 7861, 7862, 7867, + 7866, 7876, 7875, 7883, 7890, 7900, 7917, 7920, 7927, 7931, + 7938, 7942, 7946, 7953, 7953, 7959, 7960, 7964, 7965, 7966, + 7970, 7971, 7980, 7987, 7988, 7993, 7992, 8004, 8005, 8006, + 8010, 8012, 8011, 8018, 8017, 8038, 8039, 8043, 8044, 8048, + 8049, 8050, 8054, 8055, 8056, 8061, 8060, 8081, 8082, 8086, + 8091, 8092, 8099, 8101, 8106, 8108, 8107, 8120, 8122, 8121, + 8135, 8136, 8141, 8150, 8151, 8152, 8156, 8163, 8173, 8181, + 8190, 8192, 8191, 8197, 8196, 8219, 8220, 8224, 8225, 8229, + 8230, 8231, 8232, 8233, 8234, 8238, 8239, 8244, 8243, 8264, + 8265, 8266, 8271, 8270, 8281, 8288, 8294, 8303, 8304, 8308, + 8324, 8323, 8336, 8337, 8341, 8342, 8346, 8357, 8368, 8369, + 8374, 8373, 8388, 8389, 8393, 8394, 8398, 8409, 8421, 8420, + 8428, 8428, 8437, 8438, 8443, 8444, 8454, 8453, 8468, 8467, + 8486, 8485, 8502, 8500, 8521, 8522, 8527, 8526, 8540, 8549, + 8539, 8559, 8571, 8635, 8640, 8655, 8656, 8671, 8670, 8686, + 8685, 8698, 8700, 8715, 8723, 8721, 8736, 8754, 8756, 8766, + 8770, 8811, 8820, 8830, 8831, 8835, 8839, 8845, 8852, 8854, + 8863, 8867, 8871, 8878, 8887, 8891, 8898, 8915, 8918, 8926, + 8929, 8936, 8940, 8944, 8948, 8955, 8956, 8960, 8961, 8970, + 8983, 8989, 9000, 9003, 9011, 9014, 9020, 9026, 9035, 9036, + 9037, 9057, 9062, 9084, 9090, 9096, 9102, 9103, 9104, 9105, + 9106, 9110, 9111, 9112, 9116, 9117, 9118, 9122, 9123, 9128, + 9179, 9186, 9229, 9235, 9239, 9245, 9251, 9257, 9263, 9269, + 9275, 9281, 9287, 9293, 9299, 9305, 9309, 9315, 9324, 9330, + 9338, 9344, 9353, 9359, 9367, 9377, 9383, 9390, 9397, 9405, + 9411, 9420, 9424, 9430, 9436, 9442, 9448, 9455, 9461, 9467, + 9473, 9479, 9486, 9492, 9498, 9504, 9510, 9516, 9522, 9528, + 9534, 9538, 9539, 9543, 9544, 9548, 9549, 9553, 9554, 9558, + 9559, 9560, 9561, 9562, 9563, 9567, 9568, 9573, 9576, 9580, + 9581, 9582, 9586, 9587, 9588, 9589, 9590, 9591, 9595, 9596, + 9597, 9601, 9606, 9613, 9635, 9642, 9651, 9652, 9653, 9654, + 9658, 9667, 9668, 9672, 9676, 9677, 9678, 9679, 9680, 9681, + 9682, 9714, 9715, 9716, 9717, 9718, 9719, 9720, 9721, 9722, + 9730, 9738, 9739, 9746, 9752, 9757, 9767, 9772, 9777, 9783, + 9788, 9794, 9805, 9812, 9817, 9822, 9827, 9832, 9837, 9842, + 9850, 9851, 9852, 9853, 9861, 9862, 9871, 9872, 9878, 9882, + 9888, 9894, 9903, 9904, 9913, 9920, 9934, 9940, 9946, 9955, + 9964, 9970, 9976, 9982, 9988, 10003, 10014, 10020, 10026, 10032, + 10038, 10044, 10052, 10059, 10063, 10069, 10077, 10086, 10087, 10091, + 10095, 10102, 10106, 10126, 10133, 10139, 10146, 10153, 10159, 10165, + 10171, 10177, 10184, 10190, 10201, 10208, 10214, 10227, 10232, 10237, + 10243, 10249, 10254, 10261, 10268, 10276, 10283, 10290, 10297, 10312, + 10318, 10324, 10333, 10344, 10351, 10357, 10365, 10371, 10377, 10383, + 10389, 10397, 10409, 10429, 10428, 10504, 10510, 10516, 10522, 10527, + 10532, 10537, 10542, 10547, 10552, 10572, 10574, 10579, 10580, 10584, + 10585, 10589, 10590, 10594, 10601, 10609, 10636, 10642, 10648, 10654, + 10660, 10666, 10675, 10682, 10684, 10681, 10691, 10702, 10708, 10714, + 10720, 10726, 10732, 10738, 10744, 10750, 10757, 10756, 10777, 10776, + 10807, 10806, 10820, 10829, 10847, 10849, 10851, 10866, 10873, 10880, + 10887, 10894, 10901, 10908, 10915, 10922, 10929, 10940, 10947, 10958, + 10969, 10989, 10988, 10994, 11011, 11017, 11026, 11035, 11045, 11044, + 11056, 11071, 11084, 11089, 11097, 11098, 11103, 11108, 11111, 11113, + 11117, 11122, 11130, 11131, 11136, 11143, 11153, 11152, 11169, 11171, + 11177, 11183, 11189, 11193, 11194, 11195, 11203, 11204, 11205, 11206, + 11207, 11208, 11209, 11210, 11214, 11215, 11216, 11217, 11224, 11225, + 11229, 11234, 11242, 11243, 11247, 11254, 11262, 11271, 11281, 11282, + 11293, 11294, 11306, 11310, 11314, 11322, 11323, 11327, 11331, 11335, + 11342, 11346, 11351, 11352, 11358, 11357, 11386, 11385, 11401, 11410, + 11422, 11434, 11435, 11436, 11437, 11442, 11443, 11444, 11445, 11446, + 11450, 11454, 11458, 11468, 11475, 11483, 11489, 11482, 11535, 11536, + 11542, 11547, 11561, 11569, 11567, 11587, 11585, 11598, 11610, 11608, + 11628, 11627, 11639, 11652, 11650, 11671, 11670, 11683, 11697, 11698, + 11699, 11703, 11704, 11712, 11713, 11717, 11726, 11727, 11728, 11733, + 11734, 11738, 11739, 11743, 11744, 11748, 11749, 11757, 11765, 11773, + 11774, 11787, 11803, 11822, 11823, 11828, 11832, 11833, 11834, 11838, + 11839, 11844, 11843, 11849, 11848, 11856, 11857, 11860, 11862, 11862, + 11866, 11866, 11871, 11872, 11876, 11878, 11883, 11884, 11888, 11899, + 11913, 11914, 11915, 11916, 11917, 11918, 11919, 11920, 11921, 11922, + 11923, 11924, 11928, 11929, 11930, 11931, 11932, 11933, 11934, 11935, + 11936, 11940, 11941, 11942, 11943, 11946, 11948, 11949, 11953, 11954, + 11958, 11966, 11968, 11972, 11974, 11973, 11987, 11990, 11989, 12007, + 12009, 12013, 12018, 12026, 12027, 12044, 12067, 12068, 12074, 12075, + 12079, 12092, 12091, 12100, 12101, 12110, 12111, 12115, 12116, 12120, + 12121, 12135, 12136, 12140, 12150, 12159, 12166, 12173, 12183, 12184, + 12191, 12201, 12202, 12204, 12206, 12208, 12210, 12219, 12223, 12224, + 12228, 12242, 12243, 12249, 12248, 12259, 12265, 12274, 12275, 12276, + 12282, 12283, 12288, 12295, 12301, 12306, 12317, 12327, 12338, 12345, + 12353, 12363, 12364, 12368, 12369, 12373, 12374, 12379, 12386, 12393, + 12400, 12410, 12415, 12420, 12424, 12430, 12436, 12445, 12453, 12457, + 12464, 12465, 12469, 12474, 12479, 12492, 12496, 12500, 12504, 12509, + 12512, 12516, 12530, 12538, 12549, 12551, 12555, 12556, 12560, 12561, + 12562, 12563, 12564, 12565, 12569, 12570, 12571, 12572, 12573, 12577, + 12578, 12579, 12580, 12584, 12585, 12586, 12587, 12588, 12592, 12593, + 12594, 12595, 12596, 12600, 12605, 12606, 12610, 12611, 12615, 12616, + 12617, 12622, 12621, 12653, 12654, 12658, 12659, 12663, 12673, 12673, + 12685, 12686, 12689, 12709, 12719, 12724, 12732, 12738, 12749, 12737, + 12751, 12766, 12778, 12777, 12800, 12799, 12809, 12808, 12831, 12837, + 12841, 12846, 12845, 12854, 12859, 12865, 12872, 12870, 12881, 12885, + 12886, 12890, 12902, 12915, 12916, 12920, 12934, 12938, 12947, 12950, + 12957, 12958, 12966, 12973, 12965, 12986, 12993, 12985, 13004, 13013, + 13022, 13030, 13031, 13035, 13036, 13040, 13041, 13049, 13049, 13052, + 13052, 13065, 13066, 13068, 13067, 13080, 13086, 13088, 13092, 13094, + 13100, 13104, 13105, 13109, 13110, 13114, 13124, 13125, 13129, 13130, + 13134, 13135, 13139, 13140, 13145, 13144, 13161, 13160, 13176, 13177, + 13181, 13182, 13186, 13191, 13199, 13207, 13218, 13219, 13228, 13229, + 13237, 13239, 13241, 13239, 13251, 13263, 13270, 13280, 13299, 13269, + 13306, 13307, 13311, 13318, 13326, 13327, 13331, 13341, 13342, 13349, + 13348, 13369, 13372, 13379, 13380, 13390, 13405, 13413, 13426, 13432, + 13425, 13437, 13443, 13436, 13451, 13455, 13454, 13488, 13489, 13493, + 13508, 13526, 13527, 13531, 13532, 13536, 13537, 13538, 13543, 13554, + 13542, 13564, 13566, 13569, 13571, 13574, 13575, 13578, 13582, 13586, + 13590, 13594, 13598, 13602, 13606, 13610, 13618, 13621, 13631, 13630, + 13649, 13656, 13664, 13672, 13680, 13688, 13696, 13703, 13710, 13716, + 13718, 13720, 13729, 13733, 13738, 13737, 13744, 13743, 13750, 13759, + 13766, 13771, 13776, 13781, 13786, 13791, 13793, 13795, 13797, 13804, + 13812, 13814, 13822, 13829, 13836, 13844, 13850, 13855, 13863, 13871, + 13879, 13883, 13887, 13894, 13901, 13908, 13915, 13921, 13927, 13933, + 13939, 13945, 13953, 13958, 13965, 13972, 13979, 13986, 13993, 14000, + 14005, 14010, 14015, 14020, 14025, 14037, 14045, 14067, 14069, 14071, + 14076, 14077, 14080, 14082, 14086, 14087, 14091, 14092, 14096, 14097, + 14101, 14102, 14106, 14107, 14111, 14112, 14121, 14133, 14132, 14151, + 14150, 14160, 14161, 14162, 14163, 14164, 14165, 14169, 14170, 14174, + 14181, 14182, 14184, 14185, 14189, 14190, 14203, 14204, 14205, 14221, + 14245, 14244, 14256, 14255, 14267, 14272, 14273, 14286, 14289, 14288, + 14301, 14302, 14307, 14309, 14311, 14313, 14315, 14317, 14325, 14327, + 14329, 14331, 14336, 14338, 14346, 14348, 14350, 14352, 14354, 14356, + 14373, 14374, 14378, 14382, 14395, 14394, 14409, 14419, 14420, 14423, + 14425, 14426, 14430, 14446, 14447, 14452, 14451, 14461, 14462, 14466, + 14466, 14471, 14470, 14476, 14480, 14481, 14485, 14486, 14493, 14498, + 14497, 14512, 14511, 14526, 14527, 14528, 14532, 14533, 14534, 14543, + 14544, 14548, 14552, 14560, 14560, 14565, 14566, 14575, 14587, 14601, + 14612, 14625, 14586, 14636, 14637, 14641, 14642, 14646, 14647, 14655, + 14659, 14660, 14661, 14664, 14666, 14670, 14671, 14675, 14680, 14687, + 14692, 14699, 14701, 14705, 14706, 14710, 14715, 14723, 14724, 14728, + 14730, 14738, 14739, 14743, 14744, 14745, 14749, 14751, 14756, 14757, + 14772, 14773, 14777, 14778, 14782, 14795, 14800, 14805, 14810, 14818, + 14826, 14831, 14839, 14847, 14862, 14869, 14875, 14885, 14886, 14894, + 14895, 14896, 14897, 14911, 14917, 14923, 14929, 14935, 14941, 14962, + 14972, 14982, 14988, 14995, 15005, 15012, 15019, 15030, 15029, 15054, + 15055, 15060, 15061, 15066, 15090, 15093, 15092, 15108, 15112, 15117, + 15121, 15128, 15134, 15143, 15161, 15162, 15166, 15171, 15179, 15184, + 15192, 15197, 15202, 15207, 15213, 15218, 15226, 15231, 15236, 15241, + 15247, 15255, 15256, 15267, 15275, 15279, 15285, 15291, 15301, 15307, + 15316, 15326, 15327, 15331, 15332, 15333, 15337, 15345, 15346, 15347, + 15348, 15352, 15361, 15369, 15377, 15385, 15386, 15394, 15395, 15399, + 15400, 15405, 15414, 15415, 15423, 15424, 15432, 15433, 15434, 15438, + 15449, 15478, 15487, 15487, 15489, 15499, 15500, 15501, 15502, 15503, + 15504, 15505, 15506, 15507, 15508, 15509, 15510, 15515, 15516, 15517, + 15518, 15519, 15520, 15521, 15522, 15523, 15524, 15525, 15526, 15527, + 15531, 15532, 15533, 15534, 15535, 15536, 15537, 15538, 15539, 15540, + 15541, 15542, 15543, 15547, 15548, 15549, 15550, 15551, 15552, 15553, + 15554, 15555, 15556, 15557, 15558, 15559, 15563, 15564, 15565, 15566, + 15567, 15568, 15569, 15570, 15583, 15584, 15585, 15586, 15587, 15588, + 15589, 15590, 15591, 15592, 15593, 15594, 15595, 15596, 15597, 15598, + 15599, 15600, 15601, 15602, 15603, 15604, 15605, 15606, 15607, 15608, + 15609, 15610, 15611, 15612, 15613, 15614, 15615, 15616, 15617, 15618, + 15619, 15620, 15621, 15622, 15623, 15624, 15625, 15626, 15627, 15628, + 15629, 15630, 15631, 15632, 15633, 15634, 15635, 15676, 15677, 15678, + 15679, 15680, 15681, 15692, 15693, 15694, 15695, 15696, 15697, 15698, + 15699, 15700, 15701, 15705, 15706, 15707, 15711, 15712, 15713, 15722, + 15723, 15724, 15725, 15726, 15727, 15728, 15729, 15730, 15731, 15732, + 15733, 15734, 15735, 15736, 15737, 15738, 15739, 15740, 15741, 15742, + 15743, 15744, 15745, 15746, 15747, 15752, 15757, 15758, 15759, 15760, + 15761, 15762, 15763, 15764, 15765, 15766, 15767, 15768, 15769, 15770, + 15771, 15772, 15773, 15774, 15775, 15776, 15777, 15778, 15779, 15780, + 15781, 15782, 15783, 15784, 15785, 15786, 15787, 15788, 15789, 15790, + 15791, 15792, 15793, 15794, 15795, 15796, 15797, 15798, 15799, 15800, + 15805, 15806, 15807, 15808, 15809, 15810, 15811, 15812, 15813, 15814, + 15815, 15816, 15817, 15818, 15819, 15820, 15821, 15822, 15823, 15824, + 15825, 15826, 15827, 15828, 15829, 15830, 15831, 15832, 15833, 15834, + 15835, 15836, 15837, 15838, 15839, 15840, 15841, 15842, 15843, 15844, + 15845, 15846, 15847, 15848, 15849, 15850, 15851, 15852, 15853, 15854, + 15855, 15856, 15857, 15858, 15859, 15860, 15861, 15862, 15863, 15864, + 15865, 15866, 15867, 15868, 15869, 15870, 15871, 15872, 15873, 15874, + 15875, 15876, 15877, 15878, 15879, 15880, 15881, 15882, 15883, 15884, + 15885, 15886, 15887, 15888, 15889, 15890, 15891, 15892, 15893, 15894, + 15895, 15896, 15897, 15898, 15899, 15900, 15901, 15902, 15903, 15904, + 15905, 15906, 15907, 15908, 15909, 15910, 15911, 15912, 15913, 15914, + 15915, 15917, 15919, 15920, 15921, 15922, 15923, 15924, 15925, 15926, + 15927, 15928, 15929, 15930, 15931, 15932, 15933, 15934, 15935, 15936, + 15937, 15938, 15939, 15940, 15941, 15942, 15943, 15944, 15945, 15946, + 15947, 15948, 15949, 15950, 15951, 15952, 15953, 15954, 15955, 15956, + 15957, 15958, 15959, 15960, 15961, 15962, 15963, 15964, 15965, 15966, + 15967, 15968, 15969, 15970, 15971, 15972, 15973, 15974, 15975, 15976, + 15977, 15978, 15979, 15980, 15981, 15982, 15983, 15984, 15985, 15986, + 15987, 15988, 15989, 15990, 15991, 15992, 15993, 15994, 15995, 15996, + 15997, 15998, 15999, 16000, 16001, 16002, 16003, 16004, 16005, 16006, + 16007, 16008, 16009, 16010, 16011, 16012, 16013, 16014, 16015, 16016, + 16017, 16018, 16019, 16020, 16021, 16022, 16023, 16024, 16025, 16026, + 16027, 16028, 16029, 16030, 16031, 16032, 16033, 16034, 16035, 16036, + 16037, 16038, 16039, 16040, 16041, 16042, 16043, 16044, 16045, 16046, + 16047, 16048, 16049, 16050, 16051, 16052, 16053, 16054, 16055, 16056, + 16057, 16058, 16059, 16060, 16061, 16062, 16063, 16064, 16068, 16069, + 16075, 16076, 16077, 16078, 16079, 16080, 16081, 16082, 16083, 16084, + 16085, 16086, 16087, 16088, 16089, 16091, 16093, 16094, 16095, 16096, + 16098, 16100, 16101, 16102, 16103, 16104, 16105, 16110, 16111, 16112, + 16113, 16114, 16115, 16116, 16117, 16118, 16119, 16120, 16121, 16122, + 16123, 16124, 16125, 16126, 16127, 16128, 16129, 16130, 16131, 16132, + 16133, 16134, 16135, 16136, 16137, 16138, 16139, 16140, 16141, 16142, + 16143, 16144, 16145, 16146, 16147, 16148, 16149, 16150, 16151, 16152, + 16153, 16154, 16155, 16156, 16157, 16158, 16159, 16160, 16161, 16162, + 16163, 16164, 16165, 16166, 16167, 16168, 16169, 16170, 16171, 16172, + 16173, 16174, 16175, 16176, 16177, 16178, 16179, 16180, 16181, 16182, + 16183, 16184, 16185, 16186, 16187, 16188, 16189, 16190, 16191, 16192, + 16193, 16194, 16195, 16196, 16197, 16198, 16199, 16200, 16201, 16202, + 16203, 16204, 16205, 16206, 16207, 16208, 16209, 16210, 16211, 16212, + 16213, 16214, 16215, 16216, 16217, 16218, 16219, 16220, 16221, 16222, + 16223, 16224, 16225, 16226, 16227, 16228, 16229, 16233, 16234, 16235, + 16236, 16237, 16238, 16239, 16240, 16241, 16242, 16243, 16244, 16245, + 16246, 16247, 16248, 16249, 16250, 16251, 16252, 16253, 16254, 16255, + 16256, 16257, 16258, 16259, 16260, 16261, 16262, 16263, 16264, 16265, + 16266, 16267, 16268, 16269, 16270, 16271, 16272, 16273, 16274, 16275, + 16276, 16277, 16278, 16279, 16280, 16281, 16282, 16283, 16284, 16285, + 16286, 16287, 16288, 16289, 16290, 16291, 16292, 16293, 16294, 16295, + 16296, 16297, 16298, 16299, 16300, 16301, 16302, 16303, 16304, 16305, + 16306, 16307, 16308, 16309, 16310, 16311, 16312, 16313, 16314, 16315, + 16316, 16317, 16318, 16319, 16320, 16321, 16322, 16323, 16324, 16325, + 16326, 16327, 16328, 16329, 16330, 16331, 16332, 16333, 16334, 16335, + 16336, 16337, 16338, 16339, 16340, 16341, 16342, 16343, 16344, 16345, + 16346, 16347, 16359, 16358, 16371, 16372, 16374, 16373, 16385, 16384, + 16391, 16389, 16409, 16410, 16415, 16416, 16418, 16417, 16431, 16432, + 16438, 16437, 16442, 16446, 16447, 16448, 16452, 16453, 16454, 16455, + 16459, 16460, 16461, 16462, 16471, 16470, 16484, 16483, 16498, 16497, + 16515, 16514, 16528, 16527, 16541, 16540, 16556, 16555, 16569, 16568, + 16582, 16581, 16594, 16593, 16611, 16610, 16622, 16621, 16633, 16632, + 16643, 16661, 16672, 16679, 16688, 16710, 16726, 16738, 16737, 16751, + 16750, 16762, 16761, 16775, 16776, 16777, 16778, 16782, 16801, 16819, + 16820, 16824, 16825, 16826, 16827, 16832, 16837, 16842, 16853, 16854, + 16855, 16861, 16867, 16879, 16878, 16892, 16893, 16899, 16908, 16909, + 16913, 16914, 16918, 16937, 16938, 16939, 16944, 16945, 16950, 16949, + 16967, 16966, 16978, 16987, 16997, 16996, 17039, 17040, 17044, 17045, + 17049, 17050, 17051, 17052, 17054, 17053, 17066, 17067, 17068, 17069, + 17070, 17076, 17081, 17086, 17091, 17095, 17100, 17109, 17111, 17116, + 17121, 17127, 17133, 17138, 17150, 17151, 17155, 17156, 17160, 17165, + 17173, 17182, 17203, 17203, 17205, 17207, 17211, 17212, 17219, 17221, + 17225, 17230, 17237, 17241, 17250, 17257, 17258, 17259, 17260, 17264, + 17265, 17266, 17267, 17268, 17269, 17270, 17271, 17272, 17273, 17274, + 17275, 17276, 17277, 17278, 17279, 17280, 17281, 17282, 17283, 17284, + 17285, 17286, 17287, 17288, 17289, 17290, 17291, 17292, 17293, 17294, + 17295, 17296, 17297, 17298, 17299, 17300, 17301, 17302, 17303, 17304, + 17305, 17309, 17310, 17314, 17315, 17319, 17326, 17333, 17343, 17352, + 17358, 17365, 17373, 17378, 17386, 17391, 17399, 17404, 17411, 17411, + 17412, 17412, 17415, 17421, 17427, 17432, 17439, 17445, 17452, 17461, + 17465, 17471, 17479, 17481, 17485, 17489, 17493, 17500, 17505, 17510, + 17515, 17520, 17528, 17529, 17533, 17534, 17539, 17540, 17544, 17545, + 17549, 17550, 17554, 17555, 17560, 17559, 17569, 17578, 17579, 17583, + 17584, 17589, 17590, 17591, 17596, 17597, 17598, 17602, 17614, 17623, + 17629, 17638, 17647, 17660, 17662, 17664, 17672, 17673, 17674, 17678, + 17679, 17685, 17686, 17687, 17688, 17689, 17690, 17691, 17701, 17702, + 17707, 17720, 17734, 17735, 17736, 17740, 17741, 17745, 17746, 17751, + 17752, 17756, 17762, 17771, 17771, 17785, 17786, 17787, 17788, 17798, + 17800, 17806, 17812, 17822, 17831, 17837, 17842, 17846, 17820, 17895, + 17895, 17910, 17914, 17918, 17922, 17926, 17930, 17938, 17939, 17955, + 17962, 17969, 17982, 17983, 17984, 17988, 17989, 17990, 17994, 17995, + 18000, 18002, 18001, 18007, 18008, 18012, 18017, 18024, 18029, 18038, + 18044, 18052, 18056, 18060, 18064, 18068, 18069, 18070, 18074, 18075, + 18080, 18081, 18087, 18088, 18089, 18090, 18091, 18092, 18093, 18097, + 18098, 18099, 18100, 18101, 18102, 18103, 18104, 18105, 18106, 18107, + 18108, 18112, 18117, 18121, 18130, 18129, 18142, 18147, 18151, 18155, + 18164, 18165, 18169, 18177, 18188, 18193, 18197, 18202, 18207, 18211, + 18218, 18224, 18229, 18239, 18238, 18253, 18261, 18252, 18273, 18278, + 18283, 18293, 18292, 18303, 18301, 18315, 18313, 18325, 18336, 18340, + 18352, 18357, 18358, 18365, 18367, 18366, 18394, 18395, 18396, 18397, + 18398, 18402, 18403, 18404, 18405, 18406, 18407, 18408, 18409, 18413, + 18414, 18415, 18416, 18423, 18421, 18438, 18437, 18452, 18451 +}; +#endif + +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) + +#if YYDEBUG || 0 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; + +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"end of file\"", "error", "\"invalid token\"", "'@'", "ABORT_SYM", + "IMPOSSIBLE_ACTION", "FORCE_LOOKAHEAD", "END_OF_INPUT", + "COLON_ORACLE_SYM", "PARAM_MARKER", "FOR_SYSTEM_TIME_SYM", + "LEFT_PAREN_ALT", "LEFT_PAREN_WITH", "LEFT_PAREN_LIKE", + "ORACLE_CONCAT_SYM", "PERCENT_ORACLE_SYM", "WITH_CUBE_SYM", + "WITH_ROLLUP_SYM", "WITH_SYSTEM_SYM", "IDENT", "IDENT_QUOTED", + "LEX_HOSTNAME", "UNDERSCORE_CHARSET", "BIN_NUM", "DECIMAL_NUM", + "FLOAT_NUM", "HEX_NUM", "HEX_STRING", "LONG_NUM", "NCHAR_STRING", "NUM", + "TEXT_STRING", "ULONGLONG_NUM", "AND_AND_SYM", "DOT_DOT_SYM", + "EQUAL_SYM", "GE", "LE", "MYSQL_CONCAT_SYM", "NE", "NOT2_SYM", "OR2_SYM", + "SET_VAR", "SHIFT_LEFT", "SHIFT_RIGHT", "ACCESSIBLE_SYM", "ADD", "ALL", + "ALTER", "ANALYZE_SYM", "AND_SYM", "ASC", "ASENSITIVE_SYM", "AS", + "BEFORE_SYM", "BETWEEN_SYM", "BIGINT", "BINARY", "BIT_AND", "BIT_OR", + "BIT_XOR", "BLOB_MARIADB_SYM", "BLOB_ORACLE_SYM", "BODY_ORACLE_SYM", + "BOTH", "BY", "CALL_SYM", "CASCADE", "CASE_SYM", "CAST_SYM", "CHANGE", + "CHAR_SYM", "CHECK_SYM", "COLLATE_SYM", "CONDITION_SYM", "CONSTRAINT", + "CONTINUE_MARIADB_SYM", "CONTINUE_ORACLE_SYM", "CONVERT_SYM", + "COUNT_SYM", "CREATE", "CROSS", "CUME_DIST_SYM", "CURDATE", + "CURRENT_ROLE", "CURRENT_USER", "CURSOR_SYM", "CURTIME", "DATABASE", + "DATABASES", "DATE_ADD_INTERVAL", "DATE_SUB_INTERVAL", "DAY_HOUR_SYM", + "DAY_MICROSECOND_SYM", "DAY_MINUTE_SYM", "DAY_SECOND_SYM", "DECIMAL_SYM", + "DECLARE_MARIADB_SYM", "DECLARE_ORACLE_SYM", "DEFAULT", + "DELETE_DOMAIN_ID_SYM", "DELETE_SYM", "DENSE_RANK_SYM", "DESCRIBE", + "DESC", "DETERMINISTIC_SYM", "DISTINCT", "DIV_SYM", "DO_DOMAIN_IDS_SYM", + "DOUBLE_SYM", "DROP", "DUAL_SYM", "EACH_SYM", "ELSEIF_MARIADB_SYM", + "ELSE", "ELSIF_ORACLE_SYM", "EMPTY_SYM", "ENCLOSED", "ESCAPED", + "EXCEPT_SYM", "EXISTS", "EXTRACT_SYM", "FALSE_SYM", "FETCH_SYM", + "FIRST_VALUE_SYM", "FLOAT_SYM", "FOREIGN", "FOR_SYM", "FROM", + "FULLTEXT_SYM", "GOTO_ORACLE_SYM", "GRANT", "GROUP_CONCAT_SYM", + "JSON_ARRAYAGG_SYM", "JSON_OBJECTAGG_SYM", "JSON_TABLE_SYM", "GROUP_SYM", + "HAVING", "HOUR_MICROSECOND_SYM", "HOUR_MINUTE_SYM", "HOUR_SECOND_SYM", + "IF_SYM", "IGNORE_DOMAIN_IDS_SYM", "IGNORE_SYM", "IGNORED_SYM", + "INDEX_SYM", "INFILE", "INNER_SYM", "INOUT_SYM", "INSENSITIVE_SYM", + "INSERT", "IN_SYM", "INTERSECT_SYM", "INTERVAL_SYM", "INTO", "INT_SYM", + "IS", "ITERATE_SYM", "JOIN_SYM", "KEYS", "KEY_SYM", "KILL_SYM", + "LAG_SYM", "LEADING", "LEAD_SYM", "LEAVE_SYM", "LEFT", "LIKE", "LIMIT", + "LINEAR_SYM", "LINES", "LOAD", "LOCATOR_SYM", "LOCK_SYM", "LONGBLOB", + "LONG_SYM", "LONGTEXT", "LOOP_SYM", "LOW_PRIORITY", + "MASTER_SSL_VERIFY_SERVER_CERT_SYM", "MATCH", "MAX_SYM", "MAXVALUE_SYM", + "MEDIAN_SYM", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIN_SYM", + "MINUS_ORACLE_SYM", "MINUTE_MICROSECOND_SYM", "MINUTE_SECOND_SYM", + "MODIFIES_SYM", "MOD_SYM", "NATURAL", "NEG", "NESTED_SYM", "NOT_SYM", + "NO_WRITE_TO_BINLOG", "NOW_SYM", "NTH_VALUE_SYM", "NTILE_SYM", + "NULL_SYM", "NUMERIC_SYM", "ON", "OPTIMIZE", "OPTIONALLY", "ORDER_SYM", + "ORDINALITY_SYM", "OR_SYM", "OTHERS_ORACLE_SYM", "OUTER", "OUTFILE", + "OUT_SYM", "OVER_SYM", "PACKAGE_ORACLE_SYM", "PAGE_CHECKSUM_SYM", + "PARSE_VCOL_EXPR_SYM", "PARTITION_SYM", "PATH_SYM", + "PERCENTILE_CONT_SYM", "PERCENTILE_DISC_SYM", "PERCENT_RANK_SYM", + "PORTION_SYM", "POSITION_SYM", "PRECISION", "PRIMARY_SYM", + "PROCEDURE_SYM", "PURGE", "RAISE_ORACLE_SYM", "RANGE_SYM", "RANK_SYM", + "READS_SYM", "READ_SYM", "READ_WRITE_SYM", "REAL", "RECURSIVE_SYM", + "REFERENCES", "REF_SYSTEM_ID_SYM", "REGEXP", "RELEASE_SYM", "RENAME", + "REPEAT_SYM", "REQUIRE_SYM", "RESIGNAL_SYM", "RESTRICT", "RETURNING_SYM", + "RETURN_MARIADB_SYM", "RETURN_ORACLE_SYM", "REVOKE", "RIGHT", + "ROW_NUMBER_SYM", "ROWS_SYM", "ROWTYPE_ORACLE_SYM", + "SECOND_MICROSECOND_SYM", "SELECT_SYM", "SENSITIVE_SYM", "SEPARATOR_SYM", + "SERVER_OPTIONS", "SET", "SHOW", "SIGNAL_SYM", "SMALLINT", "SPATIAL_SYM", + "SPECIFIC_SYM", "SQL_BIG_RESULT", "SQLEXCEPTION_SYM", "SQL_SMALL_RESULT", + "SQLSTATE_SYM", "SQL_SYM", "SQLWARNING_SYM", "SSL_SYM", "STARTING", + "STATS_AUTO_RECALC_SYM", "STATS_PERSISTENT_SYM", + "STATS_SAMPLE_PAGES_SYM", "STDDEV_SAMP_SYM", "STD_SYM", "STRAIGHT_JOIN", + "SUM_SYM", "SYSDATE", "TABLE_REF_PRIORITY", "TABLE_SYM", "TERMINATED", + "THEN_SYM", "TINYBLOB", "TINYINT", "TINYTEXT", "TO_SYM", "TRAILING", + "TRIGGER_SYM", "TRUE_SYM", "UNDO_SYM", "UNION_SYM", "UNIQUE_SYM", + "UNLOCK_SYM", "UNSIGNED", "UPDATE_SYM", "USAGE", "USE_SYM", "USING", + "UTC_DATE_SYM", "UTC_TIMESTAMP_SYM", "UTC_TIME_SYM", "VALUES_IN_SYM", + "VALUES_LESS_SYM", "VALUES", "VARBINARY", "VARCHAR", "VARIANCE_SYM", + "VAR_SAMP_SYM", "VARYING", "WHEN_SYM", "WHERE", "WHILE_SYM", "WITH", + "XOR", "YEAR_MONTH_SYM", "ZEROFILL", "BODY_MARIADB_SYM", + "ELSEIF_ORACLE_SYM", "ELSIF_MARIADB_SYM", "EXCEPTION_ORACLE_SYM", + "GOTO_MARIADB_SYM", "OTHERS_MARIADB_SYM", "PACKAGE_MARIADB_SYM", + "RAISE_MARIADB_SYM", "ROWTYPE_MARIADB_SYM", "ROWNUM_SYM", "REPLACE", + "SUBSTRING", "TRIM", "ACCOUNT_SYM", "ACTION", "ADMIN_SYM", "ADDDATE_SYM", + "AFTER_SYM", "AGAINST", "AGGREGATE_SYM", "ALGORITHM_SYM", "ALWAYS_SYM", + "ANY_SYM", "ASCII_SYM", "AT_SYM", "ATOMIC_SYM", "AUTHORS_SYM", + "AUTOEXTEND_SIZE_SYM", "AUTO_INC", "AUTO_SYM", "AVG_ROW_LENGTH", + "AVG_SYM", "BACKUP_SYM", "BEGIN_MARIADB_SYM", "BEGIN_ORACLE_SYM", + "BINLOG_SYM", "BIT_SYM", "BLOCK_SYM", "BOOL_SYM", "BOOLEAN_SYM", + "BTREE_SYM", "BYTE_SYM", "CACHE_SYM", "CASCADED", "CATALOG_NAME_SYM", + "CHAIN_SYM", "CHANGED", "CHANNEL_SYM", "CHARSET", "CHECKPOINT_SYM", + "CHECKSUM_SYM", "CIPHER_SYM", "CLASS_ORIGIN_SYM", "CLIENT_SYM", + "CLOB_MARIADB_SYM", "CLOB_ORACLE_SYM", "CLOSE_SYM", "COALESCE", + "CODE_SYM", "COLLATION_SYM", "COLUMNS", "COLUMN_ADD_SYM", + "COLUMN_CHECK_SYM", "COLUMN_CREATE_SYM", "COLUMN_DELETE_SYM", + "COLUMN_GET_SYM", "COLUMN_SYM", "COLUMN_NAME_SYM", "COMMENT_SYM", + "COMMITTED_SYM", "COMMIT_SYM", "COMPACT_SYM", "COMPLETION_SYM", + "COMPRESSED_SYM", "CONCURRENT", "CONNECTION_SYM", "CONSISTENT_SYM", + "CONSTRAINT_CATALOG_SYM", "CONSTRAINT_NAME_SYM", "CONSTRAINT_SCHEMA_SYM", + "CONTAINS_SYM", "CONTEXT_SYM", "CONTRIBUTORS_SYM", "CPU_SYM", "CUBE_SYM", + "CURRENT_SYM", "CURRENT_POS_SYM", "CURSOR_NAME_SYM", "CYCLE_SYM", + "DATAFILE_SYM", "DATA_SYM", "DATETIME", "DATE_SYM", "DAY_SYM", + "DEALLOCATE_SYM", "DEFINER_SYM", "DELAYED_SYM", "DELAY_KEY_WRITE_SYM", + "DES_KEY_FILE", "DIAGNOSTICS_SYM", "DIRECTORY_SYM", "DISABLE_SYM", + "DISCARD", "DISK_SYM", "DO_SYM", "DUMPFILE", "DUPLICATE_SYM", + "DYNAMIC_SYM", "ENABLE_SYM", "END", "ENDS_SYM", "ENGINES_SYM", + "ENGINE_SYM", "ENUM", "ERROR_SYM", "ERRORS", "ESCAPE_SYM", "EVENTS_SYM", + "EVENT_SYM", "EVERY_SYM", "EXCHANGE_SYM", "EXAMINED_SYM", "EXCLUDE_SYM", + "EXECUTE_SYM", "EXCEPTION_MARIADB_SYM", "EXIT_MARIADB_SYM", + "EXIT_ORACLE_SYM", "EXPANSION_SYM", "EXPIRE_SYM", "EXPORT_SYM", + "EXTENDED_SYM", "EXTENT_SIZE_SYM", "FAST_SYM", "FAULTS_SYM", + "FEDERATED_SYM", "FILE_SYM", "FIRST_SYM", "FIXED_SYM", "FLUSH_SYM", + "FOLLOWS_SYM", "FOLLOWING_SYM", "FORCE_SYM", "FORMAT_SYM", "FOUND_SYM", + "FULL", "FUNCTION_SYM", "GENERAL", "GENERATED_SYM", "GET_FORMAT", + "GET_SYM", "GLOBAL_SYM", "GRANTS", "HANDLER_SYM", "HARD_SYM", "HASH_SYM", + "HELP_SYM", "HIGH_PRIORITY", "HISTORY_SYM", "HOST_SYM", "HOSTS_SYM", + "HOUR_SYM", "ID_SYM", "IDENTIFIED_SYM", "IGNORE_SERVER_IDS_SYM", + "IMMEDIATE_SYM", "IMPORT", "INCREMENT_SYM", "INDEXES", + "INITIAL_SIZE_SYM", "INSERT_METHOD", "INSTALL_SYM", "INVOKER_SYM", + "IO_SYM", "IPC_SYM", "ISOLATION", "ISOPEN_SYM", "ISSUER_SYM", + "INVISIBLE_SYM", "JSON_SYM", "KEY_BLOCK_SIZE", "LANGUAGE_SYM", + "LAST_SYM", "LAST_VALUE", "LASTVAL_SYM", "LEAVES", "LESS_SYM", + "LEVEL_SYM", "LIST_SYM", "LOCAL_SYM", "LOCKED_SYM", "LOCKS_SYM", + "LOGFILE_SYM", "LOGS_SYM", "MASTER_CONNECT_RETRY_SYM", + "MASTER_DELAY_SYM", "MASTER_GTID_POS_SYM", "MASTER_HOST_SYM", + "MASTER_LOG_FILE_SYM", "MASTER_LOG_POS_SYM", "MASTER_PASSWORD_SYM", + "MASTER_PORT_SYM", "MASTER_SERVER_ID_SYM", "MASTER_SSL_CAPATH_SYM", + "MASTER_SSL_CA_SYM", "MASTER_SSL_CERT_SYM", "MASTER_SSL_CIPHER_SYM", + "MASTER_SSL_CRL_SYM", "MASTER_SSL_CRLPATH_SYM", "MASTER_SSL_KEY_SYM", + "MASTER_SSL_SYM", "MASTER_SYM", "MASTER_USER_SYM", "MASTER_USE_GTID_SYM", + "MASTER_HEARTBEAT_PERIOD_SYM", "MASTER_DEMOTE_TO_SLAVE_SYM", + "MAX_CONNECTIONS_PER_HOUR", "MAX_QUERIES_PER_HOUR", "MAX_ROWS", + "MAX_SIZE_SYM", "MAX_UPDATES_PER_HOUR", "MAX_STATEMENT_TIME_SYM", + "MAX_USER_CONNECTIONS_SYM", "MEDIUM_SYM", "MEMORY_SYM", "MERGE_SYM", + "MESSAGE_TEXT_SYM", "MICROSECOND_SYM", "MIGRATE_SYM", "MINUTE_SYM", + "MINVALUE_SYM", "MIN_ROWS", "MODE_SYM", "MODIFY_SYM", "MONITOR_SYM", + "MONTH_SYM", "MUTEX_SYM", "MYSQL_SYM", "MYSQL_ERRNO_SYM", "NAMES_SYM", + "NAME_SYM", "NATIONAL_SYM", "NCHAR_SYM", "NEVER_SYM", "NEXT_SYM", + "NEXTVAL_SYM", "NOCACHE_SYM", "NOCYCLE_SYM", "NODEGROUP_SYM", "NONE_SYM", + "NOTFOUND_SYM", "NO_SYM", "NOMAXVALUE_SYM", "NOMINVALUE_SYM", + "NO_WAIT_SYM", "NOWAIT_SYM", "NUMBER_MARIADB_SYM", "NUMBER_ORACLE_SYM", + "NVARCHAR_SYM", "OF_SYM", "OFFSET_SYM", "OLD_PASSWORD_SYM", "ONE_SYM", + "ONLY_SYM", "ONLINE_SYM", "OPEN_SYM", "OPTIONS_SYM", "OPTION", + "OVERLAPS_SYM", "OWNER_SYM", "PACK_KEYS_SYM", "PAGE_SYM", "PARSER_SYM", + "PARTIAL", "PARTITIONS_SYM", "PARTITIONING_SYM", "PASSWORD_SYM", + "PERIOD_SYM", "PERSISTENT_SYM", "PHASE_SYM", "PLUGINS_SYM", "PLUGIN_SYM", + "PORT_SYM", "PRECEDES_SYM", "PRECEDING_SYM", "PREPARE_SYM", + "PRESERVE_SYM", "PREV_SYM", "PREVIOUS_SYM", "PRIVILEGES", "PROCESS", + "PROCESSLIST_SYM", "PROFILE_SYM", "PROFILES_SYM", "PROXY_SYM", + "QUARTER_SYM", "QUERY_SYM", "QUICK", "RAW_MARIADB_SYM", "RAW_ORACLE_SYM", + "READ_ONLY_SYM", "REBUILD_SYM", "RECOVER_SYM", "REDOFILE_SYM", + "REDO_BUFFER_SIZE_SYM", "REDUNDANT_SYM", "RELAY", "RELAYLOG_SYM", + "RELAY_LOG_FILE_SYM", "RELAY_LOG_POS_SYM", "RELAY_THREAD", "RELOAD", + "REMOVE_SYM", "REORGANIZE_SYM", "REPAIR", "REPEATABLE_SYM", "REPLAY_SYM", + "REPLICATION", "RESET_SYM", "RESTART_SYM", "RESOURCES", "RESTORE_SYM", + "RESUME_SYM", "RETURNED_SQLSTATE_SYM", "RETURNS_SYM", "REUSE_SYM", + "REVERSE_SYM", "ROLE_SYM", "ROLLBACK_SYM", "ROLLUP_SYM", "ROUTINE_SYM", + "ROWCOUNT_SYM", "ROW_SYM", "ROW_COUNT_SYM", "ROW_FORMAT_SYM", + "RTREE_SYM", "SAVEPOINT_SYM", "SCHEDULE_SYM", "SCHEMA_NAME_SYM", + "SECOND_SYM", "SECURITY_SYM", "SEQUENCE_SYM", "SERIALIZABLE_SYM", + "SERIAL_SYM", "SESSION_SYM", "SERVER_SYM", "SETVAL_SYM", "SHARE_SYM", + "SHUTDOWN", "SIGNED_SYM", "SIMPLE_SYM", "SKIP_SYM", "SLAVE", "SLAVES", + "SLAVE_POS_SYM", "SLOW", "SNAPSHOT_SYM", "SOCKET_SYM", "SOFT_SYM", + "SONAME_SYM", "SOUNDS_SYM", "SOURCE_SYM", "SQL_BUFFER_RESULT", + "SQL_CACHE_SYM", "SQL_CALC_FOUND_ROWS", "SQL_NO_CACHE_SYM", "SQL_THREAD", + "STAGE_SYM", "STARTS_SYM", "START_SYM", "STATEMENT_SYM", "STATUS_SYM", + "STOP_SYM", "STORAGE_SYM", "STORED_SYM", "STRING_SYM", + "SUBCLASS_ORIGIN_SYM", "SUBDATE_SYM", "SUBJECT_SYM", "SUBPARTITIONS_SYM", + "SUBPARTITION_SYM", "SUPER_SYM", "SUSPEND_SYM", "SWAPS_SYM", + "SWITCHES_SYM", "SYSTEM", "SYSTEM_TIME_SYM", "TABLES", "TABLESPACE", + "TABLE_CHECKSUM_SYM", "TABLE_NAME_SYM", "TEMPORARY", "TEMPTABLE_SYM", + "TEXT_SYM", "THAN_SYM", "TIES_SYM", "TIMESTAMP", "TIMESTAMP_ADD", + "TIMESTAMP_DIFF", "TIME_SYM", "TRANSACTION_SYM", "TRANSACTIONAL_SYM", + "THREADS_SYM", "TRIGGERS_SYM", "TRIM_ORACLE", "TRUNCATE_SYM", "TYPE_SYM", + "UDF_RETURNS_SYM", "UNBOUNDED_SYM", "UNCOMMITTED_SYM", "UNDEFINED_SYM", + "UNDOFILE_SYM", "UNDO_BUFFER_SIZE_SYM", "UNICODE_SYM", "UNINSTALL_SYM", + "UNKNOWN_SYM", "UNTIL_SYM", "UPGRADE_SYM", "USER_SYM", "USE_FRM", + "VALUE_SYM", "VARCHAR2_MARIADB_SYM", "VARCHAR2_ORACLE_SYM", "VARIABLES", + "VERSIONING_SYM", "VIA_SYM", "VIEW_SYM", "VISIBLE_SYM", "VIRTUAL_SYM", + "WAIT_SYM", "WARNINGS", "WEEK_SYM", "WEIGHT_STRING_SYM", "WINDOW_SYM", + "WITHIN", "WITHOUT", "WORK_SYM", "WRAPPER_SYM", "WRITE_SYM", "X509_SYM", + "XA_SYM", "XML_SYM", "YEAR_SYM", "CONDITIONLESS_JOIN", "ON_SYM", + "PREC_BELOW_NOT", "'='", "'>'", "'<'", "'|'", "'&'", "'-'", "'+'", "'*'", + "'/'", "'%'", "'^'", "'~'", "SUBQUERY_AS_EXPR", + "PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE", "USER", + "PREC_BELOW_CONTRACTION_TOKEN2", "'('", "')'", "EMPTY_FROM_CLAUSE", + "','", "'!'", "'{'", "'}'", "';'", "'.'", "':'", "$accept", "query", + "$@1", "opt_end_of_input", "directly_executable_statement", + "verb_clause", "deallocate", "deallocate_or_drop", "prepare", "$@2", + "execute", "$@3", "$@4", "execute_using", "$@5", "execute_params", + "help", "$@6", "change", "$@7", "master_defs", "master_def", + "ignore_server_id_list", "ignore_server_id", "do_domain_id_list", + "do_domain_id", "ignore_domain_id_list", "ignore_domain_id", + "master_file_def", "optional_connection_name", "connection_name", + "optional_for_channel", "for_channel", "create", "$@8", "$@9", "$@10", + "$@11", "$@12", "$@13", "$@14", "$@15", "$@16", "$@17", "$@18", "$@19", + "$@20", "$@21", "$@22", "$@23", "$@24", "opt_sequence", "sequence_defs", + "sequence_def", "force_lookahead", "server_def", "$@25", + "server_options_list", "server_option", "event_tail", "$@26", + "ev_schedule_time", "$@27", "opt_ev_status", "ev_starts", "ev_ends", + "opt_ev_on_completion", "ev_on_completion", "opt_ev_comment", + "ev_sql_stmt", "$@28", "clear_privileges", "opt_aggregate", "sp_handler", + "sp_name", "sp_a_chistics", "sp_c_chistics", "sp_chistic", + "sp_c_chistic", "sp_suid", "call", "$@29", "$@30", "$@31", + "opt_sp_cparam_list", "opt_sp_cparams", "sp_cparams", "sp_fdparam_list", + "$@32", "sp_fdparams", "sp_param_name", "sp_pdparam_list", "sp_pdparams", + "sp_parameter_type", "sp_parenthesized_pdparam_list", "$@33", + "sp_parenthesized_fdparam_list", "sp_proc_stmts", "sp_proc_stmts1", + "optionally_qualified_column_ident", "row_field_definition", + "row_field_definition_list", "row_type_body", "sp_decl_idents_init_vars", + "sp_decl_variable_list", "$@34", "sp_decl_handler", "$@35", + "opt_parenthesized_cursor_formal_parameters", "sp_cursor_stmt_lex", + "sp_cursor_stmt", "$@36", "sp_handler_type", "sp_hcond_list", + "sp_hcond_element", "sp_cond", "sqlstate", "opt_value", "sp_hcond", + "raise_stmt_oracle", "signal_stmt", "signal_value", "opt_signal_value", + "opt_set_signal_information", "signal_information_item_list", + "signal_allowed_expr", "signal_condition_information_item_name", + "resignal_stmt", "get_diagnostics", "which_area", + "diagnostics_information", "statement_information", + "statement_information_item", "simple_target_specification", + "statement_information_item_name", "condition_number", + "condition_information", "condition_information_item", + "condition_information_item_name", "sp_decl_ident", "sp_decl_idents", + "sp_proc_stmt_if", "$@37", "sp_proc_stmt_statement", "$@38", + "RETURN_ALLMODES_SYM", "sp_proc_stmt_return", "$@39", + "sp_proc_stmt_exit_oracle", "$@40", "$@41", + "sp_proc_stmt_continue_oracle", "$@42", "$@43", "sp_proc_stmt_leave", + "sp_proc_stmt_iterate", "sp_proc_stmt_goto_oracle", "expr_lex", "@44", + "assignment_source_lex", "assignment_source_expr", "$@45", + "for_loop_bound_expr", "$@46", "cursor_actual_parameters", + "opt_parenthesized_cursor_actual_parameters", "sp_proc_stmt_with_cursor", + "sp_proc_stmt_open", "sp_proc_stmt_fetch_head", "sp_proc_stmt_fetch", + "sp_proc_stmt_close", "sp_fetch_list", "sp_if", "$@47", "$@48", + "sp_elseifs", "case_stmt_specification", "$@49", "case_stmt_body", + "$@50", "simple_when_clause_list", "searched_when_clause_list", + "simple_when_clause", "$@51", "searched_when_clause", "$@52", + "else_clause_opt", "sp_opt_label", "opt_sp_for_loop_direction", + "sp_for_loop_index_and_bounds", "sp_for_loop_bounds", "loop_body", + "repeat_body", "pop_sp_loop_label", "sp_labeled_control", "$@53", "$@54", + "$@55", "$@56", "$@57", "$@58", "sp_unlabeled_control", "$@59", "$@60", + "$@61", "$@62", "$@63", "trg_action_time", "trg_event", "create_body", + "$@64", "create_like", "opt_create_select", + "create_select_query_expression", "opt_create_partitioning", + "opt_partitioning", "partitioning", "$@65", "have_partitioning", + "partition_entry", "$@66", "partition", "$@67", "part_type_def", "$@68", + "$@69", "$@70", "opt_linear", "opt_key_algo", "part_field_list", + "part_field_item_list", "part_field_item", "part_column_list", + "part_func", "sub_part_func", "opt_num_parts", "opt_sub_part", "$@71", + "$@72", "sub_part_field_list", "sub_part_field_item", "part_func_expr", + "opt_num_subparts", "part_defs", "part_def_list", "opt_partition", + "part_definition", "$@73", "part_name", "opt_part_values", "$@74", + "$@75", "part_func_max", "part_values_in", "part_value_list", + "part_value_item", "$@76", "$@77", "part_value_item_list", + "part_value_expr_item", "opt_sub_partition", "sub_part_list", + "sub_part_definition", "$@78", "sub_name", "opt_part_options", + "part_option_list", "part_option", "opt_subpart_options", + "subpart_option_list", "server_part_option", "opt_versioning_rotation", + "$@79", "opt_versioning_interval_start", "opt_vers_auto_part", "opt_as", + "opt_create_database_options", "create_database_options", + "create_database_option", "opt_if_not_exists_table_element", + "opt_if_not_exists", "create_or_replace", "opt_create_table_options", + "create_table_options_space_separated", "create_table_options", + "create_table_option", "$@80", "engine_defined_option", + "opt_versioning_option", "versioning_option", "default_charset", + "default_collation", "storage_engines", "known_storage_engines", + "row_types", "merge_insert_types", "udf_type", "create_field_list", + "create_field_list_parens", "field_list", "field_list_item", + "column_def", "key_def", "$@81", "$@82", "$@83", "$@84", "$@85", "$@86", + "$@87", "constraint_def", "period_for_system_time", + "period_for_application_time", "opt_check_constraint", + "check_constraint", "opt_constraint_no_id", "opt_constraint", + "constraint", "field_spec", "@88", "field_type_or_serial", "$@89", + "$@90", "opt_serial_attribute", "opt_serial_attribute_list", + "opt_asrow_attribute", "opt_asrow_attribute_list", "field_def", "$@91", + "opt_generated_always", "vcol_opt_specifier", "vcol_opt_attribute", + "vcol_opt_attribute_list", "vcol_attribute", "parse_vcol_expr", "$@92", + "parenthesized_expr", "virtual_column_func", "expr_or_literal", + "column_default_expr", "field_type", "qualified_field_type", "udt_name", + "field_type_all", "field_type_numeric", "opt_binary_and_compression", + "field_type_string", "field_type_temporal", "field_type_lob", + "field_type_misc", "char", "nchar", "varchar", "nvarchar", "int_type", + "real_type", "srid_option", "float_options", "precision", + "field_options", "last_field_options", "field_length_str", + "field_length", "field_scale", "opt_field_length", "opt_field_scale", + "opt_precision", "attribute_list", "attribute", "opt_compression_method", + "opt_compressed", "opt_enable", "compressed", + "compressed_deprecated_data_type_attribute", + "compressed_deprecated_column_attribute", "asrow_attribute", + "serial_attribute", "with_or_without_system", "charset", "charset_name", + "charset_name_or_default", "opt_load_data_charset", + "old_or_new_charset_name", "old_or_new_charset_name_or_default", + "collation_name", "collation_name_or_default", "opt_default", + "charset_or_alias", "opt_binary", "binary", "opt_bin_mod", "ws_nweights", + "$@93", "ws_level_flag_desc", "ws_level_flag_reverse", "ws_level_flags", + "ws_level_number", "ws_level_list_item", "ws_level_list", + "ws_level_range", "ws_level_list_or_range", "opt_ws_levels", + "opt_primary", "references", "opt_ref_list", "ref_list", + "opt_match_clause", "opt_on_update_delete", "delete_option", + "constraint_key_type", "key_or_index", "opt_key_or_index", + "keys_or_index", "fulltext", "spatial", "normal_key_options", + "fulltext_key_options", "spatial_key_options", "normal_key_opts", + "spatial_key_opts", "fulltext_key_opts", "opt_USING_key_algorithm", + "opt_key_algorithm_clause", "key_using_alg", "all_key_opt", + "normal_key_opt", "spatial_key_opt", "fulltext_key_opt", + "btree_or_rtree", "ignorability", "key_list", "opt_without_overlaps", + "key_part", "opt_ident", "string_list", "alter", "$@94", "$@95", "$@96", + "$@97", "$@98", "$@99", "$@100", "$@101", "$@102", "$@103", "$@104", + "$@105", "$@106", "account_locking_option", "opt_password_expire_option", + "opt_account_locking_and_opt_password_expiration", + "ev_alter_on_schedule_completion", "opt_ev_rename_to", "opt_ev_sql_stmt", + "ident_or_empty", "alter_commands", "$@107", "$@108", "$@109", "$@110", + "remove_partitioning", "all_or_alt_part_name_list", "add_partition_rule", + "$@111", "add_part_extra", "reorg_partition_rule", "$@112", + "reorg_parts_rule", "$@113", "alt_part_name_list", "alt_part_name_item", + "alter_list", "add_column", "alter_list_item", + "opt_index_lock_algorithm", "alter_algorithm_option", + "alter_lock_option", "opt_column", "opt_ignore", "alter_options", + "$@114", "alter_options_part2", "alter_option_list", "alter_option", + "opt_restrict", "opt_place", "opt_to", "slave", "$@115", "$@116", + "start", "opt_start_transaction_option_list", + "start_transaction_option_list", "start_transaction_option", + "slave_thread_opts", "$@117", "slave_thread_opt_list", + "slave_thread_opt", "slave_until", "slave_until_opts", "checksum", + "$@118", "opt_checksum_type", "repair_table_or_view", "$@119", "repair", + "$@120", "opt_mi_repair_type", "mi_repair_types", "mi_repair_type", + "opt_view_repair_type", "analyze", "$@121", "analyze_table_list", + "analyze_table_elem_spec", "opt_persistent_stat_clause", + "persistent_stat_spec", "persistent_column_stat_spec", "$@122", + "persistent_index_stat_spec", "$@123", "table_column_list", + "table_index_list", "table_index_name", "binlog_base64_event", + "check_view_or_table", "$@124", "check", "$@125", "opt_mi_check_type", + "mi_check_types", "mi_check_type", "opt_view_check_type", "optimize", + "$@126", "opt_no_write_to_binlog", "rename", "$@127", "rename_list", + "table_to_table_list", "table_to_table", "keycache", "$@128", + "keycache_list_or_parts", "keycache_list", "assign_to_keycache", + "assign_to_keycache_parts", "key_cache_name", "preload", "$@129", + "preload_list_or_parts", "preload_list", "preload_keys", + "preload_keys_parts", "adm_partition", "$@130", "cache_keys_spec", + "$@131", "cache_key_list_or_empty", "opt_ignore_leaves", "select", + "$@132", "$@133", "select_into", "$@134", "$@135", "simple_table", + "table_value_constructor", "$@136", "query_specification_start", "$@137", + "$@138", "query_specification", "select_into_query_specification", + "query_expression", "query_expression_no_with_clause", + "query_expression_body_ext", "$@139", "$@140", + "query_expression_body_ext_parens", "query_expression_body", "$@141", + "query_primary", "query_simple", "subselect", "subquery", + "opt_from_clause", "from_clause", "table_reference_list", + "select_options", "opt_history_unit", "history_point", + "for_portion_of_time_clause", "opt_for_portion_of_time_clause", + "opt_for_system_time_clause", "system_time_expr", "select_option_list", + "select_option", "select_lock_type", "opt_select_lock_type", + "opt_lock_wait_timeout_new", "select_item_list", "select_item", + "remember_tok_start", "remember_name", "remember_end", "select_alias", + "opt_default_time_precision", "opt_time_precision", "optional_braces", + "expr", "boolean_test", "predicate", "bit_expr", "or", "and", "not", + "not2", "comp_op", "all_or_any", "opt_dyncol_type", "dyncol_type", + "numeric_dyncol_type", "temporal_dyncol_type", "string_dyncol_type", + "dyncall_create_element", "dyncall_create_list", "plsql_cursor_attr", + "explicit_cursor_attr", "trim_operands", "trim_operands_regular", + "trim_operands_special", "column_default_non_parenthesized_expr", + "primary_expr", "string_factor_expr", "simple_expr", + "mysql_concatenation_expr", "function_call_keyword_timestamp", + "function_call_keyword", "substring_operands", + "substring_operands_regular", "substring_operands_special", + "function_call_nonkeyword", "function_call_conflict", + "function_call_generic", "@142", "fulltext_options", + "opt_natural_language_mode", "opt_query_expansion", "opt_udf_expr_list", + "udf_expr_list", "udf_expr", "sum_expr", "$@143", "$@144", "$@145", + "$@146", "$@147", "window_func_expr", "window_func", + "simple_window_func", "inverse_distribution_function", + "percentile_function", "$@148", "inverse_distribution_function_def", + "order_by_single_element_list", "window_name", "variable", "$@149", + "variable_aux", "opt_distinct", "opt_gconcat_separator", + "opt_gorder_clause", "gorder_list", "opt_glimit_clause", "glimit_clause", + "glimit_options", "in_sum_expr", "$@150", "cast_type", + "cast_type_numeric", "cast_type_temporal", "opt_expr_list", "expr_list", + "ident_list_arg", "ident_list", "when_list", "when_list_opt_else", + "table_ref", "json_text_literal", "json_text_literal_or_num", + "join_table_list", "json_table_columns_clause", + "json_table_columns_list", "json_table_column", "$@151", "$@152", + "json_table_column_type", "json_table_field_type", + "json_opt_on_empty_or_error", "json_on_response", + "json_on_error_response", "json_on_empty_response", "table_function", + "$@153", "$@154", "esc_table_ref", "derived_table_list", "join_table", + "$@155", "$@156", "$@157", "$@158", "$@159", "$@160", "inner_join", + "normal_join", "opt_use_partition", "use_partition", "table_factor", + "table_primary_ident_opt_parens", "table_primary_derived_opt_parens", + "table_reference_list_parens", "nested_table_reference_list", + "join_table_parens", "table_primary_ident", "table_primary_derived", + "opt_outer", "index_hint_clause", "index_hint_type", + "index_hint_definition", "$@161", "$@162", "index_hints_list", + "opt_index_hints_list", "$@163", "opt_key_definition", "$@164", + "opt_key_usage_list", "key_usage_element", "key_usage_list", + "using_list", "interval", "interval_time_stamp", "date_time_type", + "table_alias", "opt_table_alias_clause", "table_alias_clause", "opt_all", + "opt_where_clause", "$@165", "opt_having_clause", "$@166", + "opt_group_clause", "group_list", "olap_opt", "opt_window_clause", + "window_def_list", "window_def", "window_spec", "$@167", + "opt_window_ref", "opt_window_partition_clause", + "opt_window_order_clause", "opt_window_frame_clause", + "window_frame_units", "window_frame_extent", "window_frame_start", + "window_frame_bound", "opt_window_frame_exclusion", "alter_order_clause", + "alter_order_list", "alter_order_item", "opt_order_clause", + "order_clause", "$@168", "order_list", "order_dir", "opt_limit_clause", + "limit_clause", "fetch_first_clause", "first_or_next", "row_or_rows", + "only_or_with_ties", "opt_global_limit_clause", "limit_options", + "limit_option", "limit_rows_option", "delete_limit_clause", + "order_limit_lock", "opt_order_limit_lock", "query_expression_tail", + "opt_query_expression_tail", "opt_procedure_or_into", "order_or_limit", + "opt_plus", "int_num", "ulong_num", "real_ulong_num", "longlong_num", + "ulonglong_num", "real_ulonglong_num", "dec_num_error", "dec_num", + "choice", "bool", "procedure_clause", "$@169", "procedure_list", + "procedure_list2", "procedure_item", "select_var_list_init", "$@170", + "select_var_list", "select_var_ident", "select_outvar", "into", + "into_destination", "$@171", "$@172", "do", "$@173", "drop", "$@174", + "$@175", "$@176", "$@177", "table_list", "table_name", + "table_name_with_opt_use_partition", "table_alias_ref_list", + "table_alias_ref", "opt_if_exists_table_element", "opt_if_exists", + "opt_temporary", "insert", "$@178", "$@179", "replace", "$@180", "$@181", + "insert_start", "stmt_end", "insert_lock_option", "replace_lock_option", + "insert_replace_option", "opt_into", "insert_table", "$@182", + "insert_field_spec", "$@183", "insert_field_list", "opt_fields", + "fields", "insert_values", "values_list", "ident_eq_list", + "ident_eq_value", "equal", "opt_equal", "opt_with", "opt_by", + "no_braces", "$@184", "no_braces_with_names", "$@185", "opt_values", + "opt_values_with_names", "values", "values_with_names", "expr_or_ignore", + "expr_or_ignore_or_default", "opt_insert_update", "$@186", "$@187", + "update_table_list", "update", "$@188", "$@189", "$@190", "update_list", + "update_elem", "insert_update_list", "insert_update_elem", + "opt_low_priority", "delete", "$@191", "opt_delete_system_time", + "delete_part2", "delete_single_table", "delete_single_table_for_period", + "single_multi", "$@192", "$@193", "$@194", "$@195", "opt_returning", + "$@196", "table_wild_list", "table_wild_one", "opt_wild", + "opt_delete_options", "opt_delete_option", "truncate", "$@197", "$@198", + "opt_table_sym", "opt_profile_defs", "profile_defs", "profile_def", + "opt_profile_args", "show", "$@199", "show_param", "$@200", "$@201", + "show_engine_param", "master_or_binary", "opt_storage", "opt_db", + "opt_full", "from_or_in", "binlog_in", "binlog_from", "wild_and_where", + "describe", "$@202", "$@203", "explainable_command", "describe_command", + "analyze_stmt_command", "opt_extended_describe", "opt_format_json", + "opt_describe_column", "explain_for_connection", "flush", "$@204", + "flush_options", "$@205", "opt_flush_lock", "flush_lock", "$@206", + "flush_options_list", "flush_option", "opt_table_list", "backup", + "backup_statements", "$@207", "opt_delete_gtid_domain", + "delete_domain_id_list", "delete_domain_id", + "optional_flush_tables_arguments", "reset", "$@208", "reset_options", + "reset_option", "$@209", "$@210", "slave_reset_options", + "master_reset_options", "purge", "$@211", "kill", "$@212", "kill_type", + "kill_option", "opt_connection", "kill_expr", "shutdown", "$@213", + "shutdown_option", "use", "load", "$@214", "$@215", "$@216", "$@217", + "data_or_xml", "opt_local", "load_data_lock", "opt_duplicate", + "opt_field_term", "field_term_list", "field_term", "opt_line_term", + "line_term_list", "line_term", "opt_xml_rows_identified_by", + "opt_ignore_lines", "lines_or_rows", "opt_field_or_var_spec", + "fields_or_vars", "field_or_var", "opt_load_data_set_spec", + "load_data_set_list", "load_data_set_elem", "text_literal", + "text_string", "hex_or_bin_String", "param_marker", "signed_literal", + "literal", "NUM_literal", "temporal_literal", "with_clause", "$@218", + "opt_recursive", "with_list", "with_list_element", "opt_cycle", "$@219", + "opt_with_column_list", "with_column_list", "ident_sys_alloc", + "comma_separated_ident_list", "with_element_head", "insert_ident", + "table_wild", "select_sublist_qualified_asterisk", "order_ident", + "simple_ident", "simple_ident_nospvar", "field_ident", "table_ident", + "table_ident_opt_wild", "table_ident_nodb", "IDENT_cli", "ident_cli", + "IDENT_sys", "ident_cli_func", "ident_func", "TEXT_STRING_sys", + "TEXT_STRING_literal", "TEXT_STRING_filesystem", "ident_table_alias", + "ident_cli_set_usual_case", "ident_sysvar_name", "ident", "label_ident", + "ident_or_text", "user_maybe_role", "user_or_role", "user", + "keyword_table_alias", "keyword_ident", "keyword_sysvar_name", + "keyword_set_usual_case", "non_reserved_keyword_udt", + "keyword_sp_var_not_label", "keyword_sp_head", "keyword_verb_clause", + "keyword_set_special_case", "keyword_sysvar_type", "keyword_data_type", + "keyword_cast_type", "keyword_func_sp_var_and_label", + "keyword_func_sp_var_not_label", "keyword_sp_var_and_label", + "reserved_keyword_udt_not_param_type", "set", "$@220", "set_param", + "$@221", "$@222", "$@223", "set_stmt_option_list", + "start_option_value_list_following_option_type", "$@224", + "option_value_list", "option_value", "$@225", "option_type", + "opt_var_type", "opt_var_ident_type", "set_stmt_option", "$@226", + "$@227", "$@228", "option_value_following_option_type", "$@229", "$@230", + "$@231", "option_value_no_option_type", "$@232", "$@233", "$@234", + "$@235", "$@236", "$@237", "$@238", "$@239", "$@240", "$@241", + "transaction_characteristics", "transaction_access_mode", + "isolation_level", "transaction_access_mode_types", "isolation_types", + "text_or_password", "set_expr_or_default", "lock", "$@242", + "opt_lock_wait_timeout", "table_or_tables", "table_lock_list", + "table_lock", "lock_option", "unlock", "$@243", "handler", "$@244", + "handler_tail", "$@245", "handler_read_or_scan", "handler_scan_function", + "handler_rkey_function", "$@246", "handler_rkey_mode", "revoke", + "revoke_command", "admin_option_for_role", "grant", "grant_command", + "opt_with_admin", "opt_with_admin_option", "role_list", "current_role", + "role_name", "grant_role", "opt_table", "grant_privileges", + "opt_privileges", "object_privilege_list", "column_list_privilege", + "column_privilege", "object_privilege", "opt_and", "require_list", + "require_list_element", "grant_ident", "user_list", "grant_list", + "user_and_role_list", "via_or_with", "using_or_as", "grant_user", + "auth_expression", "auth_token", "opt_auth_str", "opt_require_clause", + "resource_option", "resource_option_list", "opt_resource_options", + "opt_grant_options", "opt_grant_option", "grant_option_list", + "grant_option", "begin_stmt_mariadb", "$@247", "compound_statement", + "opt_not", "opt_work", "opt_chain", "opt_release", "commit", "rollback", + "savepoint", "release", "unit_type_decl", "union_option", + "query_expression_option", "definer_opt", "no_definer", "definer", + "view_algorithm", "opt_view_suid", "view_suid", "view_list_opt", + "view_list", "view_select", "$@248", "view_check_option", + "trigger_action_order", "trigger_follows_precedes_clause", + "trigger_tail", "$@249", "$@250", "$@251", "$@252", "$@253", + "sf_return_type", "$@254", "xa", "opt_format_xid", "xid", + "begin_or_start", "opt_join_or_resume", "opt_one_phase", "opt_suspend", + "$@255", "opt_migrate", "install", "uninstall", "keep_gcc_happy", + "_empty", "statement", "sp_statement", "sp_if_then_statements", + "sp_case_then_statements", "reserved_keyword_udt_param_type", + "reserved_keyword_udt", "keyword_sp_block_section", "keyword_label", + "keyword_sp_decl", "opt_truncate_table_storage_clause", + "ident_for_loop_index", "row_field_name", "while_body", "$@256", + "for_loop_statements", "sp_label", "sp_control_label", "sp_block_label", + "sp_opt_default", "sp_decl_variable_list_anchored", + "sp_param_name_and_mode", "sp_param", "sp_param_anchored", + "sf_c_chistics_and_body_standalone", "$@257", "sp_tail_standalone", + "$@258", "$@259", "drop_routine", "create_routine", "$@260", "$@261", + "$@262", "sp_decls", "sp_decl", "sp_decl_body", "$@263", + "sp_proc_stmt_in_returns_clause", "sp_proc_stmt", + "sp_proc_stmt_compound_ok", "sp_labeled_block", "$@264", + "sp_unlabeled_block", "$@265", "sp_unlabeled_block_not_atomic", "$@266", YY_NULLPTR +}; + +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) +{ + return yytname[yysymbol]; +} +#endif + +#define YYPACT_NINF (-5341) + +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) + +#define YYTABLE_NINF (-3660) + +#define yytable_value_is_error(Yyn) \ + 0 + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const int yypact[] = +{ + 7647, -5341, -5341, 2971, 1711, 93552, -5341, 116, -5341, 1031, + -5341, -5341, -5341, 3395, -5341, -5341, -5341, -5341, -5341, 198, + 463, -5341, 326, -5341, -5341, 353, 80214, 634, 580, -5341, + 83178, -5341, -5341, -5341, -5341, 83178, -5341, -5341, 93552, -5341, + -5341, 1436, -5341, 172, 1568, 2263, 1565, 463, 1074, -5341, + -5341, 94293, 326, 1603, -5341, -5341, 1251, 93552, 326, -5341, + 1074, 93552, -5341, 313, 279, -5341, 1342, 4371, 133, 2180, + 2197, -5341, -5341, 1640, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 4703, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 1891, -5341, -5341, -5341, + -5341, 4408, 1835, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 45266, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 133, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 95034, 93552, 1543, 1584, + 93552, 2226, 80955, 2226, -5341, 126, -5341, -5341, 1971, -5341, + 1630, -5341, 463, 2744, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, 1718, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 2204, 2508, + 536, 2237, 278, 2226, -5341, 2226, 2226, 2226, 2226, 2226, + 2226, -5341, 2226, 2226, 943, 93552, 67617, -5341, -5341, 108, + 2417, -5341, -5341, -5341, -5341, -5341, -5341,108132, 463, 23317, + 2512, -5341, -5341, 2074, 3711, 1871, -5341, 2356, -5341, -5341, + 93552, -5341, 2226,108132, -5341, 2356, 68358, 3781, 49723, 7733, + 2356, 463, 2453, -5341, 1882, -5341, -5341, -5341, -5341, -5341, + -5341, 93552, -5341, -5341, -5341, 2338, 1074, 80955, -5341, -5341, + -5341, -5341, -5341, 2625, 23317, 243, 2385, -5341, -5341, 2304, + 46007, 80955, 2583, 2508, 2606, -5341, 1528, 572, -5341, 1998, + 2077, 2508, 1514, 2091, 2508, 2497, 2226, 2226, -5341, -5341, + 3364, 3364, 3364, 2333, 3364, -5341, 3364, 2673, 2022, 447, + -5341, -5341, 2028, 93552, 2583, -5341, 2583, -5341, 2668, 2583, + 2583, 2166, 2682, 2695, 160, 1531, 187, 187, 1971, 40820, + 1148, 2531, -5341, 2673, 2078, 1905, 2119, 2119, 2119, 2078, + 133, 2078, -5341, 2861, 1630, 2895, 93552, -5341, 2729, -5341, + 2070, -5341, -5341, 239, -5341, 2133, -5341, 2092, 1415, 69840, + -5341, 2763, -5341, -5341, -5341, -5341, -5341, -5341, 2589, 259, + 2235, 2457, 2161, -5341, 2642, 80955, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 93552, 2132, -5341, -5341, 23317, 2801, + 2204, -5341, 2632, -5341, -5341, -5341, -5341, 46007, -5341, -5341, + -5341, 2800, -5341, -5341, 83919, 663, 93552, 2813, 93552, 93552, + 93552, 93552, -5341, 80955, -5341, -5341, 2226, 2226, -5341, -5341, + 2795, 2350, 2316, 1553, 2203, 2511, -5341, 2399, -5341, 2210, + 2289, 2420, 2227, 2230, 2283, 211, -5341, 2242, -5341, 929, + 2692, 146, 154, 2696, 162, 424, 2847, 2705, 454, 971, + 466, 2503, 470, -5341, -5341, -5341, -5341, 2780, 2867, 2309, + -5341, 2323, -5341, 2812, 2646, 1149, -5341, -5341, 895, 2748, + 1213, 46007,110200, 81696,111492, -5341,111492,111492, -5341, 245, + -5341, 1568, 93552,110846, -5341, 93552,103866, -5341, 11694, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 93552, -5341, + -5341, -5341, -5341, -5341, 2321, -5341, -5341, -5341, -5341, -5341, + 2765, 2247, 2772, -5341, 2345, -5341, -5341, -5341, -5341, -5341, + 84660, -5341, 190, 205, 3475, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 29469, 2357, 2360, 2363, + 18703, 2366, 2372, 2376, 2390, 2394, 2203, 2203, 2203, 2395, + 2400, 2414, 2422, 2423, 2434, 2477, -5341, 2478, 2482, 2506, + 2518, 2527, 2551, 24086, 2555, 2560, 2561, 37103, 2567, 2568, + 2578, 2579, 23317, 2395, 2610, 2622, -5341, 2629, 2644, 2657, + 2674, 2693, 2711, 2720, 2726, 3149, 2730, 2738, 2745, 2746, + -5341, 2203, 2395, 2395, 2755, 2758, 2759, 2773, 2776, 2781, + 2788, 2799, 2811, 2830, 2833, 2844, 2845, 2853, 2855, 201, + 2859, 2866, 2868, 2869, 2872, 2873, 2875, 2461, 2884, 2886, + 2887, 2504, 2888, 2889, 2891, 2899, 206, 2902, 2903, 210, + 2904, 2908, 2910, 2913, 2914, 2920, 2921, 30238, 31007, 29469, + 16396, -5341, 93552, 95775, -5341, -5341, 4197, 1112, 3315, 2082, + 29469, -5341, -5341, -5341, 3126, -5341, 3243, -5341, -5341, -5341, + -5341, 3077, 3097, -5341, 3108, -5341, -5341, 3138, 2660, -5341, + 3448, -5341, -5341, -5341, -5341, -5341, 2721, -5341, 2926, 3514, + 3536, 2933, 2934, -5341, -5341, 479, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 2792, + 2864, -5341, 3448, -5341, -5341, 72804, -5341,108843, -5341, -5341, + 2350, 3007, 3413, -5341, 3518, -5341, 3452, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3781, + -5341, -5341, 51227, 3458, -105, -5341, -5341, 186, -5341, 196, + 240, 63171, -5341, 305, 63912, 260, 85401, 949, -5341, 70581, + -5341, 316, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 2935, -5341, 3051, 3262, 2944, 3317, 1571, -5341, + -5341, 384, 537, 3038, 115, -5341, 62, -5341, 1571, -5341, + 73545, 725, 2169, -5341, 801, -5341, 3601, -5341, -5341, 3043, + 3029, 3059, -5341, 3276, -5341, 2508, -5341, 539, -5341, 725, + 1571, 2169, -5341, 3226, 3308, 1383, 3262, -5341, 1084, -5341, + -5341, -5341, 3597, -5341, 2959, -5341, 3321, -5341, 93552, 1217, + 46007, -5341, -5341, -5341, 2963, 46007, 46007, 1221, 299, 4197, + 2965, 23317, -5341, -5341, 4092, 53483, 3166, 368, 1085, -5341, + -5341, 1568, 93552, -5341, -5341, 624, -5341, 3389, -5341, 2968, + -5341, 96516, 299, 3628, -5341, -5341, -5341, 774, 3362, -5341, + 2977, -5341, -5341, -5341, -5341, 46007, 93552, 2508, -5341, -5341, + -5341, -5341, 2979, -5341, -5341, 3183, 3065, -5341, 3003, -5341, + -5341, 225, -5341, -5341, 3761, -5341, 93552, -5341, 2583, -5341, + -5341, 2583, -5341, -5341, -5341, 2583, 2583, 2583, -5341, -5341, + 3031, -5341, 3313, 3314, 2642, -5341, 3002, 40079, 93552, 3777, + -5341, 3572, -5341, -5341, -5341, 3009, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 3575, 3762, 3762, -5341, 51979, -5341, + -5341, 3660, 2531, 1589, 3501, 54987, 3649, 3737, 57243, -5341, + 725, -5341, -5341, -5341, -5341, 2249, 93552, -5341, 2249, 2249, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 133, -5341, -5341, 2744, 3410, 71322, 93552, 2078, + 1905, -5341, -5341, -5341, 2508, 369, 3406, -5341, 93552, -5341, + -5341, -5341, 2203, 3812, -5341, -5341, -5341, -5341, -5341, 46007, + 3235, 69840, 2226, -5341, -5341, -5341, 259, -5341, 1596, 93552, + 46007, 3076, -5341, 46007, 3037, 23317, -5341, -5341, 3515, 4197, + 108132, 3398, -5341, -5341, 46007, 1686, -5341, -5341, 46007, 3773, + 46007, 3707, 2531, -5341, 3053, -5341, 3052, -5341, -5341, 3721, + 93552, -5341, -5341, -5341, 3055, 74286, -5341, 72804, 46007, -5341, + -5341, 3424, 3205, -5341, -5341, -5341, -5341, -5341, -5341, 3146, + -5341, -5341, 3071, -5341, -5341, -5341, -5341, 3519, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 72804, -5341, -5341, 3520, + 3523, -5341, 69840, 1506, 5228, 95775, -5341, 3718, -5341, -5341, + -5341, 3597, -5341, -5341, 24855, -5341, 25624, -5341, -5341, -5341, + 3354, 549, 1062, -5341, -5341, 3550, 93552, 3301, 3746, 3725, + -5341, -5341, -5341, -5341, -5341, -5341, 3569, 3102, 3706, 3099, + -5341, -5341, -5341, 3104, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 46007, 52731, -5341, -5341, -5341, 3110, -5341, -5341, + -5341, 3116, 29469, 29469, -5341, 3842, 3842, 3842, 23317, 2919, + 396, 3471, 23317, 23317, 23317, 2143, 3123, -5341, -5341, -5341, + 284, -5341, 23317, 23317, 37850, 3150, 987, 5096, 23317, 3820, + 3820, -5341, 23317, 23317, 16396, 3454, 23317, 23317, 23317, 95775, + 37850, 3595, 3152, -5341, 3156, 2151, 23317, 2184, 23317, -5341, + -5341, 23317, 23317, 23317, 23317, 3155, 31776, 3159, 23317, 23317, + 3169, 3303, 3842, 3842, 2277, 293, -5341, -5341, -5341, 3842, + 3842, 3177, 23317, 23317, 17165, 23317, 23317, 2291, 23317, 23317, + 23317, 23317, 23317, 23317, -5341, 23317, 23317, 1009, 23317, 23317, + 46007, 23317, 23317, 3831, 46007, 23317, 23317, 3832, 23317, 23317, + 46007, 23317, -5341, 23317, 3942, 3942, -5341, 23317, 17165, 23317, + 3184, 38597, 23317, 23317, 23317, 24086, -5341, 24086, -5341, -5341, + 3188, 3393, 355, 133, 23317, 3178, -5341, -5341, -5341, -5341, + 23317, 23317, 23317, 31776, -5341, -5341, -5341, 432, -5341, -5341, + -5341, 26393, 31776, 3193, 31776, 31776, 3806, 2112, 31776, 31776, + 31776, 31776, 31776, 31776, 31776, 32545, 33314, 31776, 31776, 31776, + 31776, -5341, 80955, 29469, 48971, 3199, 3845, -5341, 75027, -5341, + 1591, 645, -5341, 2508, 3711, 34852, -5341, 3206, -5341, 3703, + 46007, 3203, 3211, 3868, 72804, 69840, 1506, 3229, -5341, 1300, + 234, -5341, 74286, 93552, -5341, -5341, -5341, 3928, 23317, -5341, + -5341, -5341, -5341, -5341, 3222, 383, 3230, -5341, 1040, -5341, + -5341, -5341, -5341, -5341, 93552, -5341, 86142, 50475, 3333, 3892, + 3252, 2583, 86883, 93552, 46007, 93552, 97257, 93552, 93552, 46007, + 72804, 46007, -5341, -5341, -5341, 818, 1571, 93552, 1571, 2169, + 852, 1571, 3874, -5341, -5341, 937, 937, -5341, -5341, -5341, + -5341, -5341, -5341, 1571, 93552, 93552, 1571, 69840, -5341, 2169, + 1479, -5341, 3539, 3330, -5341, -5341, -5341, 3581, -5341, -5341, + 3907, 3254, -5341, 3603, -5341, 3352, -5341, -5341, 46007, -5341, + -5341, 2169, -5341, 2169, 2169, 3919, 1571, 1571, 1571, -5341, + 41561, 3275, 3280, -5341, 3282, -5341, 3283, -5341, 3911, -5341, + -5341, -5341, 4064, 3924, 3289, -5341, -5341, 3859, 890, -5341, + 3715, -5341, 3840, -5341, 23317, 4197, 19472, 3570, -5341, -5341, + 3573, 3577, 3583, -5341, -5341, -5341, -5341, 3722, 3585, -5341, + 2508, 3587, -5341, -5341, -5341, 3319, -5341, -5341, -5341, 80955, + 34852, -5341, 3322, -5341, 3336, -5341, 208, -5341, -5341, 3989, + 3437, 23317, -5341, -5341, 46007, 3835, -5341, 2508, 1528, 93552, + -5341, -5341, 4072, -5341, 1440, 3999, -5341, -5341, 3460, 1514, + -5341, 3999, -21, -5341, -5341, 3364, 3531, -5341, -5341, -5341, + 80955, -5341, -5341, -5341, -5341, -5341, -5341, 93552, -5341, 74286, + 69840, 80955, 2583, 2583, -5341, 46007, -5341, -5341, -5341, 2583, + 2583, 2583, 3388, -5341, 2876, 3361, 3365, 3366, 3370, 2027, + 3371, 42302, 2341, 291, 3976, 3994, -5341, 3945, 2700, 3945, + -5341, -5341, 42302, 41561, 3377, 3777, -5341, -5341, -5341, -5341, + 80955, 3375, -5341, -5341, 3374, -5341, 23317, 4097, 4021, 3660, + -5341, -5341, 55739, 1465, 84660, -5341, -5341, -5341, 3729, 3913, + 1166, -5341, 3383, 3510, -5341, 444, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 23317, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 234, 229, -5341, -5341, -5341, 1397, 3767, + 2573, -5341, -5341, 80955, 2573, -5341, 3407, 3713, -5341, 3716, + 122, -5341, 46007, -5341, -5341, -5341, -5341, -5341, 46007, 3405, + -5341, 3596, 93552, 2132, 3420, 3421, 4197, 3918, -5341, 3515, + -5341,103155, -5341, 4136, 5255, 139, 3472, -5341, -5341, -5341, + -5341, -5341, 46007, -5341, -5341, 338, 3575, 3504, -5341, 3427, + -5341, -5341, 563, 4007, -5341, -5341, 4005, 93552, 4107, 58725, + -5341, -5341, 4040, 93552, 3462, -5341, -5341, 3466, 193, 46007, + 46007,108132, -5341, -5341, 3470, -5341, -5341, -5341, 3971, -5341, + -5341, 68, 4198, -5341, -5341, -5341, 43043, 43043, 929, 2692, + -5341, -5341, 2696, -5341, -5341, 2705, -5341, 971, -5341, 2503, + -5341, -5341, -5341, -5341, 2083, -5341,108132, -5341, 3911, 23317, + 48230, 4197, -5341, -5341, 46007, -5341, 4116, -5341, -5341,100221, + 185, -5341, -5341, 230, 46007, -5341, -5341, -5341, 4111, 3618, + 93552, -5341, -5341, 4171, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 93552, 93552,108132,108132, -5341, -5341, 1091, 1300, -5341, + 4229, 95775, 23317, -5341, 3497, -5341, 3499, 3500, 2972, 3858, + 23317, 23317, -5341, 2925, 67, 309, -5341, 3506, 3517, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3509, -5341, -5341, + 379, 413, 3513, -5341, -5341, -5341, 3516, 133, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 4162, -5341, + 263, -5341, -5341, -5341, 23317, 493, 511, 612, 3528, 417, + 455, 931, 3110, 2095, 3522, 37850, 95775, 3842, 3524, 378, + 3842, 3525, 1329, 1461, 515, 766, 893, -5341, 348, -5341, + 1483, 1516, -5341, -5341, 3526, 3527, 3842, 3529, -5341, 3532, + 3533, 3534, -5341, 1520, 296, 3537, -5341, -5341, 20241, 21010, + 21779, 3185, 3538, -5341, -5341, 1526, 905, 3842, 3540, 1188, + 1580, 1610, -5341, 2106, 1624, 1712, 3543, 2965, 1536, 1878, + -5341, -5341, -5341, -5341, 3542, 1966, 2120, 3544, 3552, 2123, + 2272, 46007, 3556, 3560, 2294, 46007, 1793, 2332, 3548, 1813, + 813, 3559, 3561, 2398, 3562, 1860, -5341, 95775, 93552, 3564, + 3511, 298, 3565, 2480, 3454, 3454, -5341, 23317, 3566, 274, + 95775, 581, 1323, -5341, 3315, -5341, -5341, -5341, -5341, 458, + -5341, 3568, 3315, 3576, 3112, 16396, -5341, 1382, 1568, 31776, + 31776, 3578, 31776, 31776, 809, 354, 354, 3586, 3586, 488, + 446, 24086, 809, 24086, 809, 3586, 3586, 3586, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 4083, 3584, 3589, 3591, + 3592, -144, 3574, -5341, -5341, -5341, -5341, -5341, -5341, 40, + 3933, -5341, 3757, 450, 23317, -5341, 3553, 4271, 4325, 4329, + -5341, -5341, -5341, -5341, 72804, 72804, 3579, -5341, -21, 3937, + 4243, 74286, 4247, -5341, 3598, 43043, 43043, -5341, 3599, -5341, + 23317, 3590, 3600, 3604, 97998, -5341, 4251, 234, 75768, 4197, + 72804, 618, 17934, 93552, 93552, -5341, 85401, 4252, 855, 3879, + -5341, 3606, 3610, -5341, 234, 17934, 3612, 1140, 400, -5341, + 3611, 3615, -5341, -5341, -5341, -5341, 23317, 3621, 93552, 93552, + -5341, -5341, -5341, -5341, 93552, -5341, -5341, -5341, -5341, -5341, + -5341, 2508, 23317, 93552, 1571, -5341, -5341, -5341, 1571, 93552, + 1571, -5341, 2508, 4258, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 1571, -5341, -5341, -5341, -5341, -5341, + 3790, 725, 3276, 3874, 3999, 2169, 46007, 1571, 1571, 23317, + -5341, -5341, -5341, -5341, 4150, 3575, 19472, 3632, 3631, -5341, + -5341,108132, 93552, 95775, 4363, -5341, -5341, 4171, 80955, 87624, + 46007, -5341, -5341, -5341, 2218, -5341, -5341, -5341, -5341, -5341, + 4197, 2385, 2422, -5341, 3635, 4197, -5341, -5341, 4322, -5341, + -5341, -5341, -5341, 2508, -5341, -5341, 4217, -5341, 46007, -5341, + -5341, 54235, 54235, 1763, -5341, 98739, -5341, 2508, 4197, 46007, + 1151, 230, -5341, 4376, -5341, -5341, 3756, -5341, -5341, -5341, + 3642, -5341, 4066, -5341, -5341, -5341, -5341, -5341, -5341, 3653, + -5341, 4309, -5341, 1597, 212, 93552, 90, 122, -5341, 93552, + 93552, 46007, -5341, 93552, 2583, -5341, -5341, 2583, 46007, 93552, + 93552, 2583, 23317, 42302, -5341, -5341, -5341, -5341, -5341, 42302, + -5341, 2966, -5341, 3861, 1812, 1812, -5341, -5341, -5341, -5341, + -5341, 4280, 3945, 3945, 42302, 4281, 4248, -5341, 93552, 6410, + 545, -5341, 51979, 93552, 4197, 23317, -5341, 3690, 4021, -5341, + 215, 783, 444, -5341, 3936, 230, -5341, -5341, 57243, 4009, + 57243, 57243, 95775, 3897, 23317, -5341, 4326, 3675, 4197, 1597, + 2508, -5341, 234, 234, 3895, 4187, 4188, 3800, 2508, 4190, + 4196, 4200, -5341, -5341, -5341, -5341, -5341, 3663, 1055, 315, + 1019, 69840, 4151, -21, 4266, 3692, -5341, 46007, 4345, -5341, + -5341, -5341, -5341, 23317,108132, -5341, -5341, -5341, 3710, 3712, + 3714, 3717, 3726, 3730, 3740, 3741, 3742, 3743, 3744, 3755, + 3758, 3760, 3763, 3765, 3766, 3770, 3775, 3779, 3785, 3788, + 3789, 3796, 3798, 157, -5341, -5341, 3750, -5341, -5341, -5341, + -5341, -5341, 1812, 93552, 4186, 58725, -5341, 3916, 4328, -5341, + -5341, 41561, -5341, 3732, 46007, -5341, 74286, 72804, -5341, -5341, + -5341, 3764, 1091,104577, -5341, -5341, 4502, 69840, 4207, -5341, + -5341, 3778, -5341, 3780, 4277, 4279, -5341, 95775,102444, -5341, + -5341, 4197, -5341, -5341, 3771, -5341, -5341, 3859, 3762, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 3816, 4069, 4180, -5341, -5341, -5341, + 3160, -5341, -5341, -5341, -5341, -5341, -5341, 4423, 76509,105288, + 3792, -5341, -5341, -5341, -5341, 2165, -5341, -5341,111492,111492, + 111492, 4171, -5341,100962, 23317, -5341, 1872, -5341, 23317, -5341, + -5341, 23317, -5341, 4197, 3822,112223, 77250, -5341, 77250,112223, + 23317, -5341, 3799, -5341, 4427, 4430, -5341, -5341, -5341, 23317, + -5341, 23317, 23317, 1932, 23317, 23317, 23317, 23317, -5341, 23317, + -5341, 23317, 23317, -5341, 31776, -5341, 3797, 3807, -5341, -5341, + 3808, -5341, 23317, 23317, -5341, -5341, -5341, 23317, 23317, 23317, + -5341, -5341, 3810, -5341, -5341, -5341, -5341, 23317, 23317, 23317, + -5341, 23317, 3486, 23317, 3521, 23317, 4020, 23317, -5341, 27162, + -5341, 3811, -5341, -5341, 23317, 23317, -5341, 23317, 23317, 23317, + -5341, -5341, -5341, 23317, -5341, 4379, 23317, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, 23317, -5341, 302, 27931, -5341, + 23317, 23317, 23317, -5341, -5341, 23317, 3809, 3813, -5341, 93552, + 2435, 3843, 230, 3815, -5341, -5341, 3824, 3830, 2965, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 987, 31776, 827, 31776, + 1568, 3733, 16396, -5341, 1431, 1568, 3454, 3454, 93552, 4536, + 3826, -5341, 23317, 23317, 17165, 23317, 95775, 23317, 3828, 3836, + -5341, 3834, 31776, -5341, -5341, 3838, -5341, 2299, 3843, 3929, + 4283, -5341, 4197, 34852, 4338, -5341, 46007, 4340, 4387, 4045, + -5341, 72804, 69840, 4503, 4507, -5341, 4197, -5341, 3850, -5341, + -5341, -5341, 3851, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 402, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 23317, 72804, -5341, -5341, -5341, -5341, 234, -5341, 3860, 3862, + -5341, -5341, 29469, 2422, -5341, 4197, -5341, 234, 234, 17934, + -5341, 8887, -5341, -5341, 1021, 4138, 4410, -5341, -5341, 93552, + 1040, 93552, -5341, 50475, 50475, 88365, 4197, 143, -5341, -5341, + -5341, -5341, 4197, -5341, -5341, -5341, -5341, -5341, -5341, 3875, + -5341, -5341, -5341, 4613, -5341, -5341, 4258, -5341, 2531, 2169, + -5341, -5341, 4197, 38597, 564, -5341, -5341, -5341, 19472,105999, + -5341, 3866, 3869, 3873, -5341, 46007,106710, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3878, -5341, -5341, + 19472, 3885, -5341, 3999, -5341, 3764, 1412, 3890, 3872, -5341, + -5341, -5341, -5341, -5341, -5341, 233, 248, 1915, 2531, -5341, + -5341, 287, -5341, -5341, -5341, -5341, -5341, 878, -5341, -5341, + 3999, -5341, 1440, 2508, 3927, -5341, 230, 4118, -5341, -5341, + 1597, 1165, 1165, 4458, 212, 4331, -5341, 4151, 4540, 4464, + 4466, -5341, 3663, -5341, -5341, -5341, 93552, -5341, -5341, 1068, + -5341, 46007, 1947, 3572, 3572, -5341, 1812, 227, -5341, 31776, + 4620, -5341, 4384, 42302, 4514, 4516, -5341, 42302, -5341, -5341, + 2173, -5341, -5341, 72063, -5341, -5341, -5341, 4197, 195, 2178, + 23317, 93552, -5341, 3690, 3963, -5341, -5341, 783, -5341, -5341, + -5341, -5341, 57243, -5341, -5341, -5341, 1465, 3896, 2178, 1589, + 3899, -5341, -5341, 75768, 72063, -5341, 4269, 4272, 1659, -5341, + -5341, -5341, -5341, 234, 234, -5341, 311, 234, -5341, -5341, + 518, -5341, -5341, 1688, 337, 3663, -5341, 2508, 2508, 2508, + 2508, 230, 2508, 2508, 2190, -5341, 321, -5341, -5341, 80955, + -5341, 4651, 4652, -5341, 4653, -5341, -5341, 841, -5341, 2778, + 933, -5341, 961, -5341, 4446, 93552, 4635, 3692, -5341, 461, + 2132, 4197, -5341, 4404, 3910, 3912, 230, 3917, 230, 230, + 2508, 2508, 3875, 2508, 230, 2508, 2508, 2508, 2508, 2508, + 2508, 2508, 230, 2508, 1486, 3754, 414, 2508, 230, 5255, + -5341, -5341, -5341, -5341, 3908, 41561, 633, -5341, 56491, 4452, + 2531, 3932, -5341, -21, -5341, -5341, 434, 4572, -5341, 3923, + 23317, -5341, 113, 4120, 3938, 59466, 69840, 69840, -5341, 2594, + -5341, 46007, -5341, 4564, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 65394, -5341, -5341, 4241, 1782, 3931, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 3934, -5341, -5341, 23317, -5341, -5341, 3424, -5341, + -5341, -5341, -5341, -5341,107421, 3930, 4197, 23317, 4197, 4197, + 23317, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 3939, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 3939, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 3940, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3947, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 4626, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 4569, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 3939, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3939, -5341, 3939, + -5341, 4575, 3939, 3939, -5341, 3952, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 3953, 3954, 3955, 2965, -5341, 23317, 23317, 2491, 169, 169, + 23317, 2008, 2056, 838, -5341, 2493, 2509, 2572, 2311, 95775, + -5341, -5341, 2612, 2623, 2624, 2652, 2653, -5341, 2060, 3286, + 2096, 4197, 23317, 4197, 23317, 4197, 23317, 4197, 24086, 2753, + -5341, 2219, 4130, -5341, 2250, 4219, 2784, 2789, 2253, -5341, + 2805, 4706, 2264, 24086, 2796, 2831, 2102, 2158, 2835, 95775, + 93552, 3951, 3960, 3960, 194, -5341, 3958, -5341, -5341, -5341, + 3959, -5341, 23317, 23317, 3966, 3315, -5341, 23317, 1568, 31776, + 1025, 31776, -5341, -5341, 4083, -5341, 23317, -5341, 4538, 3967, + 4164, 3969, 3970, 3185, 3972, 3975, 3977, 3983, 4197, -5341, + -5341, 93552, 3985, 2082, -5341, 3875, -5341, 4598, -5341, 4701, + 3991, 4011, 3993, 3838, -5341, 72804, -5341, 46007, -5341, 4648, + 3466, -5341, 69840, 69840, -5341, 82437, -5341, 57984, 93552, 93552, + -5341, 4197, -5341, 17934, 618, 4747, 4750, -5341, -5341, -5341, + -5341, 72, 4550, -5341, -5341, -5341, -5341, 17934, 234, -5341, + 234, 17934, 3615, -5341, -5341, -5341, -5341, 4093, -5341, 725, + -5341, -5341, -5341, 1571, 4001, -5341, 234, 1344, -5341, 19472, + 4006, 4003, -5341, 4475, -5341, 987, 283, -5341, 3575, -5341, + 4016, 89106, -5341, 4018, -5341, -5341, 4558, -5341, -5341, 4649, + 54235, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 725, 4065, 4246, -5341, -5341, -5341, -5341, -5341, + 2174, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 46007, 4602, 69840, 933, 4393, 46007, 46007, 6731, 9105, + 3663, 4027, 93552, -5341, 3692, 4028, 481, 4028, -5341, -5341, + -5341, -5341, 2082, 1812, 1812, 3125, 4509, 42302, 42302, 3605, + 4510, 23317, 4031, -5341, 93552, -5341, 1083, -5341, 4434, -5341, + -5341, 23317, -5341, -5341, -5341, -5341, 4197, 4761, 4033, -5341, + -5341, -5341, -5341, -5341, -5341, 23317, -5341, 55739, 23317, 4037, + 4038, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 302, 302, + -5341, -5341, 302, 302, -5341, -5341, -5341, -5341, 302, 302, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 1055, -5341, 4788, 474, -5341, 4614, -5341, -5341, -5341, -5341, + 118, 230, 230, 230, 3754, 1727, -5341, 2778, 1685, 4375, + -5341, 6390, 1568, 1654, 4537, 1759, -5341, 2273, -5341, 4772, + -5341, 200, -5341, -5341,108132, 218, 238, -5341, 257, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 58725, 2531, -5341, 93552, + 4388, 4577, -5341, -5341, -5341, -5341, -5341, -5341, 987, -5341, + 4197, -5341, 4695, -5341, -5341, -5341, -5341, 122, 122, -5341, + 108132, -5341, -5341, 283, -5341, -5341, 4564, 4327, -5341, 1384, + -5341, 3939, 3939, 48, -5341, 3940, 4607, 3940, -5341, -5341, + 4443, 3148, 2220, 4443, -5341, 2220, 3940, -5341, 4058, -5341, + 4443, -5341, 2220, 3939, -5341, 3939, -5341, -5341, 2220, 3939, + -5341, 4059, 3940, 4443, 1355, 2330, 3940, -5341, 3939, 1499, + 3939, 3939, 3939, 4260, 3939, 3939, -5341, 3940, -5341, -5341, + -5341, -5341, -5341, -5341, 138, 3939, 3939, 3939, 3939, 3947, + 4712, 4715, -5341, 93552, -5341, 4197, -5341, -5341,111492, 93552, + 838, 4197, 3090, -5341, -5341, -5341, 604, 3246, -5341, -5341, + -5341, 4814, -5341, -5341, 3939, -5341, 604, -5341, -5341, -5341, + -5341, -5341, -5341, 604, -5341, -5341, -5341, -5341, 4070, 3454, + 3454, -5341, 4780, 4590, 4683, 2856, 23317, 23317, -5341, 23317, + -5341, -5341, -5341, 1350, 4073, 4541, -5341, -5341, -5341, -5341, + -5341, -5341, 23317, 23317, 23317, 4197, 4197, 4197, 3454, -5341, + -5341, 4057, -5341, -5341,112223, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 414, 3454, -5341, -5341, 23317, 23317, -5341, -5341, + -5341, 93552, 3843, 4077, 4348, -5341, -5341, -5341, 3843, 4215, + -5341, -5341, 3843, 230, -5341, -5341, -5341, 2280, 3315, -5341, + 23317, 1568, 4655, 4078, 4799, 4085, -5341, -5341, -5341, -5341, + -5341, -5341, 23317, 82437, -5341, 4086, 4089, -5341, -5341, -5341, + 4521, 23317, 4705, 4658, -5341, 3843, 93552, -5341, -5341, -5341, + 69840, 3598, 3598, 89847, -5341, -5341, -5341, -5341, 680, 234, + 234, 17934, -5341, -5341, 4096, 4099, 17934, 17934, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 725, -5341, 38597, 2531, 22548, -5341, -5341, -5341, 19472, + -5341, 4104, 38597, 4563, -5341, -5341, -5341, 4452, 189, -5341, + -5341, 90588, -5341, 4110, -5341, 4090, -5341, 1809, 4440, 4718, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 4113, -5341, -5341, -5341, + 4131, -5341, 4115, -5341, 46007, -5341, -5341, 4139, -5341, -5341, + 39338, 4728, 4157, 4482, 46007, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 4483, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 1653, 93552, 234, 234, + -5341, -5341, 4685, -5341, 6520, -5341, -5341, -5341, -5341, -5341, + 234, -5341, -5341, -5341, 847, 4704, 4851, 4132, 4270, -5341, + -5341, -5341, -5341, 4237, 4273, 3692, 2468, -5341, -5341, -5341, + 4616, -5341, -5341, -5341, 4617, 4197, 93552, -5341, -5341, -5341, + 1163, 2066, 4748, 2178, 4142, 93552, 2178, 783, 444, 4197, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 551, -5341, 80955, -5341, -5341, -5341, -5341, + -5341, 4887, 4892, -5341, -5341, -5341, -5341, 4330, 632, 4372, + 1370, 4709, 4544, 4713, 2053, 3582, 234, 4716, 4867, -5341, + 459, 234, 4717, 4776, 4235, 4782, 4725, -5341, 4239, 4544, + 4729, 4355, 4731, 4733, 4735, -5341, -5341, 9105, -5341, -5341, + -5341, -5341, 420, 43784, -5341, -5341, -5341, -5341, -5341, 4350, + 23317, 23317, 4752, 93552, 4753, -5341, 4571, -5341, 93552, -5341, + 987, -5341, -5341, -5341, 4476, -5341, 2281, -5341, -5341, 2339, + -5341, -5341, 2374, -5341, -5341, 3732, -5341, 4834, -5341, 4524, + 3229, -5341, -5341, 133, 4383, 4660, 4660, -5341, -5341, -5341, + 4765, -5341, -5341, -5341, -5341, 4815, -5341, 4443, 234, 4443, + -5341, -5341, 158, -5341, 158, -5341, 217, 3458, 77991, 4443, + -5341, -5341, -5341, -5341, 4662, 2220, 604, 77250, 1629, 4584, + -5341, -5341, -5341, 158, 3364, -5341, -5341, 4443, -5341, -5341, + -5341, 3364, 158, -5341, 4668, -5341, -5341, -5341, 158, 4443, + 4405, 93552, 4884, 2220, -5341, -5341,101703, 2220, 158, 4884, + 4749, -5341, 604, 4930, 2220, 4443, 158, 158, -5341, 197, + 4209, -5341,111492, -5341, -5341, 4213, 4214, 4218, 4220, -5341, + -5341, 2383, 4221, -5341, -5341, -5341, -5341, 4222, 4225, 23317, + 3364, 4683, 57243, 4226, -5341, -5341, 2857, 2162, 2432, 4491, + 4448, -5341, 4382, -5341, 2879, 4197, 4197, 1769, 3940, -5341, + -5341, -5341, -5341, 4846, 3939, -5341, 4936, -5341, 3939, 604, + -5341, -5341, -5341, -5341, -5341, 4232, 2442, 1776, 2880, 2881, + -5341, -5341, -5341, 4234, -5341, -5341, 418, -5341, 4227, -5341, + 2445, 4950, 2110, 23317, -5341, 4240, -5341, -5341, 93552, -5341, + -5341, 3454, 1118, -5341, 2449, -5341, -5341, -5341, 4244, 3598, + -5341, -5341, 60207, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 17934, 17934, 3999, -5341, 4005, 2422, -5341, -5341, -5341, -5341, + 4611, 4245, 4249, -5341, -5341, -5341, 4236, 133, 38597, -5341, + -5341, -5341, 4253, 4250, -5341, -5341, -5341, 89106, -5341, 2462, + -5341, -5341, 4971, 19472, 2508, 2628, 4256, -5341, 80955, 4257, + 4259, 46748, 1625, 93552, 2484, -5341, -5341, -5341, -5341, -5341, + 1463, -5341, 484, 2583, 2218, 2218, -5341, 4255, 46007, -5341, + 234, -5341, 273, 275, 294, 335, -5341, 3875, 230, 230, + 2508, 2508, 234, 230, 80955, 1708, 230, 3875, 3875, 387, + 2508, 2329, 273, -5341, -5341, -5341, 230, 273, 265, -5341, + -5341, 4495, -5341, 9105, 69099, 78732, 3783, -5341, -5341, 1592, + 4373, -5341, 4267, 78732, -5341, 2508, -5341, 4984, 5008, -5341, + -5341, 4670, 23317, 4261, 23317, 4274, 2502, -5341, 2218, -5341, + 2218, -5341, 1163, 4985, 4986, 4932, 4987, 2066, -5341, 2240, + -5341, -5341, -5341, -5341, -5341, -5341, 783, -5341, -5341, 4276, + -5341, -5341, -5341, -5341, 4612, -5341, 5030, -5341, 4730, 44525, + 2583, -5341, 1739, 4321, -5341, -5341, -5341, 4924, 2813, 2813, + 326, 2813, 90588, 93552, 46007, 545, 443, 4907, 2226, 1869, + 4332, 4845, 2813, 2813, 91329, 326, 38597, -5341, -5341, -5341, + 2813, -5341, 2813, 46007, 92070, 326, -5341, -5341, -5341, 93552, + -5341, 2813, 326, -5341, 326, 326, 90588, -5341, 10320, -5341, + -5341, 39338, 1406, -5341, 4197, 3454, 4682, -5341, -5341, 4406, + 2508, 4656, -5341, -5341, 4762, -5341, 93552, 226, -5341, 230, + -5341, 230, -5341, 230, -5341, 31776, -5341, 3599, -5341, -5341, + 2065, -5341, -5341, 4657, 4452, 4802, -5341, -5341, 93552, -5341, + 4763, 4789, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 79473, 234, -5341, -5341, 2516, -5341, + -5341, 2523, -5341, -5341, -5341, -5341,101703, -5341, 2542, -5341, + 66876, 23317, -5341, -5341, -5341, 4884, 4298, -5341, -5341, -5341, + 4323, -5341, -5341, -5341, -5341, -5341, 4930, -5341, -5341, 62430, + -5341, -5341, -5341, 78732, 4960, -5341, -5341, -5341, -5341, -5341, + 5059, -5341, -5341, 4308, 2178, -5341, 4311, -5341, -5341, -5341, + -5341, 23317, -5341, 4543, -5341, 4650, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 3875, -5341, -5341, -5341, + 4313, -5341, 230, -5341, 23317, -5341, -5341, 4314, 3419, 2178, + -5341, -5341, 4411, 4283, 4318, -5341, 4658, 93552, -5341, -5341, + 17934, 17934, -5341, -5341, -5341, 4328, -5341, -5341, -5341, 38597, + 60948, 4319, 4316, -5341, 234, -5341, -5341, 93552, -5341, -5341, + 3875, 4681, -5341, 2553, -5341, -5341, 93552, 4324, 4518, 93552, + 93552, -5341, -5341, 4333, 93552, -5341, -5341, -5341, 39338, 4334, + 4942, 4944, 2218, -5341, 2583, 4869, 46748, -5341, 2583, 2583, + 64653, 93552, 4335, 2508, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 4339, -5341, -5341, -5341, -5341, -5341, 2508, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 5053, -5341, 4685, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 4341, 4337, 93552, -5341, 66135, -5341, -5341, -5341, -5341, 5002, + 108132, -5341, -5341, -5341, 4905, 1654, -5341, -5341, 4342, -5341, + -5341, 66876, -5341, -5341, -5341, -5341, 4344, 4346, 4197, 93552, + 4197, 93552, -5341, 4982, 4982, -5341, 3364, 3364, 5049, 3364, + -5341, 5055, 5060, 2240, -5341, -5341, 5097, 632, 4719, 1685, + 1568, 326, 1568, 5000, -5341, -5341, 93552, 46748, 90588, 46748, + -5341, 4842, -5341, 72063, 46748, 2813, 93552, -5341, 5004, -5341, + 4972, 46748, 46748, -5341, -5341, 90588, 4351, -5341, 2178, 2512, + 93552, 46748, -5341, -5341, -5341, 3843, 4822, 46748, 90588, -5341, + 90588, -5341, 4634, 4850, 3331, -5341, 4358, 4357, 93552, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 846, -5341, -5341, 2574, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 1346, 4557, + -5341, 2065, -5341, -5341, -5341, 46007, -5341, -5341, -5341, -5341, + -5341, -5341, 604, 3364, 604, 4884, -5341, 93552, -5341, 4197, + -5341, 93552, 5113, -5341, -5341, -5341, -5341, 47489, -5341, -5341, + -5341, 4684, -5341, 2581, -5341, 4367, 23317, -5341, -5341, 2892, + -5341, -5341, 4368, -5341, 4369, 3896, -5341, 3557, 4501, 4271, + 4325, 4329, 4551, 4720, -5341, 4555, -5341, 4193, 4521, 4378, + 31776, -5341, -5341, 1600, -5341, -5341, -5341, -5341, 95775, -5341, + -5341, 4374, -5341, 38597, 19472, -5341, -5341, 4795, -5341, 2597, + 2178, 4385, 93552, 4386, 2603, 2617, 93552, 4389, -5341, 23317, + 2583, -5341, -5341, 46748, 46007, -5341, 4868, 708, 46748, 46748, + 4392, 1381, 4394, 4396, 2550, 1663, 4397, 4059, 1687, 58, + 1355, 462, 1765, 4399, 1785, 4400, 1801, 1831, 1840, 1862, + 1864, 4409, 5094, -5341, -5341, 4412, 4415, 4416, 4418, 4419, + 4420, 4421, 4422, 4424, -5341, -5341, 46007, -5341, -5341, 189, + 265, -5341, 78732, -5341, 1714, 4593, -5341, -5341, 5164, -5341, + 4752, 78732, 3783, -5341, -5341, -5341, -5341, 99480, 6991, 2648, + 2649, 2241, -5341, -5341, -5341, -5341, 3364, -5341, 3364, 3364, + -5341, 4413, -5341, -5341, -5341, 5052, -5341, 5054, -5341, 2071, + 1501, -5341, 46748, 338, 4899, 4886, 5122, -5341, 46748, 4250, + 93552, -5341, -5341, 434, -5341, 38597, -5341, -5341, 4910, 4911, + -5341, 4929, 1406, -5341, 93552, -5341, -5341, -5341, 4527, -5341, + 108132, 4630, 5143, 5144, -5341, 93552, 92811, 31776, -5341, -5341, + 5058, -5341, 3575, -5341, -5341, -5341, -5341, -5341, 4439, -5341, + 62430, -5341, -5341, -5341, -5341, -5341, 2178, -5341, -5341, -5341, + 151, -5341, 5171, 1546, -5341, -5341, 253, -5341, -5341, -5341, + -5341, 93552, 4447, 4533, -5341, -5341, 4519, -5341, -5341, 2945, + -5341, 137, 61689, -5341, -5341, -5341, -21, 93552, -5341, 5201, + 4450, 1055, -21, -21, 4451, 93552, 2893, 46748, 4868, 1289, + 4459, 1165, -5341, 1165, -5341, -5341, 3008, 66876, -5341, -5341, + 3325, 93552, 4460, 5221, -5341, -5341, 4665, -5341, 93552, -5341, + -5341, -5341, 1759, -5341, -5341,109554, 5024, 2655, -5341, -5341, + -5341, -5341, -5341, 5178, -5341, 5179, 4467, 4468, -5341, -5341, + -5341, -5341, 46748, -98, -5341, -5341, 5101, -5341, 5149, 5151, + 1406, -5341, 46007, 5036, 75768, -5341, -5341, -5341, 326, -5341, + 93552, 46748, 46007, -5341, -5341, 4250, 878, 23317, 4826, 5164, + -5341, 4671, 4672, -5341, -5341, 2676, -5341, -5341, 2082, 4961, + -5341, 93552, -5341, -5341, -5341, 3557, -5341, -5341, 4609, 360, + -5341, 2679, -5341, -5341, -5341, 3843, -5341, 4481, -5341, 4843, + 234, 234, 4844, 234, 234, 234, 234, 4484, 2945, -5341, + -5341, -5341, 4835, -5341, -5341, -5341, 2752, 2178, 4487, 93552, + 4489, 2687, 1675, 2791, 93552, 4488, -5341, -5341, -5341, 1165, + 93552, 5091, -5341, 4493, -5341, 4494, 4496, -5341, -5341, 5114, + 2508, -5341, 4576, -5341, -5341, 3008, -5341, -5341, -5341, 4539, + 5119, 5080, -5341, 80955, 34083, -5341, 4988, -5341, 4943, 5184, + -5341, 5234, 3793, -5341, -5341, -5341, -5341, -5341, -5341, 93552, + 4508, 46007, 4571, 5164, 2468, -5341, 99480, 9273, -5341, -5341, + 89106, 89106, 5094, 3843, 4658, -5341, -5341, -5341, 34083, -5341, + -5341, 4658, -5341, -5341, -5341, -5341, -5341, 5134, -5341, 4197, + 23317, -5341, -5341, -5341, -5341, -5341, 92811, -5341, 545, -5341, + -5341, -5341, -5341, -5341, -5341, 93552, -5341, 4511, -5341, -5341, + 188, 234, 2508, 2508, 234, 3920, 3920, 3843, 80955, 4603, + -5341, -5341, 234, 1165, 2508, 234, 1165, -5341, -5341, 1256, + 2752, -5341, -5341, -5341, -5341, -5341, -5341, 1612, -21, -5341, + 4714, 1256, 1675, -5341, -5341, 1256, 2791, -5341, -5341, 4522, + 93552, 4526, 4530, -5341, 2691, -5341, 1088, 5108, 93552, 4535, + 93552, 93552, -5341, -5341, -5341, -5341, -5341, -5341, 4891, -5341, + 4542, 4545, 3754, 3754, 16396, -5341, -5341, -5341, -5341, -5341, + -5341, 5120, -5341, 4582, 849, 234, -5341, 3964, 4525, 93552, + 5193, 4904, -5341, -5341, -5341, 5121, -5341, -5341, -5341, -5341, + -5341, 2000, 4547, 2706, -5341, -5341, 2733, -5341, -5341, -5341, + -5341, 4552, 4197, -5341, 38597, -5341, 4533, -5341, -5341, 2750, + -5341, 28700, -5341, -5341, -5341, 2508, -5341, -5341, 2508, -5341, + -5341, -5341, -5341, -5341, 2762, -5341, 80955, -5341, -5341, 230, + -5341, -5341, 5157, 4994, -5341, 4754, 2752, 2650, -5341, -5341, + -5341, -5341, -5341, 4554, 93552, 93552, 4556, -5341, 93552, -5341, + -5341, -5341, 1363, -5341, 2790, 93552, 2815, 2820, -5341, -5341, + -5341, -5341, 4561, 4565, -5341, 24, -5341, -5341, 3964, 93552, + 4559, -5341, -5341, 4670, -5341, 5130, 2468, -5341, -5341, -5341, + 4658, 4568, -5341, 234, 5086, -5341, -5341, 4511, -5341, 4570, + -5341, 2082, -5341, -5341, 80955, -5341, 4603, -5341, -5341, -5341, + -5341, -5341, -5341, 1256, -5341, -5341, 2825, 4450, 93552, -5341, + 600, 600, 2752, 2828, 1675, 2791, -5341, 308, -5341, 1644, + 1644, 1326, -5341, 93552, -5341, -5341, -5341, 2468, 346, 2837, + 38597, 19472, 4873, 4434, -5341, 28700, 4586, 4177, -5341, -5341, + -5341, 4869, 4587, 4450, -5341, -5341, 1599, 5023, 5154, 5159, + -5341, 2752, -5341, -5341, -5341, 4588, -5341, 1644, -5341, -5341, + -5341, -5341, -5341, 1758, -5341, 5252, -5341, 3673, -5341, -5341, + -5341, 5166, 346, 346, -5341, -5341, -5341, 5305, 4748, -5341, + -5341, -5341, 4177, -5341, -5341, 2752, 4591, -5341, -5341, -5341, + 5078, 5274, -5341, -5341, -5341, -5341, 1758, -5341, 4732, -5341, + -5341, -5341, -5341, -5341, -5341, 391, 5174, -5341, 5176, -5341, + 3364, 5237, -5341, -5341, 2752, 600, 600, -5341, -5341, -5341, + -5341, 5266, 4951, -5341, 5354, 4606, -5341, -5341, -5341, 1413, + 421, 35604, 5129, -5341, -5341, 80955, -5341, -5341, -5341, -5341, + 80955, -5341, 2848, -5341, -5341, 38597, -5341, -5341,108132, -5341, + -5341, 36356, 4608, -5341, 234, -5341, 5164, -5341, 38597, -5341, + -5341, -5341, 19472, -5341, -5341 +}; + +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_int16 yydefact[] = +{ + 0, 3619, 2, 1016, 2294, 0, 430, 0, 1243, 612, + 2139, 2288, 2287, 2060, 470, 220, 376, 2062, 2361, 0, + 0, 466, 1259, 754, 496, 0, 320, 0, 0, 473, + 318, 220, 1308, 3262, 2188, 0, 3368, 2126, 0, 1306, + 468, 2459, 2065, 0, 3524, 0, 0, 0, 3529, 72, + 2032, 0, 1259, 342, 3370, 85, 0, 0, 1259, 2345, + 3529, 0, 2373, 0, 0, 2168, 0, 0, 0, 0, + 3, 3621, 22, 0, 45, 27, 33, 17, 21, 16, + 47, 60, 53, 30, 3709, 3710, 3712, 43, 3560, 42, + 11, 63, 64, 19, 50, 12, 15, 18, 41, 49, + 37, 44, 57, 58, 1329, 1305, 1333, 1304, 1300, 1296, + 1315, 1316, 1317, 1323, 25, 26, 34, 51, 68, 23, + 65, 61, 24, 2294, 13, 28, 29, 14, 52, 46, + 38, 62, 69, 39, 0, 59, 40, 67, 32, 54, + 31, 9, 10, 20, 55, 56, 48, 70, 35, 66, + 36, 8, 2048, 168, 3526, 3711, 1060, 0, 0, 0, + 0, 2058, 0, 2058, 1151, 1374, 3558, 3559, 3560, 1260, + 0, 1261, 0, 0, 2501, 2502, 2744, 2759, 2807, 2559, + 2851, 2861, 2878, 2885, 3020, 2712, 2757, 2758, 2558, 2787, + 2620, 2879, 2902, 2930, 3015, 2697, 2696, 2698, 3001, 2699, + 2700, 2701, 2702, 2703, 3002, 2595, 2704, 2705, 2706, 2708, + 2707, 2709, 2710, 3003, 2596, 3630, 2597, 2669, 2711, 2671, + 2670, 2713, 2598, 2599, 2714, 2715, 2716, 2718, 2717, 2650, + 2601, 2600, 2719, 2721, 2720, 2672, 2673, 2653, 2722, 3004, + 2723, 2725, 2602, 2999, 2603, 2604, 2605, 2724, 2606, 2726, + 2654, 2727, 2728, 2607, 2729, 2730, 2731, 2732, 2734, 2733, + 2647, 2735, 2736, 2738, 2739, 2740, 2737, 2741, 2742, 2745, + 2743, 2675, 2674, 3005, 2608, 2746, 2747, 2748, 2749, 2751, + 2752, 2750, 2753, 2655, 2754, 2755, 2756, 2764, 3631, 2765, + 2767, 2766, 2676, 2768, 2769, 2770, 2772, 2771, 2773, 2775, + 2609, 2610, 2611, 2774, 2776, 2760, 2761, 2762, 2763, 2778, + 2777, 2779, 2780, 2781, 2677, 2612, 2651, 2613, 2998, 2782, + 2783, 2556, 2784, 2785, 3006, 2614, 2666, 2786, 2656, 2789, + 2788, 2615, 2790, 2616, 2791, 3007, 3008, 2792, 2793, 2795, + 2797, 2794, 2798, 2799, 2805, 2617, 2796, 2800, 2801, 2802, + 2803, 2804, 2806, 2678, 2808, 2648, 2809, 3009, 3010, 2810, + 2811, 2812, 2813, 2667, 2814, 2815, 2816, 2817, 2830, 2831, + 2821, 2822, 2824, 2825, 2828, 2823, 2829, 2834, 2833, 2835, + 2836, 2837, 2838, 2839, 2832, 2819, 2826, 2827, 2820, 2840, + 2841, 2818, 2842, 2844, 2843, 2845, 2679, 2846, 2847, 2848, + 2849, 2850, 3011, 2852, 2853, 2855, 2854, 2856, 3012, 2857, + 2858, 2859, 2663, 2860, 2680, 2681, 2862, 2863, 3013, 2864, + 2865, 2870, 2871, 2872, 2649, 2867, 2866, 2868, 2869, 2682, + 2683, 2684, 2873, 2874, 2875, 2877, 2876, 2657, 2619, 2618, + 3014, 2621, 2880, 2881, 2622, 2882, 2884, 2883, 2665, 2623, + 2886, 2887, 2889, 2888, 2624, 2652, 2625, 2626, 2890, 2891, + 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, + 2685, 2686, 2903, 2904, 2905, 2907, 2906, 2908, 2909, 2913, + 2910, 2911, 2912, 2914, 2627, 2915, 2658, 2916, 2917, 2918, + 2628, 2920, 2919, 2629, 2921, 2922, 2923, 2924, 2925, 2664, + 2659, 2926, 2927, 2929, 2687, 2928, 2931, 2932, 2660, 2933, + 2934, 3016, 2630, 2935, 2936, 2688, 2668, 2631, 3017, 2938, + 2661, 2695, 2937, 2939, 2633, 2634, 2940, 2941, 2942, 2632, + 2943, 2635, 3018, 2944, 2946, 2945, 2947, 2948, 2949, 2950, + 2636, 2951, 2952, 2637, 2953, 2638, 2954, 2955, 3019, 2956, + 2958, 2957, 2959, 2960, 2961, 2962, 2963, 2964, 2966, 2968, + 2967, 2965, 2969, 2970, 2689, 2971, 2639, 2690, 3022, 3023, + 2691, 2972, 2973, 2974, 2975, 3021, 2662, 2976, 2977, 2642, + 2978, 2979, 2981, 2980, 2640, 2641, 2982, 2983, 2646, 3024, + 2984, 3025, 2692, 2693, 2985, 2986, 2996, 2987, 2989, 2988, + 2991, 2990, 2997, 3026, 2557, 2643, 2992, 2993, 2644, 2994, + 2645, 2995, 2694, 2506, 2522, 244, 2523, 2553, 2551, 2555, + 2549, 2554, 2547, 2548, 3000, 2594, 2552, 2550, 400, 131, + 0, 0, 2163, 2058, 2036, 2058, 2058, 2058, 2058, 2058, + 2058, 2061, 2058, 2058, 0, 0, 0, 400, 2068, 2363, + 0, 2383, 2384, 2378, 3358, 3359, 3353, 378, 0, 0, + 0, 2261, 2260, 0, 0, 305, 317, 320, 313, 316, + 0, 220, 2058, 378, 319, 320, 0, 1338, 0, 2266, + 320, 0, 2137, 2377, 0, 400, 2460, 2457, 2068, 2334, + 2336, 0, 2332, 1446, 1445, 0, 3529, 0, 2512, 1238, + 1270, 1195, 3530, 3531, 0, 77, 80, 2300, 343, 0, + 0, 0, 610, 0, 0, 1203, 0, 3531, 3541, 2375, + 0, 131, 1176, 0, 131, 2171, 2058, 2058, 3602, 3603, + 0, 0, 0, 3597, 0, 3604, 0, 1333, 0, 1319, + 1, 5, 0, 0, 610, 970, 610, 971, 0, 610, + 610, 0, 0, 0, 0, 3565, 3558, 3559, 3560, 0, + 2018, 1873, 1334, 1333, 1965, 1969, 3546, 3546, 3546, 0, + 0, 1965, 1324, 2762, 2998, 2884, 0, 2279, 2293, 2277, + 2495, 1302, 1298, 2606, 1019, 1061, 1024, 228, 0, 0, + 1026, 0, 1037, 2528, 2527, 2526, 1034, 220, 0, 1153, + 0, 0, 0, 3566, 3565, 0, 1215, 2281, 2282, 2283, + 2284, 2285, 2286, 2289, 0, 250, 400, 432, 0, 443, + 434, 437, 0, 132, 133, 1241, 1244, 0, 613, 2167, + 2166, 0, 2165, 2140, 0, 2163, 0, 2056, 0, 0, + 0, 0, 220, 0, 220, 2041, 2058, 2058, 471, 3652, + 0, 3418, 3436, 3437, 1387, 3433, 3438, 0, 3435, 3430, + 0, 0, 3432, 3429, 0, 0, 3457, 3431, 3434, 2597, + 2730, 2771, 2611, 2779, 2780, 2894, 2898, 2903, 2914, 2918, + 2661, 2633, 2959, 3411, 3399, 3413, 3412, 0, 0, 3416, + 3421, 0, 3420, 0, 0, 2070, 2364, 2365, 2369, 0, + 2387, 0, 391, 0, 0, 3638, 0, 0, 380, 381, + 3637, 3715, 0, 385, 3636, 0, 378, 3702, 0, 400, + 3696, 3704, 3703, 3705, 3706, 3707, 3708, 411, 0, 412, + 413, 467, 3699, 2524, 0, 3633, 3635, 3632, 3634, 2525, + 3658, 0, 0, 3701, 0, 3700, 3697, 3698, 1257, 1678, + 0, 2434, 2503, 2504, 0, 2447, 2452, 2453, 2445, 2446, + 2450, 2426, 2449, 2425, 2451, 1448, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1387, 1387, 1387, 1384, + 0, 0, 0, 0, 0, 0, 2443, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1384, 0, 0, 2442, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3020, + 2444, 1387, 1384, 1384, 0, 0, 3015, 0, 0, 0, + 3001, 2595, 3003, 2650, 2602, 2603, 2604, 2605, 2647, 2674, + 3005, 3006, 3007, 3009, 3010, 3011, 3012, 2863, 3013, 3014, + 2665, 2892, 2687, 3016, 3017, 3019, 2690, 3022, 3023, 2691, + 3021, 2662, 3024, 3025, 3026, 2643, 2694, 0, 0, 0, + 0, 1447, 0, 0, 1331, 1523, 755, 1393, 1405, 1421, + 0, 1521, 1520, 1524, 1526, 1532, 1440, 1553, 1492, 1493, + 1495, 1494, 1499, 1500, 0, 1654, 1501, 0, 0, 1498, + 2439, 1497, 1496, 2440, 2441, 1491, 2481, 2511, 0, 0, + 2505, 3000, 2594, 498, 497, 0, 339, 332, 327, 335, + 329, 331, 330, 336, 337, 338, 333, 328, 334, 321, + 0, 306, 0, 314, 3542, 0, 1262, 378, 474, 340, + 3418, 2698, 2898, 3391, 0, 3398, 0, 3557, 3551, 3554, + 3553, 3549, 3552, 3550, 3555, 1359, 3556, 1358, 1309, 1339, + 1356, 1357, 0, 0, 0, 2584, 2583, 890, 2581, 3283, + 3284, 0, 2585, 0, 0, 3285, 2951, 2972, 2582, 0, + 2517, 0, 2518, 2578, 2576, 2580, 2579, 2573, 2574, 2577, + 3263, 3268, 3264, 2575, 0, 2294, 0, 0, 2274, 968, + 967, 0, 0, 0, 0, 2210, 0, 890, 2274, 2211, + 0, 1930, 2264, 2267, 0, 3287, 2224, 969, 3288, 2260, + 0, 2196, 2212, 2173, 2217, 131, 3289, 131, 2263, 1930, + 2274, 0, 2189, 0, 0, 0, 2294, 1373, 0, 315, + 3369, 2138, 1149, 2106, 1307, 2092, 0, 469, 0, 2073, + 0, 2333, 3717, 3525, 0, 0, 0, 0, 3534, 1720, + 2033, 0, 81, 76, 0, 0, 0, 0, 2500, 3371, + 86, 0, 0, 3616, 74, 0, 2351, 0, 2349, 2346, + 2348, 0, 3534, 0, 2374, 1183, 1183, 0, 0, 1175, + 1177, 1178, 1183, 1183, 2172, 0, 0, 0, 2433, 2431, + 2432, 2513, 3599, 2430, 2429, 3608, 3610, 3593, 0, 3596, + 3595, 3605, 1322, 1321, 6, 71, 0, 142, 610, 220, + 220, 610, 167, 148, 151, 610, 610, 610, 160, 162, + 0, 222, 0, 0, 3565, 1337, 2807, 0, 0, 1349, + 1335, 1768, 1336, 1800, 1770, 1740, 1731, 1730, 1796, 1797, + 1799, 1798, 1801, 1803, 1793, 0, 0, 2031, 0, 2026, + 1874, 1879, 1873, 0, 0, 0, 0, 0, 0, 1964, + 1930, 1973, 1935, 1966, 1301, 1962, 0, 1297, 1362, 1362, + 3548, 3547, 3545, 3544, 3543, 1967, 1320, 1328, 1326, 1327, + 1968, 1318, 0, 2291, 2497, 0, 0, 2296, 0, 1965, + 1969, 2097, 2096, 2099, 0, 904, 0, 229, 0, 3563, + 3564, 3562, 1387, 2529, 2532, 3561, 2533, 229, 2059, 0, + 0, 0, 2058, 1157, 1158, 1152, 1154, 1156, 0, 0, + 0, 0, 2295, 0, 246, 252, 245, 441, 0, 401, + 378, 0, 438, 87, 0, 1245, 2049, 2051, 0, 2141, + 0, 1347, 1873, 2143, 2148, 2157, 2161, 2164, 2038, 0, + 0, 3680, 2044, 2043, 3679, 0, 2045, 0, 0, 2046, + 2034, 0, 447, 449, 3419, 3417, 3454, 3453, 3458, 0, + 3455, 3451, 0, 3410, 3459, 3444, 3448, 0, 3460, 3445, + 3452, 3466, 3465, 3467, 3462, 3461, 0, 3464, 3450, 0, + 3449, 3470, 0, 3414, 0, 0, 423, 0, 2075, 2076, + 2072, 1149, 2071, 2370, 0, 2362, 0, 1280, 2389, 2388, + 2385, 1865, 3355, 3360, 400, 392, 0, 0, 2863, 0, + 399, 398, 397, 3620, 420, 400, 386, 409, 0, 0, + 3622, 379, 382, 418, 421, 3657, 460, 456, 464, 458, + 3713, 274, 0, 0, 2503, 2504, 2436, 2435, 2505, 2427, + 2448, 0, 0, 0, 1527, 1871, 1871, 1871, 0, 0, + 1728, 0, 0, 0, 0, 1871, 0, 1565, 1539, 1538, + 0, 1566, 0, 0, 0, 0, 0, 0, 0, 1684, + 1684, 1650, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1722, 1724, 2481, 1871, 0, 1871, 0, 1392, + 1571, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1871, 1871, 1871, 0, 1582, 1584, 1583, 1871, + 1871, 0, 0, 0, 0, 0, 0, 1871, 0, 0, + 0, 0, 0, 1718, 2454, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1718, 0, 0, 0, 0, + 0, 0, 2456, 0, 0, 0, 2455, 0, 0, 0, + 0, 0, 0, 1718, 0, 0, 1529, 0, 1528, 1530, + 0, 1331, 756, 0, 0, 0, 1444, 1442, 1443, 1441, + 0, 0, 0, 0, 1450, 1452, 1454, 0, 1449, 1451, + 1453, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1531, 0, 0, 0, 0, 0, 2428, 0, 1603, + 0, 510, 2359, 0, 0, 0, 304, 1264, 2534, 0, + 0, 400, 3417, 0, 0, 0, 3414, 1374, 1355, 3290, + 0, 889, 0, 0, 892, 894, 893, 3322, 0, 891, + 3331, 3329, 3327, 3326, 0, 0, 3270, 3272, 0, 898, + 900, 899, 3320, 897, 0, 3306, 0, 0, 0, 0, + 0, 610, 0, 0, 0, 0, 0, 0, 0, 0, + 2241, 0, 1373, 1373, 2190, 0, 2274, 0, 2274, 2264, + 0, 2274, 2270, 2230, 2223, 0, 0, 667, 1947, 1931, + 2216, 2268, 2269, 2274, 0, 0, 2274, 0, 2231, 2264, + 2274, 2185, 0, 0, 2177, 2182, 2178, 0, 2184, 2183, + 2186, 2174, 2175, 0, 2203, 0, 2215, 2222, 0, 2202, + 2209, 0, 2220, 2264, 2264, 0, 2274, 2274, 2274, 1150, + 0, 1374, 0, 3654, 2458, 2461, 2467, 2473, 2077, 2074, + 2335, 3620, 0, 0, 1272, 1274, 1273, 1290, 1197, 3533, + 0, 3535, 0, 3537, 0, 78, 0, 0, 2327, 2325, + 0, 0, 0, 2319, 2321, 2324, 2320, 0, 0, 2326, + 131, 0, 2322, 2328, 2301, 2304, 2311, 1373, 2302, 0, + 0, 341, 344, 346, 0, 349, 1865, 3374, 3373, 0, + 0, 0, 1201, 1204, 0, 2356, 2353, 131, 0, 2660, + 3540, 3538, 0, 1171, 1187, 134, 1181, 1182, 0, 0, + 1174, 134, 3355, 3617, 3618, 0, 0, 3594, 3611, 3592, + 0, 3606, 3607, 3591, 7, 4, 154, 0, 145, 0, + 0, 0, 610, 610, 137, 0, 3681, 1374, 1374, 610, + 610, 610, 0, 1765, 0, 1731, 1796, 1797, 1799, 0, + 1798, 0, 0, 1865, 0, 0, 1788, 1813, 0, 1813, + 1790, 1791, 0, 0, 0, 1349, 1794, 2514, 2027, 2030, + 0, 2019, 2021, 2022, 2526, 2024, 0, 0, 1876, 1879, + 1941, 1942, 0, 1364, 0, 1955, 1956, 1954, 0, 1932, + 1948, 1953, 1951, 0, 1923, 0, 1972, 1963, 2011, 1363, + 1970, 1971, 1325, 2280, 0, 2278, 2297, 2298, 2496, 1303, + 1299, 1021, 905, 2098, 904, 603, 606, 605, 0, 0, + 2069, 227, 2531, 0, 2069, 1038, 0, 2532, 3495, 0, + 3502, 3484, 0, 1155, 3567, 3568, 1032, 1030, 0, 1216, + 1217, 1220, 0, 250, 0, 253, 255, 0, 400, 433, + 435, 378, 444, 0, 0, 1255, 0, 1253, 1252, 1250, + 1251, 1249, 0, 1240, 1246, 1247, 1793, 0, 2144, 2151, + 2053, 2055, 2495, 0, 1348, 2146, 1921, 0, 0, 0, + 2159, 2057, 0, 0, 2040, 3408, 3482, 2039, 1159, 0, + 0, 378, 472, 448, 402, 3447, 1388, 3463, 0, 3468, + 3469, 3406, 225, 224, 3415, 223, 0, 0, 0, 0, + 3456, 3439, 0, 3443, 3442, 0, 3440, 0, 3441, 0, + 3446, 3423, 3422, 2471, 0, 2470, 378, 377, 2077, 3008, + 3024, 2371, 2367, 2366, 0, 2386, 0, 1866, 1867, 0, + 0, 1869, 3357, 1974, 0, 3354, 393, 400, 0, 0, + 0, 415, 3688, 272, 387, 400, 402, 414, 453, 275, + 383, 0, 0, 378, 378, 400, 3620, 3355, 3290, 1679, + 1681, 0, 0, 1872, 0, 1696, 0, 0, 0, 0, + 0, 0, 1507, 0, 0, 0, 1633, 0, 1696, 1661, + 2004, 2005, 1985, 1986, 1984, 1987, 1385, 0, 1988, 2003, + 0, 0, 0, 1659, 1330, 1313, 0, 0, 1841, 1842, + 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, + 1854, 1859, 1855, 1856, 1857, 1858, 1853, 1860, 0, 1840, + 0, 1685, 1646, 1648, 0, 0, 0, 756, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1871, 0, 0, + 1871, 0, 0, 0, 0, 0, 0, 1660, 0, 1658, + 0, 0, 1657, 1551, 0, 0, 1871, 0, 1577, 0, + 0, 0, 1573, 0, 0, 0, 1557, 1558, 0, 0, + 0, 1483, 0, 1481, 1482, 0, 0, 1871, 0, 0, + 0, 0, 1474, 0, 0, 0, 0, 1719, 0, 0, + 1863, 1861, 1864, 1862, 0, 0, 1720, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1555, 0, 0, 0, + 2486, 938, 0, 0, 0, 0, 1522, 0, 0, 0, + 0, 1390, 1389, 1391, 1402, 1396, 1400, 1394, 1398, 0, + 1455, 3002, 1403, 0, 0, 0, 1406, 1415, 1419, 0, + 0, 0, 0, 0, 1426, 1424, 1425, 1437, 1438, 1422, + 1423, 0, 1428, 0, 1427, 1434, 1435, 1436, 1439, 1525, + 901, 1533, 1891, 1652, 1653, 1677, 1895, 0, 0, 0, + 0, 2482, 1374, 1477, 1476, 1478, 1479, 1480, 511, 0, + 505, 508, 522, 0, 0, 2358, 0, 2674, 2690, 2691, + 322, 325, 324, 326, 0, 0, 1263, 1267, 3355, 0, + 0, 0, 0, 3486, 3396, 0, 0, 1370, 1310, 1369, + 0, 0, 0, 0, 0, 3312, 3324, 0, 0, 3321, + 0, 0, 0, 0, 0, 3294, 0, 0, 0, 0, + 3267, 3333, 3334, 3337, 0, 0, 0, 2972, 0, 3269, + 3274, 3265, 3278, 3280, 3282, 2232, 0, 0, 0, 0, + 2237, 2234, 2227, 2240, 2712, 2236, 2253, 2235, 2229, 2242, + 2228, 0, 0, 0, 2274, 2246, 2249, 2243, 2274, 0, + 2274, 2245, 0, 2272, 2259, 2258, 2257, 2200, 2199, 2193, + 2265, 2250, 2244, 220, 2274, 2198, 2197, 2179, 2180, 2181, + 0, 1930, 0, 2270, 134, 2264, 0, 2274, 2274, 0, + 2256, 2219, 2221, 2125, 0, 1793, 0, 0, 2111, 2104, + 2091, 378, 0, 0, 0, 2078, 2079, 272, 0, 0, + 0, 495, 1290, 1276, 1292, 1199, 1198, 1196, 3532, 3536, + 1721, 80, 2119, 2117, 82, 2116, 2118, 83, 2337, 2313, + 2312, 2314, 2318, 131, 2323, 2315, 0, 2329, 2330, 350, + 354, 0, 0, 0, 3372, 0, 611, 0, 75, 0, + 1205, 1974, 2352, 2354, 2347, 3539, 0, 1172, 1189, 1188, + 1184, 1185, 0, 1169, 135, 1180, 1179, 1173, 2169, 3600, + 3609, 3613, 3598, 601, 986, 0, 3404, 3502, 189, 0, + 0, 0, 140, 0, 610, 161, 163, 610, 0, 0, + 0, 610, 0, 0, 1810, 1802, 1804, 1805, 1806, 0, + 1809, 0, 1352, 0, 1340, 1340, 1350, 1812, 1792, 1789, + 1814, 0, 1813, 1813, 0, 0, 1772, 1771, 0, 1865, + 895, 2023, 0, 0, 1875, 0, 1877, 1886, 1876, 1944, + 2687, 0, 0, 1366, 0, 1974, 1360, 2435, 0, 0, + 0, 0, 0, 0, 0, 1943, 1940, 0, 2299, 601, + 0, 604, 2098, 2098, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 239, 1025, 2530, 1027, 0, 0, 0, + 0, 0, 3514, 3355, 1052, 3569, 1028, 0, 0, 1219, + 248, 247, 251, 0, 378, 439, 436, 431, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 134, 89, 110, 0, 1242, 1254, 2050, + 1248, 2145, 1340, 0, 0, 0, 2498, 0, 1958, 1922, + 2158, 0, 2162, 2161, 0, 3678, 0, 0, 1161, 1160, + 2042, 2047, 3355, 378, 292, 405, 451, 0, 0, 3403, + 226, 3478, 3481, 2495, 0, 0, 3424, 0, 378, 424, + 2079, 2368, 2372, 1281, 1283, 1284, 1282, 1290, 0, 2546, + 2545, 2544, 2515, 1870, 2516, 2541, 2539, 2543, 2537, 2542, + 2535, 2536, 2540, 2538, 0, 3363, 3364, 3362, 1979, 1975, + 0, 3356, 3361, 394, 395, 416, 419, 0, 0, 378, + 0, 388, 389, 403, 407, 0, 422, 461, 445, 445, + 445, 272, 1258, 0, 0, 2485, 0, 1628, 0, 1629, + 1630, 0, 1508, 1729, 0, 0, 0, 1536, 0, 0, + 0, 1632, 0, 1386, 0, 0, 1511, 1503, 1314, 0, + 1663, 0, 0, 0, 0, 0, 0, 0, 1668, 0, + 1666, 0, 0, 1723, 0, 1725, 2482, 0, 1638, 1673, + 0, 1636, 0, 0, 1662, 1674, 1675, 0, 0, 0, + 1642, 1640, 0, 1644, 1578, 1641, 1643, 0, 0, 0, + 1576, 0, 0, 0, 0, 0, 0, 0, 1554, 0, + 1589, 0, 1626, 1590, 0, 0, 1587, 0, 0, 0, + 1605, 1540, 1541, 0, 1542, 1592, 0, 1516, 1547, 1548, + 1513, 1514, 1606, 1595, 1515, 0, 1550, 1974, 0, 1534, + 0, 0, 0, 1552, 1581, 0, 0, 0, 1512, 0, + 0, 0, 1974, 0, 1607, 1556, 0, 0, 757, 1332, + 1504, 2483, 1397, 1401, 1395, 1399, 0, 0, 0, 0, + 1414, 0, 0, 1407, 1417, 1420, 0, 0, 1893, 0, + 0, 1671, 1718, 1718, 1718, 1718, 0, 0, 0, 1622, + 1623, 0, 0, 504, 503, 0, 507, 591, 0, 524, + 512, 501, 2360, 0, 0, 1265, 0, 0, 0, 0, + 3397, 0, 0, 0, 0, 1374, 1375, 1375, 2481, 3291, + 3292, 3293, 0, 2571, 2570, 2568, 2572, 2569, 2519, 2521, + 0, 2520, 2566, 2564, 2567, 2562, 2560, 2561, 2565, 2563, + 0, 0, 3310, 903, 902, 3323, 0, 3345, 0, 0, + 3330, 3351, 3352, 3349, 3350, 3348, 3328, 0, 0, 0, + 3273, 0, 3339, 3340, 0, 0, 0, 3308, 3307, 0, + 0, 0, 3300, 0, 0, 0, 2255, 0, 2226, 2239, + 2238, 2275, 2276, 2252, 2248, 2194, 2251, 2247, 2271, 1974, + 2204, 2225, 2195, 0, 2218, 2176, 2272, 2233, 1873, 2264, + 2191, 2192, 2254, 0, 1349, 1375, 2107, 1374, 2108, 378, + 2462, 0, 2469, 0, 2066, 0, 378, 1239, 1279, 1271, + 1278, 1275, 1290, 1288, 1277, 964, 963, 0, 1291, 79, + 0, 0, 2316, 134, 2310, 2331, 2305, 0, 345, 355, + 347, 351, 352, 353, 348, 2781, 2863, 0, 1873, 3376, + 3615, 1212, 1210, 1209, 1211, 1200, 1206, 1207, 2357, 2355, + 134, 2376, 1187, 0, 1190, 3620, 1974, 0, 3612, 155, + 602, 0, 0, 0, 986, 0, 165, 3514, 0, 0, + 0, 138, 169, 3675, 3682, 3583, 0, 156, 3685, 228, + 3683, 0, 0, 1807, 1808, 1769, 1340, 1342, 1341, 0, + 0, 1344, 0, 0, 0, 0, 1777, 0, 1773, 1775, + 0, 1838, 1830, 0, 2028, 2020, 2025, 2480, 1883, 1927, + 0, 0, 1311, 1886, 0, 1945, 1936, 0, 1367, 1365, + 1957, 1934, 0, 1950, 1949, 1952, 1364, 1924, 1927, 0, + 1374, 1022, 607, 0, 0, 1023, 0, 0, 0, 233, + 236, 234, 235, 2098, 2098, 183, 2098, 2098, 182, 184, + 0, 178, 175, 185, 2098, 1039, 171, 0, 0, 0, + 0, 1974, 0, 0, 0, 191, 0, 3489, 3488, 0, + 3504, 0, 0, 3506, 0, 3505, 3503, 3474, 3485, 0, + 1047, 1017, 0, 1054, 1056, 0, 0, 3569, 1218, 0, + 250, 254, 442, 0, 0, 0, 1974, 0, 1974, 1974, + 0, 0, 1974, 0, 1974, 0, 0, 0, 0, 0, + 0, 0, 1974, 0, 0, 0, 1974, 0, 1974, 0, + 88, 1256, 2142, 2054, 2161, 0, 2496, 1373, 0, 2154, + 1873, 0, 2160, 3355, 3409, 3483, 1159, 0, 293, 0, + 0, 402, 3518, 0, 0, 0, 0, 0, 2472, 426, + 2063, 0, 1290, 1294, 2379, 3366, 3367, 3365, 1982, 1983, + 1980, 1978, 1981, 396, 417, 296, 298, 3650, 295, 297, + 3648, 3649, 0, 3691, 3693, 0, 374, 283, 372, 3645, + 3643, 3647, 3641, 3646, 3639, 3640, 3644, 3642, 373, 287, + 3690, 3716, 0, 3689, 390, 0, 410, 402, 0, 455, + 457, 446, 465, 459, 378, 1682, 1680, 0, 1697, 1726, + 0, 3027, 3028, 3029, 3030, 3031, 3032, 3034, 3035, 3033, + 3036, 3037, 857, 3038, 3039, 3040, 3041, 3042, 3043, 3044, + 3045, 3046, 3047, 3048, 857, 3049, 3050, 3051, 3052, 3053, + 3054, 3055, 3056, 3057, 3058, 3059, 3061, 3060, 3062, 3063, + 3064, 3065, 3066, 3067, 3068, 3069, 840, 3070, 3071, 3072, + 3073, 3074, 3075, 3077, 3076, 3078, 3079, 3080, 3081, 861, + 3082, 3083, 3084, 3086, 3085, 3087, 3088, 3089, 3090, 3091, + 3092, 3093, 3094, 3095, 1712, 3096, 3097, 3098, 3099, 3100, + 3102, 3101, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, + 3113, 3114, 3115, 3625, 3116, 3117, 3626, 3118, 3119, 3120, + 1706, 3121, 3122, 3123, 3124, 3125, 3126, 3103, 3127, 3104, + 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 3137, + 3138, 3139, 3140, 3141, 3142, 3143, 3146, 3144, 3145, 3147, + 3148, 3149, 3150, 3151, 3153, 3152, 3156, 3154, 3155, 3157, + 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3627, 3165, 3166, + 3167, 3168, 3169, 3171, 3172, 3170, 3173, 3174, 3175, 3176, + 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, 3185, 3187, + 3186, 3188, 3189, 3190, 3191, 3193, 3194, 3195, 3196, 3197, + 3198, 3199, 3200, 3203, 3201, 3202, 3204, 3205, 3206, 3207, + 3208, 3209, 3210, 3211, 3212, 3216, 3213, 3217, 3214, 3218, + 3215, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3228, + 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3237, 3238, 3239, + 3240, 3241, 1709, 3242, 3243, 3244, 3245, 3246, 3247, 3248, + 3250, 3251, 3249, 0, 3252, 3254, 3253, 3255, 3256, 3257, + 3258, 3259, 3260, 3261, 3192, 3227, 3236, 859, 1714, 857, + 2593, 1707, 859, 0, 1705, 0, 1703, 1704, 767, 769, + 2586, 2587, 2588, 2589, 2591, 2592, 3628, 3629, 768, 2590, + 0, 0, 0, 1634, 1631, 0, 0, 0, 1688, 1688, + 0, 0, 0, 0, 1431, 0, 0, 0, 1617, 0, + 1639, 1637, 0, 0, 0, 0, 0, 1645, 0, 1562, + 1560, 1489, 0, 1487, 0, 1488, 0, 1490, 0, 0, + 1627, 0, 1457, 1475, 0, 0, 0, 1721, 0, 1990, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2487, 0, 0, 927, 933, 936, 937, 939, 931, + 0, 1599, 0, 0, 0, 1412, 1408, 0, 1416, 0, + 0, 0, 1430, 1429, 1895, 1894, 0, 1670, 0, 0, + 1720, 0, 0, 1720, 0, 0, 0, 2484, 1375, 1604, + 1374, 514, 0, 532, 506, 1974, 509, 0, 523, 0, + 535, 0, 0, 0, 323, 0, 1268, 0, 454, 0, + 3395, 3487, 0, 0, 1368, 1376, 1371, 0, 0, 0, + 3314, 3313, 3325, 0, 0, 0, 0, 3298, 3296, 3295, + 3271, 0, 0, 3344, 3338, 3335, 3336, 0, 0, 3277, + 0, 0, 3275, 3279, 3281, 2214, 2213, 0, 2273, 1930, + 2187, 2206, 2208, 2274, 2127, 2131, 0, 1865, 2115, 0, + 0, 2109, 2113, 0, 2468, 0, 0, 2080, 1793, 3718, + 0, 1832, 84, 0, 2317, 2308, 0, 2303, 2306, 0, + 0, 3387, 3388, 3380, 3383, 3381, 3382, 3386, 3389, 3390, + 3377, 3384, 1930, 0, 0, 1202, 1208, 2350, 1186, 136, + 0, 1170, 3651, 2170, 3601, 3614, 1001, 1003, 1002, 987, + 988, 0, 0, 0, 1047, 0, 0, 0, 614, 614, + 170, 0, 0, 200, 3569, 0, 0, 0, 158, 1766, + 1351, 1343, 1345, 1340, 1340, 0, 1730, 0, 0, 0, + 1730, 0, 0, 495, 0, 1811, 1827, 896, 2393, 1884, + 1885, 0, 1880, 1928, 1929, 1882, 1878, 0, 1887, 1889, + 1312, 1946, 1938, 1933, 1361, 0, 1926, 0, 0, 0, + 2014, 2016, 665, 664, 238, 237, 242, 243, 1974, 1974, + 2103, 2102, 1974, 1974, 177, 174, 2101, 2100, 1974, 1974, + 172, 2069, 195, 194, 196, 197, 199, 198, 193, 1035, + 0, 3492, 0, 3499, 3494, 3497, 3477, 3476, 3475, 3472, + 0, 1974, 1974, 1974, 0, 1974, 3513, 3515, 0, 0, + 1036, 904, 3527, 0, 0, 205, 3571, 0, 3573, 0, + 1222, 0, 1221, 249, 378, 1974, 1974, 103, 1974, 95, + 96, 91, 123, 124, 93, 94, 99, 98, 100, 101, + 104, 105, 102, 97, 92, 127, 129, 128, 106, 2010, + 2009, 2008, 130, 125, 126, 90, 0, 1873, 2499, 0, + 0, 1959, 2155, 2147, 2149, 2037, 2035, 3656, 0, 452, + 406, 450, 0, 3402, 3407, 3480, 3479, 3502, 3502, 400, + 378, 400, 425, 0, 1285, 1290, 1294, 0, 1286, 2390, + 834, 857, 857, 874, 820, 840, 836, 840, 3119, 830, + 874, 786, 786, 874, 833, 786, 840, 835, 0, 832, + 874, 831, 786, 857, 824, 857, 780, 781, 786, 857, + 799, 0, 840, 874, 0, 821, 840, 826, 857, 0, + 857, 857, 857, 2976, 857, 857, 284, 840, 764, 770, + 772, 771, 773, 774, 857, 857, 857, 857, 857, 861, + 0, 0, 3694, 0, 273, 404, 408, 462, 445, 0, + 0, 1727, 0, 855, 858, 1698, 909, 0, 1711, 842, + 841, 0, 862, 1713, 0, 1710, 909, 856, 860, 1716, + 1702, 1708, 1715, 909, 1506, 1537, 1510, 1509, 0, 0, + 0, 1569, 0, 1686, 1692, 0, 0, 0, 1544, 0, + 1669, 1667, 1546, 0, 0, 1619, 2484, 1594, 1665, 1572, + 1596, 1549, 0, 0, 0, 1486, 1484, 1485, 0, 1563, + 1585, 0, 1473, 1586, 0, 1570, 1593, 1502, 1992, 1991, + 1989, 1517, 1974, 0, 1574, 1535, 0, 0, 1598, 2488, + 2489, 0, 0, 0, 938, 924, 925, 926, 0, 928, + 930, 932, 0, 1974, 1433, 1432, 1404, 0, 1413, 1410, + 0, 1418, 1897, 1896, 0, 0, 1610, 1612, 1611, 1614, + 1613, 1608, 1718, 1376, 1624, 0, 515, 516, 518, 520, + 597, 0, 510, 539, 499, 0, 514, 502, 1266, 1269, + 0, 3393, 3392, 0, 1372, 1380, 1379, 2478, 2482, 0, + 0, 0, 3311, 3332, 0, 0, 0, 0, 3342, 3341, + 3343, 3309, 3304, 3302, 3301, 1996, 1997, 1995, 1993, 1994, + 2205, 1930, 2201, 0, 1873, 0, 1830, 1375, 2105, 0, + 3655, 0, 2086, 0, 2083, 2090, 488, 2154, 0, 2081, + 2052, 0, 1835, 0, 1836, 1833, 1834, 1974, 0, 0, + 371, 363, 358, 366, 360, 362, 361, 367, 368, 369, + 370, 364, 359, 365, 357, 356, 0, 3375, 1213, 1214, + 0, 1193, 1191, 143, 0, 3405, 164, 0, 149, 152, + 715, 0, 0, 0, 0, 2098, 2098, 2098, 2098, 2098, + 2098, 2098, 2098, 2098, 2098, 0, 2098, 2098, 2098, 2098, + 2098, 2098, 2098, 2098, 2098, 2098, 0, 0, 2098, 2098, + 139, 483, 491, 615, 618, 654, 656, 643, 644, 480, + 0, 141, 269, 231, 0, 0, 0, 257, 0, 680, + 681, 679, 678, 0, 0, 3569, 0, 1354, 1353, 1778, + 0, 1782, 1787, 1783, 0, 1774, 0, 1795, 1839, 1831, + 0, 0, 2401, 1927, 0, 0, 1927, 0, 0, 1375, + 2012, 1374, 176, 181, 180, 173, 186, 179, 1040, 192, + 3493, 3491, 3490, 0, 3498, 0, 3473, 3509, 3507, 3508, + 3511, 0, 0, 3510, 3512, 1041, 1042, 1048, 1043, 1147, + 1147, 0, 1147, 0, 0, 1147, 2098, 0, 0, 495, + 1165, 2098, 0, 0, 0, 0, 0, 1130, 0, 1147, + 0, 0, 0, 0, 0, 1068, 1129, 616, 1018, 1067, + 1069, 1081, 491, 0, 1102, 1132, 1133, 1131, 3528, 0, + 0, 0, 1053, 0, 208, 206, 216, 3570, 0, 2069, + 0, 3573, 1224, 1225, 0, 440, 0, 116, 118, 0, + 120, 122, 0, 112, 114, 2161, 2152, 0, 1960, 0, + 1374, 2069, 294, 0, 0, 3516, 3516, 427, 429, 428, + 2120, 1287, 1295, 2392, 2391, 0, 792, 874, 872, 874, + 806, 875, 844, 837, 844, 808, 914, 820, 0, 874, + 907, 911, 908, 816, 0, 786, 909, 0, 912, 787, + 814, 807, 813, 844, 0, 803, 811, 874, 779, 815, + 802, 0, 844, 817, 822, 825, 827, 829, 844, 874, + 0, 0, 3620, 786, 801, 800, 0, 786, 844, 3620, + 838, 823, 909, 920, 786, 874, 844, 844, 288, 1974, + 290, 375, 445, 3714, 1683, 0, 0, 0, 0, 1699, + 910, 0, 0, 1717, 1700, 1701, 1635, 0, 0, 0, + 0, 1692, 0, 0, 1693, 1651, 0, 0, 0, 0, + 0, 1505, 0, 1615, 0, 1561, 1559, 0, 840, 1464, + 1466, 1462, 1465, 0, 859, 1468, 0, 821, 859, 909, + 1472, 1458, 1459, 1460, 1461, 0, 0, 0, 0, 0, + 2490, 922, 1601, 0, 935, 929, 927, 934, 0, 1409, + 0, 0, 1899, 0, 1672, 0, 1625, 519, 0, 598, + 594, 0, 0, 540, 0, 541, 537, 513, 0, 3394, + 1378, 1377, 0, 3318, 3316, 3315, 3347, 3346, 3299, 3297, + 0, 0, 134, 2130, 1921, 2132, 2133, 2124, 2114, 2112, + 2464, 0, 2087, 2089, 2475, 2474, 2486, 0, 0, 2069, + 2082, 1087, 0, 1088, 1099, 1101, 1293, 0, 2342, 0, + 2340, 2309, 2343, 0, 0, 0, 0, 146, 0, 0, + 0, 1012, 2623, 0, 0, 684, 686, 687, 688, 689, + 0, 716, 691, 610, 965, 965, 718, 2491, 0, 663, + 2098, 484, 1974, 1974, 1974, 1974, 641, 1974, 1974, 1974, + 0, 0, 2098, 1974, 0, 0, 1974, 1974, 1974, 1974, + 0, 0, 1974, 649, 650, 648, 1974, 1974, 2390, 490, + 492, 904, 619, 614, 0, 262, 3676, 475, 476, 0, + 0, 3573, 0, 0, 3589, 0, 3589, 0, 0, 1733, + 1732, 0, 0, 0, 0, 0, 0, 1820, 0, 1819, + 0, 1825, 1829, 0, 0, 0, 0, 2394, 2396, 0, + 2029, 1881, 1890, 1888, 1925, 1937, 0, 2017, 2015, 0, + 3500, 3496, 1977, 1976, 0, 1045, 0, 1044, 1049, 1012, + 610, 1148, 608, 0, 1106, 1110, 1107, 608, 2056, 2056, + 1259, 2056, 0, 0, 0, 0, 2056, 0, 2058, 2056, + 0, 0, 2056, 2056, 0, 1259, 0, 493, 1168, 1166, + 2056, 1167, 2056, 0, 0, 1259, 1119, 1063, 1120, 0, + 1064, 2056, 1259, 1086, 1259, 1259, 0, 617, 904, 1065, + 1066, 715, 1162, 215, 204, 0, 0, 1055, 1057, 0, + 0, 1058, 3572, 1031, 3575, 2069, 1230, 0, 108, 1974, + 109, 1974, 107, 1974, 2069, 0, 1961, 2156, 2150, 3519, + 0, 3401, 3400, 0, 2154, 0, 804, 878, 0, 805, + 846, 847, 845, 850, 782, 778, 915, 919, 918, 809, + 810, 789, 906, 913, 0, 872, 788, 784, 0, 1014, + 796, 0, 785, 828, 783, 797, 0, 280, 0, 3653, + 0, 0, 3660, 286, 812, 3620, 276, 794, 798, 285, + 0, 775, 790, 921, 791, 793, 920, 776, 777, 1974, + 3692, 303, 302, 0, 0, 463, 853, 851, 854, 852, + 0, 1567, 1568, 1689, 1927, 1687, 0, 1694, 1695, 1649, + 1591, 0, 1545, 0, 1616, 0, 1597, 1564, 1467, 1463, + 1470, 822, 1469, 1471, 1588, 1518, 1974, 1575, 1579, 1580, + 0, 1600, 1974, 1411, 0, 1902, 1901, 0, 0, 1927, + 1609, 517, 595, 512, 0, 536, 539, 0, 500, 2479, + 0, 0, 3305, 3303, 2207, 1958, 2465, 2463, 2085, 0, + 0, 0, 2084, 2094, 0, 2067, 1289, 0, 1837, 2338, + 1974, 0, 2307, 0, 1192, 1194, 0, 0, 0, 0, + 0, 717, 1013, 0, 0, 690, 2494, 683, 715, 0, + 0, 0, 965, 707, 610, 0, 1012, 966, 610, 610, + 0, 0, 0, 0, 2007, 2006, 638, 631, 630, 633, + 632, 635, 634, 0, 627, 624, 636, 626, 651, 0, + 639, 621, 676, 677, 675, 645, 652, 622, 623, 629, + 628, 625, 668, 673, 671, 670, 669, 674, 672, 640, + 655, 637, 653, 482, 599, 620, 491, 2000, 2001, 1998, + 1999, 660, 659, 2002, 657, 658, 268, 266, 267, 3665, + 0, 263, 0, 261, 0, 265, 3668, 240, 232, 0, + 378, 479, 477, 478, 0, 0, 157, 271, 258, 260, + 231, 0, 3687, 231, 3573, 1734, 0, 0, 1779, 0, + 1784, 0, 1776, 1815, 1815, 1826, 0, 0, 0, 0, + 2395, 0, 0, 2402, 2404, 1939, 0, 1043, 0, 0, + 0, 1259, 0, 0, 1134, 1104, 0, 0, 0, 0, + 1075, 0, 1084, 0, 0, 2056, 0, 1136, 0, 1135, + 0, 0, 0, 1145, 1146, 0, 1917, 1919, 1927, 0, + 0, 0, 1124, 1143, 1144, 0, 0, 0, 0, 1094, + 0, 1080, 1147, 0, 1147, 1103, 0, 682, 0, 1164, + 1105, 202, 207, 217, 218, 1033, 0, 3574, 1029, 0, + 1231, 1227, 1228, 1223, 117, 121, 113, 2153, 0, 0, + 3523, 3517, 3521, 2121, 2069, 0, 873, 848, 849, 916, + 917, 879, 909, 0, 909, 3620, 282, 0, 279, 3661, + 3662, 0, 0, 795, 312, 311, 309, 378, 299, 307, + 301, 0, 308, 0, 292, 0, 0, 1691, 1647, 0, + 1618, 1620, 0, 923, 0, 1898, 1892, 0, 0, 0, + 0, 0, 0, 1911, 1903, 0, 1676, 0, 597, 0, + 0, 525, 538, 544, 543, 3319, 3317, 2128, 0, 2088, + 2476, 2487, 489, 0, 0, 1100, 2341, 0, 3385, 0, + 1927, 1010, 0, 0, 0, 0, 0, 0, 685, 0, + 610, 961, 962, 1012, 0, 692, 984, 2491, 1012, 1012, + 3112, 857, 780, 781, 786, 857, 799, 2676, 840, 874, + 2680, 821, 840, 826, 857, 722, 857, 857, 857, 857, + 857, 0, 710, 720, 765, 767, 2586, 2587, 2588, 2589, + 2591, 2592, 2590, 2493, 485, 647, 2330, 646, 600, 0, + 2390, 270, 0, 3664, 0, 2976, 3666, 241, 187, 1374, + 213, 0, 3673, 3686, 3590, 3684, 159, 0, 1865, 0, + 0, 0, 1823, 1821, 2399, 2400, 0, 2397, 0, 0, + 2403, 0, 1050, 1046, 1051, 0, 1089, 0, 1108, 0, + 0, 1074, 0, 1245, 0, 0, 1127, 1115, 0, 1070, + 0, 1117, 1118, 1159, 1072, 0, 1920, 494, 0, 0, + 1079, 0, 1162, 1071, 1096, 1077, 1109, 1163, 209, 1059, + 378, 0, 0, 0, 1226, 0, 1233, 0, 3522, 3520, + 0, 2064, 1793, 819, 1015, 818, 3663, 281, 277, 839, + 1974, 289, 310, 291, 3695, 843, 1927, 1543, 1519, 1602, + 0, 1908, 0, 0, 1906, 1905, 0, 1900, 1907, 596, + 593, 0, 0, 533, 551, 547, 0, 549, 550, 572, + 2069, 0, 0, 2093, 2095, 2344, 3355, 0, 1007, 0, + 1008, 0, 3355, 3355, 0, 0, 0, 1012, 984, 2491, + 943, 0, 693, 0, 697, 699, 724, 0, 719, 711, + 732, 0, 0, 661, 481, 264, 0, 3667, 0, 188, + 3677, 3584, 205, 214, 259, 0, 2861, 0, 1742, 1744, + 1767, 1781, 1786, 0, 1816, 0, 0, 0, 2398, 2406, + 2405, 3501, 0, 1091, 609, 1004, 0, 1122, 0, 0, + 1162, 1076, 0, 0, 0, 1116, 1137, 1114, 1259, 1918, + 0, 0, 0, 1113, 1095, 1097, 1205, 0, 211, 187, + 3576, 0, 0, 1232, 1237, 0, 1234, 1236, 1346, 0, + 2380, 0, 300, 1690, 1909, 0, 1910, 1913, 0, 0, + 1914, 0, 529, 531, 521, 0, 526, 0, 545, 0, + 2098, 2098, 0, 2098, 2098, 2098, 2098, 565, 573, 575, + 576, 577, 0, 2129, 2466, 2477, 972, 1927, 0, 0, + 0, 0, 974, 976, 0, 0, 712, 705, 701, 0, + 0, 947, 985, 0, 695, 0, 0, 887, 941, 750, + 0, 753, 0, 885, 723, 725, 883, 884, 727, 0, + 0, 0, 766, 0, 0, 865, 0, 868, 0, 0, + 721, 0, 733, 864, 871, 2492, 642, 487, 662, 0, + 0, 0, 216, 187, 0, 1741, 0, 0, 1818, 1817, + 1832, 0, 0, 0, 539, 1090, 1005, 1123, 0, 1112, + 495, 539, 1128, 1073, 1125, 1126, 495, 0, 1078, 210, + 0, 203, 219, 3577, 3578, 1229, 0, 2122, 895, 278, + 1904, 1912, 1916, 1915, 527, 0, 534, 558, 548, 554, + 0, 2098, 0, 0, 2098, 0, 0, 0, 0, 0, + 542, 574, 2098, 0, 0, 2098, 0, 993, 995, 1138, + 973, 997, 996, 978, 994, 1006, 1011, 1010, 3355, 190, + 0, 1138, 975, 999, 982, 1138, 977, 998, 980, 0, + 0, 0, 0, 703, 0, 946, 0, 951, 0, 0, + 0, 0, 751, 752, 888, 726, 886, 882, 876, 870, + 2503, 2504, 0, 0, 0, 762, 763, 866, 759, 760, + 761, 0, 741, 0, 0, 872, 863, 734, 3671, 0, + 0, 0, 3674, 1746, 1743, 0, 1751, 1753, 1752, 1754, + 1745, 0, 0, 0, 1111, 1093, 0, 1121, 1083, 1085, + 1082, 0, 212, 1235, 0, 2381, 533, 530, 558, 0, + 556, 0, 552, 546, 553, 0, 590, 584, 0, 586, + 587, 585, 582, 569, 0, 567, 0, 989, 992, 1974, + 990, 144, 1140, 1139, 979, 0, 972, 0, 150, 983, + 153, 981, 708, 0, 0, 0, 0, 944, 0, 948, + 949, 950, 0, 942, 0, 0, 0, 0, 877, 881, + 2438, 2437, 0, 1381, 869, 0, 736, 880, 735, 0, + 3669, 1374, 218, 0, 1748, 0, 0, 1824, 1822, 1092, + 539, 2123, 2135, 0, 2407, 528, 555, 0, 563, 559, + 561, 564, 589, 588, 0, 566, 0, 583, 666, 991, + 1142, 1141, 1009, 1138, 1000, 709, 0, 1008, 0, 945, + 0, 0, 972, 0, 974, 976, 758, 0, 867, 728, + 728, 742, 3672, 0, 3585, 201, 1747, 0, 1755, 0, + 0, 0, 0, 2393, 557, 0, 0, 578, 571, 568, + 147, 0, 0, 1008, 957, 956, 0, 0, 953, 952, + 694, 972, 698, 700, 1382, 0, 739, 729, 731, 738, + 744, 745, 743, 746, 3670, 0, 1750, 0, 1761, 1760, + 1749, 0, 1756, 1758, 1098, 2134, 2136, 0, 2401, 562, + 560, 570, 579, 581, 706, 972, 0, 960, 958, 959, + 0, 0, 696, 1383, 730, 737, 747, 749, 0, 1738, + 1739, 1737, 1736, 1735, 1762, 0, 0, 1757, 0, 1759, + 0, 2409, 580, 702, 972, 0, 0, 748, 3586, 1764, + 1763, 0, 0, 2408, 0, 2413, 704, 955, 954, 3581, + 0, 0, 2420, 3579, 3580, 0, 3587, 2411, 2412, 2410, + 0, 2415, 0, 2417, 2418, 0, 2069, 3582, 378, 2419, + 2414, 0, 2421, 2423, 0, 2382, 187, 2416, 0, 1374, + 3588, 2422, 0, 1375, 2424 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -5341, -5341, -5341, -5341, 2297, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 2818, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 2032, -5341, 389, -5341, 394, -5341, 393, -3726, -593, + -5341, -1880, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 2183, -2922, -5340, -5341, -5341, -235, 1368, -5341, + -5341, 144, -5341, -262, -5341, -5341, -5341, -4405, -410, -629, + -5341, 45, 4647, 3659, -82, 3990, 945, -4381, -5341, -5341, + -5341, -5341, -5341, -5341, -1919, -5341, -5341, -5341, -5341, 333, + 167, -5341, -5341, -5341, -5341, -5341, 1453, -2126, -628, 367, + 37, -5341, -89, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 22, -5341, -5341, -5341, -173, 739, -4505, -5341, -5341, -5341, + -5341, 2419, -5341, 1834, -5341, -1747, 3685, -5341, -5341, -5341, + -5341, -5341, 2829, -2466, -5341, -5341, -5341, 1510, -5341, -2790, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -301, -5341, -2031, + 1985, -5341, 2042, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -1220, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 3355, -5341, 4605, -5341, -5341, 1228, -5341, 3245, + -5341, 3247, 3248, -2766, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -71, -68, 207, 873, 1385, -5341, -3887, -5341, + -5341, 120, -5341, -5341, -5341, -5341, -5341, 1120, 317, 1117, + -5341, 686, 3025, -2825, -5341, -5341, -5341, -5341, -5341, -5341, + -409, 27, -516, -5341, -4382, -5341, -4835, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -4018, -5341, -5341, -5341, -644, + -5341, -5341, -604, -5341, -5341, -5341, -5341, -293, -5341, -5341, + -3828, -5341, -5341, -5341, 38, -5341, 2760, 4052, -1887, 521, + -679, -5341, -3767, 904, -3962, -3891, -5341, -3849, -5341, -191, + -1300, -1294, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 482, + 297, 903, -4323, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -4322, -4320, 174, -5341, -5030, -5341, 636, -5341, -4857, -5341, + -5341, -5341, -5341, -5341, -5341, -611, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -3864, -5341, -5341, -454, -461, -5341, -354, + -3414, -5341, -2742, -4795, -342, -1415, -341, -340, -339, -5341, + -2110, 1218, 1339, -5341, -5341, -5341, -5341, -3372, -3229, -5341, + -2076, -3524, -3280, 1269, -3076, -3540, 1295, -452, -4346, -4849, + -575, -5341, -3899, -5341, -5341, -3636, -4034, -5341, -670, -2770, + -3171, -360, -5341, -5341, -1705, -3212, -5341, 863, -4055, -4074, + 426, 1707, -5341, -5341, 1204, -5341, -1642, 1202, -5341, -5341, + -5341, 1211, -5341, -605, -5341, -5341, -5341, -5341, -4097, -5341, + -2475, -4344, -5341, 5410, 5411, -2786, -574, -573, -5341, -5341, + -5341, -137, 2300, -5341, -3080, -377, -387, -384, -3133, -29, + -4870, -3687, -4250, -3722, 860, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 224, + 228, 1570, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 954, -1966, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -4785, -3009, -5341, -5341, 540, -5301, -3967, -3964, -4301, 4008, + -5341, -5341, -5341, -5341, 4094, -3312, -4244, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 3593, 1439, -5341, -5341, 2331, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -180, 2340, + -5341, -5341, -5341, -5341, -5341, 2802, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -318, -5341, -5341, -5341, -5341, -5341, + -13, 3446, -5341, -5341, -5341, -5341, 5, -5341, -5341, -5341, + -5341, 2496, -5341, -5341, -5341, -5341, 2973, -5341, -5341, -5341, + -5341, -5341, -5341, 2144, -5341, 2717, -5341, -2450, -5341, -5341, + 1410, -153, -5341, -5341, -19, -5341, -5341, -5341, -5341, -5341, + 35, -5341, -5341, -5341, 5404, -1539, 7, -66, -5341, -5341, + 6, -5341, -5341, 4147, -435, 2544, -717, 4778, -5341, -5341, + -5341, -5341, -2485, 2408, -5341, 4205, -5341, -5341, 4395, 1641, + 4167, 2282, 947, 2507, -1670, -164, -3006, 1238, -5341, 1423, + 596, 10618, -5341, -1480, -1521, -5341, -5341, -41, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 2608, 2609, -5341, -5341, + 3888, -5341, 2543, -3755, -5341, -5341, -850, -5341, -2479, -5341, + -5341, -5341, 2545, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 1740, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3837, -1597, -5341, + -5341, 3973, -5341, 1833, -5341, 864, -5341, -5341, 1670, -5341, + -2759, -5341, -5341, -1538, -636, -5341, 3978, -5341, 3995, -1191, + -4064, -5341, -1749, -467, -5341, -249, -5341, -5341, -5341, -5341, + -5341, -3437, -561, -559, -5341, -5341, -5341, 3594, -5341, 4238, + -5341, -5341, -5341, -5341, -5341, -5341, 3602, -5341, -2060, -5341, + -2534, 4242, 4254, 4262, -5341, 4263, -5341, -5341, -1522, 310, + -5341, 674, -5341, -5341, -5341, -5341, -5341, 1216, -5341, -237, + 779, -234, -4276, -1558, 1092, -5341, -5341, -1892, 3617, 4013, + -1271, -5341, 2915, -5341, 3608, 1786, -5341, 2342, -5341, 1099, + 1103, -5341, -5341, 1794, -5341, -5341, -5341, -5341, 483, -123, + -5341, -5341, -5341, 53, 819, -2046, -5341, 496, -3188, 4264, + -168, -5341, 2344, -1961, -3142, -1174, 909, -1278, 2352, 480, + 4847, -449, -5341, -5341, 4223, -5341, -2833, -5341, -603, -1540, + -1028, -3036, -3077, -4711, -5341, -2250, 1347, -5341, -5341, -5341, + -5341, 1124, -5341, -5341, -5341, 2946, -5341, 5520, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -701, -1176, + -5341, -5341, 2854, -936, -159, 5541, -17, -5341, -5341, -15, + -5341, -5341, 4945, -2016, -5341, -5341, 4390, 3483, 2826, -5341, + 1512, -5341, -5341, -5341, -5341, 1259, -5341, -5341, 216, -1158, + -521, 2347, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 825, + -5341, 1278, -1857, -5341, -5341, -5341, -5341, -9, -5341, -5341, + -5341, -5341, 1281, -5341, -445, -5341, -8, -5341, -5341, -5341, + 4816, -5341, -5341, -5341, -5341, -5341, -5341, -4085, -5341, -5341, + 3558, -1425, 4819, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 3127, -5341, -5341, -5341, -5341, -5341, -5341, 3852, 4978, 4981, + -1660, -5341, -926, 3128, 2536, -1087, -5341, -5341, -5341, 4268, + 4989, -5341, -5341, 49, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 3079, 170, -5341, -5341, -5341, -5341, + -5341, 520, -5341, -5341, -5341, -5341, 3753, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 4156, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 1544, -419, -5341, 768, -462, -5341, 395, -5341, -5341, + -5341, -5341, -5341, -532, -5341, -5341, -536, -5341, -1386, 4734, + -1306, -5341, -1697, -3307, -5341, 12, -5341, -5341, -5341, 3131, + -5341, -5341, -5341, -5341, 2877, -2504, -5341, 547, -5341, -5341, + -2651, -924, -1661, -3990, 231, -5341, -5341, -586, 1742, 9697, + -5341, -5341, 69, -474, -1243, -5341, -5341, 2827, -5, -825, + -126, -757, -767, -1060, -5341, 4654, -5341, -5341, -5341, -625, + -576, -568, -388, -507, 946, -618, 7026, 8611, -639, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 2588, + 2590, -5341, 5014, -5341, 3505, 3232, -5341, -5341, -5341, 2595, + -5341, -5341, -5341, 5021, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 2602, 2611, 2614, -5341, -5341, 1850, + -2371, -5341, -5341, -1908, 250, -5341, 3541, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 3768, -580, 4532, -549, + 3965, 5034, 4573, -5341, 4208, -5341, 4210, -5341, 1678, -5341, + -858, 2678, -1393, -3465, -5341, -5341, 2994, 1205, -5341, -5341, + -2520, -3086, -5341, 2519, 1119, -5341, -5341, 370, -5341, -5341, + -5341, 1676, 440, 5012, 4453, -5341, -5341, -5341, -5341, 5618, + 2030, -5341, 267, 5644, 5645, 5649, -414, -5341, -3150, -5341, + -4306, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 854, -5341, -5341, -5341, 2087, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -1435, 4820, -5341, 1621, -2598, + -5341, -5341, -530, -5341, -5341, -5341, -5341, -5341, 3563, -5341, + 2305, -5341, -5341, -5341, -4358, -5341, -5341, -4340, -5341, 486, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -1399, + -5341, -5341, -5341, 80, -911, 44, -5341, -5341, -5341, -5341, + -5341, -5341 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + 0, 69, 742, 1945, 70, 71, 72, 73, 74, 1911, + 75, 1261, 2571, 1263, 1876, 2574, 76, 711, 77, 2074, + 2763, 2764, 4592, 4593, 4586, 4587, 4589, 4590, 2765, 822, + 823, 2613, 2614, 78, 2631, 3948, 3212, 1947, 4816, 2625, + 5157, 1952, 4819, 1953, 4820, 2623, 3954, 4475, 1957, 1958, + 751, 3949, 3295, 3296, 5660, 1322, 3208, 3304, 3305, 2636, + 4465, 4572, 5568, 4576, 5708, 5841, 5662, 3323, 4991, 5569, + 5570, 646, 1332, 2126, 786, 2040, 5512, 2712, 5248, 2713, + 79, 815, 2063, 3330, 1436, 2064, 2065, 4882, 4883, 5258, + 5239, 5240, 5241, 5242, 4463, 4875, 4468, 2849, 2071, 5055, + 5047, 5048, 4662, 3412, 3413, 4669, 3414, 5069, 5074, 3378, + 3379, 4108, 3415, 5387, 5388, 5389, 666, 1132, 5390, 80, + 81, 667, 675, 668, 1129, 2430, 1130, 82, 83, 709, + 1901, 1902, 1903, 1904, 3174, 2591, 3168, 3169, 4404, 5056, + 3417, 84, 647, 917, 918, 919, 920, 2180, 921, 2851, + 3434, 922, 2843, 3403, 923, 924, 925, 893, 818, 2795, + 2854, 3435, 2796, 3380, 2855, 2177, 926, 927, 928, 929, + 930, 1543, 894, 2146, 3389, 4122, 85, 628, 819, 1438, + 2069, 820, 2070, 3333, 821, 2067, 1441, 3439, 2114, 848, + 1473, 931, 1138, 3440, 932, 2183, 2185, 2182, 3438, 4682, + 2184, 86, 657, 685, 645, 1471, 673, 4879, 5254, 4450, + 4873, 4451, 5223, 4375, 4868, 4869, 4870, 5319, 3153, 87, + 660, 1114, 1731, 2422, 3833, 3025, 3027, 2423, 3832, 4315, + 4316, 4317, 3023, 3024, 5421, 3029, 3830, 5613, 5966, 5731, + 5732, 3822, 5736, 4324, 4764, 4765, 4766, 5127, 5423, 5619, + 5860, 5737, 5973, 5858, 5969, 5859, 5971, 6096, 6049, 6050, + 5870, 5984, 5985, 6054, 6097, 5747, 5748, 5749, 6141, 6142, + 5750, 3826, 3827, 5418, 4760, 5499, 3199, 3200, 2035, 5293, + 1272, 88, 4452, 4556, 4453, 4454, 5193, 5878, 5807, 4456, + 4457, 4458, 6057, 1806, 5219, 5205, 4473, 5336, 4459, 4824, + 4825, 4826, 4827, 5773, 5909, 5775, 5776, 5902, 6006, 5901, + 4828, 4829, 5165, 5648, 5173, 4951, 4830, 4831, 4832, 5180, + 5482, 5650, 5646, 5784, 5785, 6116, 6117, 5800, 6081, 5801, + 6123, 6155, 6156, 5786, 89, 659, 1680, 5925, 5926, 5927, + 4176, 5483, 4177, 4178, 4179, 4649, 4180, 4181, 4182, 4183, + 4184, 4185, 4186, 4187, 4188, 4189, 5061, 4652, 4209, 5023, + 5024, 4203, 4204, 4218, 4648, 4219, 4213, 5802, 5803, 5017, + 4653, 6019, 4621, 5036, 5937, 5787, 5804, 5789, 4637, 1756, + 1757, 3244, 1771, 1772, 3074, 3075, 2038, 4638, 4689, 4639, + 5064, 4283, 5110, 4289, 4290, 4291, 3784, 3785, 3786, 3787, + 3788, 2983, 5790, 5455, 5771, 5904, 5907, 6013, 6108, 5174, + 4833, 5178, 1231, 4834, 4835, 5879, 5891, 5895, 5880, 5896, + 5892, 5642, 3203, 5881, 5882, 5883, 5898, 5894, 3939, 5884, + 5439, 5760, 5440, 5161, 5038, 90, 164, 4051, 1405, 2699, + 1407, 1417, 3327, 2725, 2724, 1420, 1419, 2717, 4021, 4527, + 4928, 4050, 3324, 4055, 5345, 784, 4558, 5698, 5543, 5706, + 5545, 4559, 4802, 4560, 5683, 5825, 4561, 5564, 5704, 5837, + 4803, 4804, 4562, 4563, 4564, 5991, 5992, 5993, 4937, 1850, + 798, 799, 1425, 1426, 1427, 2790, 5340, 4963, 91, 3194, + 2607, 92, 1289, 1290, 1291, 1923, 1924, 2610, 2611, 3931, + 4412, 93, 1256, 2567, 1913, 2599, 94, 1275, 3185, 3186, + 3187, 3925, 95, 1433, 2059, 2060, 2729, 4062, 4584, 4996, + 5353, 5576, 5349, 5715, 5716, 96, 826, 1444, 97, 630, + 2083, 2084, 2085, 2767, 98, 1552, 172, 99, 1740, 1737, + 2436, 2437, 100, 1255, 1863, 1864, 1865, 1866, 3149, 101, + 2154, 2813, 2814, 2815, 2816, 2562, 3900, 2563, 2564, 3158, + 4128, 102, 765, 1400, 103, 764, 1399, 104, 105, 684, + 737, 677, 1747, 107, 108, 4376, 2225, 110, 771, 769, + 1074, 112, 1392, 1388, 113, 2226, 1075, 761, 762, 1340, + 1158, 3229, 3230, 2094, 2095, 2669, 2656, 1159, 1160, 1369, + 2020, 2686, 2448, 2449, 1846, 2450, 3845, 4334, 6078, 1581, + 1483, 1259, 1077, 1078, 1079, 1691, 1692, 1707, 1080, 1701, + 2373, 4262, 4731, 4732, 4733, 4734, 2312, 2313, 2417, 1081, + 2302, 2303, 2304, 1082, 1083, 1084, 1085, 1086, 1087, 1088, + 2295, 2296, 2297, 1089, 1090, 1091, 2412, 4244, 4245, 4713, + 3018, 3019, 3020, 1092, 2880, 4228, 2891, 2892, 2254, 1093, + 1094, 1095, 1096, 1097, 3808, 1098, 4305, 3987, 1099, 1553, + 2189, 2252, 4701, 4233, 5083, 4703, 4704, 5087, 2194, 2868, + 3705, 3706, 3707, 2316, 2317, 1601, 1602, 1570, 1571, 1341, + 4891, 6164, 1342, 5267, 5667, 5668, 5817, 6033, 5950, 5951, + 6130, 6131, 6132, 6133, 1343, 2642, 4476, 1344, 1345, 1346, + 3971, 3972, 4892, 4480, 4894, 4484, 1981, 1982, 1985, 1986, + 1347, 1348, 1349, 1350, 1969, 1351, 1352, 1353, 2661, 5522, + 4900, 4901, 5677, 5676, 4902, 4489, 4490, 3975, 3976, 4383, + 4384, 4385, 3240, 2248, 2249, 2324, 2159, 2160, 2161, 2195, + 1361, 1996, 2677, 3250, 1998, 3248, 3982, 3252, 3988, 3989, + 2404, 3008, 3804, 3010, 4752, 5117, 5118, 5413, 5601, 5602, + 5607, 4567, 5316, 5317, 2778, 1370, 2694, 3267, 3985, 1808, + 1809, 1372, 2002, 2681, 3256, 1810, 2009, 2010, 3261, 3369, + 1373, 1374, 1386, 1391, 1377, 1375, 2840, 4523, 5072, 3789, + 3772, 4808, 5232, 2218, 2219, 5186, 4092, 1378, 2697, 3999, + 4000, 4001, 1357, 1358, 1991, 1992, 1993, 1379, 1359, 2670, + 3978, 114, 704, 115, 2110, 837, 1468, 2109, 3165, 1446, + 3897, 2089, 2090, 1460, 792, 644, 116, 648, 4123, 117, + 688, 3896, 895, 2714, 1511, 1858, 1512, 2556, 3144, 3145, + 4377, 4798, 4378, 4791, 4792, 4379, 1244, 5142, 5143, 1403, + 4017, 4018, 4012, 2550, 3138, 1245, 1851, 3890, 2547, 3891, + 2548, 2576, 3892, 5014, 5580, 5964, 2544, 118, 682, 4364, + 5620, 3884, 3885, 6041, 6042, 1242, 119, 632, 2088, 833, + 1449, 1452, 1453, 2098, 4601, 2774, 5004, 4103, 4600, 1454, + 1455, 2776, 834, 835, 120, 725, 3195, 1295, 1830, 1831, + 1832, 2531, 121, 679, 1232, 3879, 4361, 2517, 663, 5752, + 1813, 1235, 1814, 2513, 3120, 1794, 122, 1397, 1395, 813, + 123, 124, 777, 173, 2025, 125, 126, 1264, 1894, 2588, + 3907, 3908, 4388, 1895, 1896, 3166, 127, 692, 1250, 3162, + 4809, 4810, 5152, 128, 716, 1279, 1280, 1917, 1915, 3190, + 2602, 129, 2424, 130, 649, 898, 1515, 1516, 2152, 131, + 719, 1284, 132, 133, 900, 4129, 5848, 6044, 653, 2156, + 1520, 5224, 4492, 4907, 4908, 4910, 5283, 5284, 6093, 6185, + 6199, 6192, 6202, 6203, 6206, 6212, 6213, 1100, 1302, 1303, + 1101, 5930, 1102, 1103, 1104, 2227, 1248, 687, 1854, 1855, + 5137, 5428, 2554, 3141, 2143, 2144, 1856, 4793, 4794, 3047, + 3249, 1105, 3886, 5162, 1447, 2091, 1267, 613, 1106, 614, + 1107, 1108, 794, 1304, 1988, 2823, 1181, 3060, 1109, 934, + 1413, 1738, 2048, 2049, 2824, 616, 3061, 1182, 3709, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 3716, + 135, 678, 1190, 1768, 1776, 2467, 1766, 2479, 3100, 2481, + 2482, 3105, 2483, 1238, 2454, 1767, 3089, 4347, 4346, 2480, + 3871, 4781, 4780, 2484, 2475, 3867, 3853, 3070, 4341, 5131, + 5130, 2462, 2461, 2460, 2470, 2471, 2472, 2473, 3864, 3080, + 3086, 136, 901, 2165, 656, 1522, 1523, 2837, 137, 681, + 138, 710, 1269, 2595, 3178, 3179, 3920, 4406, 3921, 139, + 1143, 1144, 140, 884, 3206, 2799, 2104, 1416, 886, 2105, + 2127, 888, 1475, 889, 890, 891, 892, 4040, 3316, 3317, + 2804, 2107, 2050, 2444, 3309, 4513, 2051, 4034, 4035, 4514, + 2722, 5360, 4047, 3320, 5011, 4113, 5361, 5362, 141, 696, + 142, 5249, 703, 1258, 1873, 143, 144, 145, 146, 770, + 1382, 1161, 165, 166, 167, 168, 802, 803, 3326, 4057, + 4579, 4580, 5347, 6195, 6196, 2635, 3952, 5811, 6125, 6189, + 6208, 5260, 5261, 147, 1309, 1305, 736, 1943, 1937, 1939, + 2621, 3198, 148, 149, 150, 5052, 151, 1541, 2809, 2072, + 3717, 3718, 627, 939, 3428, 3933, 850, 5050, 1247, 2551, + 2112, 940, 941, 942, 5053, 3429, 5244, 5259, 5246, 5513, + 5665, 3214, 3951, 5250, 152, 153, 2633, 3957, 3955, 2173, + 2850, 3430, 4680, 943, 944, 945, 946, 2186, 947, 1533, + 155, 1861 +}; + +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int16 yytable[] = +{ + 615, 801, 738, 695, 797, 1539, 111, 109, 1179, 1230, + 2349, 2026, 134, 1758, 2594, 1761, 1762, 2399, 938, 2577, + 807, 669, 1415, 1775, 2618, 669, 2771, 658, 2716, 916, + 669, 2100, 1414, 683, 938, 106, 796, 2258, 2432, 1189, + 2217, 3846, 1339, 3268, 154, 1137, 706, 2224, 4088, 3142, + 2779, 2617, 714, 1183, 2696, 1836, 718, 707, 3416, 2011, + 1188, 4002, 2011, 715, 4106, 1316, 885, 1317, 1260, 3940, + 1319, 1320, 3977, 1603, 739, 1739, 676, 1525, 790, 1530, + 3996, 1531, 1532, 3878, 4565, 2289, 4487, 4566, 1536, 3157, + 2015, 1999, 1180, 3442, 3443, 2278, 885, 887, 2172, 4455, + 4455, 2543, 1184, 4003, 3098, 2036, 3720, 3207, 3721, 2121, + 1185, 2037, 3154, 1989, 699, 3992, 1564, 2333, 780, 1932, + 3722, 1804, 2501, 2502, 4208, 3167, 1445, 1145, 1286, 3888, + 3236, 1293, 4690, 3704, 3771, 2352, 3332, 3704, 2431, 2508, + 111, 782, 4690, 1837, 2731, 2853, 1964, 2701, 1193, 4690, + 936, 785, 787, 2590, 808, 787, 809, 795, 810, 2524, + 4557, 4694, 4222, 5233, 811, 812, 936, 4987, 4695, 106, + 3232, 1186, 778, 4217, 5071, 3231, 3231, 4059, 4217, 111, + 109, 2096, 4461, 2537, 2538, 134, 5371, 2384, 2385, 2386, + 2387, 2388, 2389, 2390, 2392, 2394, 2395, 2396, 2397, 2398, + 3824, 4373, 4455, 2432, 4411, -2501, 4934, 4935, 106, 4936, + 4896, 3979, 3980, 2364, -1868, -1868, 4210, 1676, 1678, 1679, + -2502, 2372, 2374, 2838, 2377, 2378, 1539, 2587, -2650, 4939, + 1721, 4941, 1644, 4046, 4953, -1020, -1020, 1662, -2666, -3378, + -3378, 1666, 4636, 4636, 2838, 4285, 4636, 4582, 4971, -2795, + -2795, -384, -384, 4636, -3379, -3379, 2838, 2061, 3961, 4636, + 2788, 2157, 1404, 938, 2838, 938, 2766, 938, 938, 935, + -2098, -486, -486, 5351, 938, 4995, 1401, 938, 672, 2862, + 4212, 1401, -2667, 2838, 2612, 935, 3877, 3362, 1163, 5444, + 5445, 5422, 4799, 3231, 4372, 4373, 1686, 701, 4286, 2838, + 1489, 2838, -2668, 2431, 1687, 1838, 4073, 1686, 2210, 2211, + 2212, 5059, 2213, 1688, 2214, 1687, 2215, 2210, 2211, 2212, + 2838, 2213, 1390, 2214, 1688, 2215, 723, 817, 2032, 1686, + 3769, 1686, 2210, 2211, 2212, 1389, 2213, 1687, 2214, 1687, + 2215, 1330, 1686, 650, 2157, 689, 1688, 1401, 1688, -3456, + 1687, 2980, 4031, 1401, 779, 755, -3378, -3439, 1401, 1688, + 720, 2838, 1708, 2834, 2720, -3443, 2876, 3393, 1708, 5842, + 5972, -3379, 5184, 4020, 5187, 4232, 4010, 4331, 4332, 1401, + 3306, 5754, 2798, 1941, 1246, 5484, 4205, 32, 1686, 5727, + 1431, 1709, 1710, 5189, 800, 936, 1687, 936, 4206, 936, + 936, -3378, 1423, 4216, 3205, 1688, 936, 2106, 4613, 936, + 661, 1686, 1686, 2838, 3923, 3924, -3379, 2835, 3021, 1687, + 1687, 829, 806, 4223, 2928, 1401, 2172, 4112, 1688, 1688, + 4836, 3146, 1760, 1800, 5191, 804, 2118, 2789, 39, 4618, + 2838, 1325, 1401, 32, 1401, 6127, 1686, 1795, 4671, 4618, + 1686, 6079, 5649, 5020, 1687, 1711, 830, 2665, 1687, 4348, + 1708, 1711, 2557, 1688, 665, 2076, 690, 1688, 2032, 4285, + 5562, 1689, 693, 5942, 836, 5021, 838, 839, 840, 841, + 842, 843, 1689, 844, 845, 3134, 5209, 3311, 1686, 1709, + 1710, 5179, 4872, 5823, 39, 5247, 1687, 1802, 938, 2917, + 717, 2788, 1708, 41, 1689, 1688, 1689, 6179, 4060, 3877, + 2200, 3201, 4958, 1136, 935, 1437, 935, 1689, 935, 935, + 883, 5549, 4286, 169, 1331, 935, 1686, 4511, 935, -1943, + 3037, 1709, 1710, 1732, 1687, 5245, 4089, 32, 1871, 1752, + 1712, 4374, -2795, 1688, 1686, -3378, 1712, 6128, 1686, 2619, + 883, 2162, 1687, 1711, 2365, 1868, 1687, 2627, 4630, 4821, + -3379, 1688, 4690, 1689, 5071, 1688, 766, 1296, 1297, 5852, + 698, 1254, 5630, 4836, 1972, 5256, 3875, 4469, 1690, 896, + 2992, 5031, 698, 1207, 1459, 1270, 1689, 1689, 39, 1690, + 5998, 6197, 2455, 4614, 6000, 1711, 1371, 41, 4690, 767, + 1907, 1371, 2157, 1371, 3155, 4455, 651, 2465, 2878, 5724, + 3030, 1690, 3312, 1690, 1686, 2033, 1163, 5062, 1542, 3156, + 1339, 1689, 1257, 4220, 1690, 1689, 1727, -3442, 694, 3307, + 936, 1688, 1833, 2366, 1835, 3015, 4470, 4539, 1712, 1948, + 849, 795, 1951, 3016, 629, 1686, 1954, 1955, 1956, 3077, + -221, 4016, 4957, 1687, 3127, 4690, 5728, -3440, 1736, 2993, + 2222, 4626, 1688, 1689, 2047, 1134, 4557, 6104, -714, -3441, + 1690, 795, 6198, -3446, 5103, 1163, 1603, 4628, 2789, 1432, + 1712, 5824, 1753, 5853, 2442, 5690, 1251, 1469, 1470, 3135, + 4217, 2093, 795, 1690, 1690, 2679, 2011, 5380, 824, 3966, + 4014, 1689, 2077, 3970, 4090, 1268, 795, 2201, 4455, 2505, + 6080, 2507, 1676, 1678, 2511, 4471, 1135, 1466, 3859, 1689, + -715, 3257, 2367, 1689, 2682, 2163, 2519, -1868, 1690, 2522, + 2499, 4925, 1690, 2525, 2036, 3444, 4636, 4520, 1315, 768, + 2037, 3960, 1908, 2075, 654, 2047, 4959, 3231, 2994, 935, + 1803, 2172, 5605, 831, 780, 2033, 1461, 1462, 1463, 2540, + 2541, 2542, 6100, 4622, 4636, 4624, 1733, 2108, 4636, 4656, + 1690, 1394, 4657, 4512, 4643, 4636, 1387, 3242, 6129, 5705, + 2651, -1868, 1273, 897, 795, 4926, 2078, 2861, 2079, 4320, + 824, 2666, 5954, 824, 4658, -1943, 2986, 2987, 4349, 1686, + 795, 938, 2981, 1801, 4466, 4670, 829, 1687, 1690, 1434, + -3378, 2433, 4313, 3314, 2418, 3321, 1688, 654, 1326, 3022, + 1689, 5729, 780, 6180, 5022, -3379, 1690, 4202, 5452, 1456, + 1690, 1458, 171, 787, 787, 787, 1464, 4287, 795, 4061, + 1424, 830, 1421, 4960, 6105, -2678, 1686, 2877, 1363, 1874, + 2721, 2187, 5792, 4619, 1687, 4210, 691, 4210, 6106, 1281, + 1686, 654, -2161, 1688, 1942, 4769, 4210, 1872, 1687, -3565, + 695, 1686, 2786, 2401, 2419, 3128, 6220, 1688, 2080, 1687, + 827, 662, 4210, 3360, 3376, 885, 4210, 1465, 1688, 1467, + 3876, 4039, 832, 1365, 847, 2721, 780, 4210, 1529, 3000, + 3001, 4877, 3004, 3005, 2721, 654, 2769, 1534, 948, 5225, + 1537, 1207, 68, 1797, 4032, 2536, 1711, 4202, 5571, 2807, + 1962, 2082, 3031, 1544, 111, 109, 1686, 1690, -3456, 5364, + 134, 1240, -2161, 936, 1687, 3202, -3439, 2204, 1686, 3359, + 2836, 1266, 4126, 1688, -3443, 4630, 1687, 4632, 724, -2650, + 2029, 1874, 2081, 106, 1490, 1688, 652, 1389, 5516, -2666, + 4212, 4524, 4288, 4631, 1686, 5730, 2839, 5968, 68, -2507, + 1207, 2158, 1687, -2650, 1689, 2082, 2433, 3981, 2443, 4583, + 1645, 1688, 721, -2666, -2508, 1663, 2376, 2839, 1414, 1667, + 1354, 4836, 3877, 5519, -1868, 5520, 5959, 1402, -115, 2839, + -115, 1712, 1402, -2667, 738, 5352, 1663, 2839, 4327, 4934, + 4935, 4565, 4936, 2327, 4566, -1020, 1834, 5586, -119, -3378, + -119, 1689, 4455, -2668, 4455, 1334, 2839, -2667, 4020, -2795, + 722, -384, 3370, 4953, -3379, 1689, 1750, -111, 6014, -111, + 6016, 6017, 2839, 2890, 2839, 1759, 1689, -2668, 883, 4551, + 2523, -486, 935, 1773, 2158, 4616, 4617, 3308, 1686, 2990, + 1414, 4287, 68, 2839, 2216, 4015, 1687, 1684, 1402, 2082, + 3770, 2839, 1796, 2288, 1402, 1688, 1681, 4647, 2929, 1402, + 2982, 1690, 1683, 4650, 1807, 5071, 6027, 4557, 6114, 5155, + 2812, 2879, 4659, 2695, 4663, 4664, 4665, 3254, 4667, 4668, + 1402, 1689, 2488, 1774, 2839, 5663, 5226, 1179, 4672, 4673, + 4674, 4675, 4676, 1689, 1713, 1714, 1715, 1716, 1717, 1718, + 1719, 1720, 1715, 1716, 1717, 1718, 1719, 1720, 1690, 4455, + 795, 5247, 1521, 1339, 6066, 6067, 1253, 2357, 1189, 1689, + 3234, 3235, 1690, 3297, 4919, 6073, 1402, 1693, 1694, 1695, + 2420, 1696, 1183, 1690, 5233, 5233, 2839, 795, 2909, 1188, + 1539, 2884, 5655, 1402, 2368, 1402, 795, 655, 6107, 795, + 2464, 5664, 885, 4472, 795, 3771, 3771, 1815, 4836, 3771, + 3771, -3266, 4878, 2839, 5100, 3771, 3771, 3101, 5102, 3849, + 2995, 1180, 4927, 2047, 2503, 2885, 3078, 2898, 6103, 2899, + 4217, 1184, 4978, 2456, 4217, 795, -3442, 5572, 1690, 1185, + -3471, 3079, 4522, 2600, 1715, 1716, 1717, 1718, 1719, 1720, + 1690, 1686, 4961, 2166, 654, 1798, -1828, 1313, 2509, 1687, + 1909, 1371, 1995, 1689, 2174, 2900, -3440, 2901, 1688, 631, + 655, 32, 807, 1857, 1779, 780, 1690, 1193, -3441, -2681, + 780, 780, -3446, 3861, 1339, 1714, 1715, 1716, 1717, 1718, + 1719, 1720, 1491, 2052, 4048, 1339, 1339, 1910, 1697, 2805, + 1186, 738, 2468, 2629, 2630, 2894, 1920, 832, 5123, 825, + 2638, 2639, 2640, 3904, 655, 1845, 3834, 670, 1513, 3310, + 780, 1933, 39, 2895, 824, 2914, 824, 2584, 4690, 3072, + 4690, 41, 1368, 3902, -1868, 4911, 4897, 5540, 4914, 5542, + 3927, 1946, 2158, 2701, 5547, 671, 3097, 5583, 5703, 5585, + 3102, 5552, 5553, 2036, 2603, 4887, 3182, 1508, 655, 2037, + 4493, 5559, 780, 1971, 4632, -3471, 2432, 4836, 2565, 883, + 1690, 2905, 1498, 1681, 4496, -2161, 5098, 2056, 2421, 1683, + 2775, 4052, 5573, 1994, 1926, 4915, 1686, 3124, 3372, 1355, + 1708, 4788, 1686, 3255, 1949, 1950, 1934, 1912, 2703, 885, + 1687, 2018, -3276, 1688, 3034, 3035, 808, 5757, 809, 1688, + 810, -1828, 2011, 3738, 2011, 2011, 811, 812, 3311, 1709, + 1710, 1518, 2027, 2028, 2896, 1508, 1689, 2157, 1387, 2036, + 3076, 111, 109, 2041, 3382, 2037, 2853, 134, 2791, 2792, + 3260, 4063, 3263, 3264, 780, -2161, 795, 3114, 2320, 2321, + 3371, 3115, 693, 3117, 787, 780, 4654, 2190, 780, 4536, + 106, 5643, 938, 4481, 4482, 3092, 2431, 3122, 4210, 780, + 2439, -3266, 5956, 780, 3167, 2092, 5829, 2514, 3802, 3803, + 3130, 3131, 3223, 1711, 5456, 2102, 5936, 2224, 3224, 3015, + 795, 4898, 795, 780, 6070, 4105, 4585, 4772, 1163, 3883, + 2702, 693, 938, 2031, 3809, 3812, 3815, 3816, 4477, 4478, + 1492, 1860, 4342, 2793, 3231, 3231, 1867, -1868, 3828, 1816, + 2515, 795, 3183, 4917, 1686, 5181, 4351, 795, 6025, 1499, + 4354, 3823, 1687, 1690, 2566, 4735, 2504, 938, 1514, 5757, + 698, 1688, 2700, 3312, 1898, 3155, 1686, 3795, 2808, 3798, + 2832, 2168, 3704, 3936, 1687, 1914, 4049, 4613, 738, 1927, + 3156, 3298, 2469, 1688, 2825, 5169, -3471, 1689, 1712, 3905, + 2510, 2831, -1828, 4709, 938, 938, 2915, 780, 795, 1686, + 6009, 2061, 4836, 1686, 3877, 916, 1137, 1687, 5695, 1686, + 2841, 1687, 1493, 1509, 936, 4636, 1688, 1687, 1354, 1686, + 1688, 1356, 1577, 1578, 1579, 3394, 1688, 1687, 694, 1717, + 1718, 1719, 1720, 2826, 1869, 3313, 1688, 3043, 3044, 5170, + 5124, 2827, 111, 2969, 4541, 2970, 2400, 4605, 4606, 3182, + 1681, 846, -1868, 937, 936, 1519, 1683, 3796, 693, 3797, + 3093, 5688, 5788, 1686, 3184, 4053, 4097, 1626, 4238, 937, + 4239, 1687, 4899, 1510, 1187, 2516, 883, 694, 5924, 2833, + 1688, 1509, -3276, 5577, 2162, 5163, 5378, 3937, 1690, 936, + 1500, 3299, -1868, 1686, 1690, 780, 1792, 655, 3300, 780, + 2045, 1687, 2829, 3862, 3301, 780, 2369, 1686, 6089, 6071, + 1688, 2057, 4655, 2162, 3003, 1687, 2350, -2495, -904, 1689, + -904, 686, 2082, 2916, 1688, 3393, 936, 936, 6010, 2086, + 3863, 2086, 5936, 935, 693, 2940, 5033, 2546, 5171, 111, + 2358, 1689, 5822, 5251, 174, 175, 2032, 4099, 6147, 5614, + 2490, 2491, 5034, 2493, 2495, 2496, 2497, 4710, 3962, 3956, + 700, 5835, 4614, 2902, 3314, 2506, -2098, 795, -2098, 2405, + 2122, 2988, 2322, 935, 1689, 2323, 3906, 3375, 1689, 3302, + 1401, 5638, 2123, 2521, 1689, 780, 5644, 5645, 1792, 795, + 795, 5338, 5252, 2690, 1689, 1686, 1287, 795, 2457, 5163, + 5943, 5915, 5164, 1687, 4931, 6011, 5172, 1327, 935, 5689, + 3932, 1841, 1688, 1207, 694, 3183, 68, 2735, 2451, 2474, + 5751, 2828, 1847, 2589, 5285, 3315, 1690, 787, 787, 780, + 787, 787, 787, 787, 780, 795, 780, 2124, 1689, 1870, + 3303, 1793, 787, 2634, 2637, 935, 935, 5783, 1690, 800, + 6148, 5783, 2425, -1868, -940, 4299, 2452, 4300, 2163, 2520, + 787, 5194, 795, 2076, 2622, 3068, 2999, 3938, 1689, 5685, + 1328, 5207, 5208, 883, 1848, 2628, 1686, 702, 1288, 3062, + 5506, 1690, 1689, 780, 1687, 1690, 3067, 2163, 4380, 5970, + 694, 1690, 5974, 1688, 2164, 780, 1686, 5514, 937, 712, + 937, 1690, 937, 937, 1687, 1408, 4191, 3882, 4525, 937, + 5339, 885, 937, 1688, 2671, 3801, 2844, 5032, 4192, 5778, + 6193, 5686, 1398, 2082, 2852, 1698, 1699, 1700, 3063, 5307, + 5292, 2328, 1539, 1793, 1246, 2332, 3064, 3184, 5253, 2526, + 4085, 2338, 3040, 1686, 795, 1690, 5397, 1539, 3181, 5751, + 2036, 1687, 3850, 5615, 5616, 1686, 2037, 3922, 169, 780, + 1688, 1686, 938, 1687, 2605, 5767, 5075, 2715, 3854, 1687, + 1689, 6120, 1688, 3139, 3069, 1690, 1339, 713, 1688, 3857, + 3858, 5416, 1339, 2082, 5301, 795, 5783, 5779, 3432, 1690, + 726, 4098, 2624, 5958, 795, 795, 795, 1339, 2691, 5960, + 780, 3911, 3912, 5783, 766, 3215, 2011, 1409, 3216, 824, + 5326, 2453, 3221, -904, 2047, 1686, 780, 1329, 2943, 2125, + 4775, 2438, 6088, 1687, 6109, 4778, 4779, 780, 780, 4526, + 1686, 2106, 1688, 2033, 3260, 795, 824, 767, 1687, 5890, + 3163, 1842, -1259, 4117, 4118, 4366, 4570, 1688, 3188, 1686, + 3243, 1689, 4016, 5617, 5726, 4508, 708, 1687, 2042, 2054, + 1459, 3852, 5769, 6194, 3877, 2492, 1688, 6121, 727, 759, + 2498, 1689, 2500, 6126, 3877, 3877, 6061, 1690, 6060, 6094, + 5780, 4634, 4367, 3441, 3441, 3441, 4497, 2683, 795, 5929, + 2047, 1686, 3965, 2000, 936, 760, 3969, 780, 5084, 1687, + 2077, 5779, 2413, 780, 4086, 4938, 1276, 2730, 1688, 760, + 4952, 5874, 2011, 6163, 1339, 4962, 3065, 2608, 1689, 2535, + 5402, 6122, 4006, 5929, 4863, 5618, 5181, 780, 6187, 6188, + 1689, 2545, 3259, 937, 2414, 2055, 1689, 1843, 5783, 1686, + 4101, 4571, 1456, 1686, 2783, 938, 1708, 1687, 2785, 4104, + 4658, 1687, 5119, 1844, 780, 780, 1688, 2158, 1690, 2433, + 1688, 2912, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, + 6035, 2803, 2803, 2609, 1410, 1709, 1710, 768, 1690, 1686, + 5556, 1376, 5546, 2684, 2078, 1686, 2079, 1687, 5435, 5781, + 1689, 1277, 1411, 1687, 5780, 795, 1688, 5608, 4007, 780, + 2001, 4729, 1688, 1686, 938, 1689, 1686, 4087, 2415, 780, + 4202, 1687, 5202, 935, 1687, 2847, 1380, 2380, -2669, 938, + 1688, 170, 5875, 1688, 1689, 1690, 2856, 849, 4574, 5783, + 740, 3273, 3274, 4903, 4904, 4575, 2632, 1690, 4210, 1711, + 2193, 1686, 4210, 1690, 4864, 1686, 5359, 1278, 2193, 1687, + 1477, 1363, 1354, 1687, 741, 1364, 885, 5203, 1688, 3426, + 938, 2685, 1688, 1354, 1354, 5685, 1689, 171, 6036, 938, + 938, 938, 4660, 3419, 3068, 1381, 2080, 936, 1539, 3983, + 3425, 2193, 1564, 111, 2888, 3432, 3715, 3374, 3062, 2416, + 3715, 5697, 743, 2913, 3723, 3067, 1365, 1690, 3017, 2206, + 3710, 1366, 5628, 5781, 3710, 3728, 3729, 2267, 1478, 6157, + 2988, 1479, 1690, 2381, 1689, 2918, 697, 5686, 1689, 6143, + 4943, 4905, 3420, 3877, 1712, 3841, 5204, 4626, 4661, 2382, + 3421, 1690, 3984, 2723, 1367, 1414, 936, 3063, 1480, 2726, + 2270, 1163, 6177, 4628, 698, 3064, 1481, 1811, 2919, 3711, + 2081, 936, 2927, 3711, 1689, 1686, 788, 3712, 2939, 738, + 1689, 3712, 3764, 1687, 6172, 883, 2951, 3877, 3427, 4298, + 1812, 4301, 1688, 1690, 2193, 1708, 780, 1686, 1689, 3768, + 780, 1689, 2400, 3069, 4944, 1687, 3171, 3172, 2193, 5115, + 4945, 3423, 936, 2977, 1688, 3719, 935, 789, 4906, 3719, + 2383, 936, 936, 936, 1709, 1710, 4371, 2802, 2802, 5177, + 5177, 5116, 2944, 3155, 5995, 1686, 1689, 791, 3714, 3913, + 1689, 1690, 3714, 1687, 1546, 1690, 1364, 5673, 3156, 3790, + 6102, 1681, 1688, 2286, 159, 2817, 937, 1683, 2652, 4650, + 5481, 5629, 2945, 805, 2653, 1521, 2654, 2307, 4659, 5674, + 4663, 4664, 4665, 4667, 4668, 935, 2948, 3109, 5723, 5132, + 5133, 1690, 3110, 3173, 3914, -1259, 6146, 1690, 1711, 5877, + 935, 3113, 1366, 5273, 1547, 5274, 1610, 3116, 5212, 795, + 795, 1686, 3147, 1179, 1179, 1690, 795, 5656, 1690, 1687, + 2803, 2803, 4202, 6118, 6118, 1627, 1628, 5675, 1688, 674, + -2675, 1402, -592, 795, 680, 795, -2098, -2098, 3087, 3088, + 3422, 935, 4243, 3268, 1189, 1189, 4207, 3825, 2082, 2655, + 935, 935, 935, 1690, -2677, 3065, 3915, 1690, 1183, 1183, + 1689, 6154, 5832, 3108, 787, 1188, 1188, 3713, 1548, 787, + 4888, 3713, 3782, 4661, 2949, 4521, 2839, 4889, 787, 4890, + 938, 1133, 1689, 1712, 787, 814, 3783, 938, 5772, 1139, + 5774, 5281, 4789, 1686, 1239, 816, 1339, 1180, 1180, 3916, + 1339, 1687, 5282, 3059, 1686, 3227, 1686, 1184, 1184, 3228, + 1688, 780, 1687, 3432, 1687, 1185, 1185, 4916, 2897, 698, + 1689, 1688, 1686, 1688, 4207, 2897, 1995, 1857, 5025, 5097, + 1687, 3213, -2683, 795, 3150, 780, 5107, 3218, 3220, 1688, + 1549, 4630, 2960, 4993, 4202, 828, 2964, 5037, 3121, 5885, + 3111, 899, -2686, 1193, 1193, 2965, 5042, 1113, 2839, 4631, + 4202, 3118, 5044, 780, 1115, 5008, 1207, 1690, -2689, -2339, + 3177, -2339, 5058, 3934, 780, 2968, 1186, 1186, 4041, 4042, + 5067, 5068, 4043, 4044, 4045, 1686, 1689, 4626, 1131, 1690, + 4202, 4618, 5220, 1687, 664, 6020, 6021, 5222, -2690, 4202, + 3204, 1163, 1688, 4628, 3209, 3210, 780, -2691, 787, 2047, + 2047, 1241, 936, 780, 3219, 787, 5903, 4656, 780, 936, + 4657, 4202, 2975, 4202, 780, 1686, 4744, 1690, 1339, -2693, + 4746, -2694, 824, 1687, 3447, 1368, 1686, 1686, 2952, 780, + 883, 1243, 1688, 3241, 1687, 1687, 3180, 1994, 3246, 174, + 175, 4697, 4698, 1688, 1688, 1257, 2802, 2802, 3917, 3918, + 3919, 1252, 5893, 5897, 1262, 1686, 1686, 4410, 1689, 2745, + 2746, 2011, 1557, 1687, 1687, 6166, 6168, 5177, 4026, 1689, + 4717, 1689, 1688, 1688, 2758, 4360, 2760, 4119, 4120, 4121, + 4352, 4795, 4353, 1690, 3730, 4737, 795, 1689, 5213, 4498, + 5214, 1265, 780, 1187, 1271, 1925, 4633, 4640, 4365, 3959, + 4642, 1930, 1931, 4067, 1274, 4069, 4070, 4646, 2779, 1604, + 5987, 4075, 4741, 5990, 1283, 5596, 2954, 1285, 4407, 4083, + 1759, 935, 1759, 4091, 5215, 4094, 2341, 2342, 935, 5425, + 5426, 1292, 4008, 4009, 2705, 4011, 4013, 3129, 3364, 3272, + 3366, 174, 175, 3715, 4755, 4328, 780, 3279, 1294, 780, + 1689, 795, 795, 5145, 5216, 4767, 1686, 3710, 5979, 5980, + 4236, 3152, 795, 1308, 1687, 1690, 4362, 1383, 1384, 2761, + 2762, 759, 1312, 1688, 2706, 938, 1690, 2648, 1690, 2649, + 174, 175, 5893, 1318, 1314, 1685, 5897, 1686, 1306, 1307, + 1689, 1310, 1686, 1311, 1690, 1687, 4596, 1323, 1321, 1686, + 1687, 1689, 1689, 4268, 1688, 4269, 3711, 1687, 4237, 1688, + 1324, 2707, 4252, 1360, 3712, 10, 1688, 1975, 1713, 1714, + 1715, 1716, 1717, 1718, 1719, 1720, 1396, 1398, 1976, 4952, + 1689, 1689, 3211, 2806, 1686, 2807, 2662, 1406, 1686, 3217, + 1422, 795, 1687, 795, 1354, 2903, 1687, 2265, 4254, 1408, + 1354, 1688, 3719, 1418, 4276, 1688, 2946, 1690, 2947, 1686, + 1686, 4630, 1428, 1429, 17, 1354, 5685, 1687, 1687, 4607, + 2955, 4609, 5134, 2958, 1430, 3714, 1688, 1688, 1393, 4631, + 800, 1435, 1686, 1686, 1686, 1440, 1207, 5217, 1765, 1443, + 1687, 1687, 1687, 5028, 5621, 1686, 1686, 1690, 1448, 1688, + 1688, 1688, 3059, 1687, 1687, 5685, 738, 936, 1690, 1690, + 4277, 4618, 1688, 1688, 5091, 3436, 1472, 3437, 5686, 2663, + 4632, 5218, 1686, 3973, 1459, 3974, 1474, 1974, 1686, 2708, + 1687, 1689, -2290, 1476, 174, 175, 1687, 1690, 1690, 1688, + 4029, 2709, 4030, 3889, 3781, 1688, 5300, 1980, 2875, 5348, + 4502, 4503, 1482, 1485, 4504, 4505, 1484, 5686, 5357, -3426, + 4506, 4507, 1689, 1486, 5893, 5897, -2292, 1689, 32, 4260, + 1487, 2947, 111, 3805, 1689, 1686, -3428, 1905, 1681, -3425, + 5331, -2290, 1354, 1687, 1683, 3373, 2017, 937, 1488, 2019, + 2019, -3427, 1688, 1975, 3713, 1494, 5777, 174, 175, 1495, + 4263, 780, 1874, 4267, 1976, 1874, 795, 795, 1497, 1689, + 37, 4994, 1977, 1689, 4271, -2292, 4272, 1974, 693, 39, + 1496, 5873, 2959, 4577, 1501, 4578, 935, 937, 41, 156, + 4749, 4998, 1874, 4999, 1689, 1689, 795, 1502, 1690, 1978, + 1503, 2710, 42, 1507, 2963, 2443, 2443, 1713, 1714, 1715, + 1716, 1717, 1718, 1719, 1720, 1414, 1414, 1689, 1689, 1689, + 5739, 1504, 937, 4784, 3868, 1506, 3870, 111, 109, 1690, + 1689, 1689, 1505, 134, 1690, 2830, 3998, 2012, 1517, 1545, + 2012, 1690, 2966, 1975, 4685, -2290, -3659, 1759, 4686, 5000, + 4687, 5001, 4688, 1550, 1976, 1979, 106, 1689, 2350, 937, + 937, 1551, 1977, 1689, 3953, 154, 1565, 5144, 5874, 1566, + 780, 2711, 1567, 2745, 2746, 1572, 1690, 2400, 1759, -2292, + 1690, 1573, 693, 1980, 5002, 1574, 5003, -2290, 2758, 1978, + 2760, 4297, 2997, 5078, 1621, 5080, -2290, 1702, -940, 1575, + 4098, 1690, 1690, 1576, 1580, -2290, 4415, 5874, 2973, 1582, + 1689, 4773, 4774, 4033, 3398, 3399, 1414, 4782, 3400, -2290, + 3401, -2292, 3402, 1583, 1690, 1690, 1690, 157, 1653, 1722, + -2292, 1584, 1585, 5122, 694, 4626, 1974, 1690, 1690, -2292, + 6063, 787, 5092, 1586, 1874, 1979, 780, 6224, 1686, 4627, + 5030, 4628, 5105, -2292, 5106, 5113, 1687, 1874, 780, 5125, + 1568, 5126, 780, 5778, 1690, 1688, 2196, 2197, 795, -3560, + 1690, 1657, 5149, 1980, 5150, 2207, 2405, 2145, 5054, 5875, + 1339, 1339, 5057, 2761, 2762, 2871, 1587, 1588, 5039, 5065, + 2985, 1589, 3929, 1703, 5167, 5039, 5168, 2438, 795, 795, + 4685, 4231, 1975, 4240, 4686, 2268, 4691, 2271, 4688, 1704, + 4632, 1723, 5272, 1976, 3974, 1590, 6110, 1690, 5875, 4241, + -1656, 1977, 2284, 2285, 2287, 5318, 5372, 1591, 5373, 2290, + 2291, 5779, 4874, 5374, 795, 5373, 1592, 2308, 694, 158, + -1655, 4041, 4042, 2937, 5085, 4043, 4044, 4045, 1978, 1686, + 4056, 1724, 5376, 1821, 5377, 6152, 1604, 1687, 4479, 5370, + 1593, 5740, 5541, 5438, 1596, 4369, 1688, -2673, 5741, 1597, + 1598, 2262, 1604, 5777, 174, 175, 1605, 1606, 5581, 5554, + 1705, 1725, 4242, 5742, 5574, 693, 5575, 1607, 1608, 6173, + 780, 5593, 5563, 5511, 5565, 693, 4022, 4023, 4024, 4025, + 1702, 4027, 4028, 3441, 1979, -2262, 3898, 5626, -740, 5627, + 2028, 795, 795, 5632, 159, 5627, 780, 1298, 6186, 1611, + 1299, 1300, 4247, 1689, 5780, 1301, 2011, 5633, 5793, 5627, + 3066, 1612, 1980, 4248, 4249, 1781, 4946, -3560, 1613, 4071, + 4072, 1726, 4074, 4253, 4076, 4077, 4078, 4079, 4080, 4081, + 4082, 5415, 4084, 1614, 5794, 938, 4093, 5341, 5671, 5672, + 3974, 3974, 4250, 4251, 160, 5815, 1615, 5816, 4517, 4518, + 4519, 954, 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 3958, 1616, 4629, 4154, 5845, 4947, 5846, 5854, + 5018, 5855, 4588, 4591, 1354, 4594, 1703, 5889, 1354, 4030, + 2411, 6007, 1617, 6008, 5407, 5876, 3155, 1604, 4795, 1301, + 5743, 938, 1704, 633, 5358, -940, 6038, 1686, 4807, 4630, + 1618, 3156, 2808, 5744, 1689, 1687, 5877, 937, 1298, 1619, + 1690, 1299, 1300, 5781, 1688, 1620, 1559, 4631, 1728, 1622, + 5745, 694, 766, 6039, 1207, 5126, -1319, 1623, 2478, 1686, + -1319, 694, 5720, 68, 1624, 1625, 5795, 1687, 5796, 1730, + 6046, 1782, 6047, 4259, 1629, 5877, 1688, 1630, 1631, 4618, + 634, 986, 6055, 1783, 6056, 767, 2228, 2229, 2230, 2231, + 5778, -2523, 1632, 1705, 1686, 1633, -713, 936, 4620, 938, + 1634, -1319, 1687, 2443, 4265, 4625, -1319, 1635, 4641, 4266, + 6072, 1688, 5627, 1414, 1734, 4645, 4274, 5624, 1636, 954, + 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, + 1637, 1743, 2232, 2233, 2234, 6074, 1354, 5627, 1784, -1319, + 6075, 1690, 5627, 4708, 5753, 6101, 1785, 5627, 6111, 1638, + 5627, 4275, 1639, 936, 3752, 4278, 1744, 6134, 5779, 5126, + 1006, 635, 4125, 1640, 1641, 3715, 5670, 1735, 6210, 161, + 6211, 1822, 1642, 162, 1643, 1228, 4705, 5090, 1646, 3710, + -2290, 1786, 1604, 2235, 2236, 1647, 1745, 1648, 1649, 3754, + 5746, 1650, 1651, 1974, 1652, 1746, 3017, 4946, 2643, 5096, + 5108, 5109, 1689, 1654, 4750, 1655, 1656, 1658, 1659, 4091, + 1660, 5797, 5597, 5766, -2292, 1823, 935, 1824, 1661, 986, + 937, 1664, 1665, 1668, 636, 768, 1974, 1669, 3711, 1670, + 4748, 936, 1671, 1672, 1689, 4888, 3712, 6159, 6160, 1673, + 1674, 6161, 4889, 6162, 4890, 1729, 163, 2237, 4947, 1020, + 5603, 5780, -2509, -2510, -3560, 4931, 1751, 1777, 5756, 1975, + 5609, 1778, 170, 1780, 5762, 5763, 1799, 3155, 1817, 1689, + 1976, 1818, 935, 1819, 3719, 1820, 1839, 1840, 1977, 937, + 1849, 1852, 3156, 1853, 2012, 1862, 2687, 1874, 1906, 1916, + 1918, 3225, 1975, 1787, 937, 1922, 1928, 3714, 1006, 1929, + 5782, 1935, 1936, 1976, 1938, 1978, 1940, 1825, 1944, 1690, + 2238, 1977, 5144, 693, 1959, 4280, 1960, 1961, 956, 957, + 1788, 1963, 960, 3799, 962, 5560, 964, 1972, 1702, 1706, + 5798, 1983, 1984, 1987, 3424, 937, 1997, 2003, 1978, 4948, + 2013, 1690, 2014, 2024, 937, 937, 937, -713, 4483, 3066, + 935, 5777, 174, 175, 2039, 2043, 4318, 1826, 2046, 2058, + 5781, 1979, 5408, 693, 2062, 2073, 2068, 2087, 1147, 5409, + 795, 637, 780, 693, 2093, 2097, 1690, 795, 795, 2099, + 4336, 2101, 2103, 4339, 4340, 3283, 2111, 1020, 2113, 1980, + 2115, 2116, 2117, 2119, 1979, 1686, 2120, 3441, 638, 2147, + 2155, 2167, 2169, 1687, 1827, 2239, 5793, 2210, 2211, 2212, + 4464, 2213, 1688, 2214, 2170, 2215, 3713, 5018, 4632, 2171, + 2175, 2176, 1980, 2178, 1703, 2179, 2181, 1148, -3527, 2193, + 5524, 5525, 5794, 5527, 5318, 2192, 4386, 2191, 2202, 3823, + 1704, 111, 111, 2209, 4842, 4843, 4844, 4845, 4846, 4847, + 4848, 4849, 4850, 4851, 4335, 4853, 4854, 4855, 4856, 4857, + 4858, 4859, 4860, 4861, 4862, 4949, 2251, 4866, 4867, 694, + 2223, 2264, 2240, 2865, 2265, 2277, 780, 2907, 795, 2279, + 2910, 780, 780, 2266, 2210, 2211, 5227, 787, 5228, 2282, + 5229, 2283, 5230, -940, 1828, 4602, 2922, 2292, 2331, 2335, + 5408, 1116, 780, 780, 2346, 2360, 4931, 5409, 2356, 4488, + -1319, 1705, 2375, 2379, 2705, 1789, 1829, 2941, 2406, 694, + 5996, 2407, 5777, 174, 175, 5799, 5434, 5584, 2434, 694, + 2435, -2983, 1706, 2440, 5795, 2441, 5796, -73, 2241, 2447, + 2242, 2458, 5296, 5297, 693, 5299, 2243, 1604, 2906, 2463, + 5304, 4568, 2466, 5308, 2706, 4954, 5311, 5312, 5778, 2486, + 4964, 2485, 2487, 3284, 5320, 2512, 5321, 3426, 5603, 2527, + 1689, 2528, 2529, 4950, 2530, 5327, 2532, 5793, 2533, 639, + 2534, 3419, 5016, 938, 5019, 1149, 2539, 1150, 3425, 1187, + 1187, 2707, 1790, 1686, 5029, -2110, 5718, 640, 1151, 2549, + 1791, 1687, 2553, 5794, 2552, 2555, 2244, 2558, 4329, 3285, + 1688, 2560, 5040, 1117, 1152, 2559, 2561, 5782, 2568, 2569, + 2578, 1118, 2582, 2579, 5045, 937, 5779, 2580, 5919, 2976, + 3420, 4595, 937, 2581, 4597, 2583, 1119, 2585, 3421, 2593, + 5066, 2586, 2991, 641, 2592, 3450, 1120, 1121, 1122, 2596, + 2245, 174, 175, 2597, 111, 109, 1123, 4355, 4356, 2606, + 4603, 4357, 2601, 4358, -940, 4359, 2612, 2620, 4134, 111, + 642, 2641, 5410, 2615, 2658, 5411, 3427, 1690, 643, 5797, + 5678, 2644, 5679, 5680, 5412, 2645, 2646, 3286, 3756, 1877, + 2647, 2650, 2659, 4718, 5176, 2660, 2668, 2672, 2676, 3423, + 694, 2673, 2675, 1686, 2689, 5795, 4719, 5796, 2688, 2708, + 2692, 1687, 4413, 1313, 2693, 936, 4949, 4418, 4419, 5780, + 1688, 2709, 4720, 4261, 5935, 2704, 2718, 2727, 4681, 5778, + 6215, 2728, 3048, -2534, 4684, 5856, 2719, 1686, 1354, 1354, + 2732, 2734, 2246, 2733, 2737, 1687, 2768, 2772, 1765, 2773, + 3287, 1367, 4721, 2247, 1688, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 3288, 3289, 1689, 2777, + 1686, 3290, 3291, 3292, 6136, 2781, 174, 175, 1687, 5185, + 5188, 5190, 5192, 2784, 2786, 5195, 5196, 1688, 2787, 2794, + 5200, 5291, 1686, 5206, 1124, 1153, 5210, 5779, 2797, 5185, + 1687, 2800, 2818, 5221, 5185, 2845, 1125, 2846, 2848, 1688, + 5410, 2864, 4264, 5411, 1877, 5303, 4740, 2867, 3422, 2869, + 2870, 2710, 5600, 5955, 4950, 2872, 2881, 2882, 5781, 2883, + 2889, 4722, 2928, 2886, 935, 2145, 2887, 2897, 2979, 3293, + 3009, 2904, 1644, 6043, 2908, 2911, 2920, 2921, 4336, 2923, + 5797, 3021, 2924, 2925, 2926, 986, 3033, 2930, 2938, 5183, + 2942, 4318, 5739, 2950, 2953, 795, 2956, 5981, 4771, 1974, + 2967, 5199, 2957, 1905, 1905, 1690, 2961, 3998, 1689, 5508, + 2962, 2971, 2974, 2972, 2978, 2984, 2989, -1456, 3028, 3294, + 5780, 2711, 4723, 2239, -1621, 2996, 1662, 3002, 2350, 1720, + 1666, 3036, 1878, 3011, 3038, 6223, 1126, 4796, 3012, 5548, + 3013, 3014, 1689, 654, 3039, 3041, 4805, 3049, 3071, 3091, + 3042, 3045, 4335, 3094, 111, 4797, 3119, 3050, 3095, 4033, + 937, 3051, 3096, 3103, 1006, 1975, 4588, 3104, 4591, 3099, + 4594, 3107, 4770, 3123, 1127, 1689, 1976, 3426, 3133, 780, + 1706, 3715, 3136, 3137, 1977, 4837, 3143, 3160, 1128, 780, + 2240, 3419, 3161, 3189, 3192, 3710, 3191, 1689, 3425, 6043, + 2012, 3193, 2012, 2012, 3265, 3196, 3197, 3226, 3233, 3237, + 3251, 1978, 4865, 3258, -715, 1690, 3266, 4929, 3262, 3269, + 6051, 3238, 3275, 5799, 3270, 3276, 3277, 3278, 3280, 5781, + 1154, 1155, 1156, 1157, 3281, 3319, 4724, 4725, 3282, 3322, + 3420, 3325, 3329, 3334, 3711, 3335, 5591, 3336, 3421, 1690, + 3337, 3241, 3712, 1020, 3361, 3365, 2241, 1878, 2242, 3338, + 2405, 4988, 3367, 3339, 2243, 5453, 3368, 1979, -715, 5458, + 5459, 745, 2400, 3340, 3341, 3342, 3343, 3344, 1879, 5404, + 795, 1759, 1690, 4422, 174, 175, 3427, 3155, 3345, 3371, + 3719, 3346, 1880, 3347, 1881, 1980, 3348, 766, 3349, 3350, + 6204, -1319, 3156, 3351, 1690, -1319, 3381, 6115, 3352, 3423, + 3383, 5491, 3353, 3714, 6214, 5782, 2082, 3239, 3354, 2145, + 6204, 3355, 3356, 3391, 2244, 5486, 1882, 6214, 4837, 3357, + 767, 3358, 3425, 5740, 3386, 3384, 3387, 3385, 787, 1883, + 5741, 3395, 3397, 4992, 6051, 3396, -1319, 3404, 3433, 3724, + 3725, -1319, 4920, 3726, 3739, 5742, 111, 3740, 3741, 4930, + 3747, 3760, -1664, 3792, 2032, 3791, 3779, -715, 2245, 3793, + 3780, 3806, 1884, 5409, 5487, 3715, 3807, -2262, 3819, 111, + 782, 938, 5488, 3821, -1319, 4726, 4727, 3022, 3820, 3710, + 1885, 3831, 3715, 795, 5799, 3835, 3829, 3837, 3838, 3839, + 2469, 3842, 795, 1879, 747, 3843, 3710, 3847, 3848, 3855, + 4423, 3856, 2468, 3880, 2839, 4817, 3894, 1880, 3903, 1881, + 5492, 2807, 3895, 3909, 3910, 4841, 5049, 3901, 3422, 5709, + 3930, 3941, 3713, 3935, 3943, -715, 3945, 3946, 3711, 3947, + 3963, 3964, 3967, 5490, 3968, 3991, 3712, 4004, 3995, -2013, + 4005, 1882, 4036, 4037, 4038, 3711, 4054, 4064, 4058, 4065, + 2246, 4066, 5158, 3712, 1883, 4096, 4068, 4102, 1886, 4107, + 768, 2247, 2782, 4109, 4114, 1887, -715, 4127, 4115, 4929, + 4425, 4190, 5743, 4193, 3719, 1888, 5782, 4199, 4202, 4207, + 4194, 4214, 728, 729, 4215, 5744, 4211, 1884, 5201, 1889, + 4221, 3719, 4224, 4225, 4226, 4227, 4270, 3714, 4281, 4282, + 4292, 4293, 5745, 936, 4304, 1885, 4296, 4306, 938, 4307, + 4308, 4321, 4309, 4318, 3714, 4310, 4931, 4311, 3817, 730, + -715, 1890, 4312, 745, 1891, 4319, 4322, 4426, 4427, 4428, + 4323, 5637, 4326, 4728, 4325, 1604, 4330, 5018, 4344, 3155, + 1892, 4345, 4350, 4363, 6183, 4369, 4368, 4429, 4370, 5306, + 4389, 744, 5489, 2350, 3156, 4381, 655, 4387, 731, 4408, + 4409, 4417, 4386, 111, 5141, 4414, 4462, 4467, -1780, -1785, + 4486, 1893, 4491, 795, 4494, 4495, 4837, 4500, 5166, 4510, + 4501, 4528, 4515, 1886, 4573, 4581, 4604, 4598, 4599, 4612, + 1887, 4623, 745, 780, 4618, 4568, 4666, 4644, 4651, 4678, + 1888, 4430, 4679, 4431, 4692, 4699, 4700, 2478, 746, 795, + 4696, 4702, 2981, 4711, 1889, 4712, 3713, 4742, 4287, -715, + 3981, 4751, 935, 4432, 4753, 4754, 4757, 1228, 4759, 5235, + 5243, 4758, 4807, 3713, 2418, 4763, 4776, 41, 5243, 4777, + 936, 4433, 5746, 5154, 4790, 6091, 1890, 4811, 4434, 1891, + 4806, 4812, 4813, 4818, 4814, 4838, 747, 4815, 4839, 4390, + 4840, 4852, 4539, 4435, 4881, 1892, 5410, 4880, 2400, 5411, + 4436, 4884, -256, 4885, 4886, 4893, 4895, 4922, 4909, 5197, + 5198, 2402, 4923, 4924, 4837, 4437, 4940, -715, 4931, 5211, + 4942, 938, 4956, 4955, 4965, 4966, 1893, 4805, 4805, 780, + 4967, 4968, 4969, 5234, 4970, 5298, 4972, 4973, 4974, 5314, + 4975, 2350, 4976, 4983, 5262, 4986, 4989, 4990, 780, 5324, + 5315, 4997, 5005, 5006, 4805, 747, 4932, 5009, 5013, 5015, + 5325, 4805, 4671, 732, 5010, 5035, 4837, 5328, 5043, 5329, + 5330, 5046, 4438, 5051, -2060, -1319, 5060, 5063, 5073, 5093, + 733, 5350, 4439, 5076, 5077, 5095, 748, 5094, 5078, 935, + 5079, 5099, 5081, 5080, 2012, 5082, 5089, 5101, 3715, 5112, + 937, 4391, 5104, 5366, 5111, 5114, 734, 5136, 4931, 4392, + 5120, 5151, 3710, 5140, 5128, 5138, 938, 5255, 5391, 795, + 4440, 5139, 5147, 5146, 4393, 5156, 5159, 5264, 5160, 5265, + 5269, 158, 5181, 4441, 4394, 4395, 4396, 5257, 5266, 5278, + 5276, 5277, 5279, 5271, 4397, 5286, 6219, 735, 5287, 5343, + 5288, 5289, 5294, 936, 5392, 5292, 937, 5305, 5243, 5182, + 5310, 3711, 4052, 5309, 4933, 5342, 5346, 5928, 5344, 3712, + 5367, 5363, 4442, 5365, 5368, 5381, 5382, 5394, 4443, 5395, + 5396, 5398, 5400, 5403, 5406, 5401, 5417, 5420, 5433, 5432, + 5437, 5443, 5450, 5442, 5451, 5454, 5498, 5507, 5509, 5521, + 2012, 5928, 5446, 5449, 5526, 5494, 159, 3719, 5496, 5502, + 5528, 5501, 5424, 5517, 5511, 5529, 5518, 5164, 5531, 5544, + 5533, 5550, 5551, 5555, 4796, 5431, 5561, 4945, 5566, 5168, + 3714, 5578, 4805, 5589, 937, 5592, 4444, 5595, 5598, 5599, + 5604, 5441, 5605, 4445, 5441, 5441, 5608, 5611, 936, 5447, + 5606, 5622, 5625, 4837, 5629, 5631, 5169, 5641, 5635, 5658, + 5659, 5457, 5682, 5693, 5684, 5302, 5493, 1759, 3243, -3650, + 5692, -2671, 935, -2670, -2674, 4446, -2684, -2688, 2228, 2229, + 2230, 2231, 4398, 5681, 5322, 5694, 5647, 5700, 5701, -372, + 4447, 4448, -3645, -3643, 4399, -3647, -3641, -3646, -3644, -3642, + 5702, 5651, 5707, 4449, 5710, 5711, 5712, 5928, 5719, 5862, + 5863, 5725, 5865, 5866, 5867, 5868, 5721, 5734, 4932, 5735, + 5738, 5758, 5759, 5764, 2232, 2233, 2234, 5243, 5770, 4422, + 5806, 5809, 5814, 5818, 5819, 5826, 5820, 5821, 5827, 5535, + 5828, 5537, 5495, 5831, 5840, 5843, 5844, 5847, 5851, 3713, + 5857, 5861, 5864, 5869, 3241, 5872, 3241, 5886, 5497, 5888, + 5900, 5906, 5908, 5910, 5912, 5911, 852, 935, 5914, 5917, + 5916, 5918, 5932, 5933, 5931, 2235, 2236, 5934, 5961, 4400, + 5968, 5539, 4837, 4805, 4837, 5939, 5536, 6216, 795, 4837, + 5983, 4805, 6002, 5997, 4401, 6004, 4837, 4837, 853, 6005, + 4805, 6012, 6029, 1110, 6015, 5558, 4837, 6018, 6023, 6024, + 6031, -2507, 4837, 4805, -2508, 4805, 6032, 6037, 6034, 855, + 4536, 6040, 4541, 5567, 6065, 6068, 4933, 6092, 856, 6062, + 5975, 6076, 4402, 5978, 6077, 5661, 6083, 749, 6087, 2237, + 6090, 5986, 6095, 6137, 5989, 6149, 4403, 6150, 1110, 857, + 780, -2060, 6151, 2738, 6158, -166, 6140, 6145, 6153, 6165, + 6170, 6174, 5049, 858, 6175, 6176, 5588, 6181, 859, 6182, + 6184, 6178, 6179, 6180, 6190, 6191, 6059, 6205, 3860, 3159, + 6218, 4095, 5356, 5354, 5355, 3950, 5761, 2739, 4509, 5510, + 5812, 860, 5941, 6085, 1333, 2445, 5393, 2044, 4876, 5503, + 4474, 641, 2238, 5375, 5587, 5657, 5594, 5722, 5070, 2426, + 4405, 3170, 4196, 4111, 2736, 1442, 4683, 2857, 2350, 5654, + 2858, 5653, 2859, 5500, 2740, 4979, 4555, 5441, 750, 5557, + 5419, 5634, 4762, 4768, 5121, 3026, 5967, 5612, 5639, 780, + 6045, 6139, 6099, 4837, 4837, 5871, 5610, 2034, 5295, 3271, + 861, 4977, 5808, 5337, 862, 5448, 4982, 5538, 5175, 6119, + 6022, 4568, 1110, 6026, 5957, 5946, 5947, 5948, 5949, 4730, + 4635, 4246, 863, 4693, 4677, 6028, 864, 865, 5965, 5026, + 4284, 780, 5383, 4745, 4747, 4743, 6144, 5243, 752, 753, + 6112, 5768, 6113, 5994, 3942, 111, 5243, 2239, 5999, 6001, + 5687, 5041, 5669, 5534, 4416, 5532, 4980, 866, 5335, 2148, + 2053, 4279, 2616, 3928, 867, 868, 5838, 3926, 5963, 3328, + 5691, 2770, 3836, 3151, 3392, 4124, 4611, 4837, 781, 2022, + 3794, 1362, 3887, 4837, 1973, 5696, 2021, 5007, 3994, 5391, + 2350, 4756, 3844, 3761, 1748, 3763, 2344, 3814, 3811, 4805, + 4314, 2403, 4234, 2253, 2199, 5086, 6086, 5944, 2400, 938, + 5713, 5717, 6169, 6167, 2240, 1965, 5275, 2667, 2263, 1966, + 2664, 2128, 4787, 5952, 5523, 5392, 5148, 5953, 2208, 4338, + 2657, 1967, 4303, 3253, 4913, 3990, 5582, 4912, 4302, 1968, + 1970, 5414, 5850, 5135, 1558, 5791, 5733, 2678, 5699, 5791, + 5405, 5088, 3424, 3997, 3993, 5427, 1385, 4740, 3245, 4736, + 1110, 2129, 5441, 2030, 1110, 4918, 763, 3363, 937, 754, + 5765, 2810, 4837, 1249, 2016, 4610, 3390, 4800, 5153, 1859, + 2241, 4019, 2242, 4786, 4783, 6135, 5805, 1110, 2243, 5623, + 1451, 1558, 1905, 5810, 1457, 2780, 1110, 1233, 2518, 3125, + 1234, 3126, 3881, 2023, 2130, 3164, 5652, 2400, 1236, 2131, + 5436, 2604, 2153, 4615, 6138, 5280, 6171, 4837, 5530, 6217, + 2132, 2133, 6221, 3140, 3388, 5640, 5429, 780, 1560, 795, + 3445, 3872, 1191, 2863, 3873, 5834, 4837, 780, 3090, 1192, + 3874, 936, 3869, 5833, 4343, 2842, 1763, 3866, 2244, 3865, + 1146, 2446, 2141, 1742, 2142, 3318, 5849, 2626, 4516, 3840, + 4921, 1110, 1110, 1110, 1110, 5012, 3944, 1558, 4569, 1282, + 772, 5579, 756, 757, 1110, 1921, 2741, 758, 1540, 2012, + 5263, 4608, 5982, 4197, 5791, 5813, 0, 0, 2860, 5515, + 0, 0, 2245, 0, 5887, 0, 0, 0, 0, 5899, + 0, 5791, 0, 0, 0, 5905, 2742, 2743, 0, 2744, + 2745, 2746, 2747, 2748, 0, 2749, 2750, 2751, 2752, 2753, + 2754, 2755, 2756, 0, 2757, 2758, 2759, 2760, 795, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5938, 0, 780, 0, 0, 0, + 0, 5669, 0, 0, 0, 4386, 4386, 0, 0, 0, + 935, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1558, 0, 0, 0, 0, 2134, 0, 0, 0, 0, + 0, 5717, 0, 0, 2246, 2135, 0, 0, 0, 5913, + 5733, 0, 0, 0, 0, 2247, 2136, 0, 738, 0, + 6058, 0, 2137, 795, 0, 0, 0, 6084, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2761, 2762, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2138, 0, 6003, 5791, 2139, 0, 0, + 0, 0, 0, 5441, 0, 5441, 5441, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 1558, + 0, 0, 0, 5830, 0, 0, 2140, 0, 6098, 0, + 1681, 5976, 5977, 5836, 6030, 0, 1683, 0, 0, 0, + 0, 0, 0, 5988, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2350, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 795, 0, 0, 0, 0, 0, 5791, 0, 0, + 0, 0, 3424, 0, 0, 0, 0, 0, 0, 5441, + 5441, 0, 0, 6069, 0, 0, 0, 0, 0, 0, + 5441, 0, 0, 0, 0, 0, 0, 0, 0, 1558, + 0, 0, 1558, 0, 6082, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5791, 5791, + 0, 0, 5940, 0, 6052, 0, 0, 6053, 0, 795, + 0, 0, 0, 0, 0, 6222, 0, 0, 0, 0, + 0, 0, 0, 5441, 0, 0, 0, 0, 0, 6207, + 0, 0, 0, 0, 6209, 0, 5791, 0, 6124, 0, + 0, 0, 0, 0, 0, 2350, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3424, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1558, + 0, 0, 0, 0, 0, 0, 0, 0, 1110, 0, + 1110, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2350, 0, 0, 0, + 795, 0, 0, 0, 0, 795, 937, 0, 0, 0, + 2350, 0, 0, 0, 0, 0, 2350, 0, 0, 0, + 0, 0, 0, 2350, 0, 0, 1110, 1110, 0, 0, + 0, 0, 1110, 0, 0, 0, 1110, 1110, 1110, 0, + 0, 0, 0, 0, 0, 0, 1110, 1110, 1558, 0, + 0, 0, 1110, 0, 0, 0, 1110, 1110, 1110, 0, + 1110, 1110, 1110, 1558, 1558, 0, 0, 0, 0, 0, + 1110, 0, 1110, 0, 0, 1110, 1110, 1110, 1110, 0, + 1110, 0, 1110, 1110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1110, 1110, 1110, 1110, + 1110, 0, 1110, 1110, 1110, 1110, 1110, 1110, 0, 1110, + 1110, 0, 1110, 1110, 0, 1110, 1110, 0, 0, 1110, + 1110, 0, 1110, 1110, 0, 1110, 0, 1110, 0, 0, + 0, 1110, 1110, 1110, 0, 0, 1110, 1110, 1110, 1110, + 0, 1110, 0, 937, 0, 0, 0, 0, 1110, 0, + 0, 0, 0, 0, 1110, 1110, 1110, 1110, 0, 0, + 0, 0, 0, 0, 0, 1110, 1110, 0, 1110, 1110, + 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 1110, 1110, 0, 0, 1110, 0, 0, + 0, 0, 1558, 0, 0, 0, 0, 0, 0, 1558, + 0, 0, 0, 0, 0, 0, -1062, -1062, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4422, 174, + 175, 0, 1110, 0, 0, 0, -1868, -1868, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -1868, 0, + 1558, 0, 0, 0, 0, 0, 4529, 0, 4530, 4531, + 0, 0, 0, 0, 2012, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4532, 0, 4533, 2157, 0, 0, 0, 0, 4534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2032, + 0, -1868, 0, 0, 0, 0, 0, 0, 0, 0, + 4535, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3817, 0, 937, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1110, -1868, + 1110, 0, 0, -1868, 0, 4423, 0, -1868, 4422, 174, + 175, 0, 0, 0, 0, 0, -1868, -1868, 0, 0, + 0, 0, 0, -1868, 1558, 0, 0, -1868, 0, 0, + 0, 0, -1868, 4536, -1868, 1110, 0, 0, -1868, 0, + 0, 0, 0, 0, 0, 0, -1868, 0, -1868, 0, + 0, 0, 0, -1868, 0, 0, 0, 0, 0, 0, + 0, -904, 0, -904, 4537, 0, 4538, 0, 0, 0, + 0, 0, 0, -1868, 0, 4425, 0, 4539, 0, 0, + 0, 937, 0, -1868, 0, 0, -1868, 0, 0, 2032, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4540, 0, 0, 0, 0, 0, -1868, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1110, 0, 0, 0, 0, -1868, 1558, 0, 1558, -1868, + 0, 0, 4426, 4427, 4428, 4423, 0, 0, -1868, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1110, 0, + 0, 0, 4429, 0, 0, 0, 0, -1868, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1868, 0, 0, 0, 0, 0, -1868, -1868, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1868, 0, -1868, 0, 0, 0, 4541, 0, + 0, 0, 0, 0, 0, 4425, 4430, 0, 4431, 0, + 0, 0, 4420, 0, 4421, 0, 0, 0, 0, 4422, + 174, 175, 0, 0, 0, 0, 0, 0, 4432, 0, + 0, 0, 0, 0, 0, 4542, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4433, 0, 0, 0, + 0, 0, 0, 4434, 0, 0, 0, 0, 0, 0, + 0, 0, 4426, 4427, 4428, 0, 0, 0, 4435, 0, + 0, 0, -904, 1110, -904, 4436, 0, 0, 0, 4543, + 4544, 0, 4429, 0, 0, 0, 4545, 0, 0, 0, + 4437, 0, 0, 0, 0, 0, 0, 0, 4546, 0, + 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1558, 1110, 0, 0, 4547, + 0, 0, 0, 0, 1110, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4430, 0, 4431, -1868, + 0, 0, 0, 4548, 0, 0, 4423, 4438, 0, 0, + 0, 0, 0, 0, 0, 0, -904, 4439, 4432, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4424, 0, + 0, 0, 0, 0, 0, 0, 4433, 0, 1110, 0, + 0, 0, 0, 4434, 0, 0, 0, 0, 0, 1558, + 1558, 0, 0, 0, 0, 4440, 0, 0, 4435, 0, + 0, 0, 0, 0, 0, 4436, 0, 0, 4441, 0, + 4549, 0, 0, 0, 0, 0, 4425, 0, 0, 0, + 4437, 0, 1110, 1110, 1110, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4442, 0, 0, + 0, 0, 0, 4443, 0, 0, 0, -1868, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1868, -1868, 0, + 0, 1558, 0, 4426, 4427, 4428, 0, 4438, 4550, -1868, + 0, 1110, 0, 0, 1558, 0, 0, 4439, 0, 4551, + 4552, 4553, 0, 4429, 0, 0, 0, 0, 0, 1110, + 0, 0, 0, 1110, 1110, 0, 1110, 1110, 0, 0, + 0, 4444, 0, 0, 2157, 1110, 0, 1110, 4445, 0, + 0, 0, 0, 0, 0, 4440, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4441, 0, + 0, 0, -1868, 0, 0, 0, 0, 4430, 1110, 4431, + 4446, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4447, 4448, -904, 0, 4432, + 0, 0, 0, 0, 1110, 0, 0, 4442, 4449, 0, + -1868, 0, 4554, 4443, -1868, 0, 1110, 4433, -1868, 0, + 1558, 0, 0, 0, 4434, 0, 0, -1868, -1868, 1110, + 0, 0, 0, 0, 0, 0, 0, 0, -1868, 4435, + 1110, 0, 0, -1868, 0, -1868, 4436, 0, 0, -1868, + 0, 0, 0, 0, 937, 0, 1110, -1868, 0, -1868, + -1868, 4437, 0, 0, -1868, 0, 0, 0, 0, 0, + 2145, 4444, 0, 2158, 0, 0, -1062, 0, 4445, 0, + 0, 0, 0, 0, -1868, 0, 0, 0, 0, 0, + -1868, 0, -1868, 1110, -1868, -1868, -1868, -1868, 0, 0, + 1110, 0, 0, 0, 0, 0, 0, 1558, 0, 0, + 4446, 0, 0, 0, 0, 0, 0, -1868, 4438, 0, + 0, 0, 0, 0, 0, 4447, 4448, 0, 4439, 0, + 0, 0, 0, 0, 0, 0, -1868, 0, 4449, 0, + -1868, 0, 0, 0, 0, 1558, 1558, 0, 0, -1868, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4440, 0, -1868, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4441, + 0, 0, 0, -1868, 0, 0, 0, 0, 0, 0, + -1868, 0, 0, 0, 0, 0, 1110, 0, 0, 0, + 0, 0, 4871, -1868, 0, -1868, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4442, 0, + 0, 0, 0, 0, 4443, 0, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1558, 0, 1558, 1558, 1558, 0, 1110, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4444, 0, 0, 0, 0, 1110, 0, 4445, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4446, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4447, 4448, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4449, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1558, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1110, 0, + 0, 0, 1110, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 1110, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 0, 1110, 1110, 0, 1110, 1110, + 1110, 1110, 0, 1110, 0, 1110, 1110, 0, 1110, 0, + 0, 0, 0, 0, 0, 0, 1110, 1110, -1868, 0, + 0, 1110, 1110, 1110, 0, 0, 0, 0, 0, 0, + 0, 1110, 1110, 1110, 0, 1110, 0, 1110, 0, 1110, + 0, 1110, 0, 1110, 0, 0, 0, 0, 1110, 1110, + 0, 1110, 1110, 1110, 0, 0, 0, 1110, 0, 0, + 1110, 0, 0, 0, 0, 0, 0, 0, 0, 1110, + 0, 0, 1110, 0, 1110, 1110, 1110, 0, 0, 1110, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1110, 1, 1110, 2, 0, 1110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1110, 1110, 1110, 1110, + 1558, 1110, 0, 0, 0, 0, 1110, 0, 0, 0, + 0, 0, 0, 0, 0, 1111, 0, 1558, 0, 0, + 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 6, 0, 7, 0, 8, + 0, 0, 0, 0, 1110, 0, 0, 9, 0, 0, + 1111, 0, 0, 0, 0, 0, 1110, 0, 0, 0, + 0, -1868, 0, 1110, 0, 0, 0, 0, 10, 0, + 11, 12, 174, 175, 2158, 0, 0, 13, 0, 1558, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1868, 0, -1868, 14, 0, -1868, -1868, 15, 0, + 1194, 0, 1195, 0, 0, 0, 0, 0, 16, 0, + 661, 0, 1110, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 1163, 0, 0, 0, 18, 0, + 0, 0, 1196, 1197, 1110, 0, 0, 0, 19, 0, + 20, 0, 1198, 0, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 12, 0, 0, + 0, 0, 0, 0, 1111, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 23, 24, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 26, 0, 0, 1199, 0, + 0, 0, 0, 1110, 0, 0, 27, 28, 29, 0, + 30, 0, 1200, 0, 0, 31, 0, 0, 0, 0, + 0, 32, 0, 0, 1110, 33, 34, 35, 0, 0, + 0, 0, 0, 0, 0, 0, 1558, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 36, 0, 37, 0, 38, 0, 1201, 0, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 0, 1202, + 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1111, 0, 0, 0, 1111, 43, 44, 0, + 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, + 0, 0, 0, 0, 1203, 47, 0, 0, 0, 1111, + 0, 0, 1558, 0, 0, 0, 0, 0, 1111, 0, + 0, 0, 0, 0, 1110, 48, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1204, 0, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, + 0, 0, 0, 0, 0, 0, 0, 1205, 0, 0, + 0, 0, 0, 0, 0, 0, 1206, 0, 51, 1110, + 0, 0, 0, 1111, 1111, 1111, 1111, 0, 0, 1207, + 0, 1110, 0, 52, 1110, 0, 1111, 0, 0, 0, + 1208, 0, 0, 0, 53, 0, 0, 54, 0, 0, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1209, 0, 56, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2262, 1210, 0, 0, 1211, 0, 1212, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1213, 1214, 0, 0, 0, + 0, 1215, 1216, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1217, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1218, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1219, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, + 0, 0, 59, 0, 0, 0, 0, 1111, 0, 0, + 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, + 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 62, 0, 0, 1220, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1221, 0, 0, 63, 0, 0, 64, 0, 0, 1222, + 0, 0, 1223, 1224, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 1110, + 1110, 0, 0, 0, 1110, 0, 0, 0, 0, 0, + 0, 0, 0, 1558, 1226, 0, 0, 0, 0, 0, + 0, 0, 1227, 0, 67, 0, 1110, 0, 1110, 0, + 1110, 0, 1110, 0, 0, 0, 0, 0, 0, 0, + 0, -3286, 0, 1228, 0, 0, 68, 1110, 0, 0, + 0, 0, 0, 1558, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1110, 1110, 0, 0, + 0, 1110, 0, 1110, 0, 1110, 0, 0, 0, 0, + 1110, 1111, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3286, 0, 0, 0, 0, 0, 0, + 1229, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1558, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1110, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1111, 0, 1111, 1110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1558, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1111, 1111, + 0, 0, 0, 0, 1111, 0, 0, 0, 1111, 1111, + 1111, 0, 0, 0, 0, 0, 0, 0, 1111, 1111, + 0, 0, 0, 0, 1111, 0, 0, 0, 1111, 1111, + 1111, 0, 1111, 1111, 1111, 1110, 0, 0, 0, 0, + 0, 0, 1111, 0, 1111, 1110, 0, 1111, 1111, 1111, + 1111, 0, 1111, 0, 1111, 1111, 0, 0, 0, 1110, + 0, 1558, 1110, 0, 0, 0, 0, 0, 1111, 1111, + 1111, 1111, 1111, 0, 1111, 1111, 1111, 1111, 1111, 1111, + 0, 1111, 1111, 0, 1111, 1111, 0, 1111, 1111, 0, + 0, 1111, 1111, 0, 1111, 1111, 0, 1111, 0, 1111, + 0, 0, 0, 1111, 1111, 1111, 0, 0, 1111, 1111, + 1111, 1111, 0, 1111, 0, 0, 0, 0, 0, 0, + 1111, 0, 0, 0, 0, 0, 1111, 1111, 1111, 1111, + 0, 0, 0, 0, 0, 0, 0, 1111, 1111, 0, + 1111, 1111, 0, 0, 1111, 1111, 1111, 1111, 1111, 1111, + 1111, 1111, 1111, 1111, 1111, 1111, 1111, 0, 0, 1111, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1111, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1110, 1110, 1, 1110, 0, 0, 0, 0, 0, 0, + 1111, 0, 1111, 0, 0, 0, 1110, 1110, 1110, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1110, 1110, 0, 0, 0, 3, 4, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 1110, 6, 0, 7, 0, 8, + 0, 0, 0, 0, 0, 0, 1110, 9, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, + 11, 12, 0, 0, 0, 1110, 0, 13, 0, 0, + 1110, 1110, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 15, 1110, + 0, 0, 1111, 1110, 0, 0, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 1111, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 20, 0, 0, 0, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 23, 24, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 26, 0, 0, 0, 0, + 0, 0, 0, 4422, 174, 175, 27, 28, 29, 0, + 30, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 33, 34, 35, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1111, -904, 0, -904, 0, + 0, 36, 0, 37, 0, 38, 0, 0, 0, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, + 40, 41, 0, 0, 2032, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 42, 0, 0, 1111, 0, + 0, 0, 0, 0, 1110, 1110, 1111, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, + 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, + 4423, 0, 0, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1112, 0, 0, 0, 0, 48, 0, 0, 0, 0, + 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 4425, 0, 0, 0, 1111, 1111, 1111, 0, 51, 4130, + 4131, 0, 0, 0, 4132, 4133, 0, 0, 0, 0, + 0, 0, 0, 52, 4134, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 53, 0, 1558, 54, 0, 0, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 4135, + 0, 0, 0, 0, 0, 56, 0, 4426, 4427, 4428, + 0, 0, 4136, 1111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4429, 4137, 0, + 5945, 1111, 0, 0, 0, 1111, 1111, 1110, 1111, 1111, + 0, 0, 0, 0, 0, 0, 0, 1111, 0, 1111, + 0, 0, 0, 0, 0, 0, 1558, 0, 4139, 1112, + 0, 0, 0, 0, 1110, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4140, 4141, 4142, + 1111, 4430, 0, 4431, 0, 0, 0, 4143, 4144, 4145, + 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, -904, 0, 4432, 0, 4146, 1111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1111, 57, + 0, 4433, 0, 0, 0, 0, 0, 0, 4434, 0, + 0, 1111, 0, 0, 0, 0, 0, 4147, 0, 0, + 0, 0, 1111, 4435, 0, 0, 0, 0, 58, 0, + 4436, 0, 59, 0, 0, 0, 0, 0, 1111, 0, + 0, 0, 60, 0, 4149, 4437, 0, 0, 0, 0, + 61, 0, 0, 0, 0, 0, 1110, 0, 1110, 0, + 0, 0, 62, 0, 0, 0, 0, 4150, 4151, 4152, + 0, 0, 0, 0, 0, 1111, 0, 0, 0, 0, + 0, 0, 1111, 63, 0, 0, 64, 1112, 0, 4153, + 4154, 1112, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4438, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4439, 0, 1112, 0, 0, 0, 0, 65, + 0, 0, 0, 1112, 0, 0, 0, 0, 66, 0, + 0, 0, 0, 0, 0, 0, 0, 4155, 0, 4156, + 4157, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4440, 0, 0, 0, 67, 0, 4158, 0, 0, 0, + 0, 0, 0, 4441, 0, 0, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 0, 68, 0, 1111, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1112, 1112, + 1112, 1112, 4159, 4160, 0, 0, 0, 0, 0, 0, + 0, 1112, 4442, 0, 0, 0, 0, 0, 4443, 0, + 0, 1111, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1111, 0, 0, 0, 0, 0, 0, 0, 4162, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4444, 0, 0, 1111, + 0, 0, 0, 4445, 0, 0, 0, 0, 1110, 4163, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1110, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4446, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4447, 4448, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4449, 0, 0, 0, 0, 0, 0, + 0, 4164, 4165, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4166, 4167, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4168, + 1111, 0, 0, 0, 1111, 0, 0, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, + 0, 0, 0, 0, 0, 1111, 0, 1111, 1111, 0, + 1111, 1111, 1111, 1111, 0, 1111, 0, 1111, 1111, 0, + 1111, 0, 0, 0, 0, 0, 0, 0, 1111, 1111, + 0, 0, 0, 1111, 1111, 1111, 0, 0, 0, 0, + 0, 0, 0, 1111, 1111, 1111, 0, 1111, 0, 1111, + 0, 1111, 0, 1111, 0, 1111, 0, 0, 0, 0, + 1111, 1111, 0, 1111, 1111, 1111, 0, 0, 0, 1111, + 0, 0, 1111, 4170, 0, 0, 4171, 0, 0, 4172, + 0, 1111, 0, 0, 1111, 0, 1111, 1111, 1111, 0, + 0, 1111, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4174, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1111, 0, 1111, 0, 0, 1111, 0, + 0, 0, 4175, 0, 0, 0, 0, 0, 1111, 1111, + 1111, 1111, 0, 1111, 0, 0, 1112, 0, 1111, 0, + 1110, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1110, 0, 0, 0, 0, 0, + 0, 0, 1558, 0, 0, 0, 0, 0, 1110, 0, + 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, + 0, 0, 0, 1110, 0, 0, 0, 0, 1111, 0, + 0, 0, 0, 0, 0, 1111, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 1112, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1111, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 1112, 0, 0, 0, 0, 1112, + 0, 0, 0, 1112, 1112, 1112, 1111, 0, 0, 0, + 0, 0, 0, 1112, 1112, 0, 0, 0, 0, 1112, + 0, 0, 0, 1112, 1112, 1112, 0, 1112, 1112, 1112, + 0, 0, 0, 0, 0, 0, 0, 1112, 0, 1112, + 0, 0, 1112, 1112, 1112, 1112, 0, 1112, 0, 1112, + 1112, 1110, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 1112, 1112, 1112, 1112, 0, 1112, + 1112, 1112, 1112, 1112, 1112, 1111, 1112, 1112, 0, 1112, + 1112, 0, 1112, 1112, 0, 0, 1112, 1112, 0, 1112, + 1112, 0, 1112, 0, 1112, 0, 1111, 0, 1112, 1112, + 1112, 0, 0, 1112, 1112, 1112, 1112, 0, 1112, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 0, 1112, 1112, 1112, 1112, 0, 0, 0, 0, 0, + 0, 0, 1112, 1112, 0, 1112, 1112, 0, 0, 1112, + 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + 1112, 1112, 0, 0, 1112, 0, 0, 0, 4422, 174, + 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 933, 0, 0, 0, 0, 0, + 0, 1110, 0, 0, 0, 0, 5332, 0, 4530, 1112, + 933, 0, 0, 0, 0, 0, 1237, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4532, 0, 0, 0, 0, 0, 0, 0, 5333, 0, + 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2032, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1558, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1111, 0, 0, 0, 4423, 0, 0, 0, 0, + 0, 0, 0, 1111, 0, 0, 1111, 0, 0, 0, + 0, 0, 1558, 0, 0, 1112, 0, 1112, 0, 0, + 0, 0, 0, 4536, 1110, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 4538, 0, 0, 0, + 0, 0, 0, 0, 0, 4425, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4540, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1110, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4426, 4427, 4428, 0, 0, 0, 0, 933, + 0, 933, 0, 933, 933, 0, 0, 1112, 0, 0, + 933, 0, 4429, 933, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4541, 0, + 0, 0, 0, 0, 0, 0, 4430, 0, 4431, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4432, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4433, 0, 0, 0, + 0, 0, 0, 4434, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4435, 0, + 0, 0, 0, 0, 0, 4436, 0, 0, 0, 4543, + 0, 0, 0, 0, 0, 1110, 4545, 0, 0, 1110, + 4437, 1111, 1111, 0, 0, 0, 1111, 0, 0, 0, + 1112, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1111, 4547, + 1111, 0, 1111, 0, 1111, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1111, + 0, 0, 0, 1112, 0, 0, 0, 4438, 0, 0, + 0, 1112, 1112, 0, 0, 0, 0, 4439, 1111, 1111, + 0, 0, 0, 1111, 0, 1111, 0, 1111, 0, 0, + 0, 0, 1111, 0, 933, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4440, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 4441, 0, + 4549, 0, 0, 0, 0, 0, 1110, 0, 0, 1111, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1111, 0, 0, 0, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4442, 0, 1112, + 1112, 1112, 0, 4443, 0, 1111, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1897, 0, 0, 0, 0, 0, 0, 1112, 0, + 0, 4444, 0, 0, 0, 0, 0, 0, 4445, 0, + 0, 0, 0, 0, 0, 0, 1112, 0, 0, 0, + 1112, 1112, 0, 1112, 1112, 0, 0, 1111, 0, 0, + 0, 0, 1112, 0, 1112, 0, 0, 1111, 0, 0, + 4446, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1111, 0, 0, 1111, 4447, 4448, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 4449, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1112, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1112, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 933, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1112, 0, 0, 0, 0, 0, 0, 1112, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 1111, 1111, 0, 1111, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1076, 1111, 1111, + 1111, 0, 0, 0, 0, 0, 1112, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1111, 1111, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1111, 0, + 0, 0, 0, 0, 1112, 0, 0, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1111, 0, 0, + 0, 0, 1111, 1111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1111, 0, 0, 0, 1111, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1439, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 1112, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, + 1112, 0, 1112, 1112, 0, 1112, 1112, 1112, 1112, 0, + 1112, 0, 1112, 1112, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 1112, 1112, 0, 0, 0, 1112, 1112, + 1112, 0, 0, 0, 0, 0, 0, 0, 1112, 1112, + 1112, 0, 1112, 0, 1112, 0, 1112, 0, 1112, 0, + 1112, 0, 0, 0, 0, 1112, 1112, 0, 1112, 1112, + 1112, 0, 0, 0, 1112, 0, 0, 1112, 0, 0, + 0, 0, 0, 0, 0, 0, 1112, 0, 0, 1112, + 0, 1112, 1112, 1112, 0, 0, 1112, 0, 1569, 0, + 0, 0, 0, 0, 0, 0, 1111, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1112, 0, + 1112, 1595, 0, 1112, 0, 0, 0, 0, 0, 0, + 1609, 0, 0, 1112, 1112, 1112, 1112, 0, 1112, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 0, 0, 1682, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 1, + 1112, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1111, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 0, 0, 0, 1112, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 7, 0, 8, 0, 933, 0, + 0, 1112, 0, 0, 9, 0, 0, 0, 0, 1111, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 11, 12, 0, + 0, 0, 0, 0, 13, 0, 1111, 1111, 933, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1111, + 1112, 0, 0, 933, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 2822, 0, 0, 0, + 0, 1112, 0, 0, 0, 19, 0, 20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1875, + 933, 933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 24, 0, 0, 0, 0, 0, 0, 1111, 0, + 1111, 25, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 27, 28, 0, 0, 30, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 32, 0, + 0, 0, 33, 34, 35, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, + 37, 1112, 38, 0, 0, 0, 0, 0, 0, 39, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, + 0, 1111, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 43, 0, 1112, 45, 0, 0, + 0, 0, 0, 2066, 46, 0, 0, 0, 1112, 0, + 0, 1112, 47, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1111, 0, 0, + 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 50, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2151, 0, 2151, 51, 0, 0, 0, 0, + 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 3058, 0, 0, 0, 0, 1111, 1111, 0, 0, + 0, 53, 0, 0, 54, 0, 0, 55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 0, 2198, 0, 0, 0, + 2203, 0, 2205, 0, 0, 0, 0, 0, 0, 0, + 2220, 2221, 0, 0, 0, 0, 2250, 0, 0, 0, + 2255, 2256, 2257, 0, 2259, 2260, 2261, 0, 0, 0, + 0, 0, 0, 0, 2269, 0, 2272, 0, 0, 2273, + 2274, 2275, 2276, 0, 0, 0, 2280, 2281, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 933, 0, + 2293, 2294, 2301, 2305, 2306, 0, 2309, 2310, 2311, 2314, + 2315, 0, 0, 2318, 2319, 0, 2325, 2326, 0, 2329, + 2330, 0, 0, 0, 2334, 0, 2336, 2337, 0, 2339, + 0, 2340, 0, 1897, 0, 2343, 2301, 2345, 0, 0, + 2351, 0, 2353, 2354, 0, 2355, 57, 0, 0, 0, + 0, 0, 2359, 0, 0, 0, 0, 0, 2361, 2362, + 2363, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 58, 0, 0, 0, 59, + 0, 0, 0, 0, 0, 0, 1112, 1112, 0, 60, + 0, 1112, 0, 0, 0, 0, 0, 61, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, + 0, 0, 0, 1112, 0, 1112, 0, 1112, 0, 1112, + 0, 0, 0, 0, 0, 0, 2459, 0, 0, 0, + 63, 0, 0, 64, 1112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 1112, 0, 0, 0, 1112, 0, + 1112, 0, 1112, 0, 0, 0, 65, 1112, 0, 0, + 0, 0, 1111, 0, 0, 66, 0, 0, 0, 0, + 0, 933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, + 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 1111, 0, 0, 0, 1112, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 1111, 0, 0, 1112, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 933, 0, 2570, 0, 2575, 0, 0, 0, 0, 0, + 1112, 0, 0, 0, 0, 933, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2598, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3418, 933, 0, 0, 0, + 0, 0, 0, 0, 0, 933, 933, 933, 0, 0, + 3058, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3708, 0, 0, 0, 3708, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1111, 0, 0, 1112, 0, 0, 1112, + 0, 0, 0, 0, 2674, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2698, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2811, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2866, 0, 0, 0, 0, 0, 0, 0, 2873, 2874, + 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 933, 0, 0, 0, + 0, 0, 0, 933, 0, 0, 0, 1112, 1112, 0, + 1112, 0, 0, 0, 1111, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 1112, 1112, 1111, 0, 0, 0, + 0, 0, 2893, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1112, 1112, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 2932, 2934, 2936, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1111, 0, 1112, 0, 0, 0, 0, 1112, 1112, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1112, 0, 0, 0, + 1112, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2998, 0, 0, 0, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3006, + 0, 3007, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3032, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3046, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3085, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3085, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3106, 0, 0, 0, 0, 3708, + 0, 0, 0, 0, 0, 0, 0, 1111, 0, 0, + 3112, 1111, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3132, 0, 0, + 0, 0, 0, 0, 2575, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1111, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3222, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3247, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1112, 0, 3247, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3331, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3446, 0, 0, 0, 3448, 0, 0, 3449, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 0, 1112, 0, 3727, 0, 0, + 0, 0, 3731, 3732, 3733, 3734, 0, 3735, 0, 3736, + 3737, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3742, 3743, 0, 0, 0, 3744, 3745, 3746, 0, 0, + 0, 0, 0, 0, 0, 3748, 3749, 3750, 0, 3751, + 0, 3753, 0, 3755, 0, 3757, 0, 3759, 0, 0, + 0, 0, 2311, 3762, 0, 2311, 0, 3765, 0, 0, + 0, 3766, 0, 0, 3767, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3774, 0, 3775, 3776, + 3777, 0, 0, 3778, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1112, 0, 0, 0, + 3800, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3810, 3813, 0, 0, 3818, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4460, 4460, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3851, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 3085, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 1112, 0, 0, 0, 0, 0, 4460, 0, + 0, 0, 0, 0, 0, 0, 2575, 0, 0, 0, + 0, 933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2575, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 933, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3986, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 933, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4110, 0, + 0, 0, 0, 0, 0, 0, 0, 1112, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 4195, 0, 0, 0, 0, 0, 0, + 1112, 0, 0, 0, 0, 4200, 0, 0, 4201, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4460, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1112, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4460, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1112, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4229, 4230, 0, 0, 0, 4235, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3418, 0, 0, 0, 0, 0, 0, + 4255, 0, 4256, 0, 4257, 0, 4258, 0, 0, 933, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4273, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 4294, 4295, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3247, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1112, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3085, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3085, 0, 0, 0, 3085, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2575, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4460, 0, + 4460, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 4485, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3247, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3247, 0, 0, 4499, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4460, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 1112, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3418, 0, 0, 0, 3708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4706, 4707, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4714, 4715, 4716, 0, 0, 0, 0, 5485, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4738, 4739, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4761, + 0, 3708, 0, 0, 0, 0, 0, 933, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3708, 3085, + 0, 0, 0, 0, 3085, 3085, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2575, 0, 0, 0, 2575, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 933, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4984, 4985, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 933, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4460, 3247, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4460, 3708, 0, 0, 4460, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 933, 0, 0, 0, 0, 0, 0, 0, + 0, 3247, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3085, 3085, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2575, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4460, 0, 0, 0, 0, + 0, 0, 0, 4460, 0, 0, 0, 0, 0, 4460, + 4460, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4460, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4460, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5268, 0, 5270, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4460, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4460, + 0, 0, 0, 4460, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4460, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5379, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4460, 6064, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5399, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4460, 0, 0, 0, 0, + 0, 0, 3247, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3085, 3085, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4460, + 0, 4460, 4460, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4460, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4460, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4460, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 933, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3247, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2575, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5636, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5839, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 949, + 0, 0, 0, 0, 950, 951, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 952, 953, 0, 954, 955, + 956, 957, 958, 959, 960, 961, 962, 963, 964, 0, + 0, 0, 0, 0, 0, 0, 965, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 966, 967, 968, 969, 0, 5962, 0, + 0, 0, 0, 0, 970, 971, 0, 972, 0, 0, + 0, 0, 0, 0, 973, 974, 0, 0, 975, 976, + 977, 978, 0, 979, 176, 0, 980, 981, 0, 0, + 0, 0, 0, 0, 0, 982, 0, 0, 983, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 984, 985, 986, 0, + 987, 0, 0, 0, 0, 0, 0, 0, 988, 989, + 990, 178, 0, 0, 0, 0, 0, 991, 0, 0, + 179, 0, 1682, 0, 0, 0, 992, 0, 0, 993, + 0, 0, 0, 0, 0, 0, 0, 0, 994, 0, + 995, 0, 996, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 997, 998, 0, 999, + 0, 0, 0, 1000, 180, 0, 0, 0, 1001, 0, + 0, 181, 1002, 0, 1003, 1004, 1005, 1006, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, + 0, 0, 0, 0, 0, 0, 1011, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, + 0, 0, 0, 0, 0, 1013, 1014, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1015, 0, 0, 0, 0, 0, + 0, 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1020, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, + 0, 39, 0, 0, 1024, 1025, 0, 0, 0, 2575, + 41, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, + 1030, 199, 200, 201, 202, 203, 204, 1031, 206, 207, + 208, 209, 210, 211, 212, 1032, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 1033, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 1038, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 1039, 1040, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 2575, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 1041, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 1042, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 1043, 1044, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 1045, 403, 404, 405, 406, 407, 1046, 409, + 410, 411, 412, 413, 414, 415, 416, 1047, 1048, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 1049, 441, 442, 443, 444, 445, 446, 447, 1050, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 1051, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 1052, 505, 506, 507, 508, + 509, 510, 1053, 512, 513, 514, 515, 516, 517, 1054, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 1055, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 1056, + 1057, 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 1062, 590, 1063, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 1064, 604, 1065, 606, 607, + 608, 0, 609, 610, 611, 1066, 0, 0, 0, 0, + 0, 0, 0, 0, 1067, 1068, 0, 0, 949, 0, + 1069, 0, 0, 950, 951, 1070, 0, 0, 0, 1071, + 1072, 0, 0, 1073, 952, 953, 0, 954, 955, 956, + 957, 958, 959, 960, 961, 962, 963, 964, 0, 0, + 0, 0, 0, 0, 0, 965, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 966, 967, 968, 969, 0, 0, 0, 2298, + 0, 0, 0, 970, 971, 0, 972, 0, 0, 0, + 0, 0, 0, 973, 974, 0, 0, 975, 976, 977, + 978, 0, 979, 176, 0, 980, 981, 0, 0, 0, + 0, 0, 0, 0, 982, 0, 0, 983, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 984, 985, 986, 0, 987, + 0, 0, 0, 0, 0, 0, 0, 988, 989, 990, + 178, 0, 0, 0, 0, 0, 991, 0, 0, 179, + 0, 0, 0, 0, 0, 992, 0, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 994, 2299, 995, + 0, 996, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 997, 998, 0, 999, 0, + 0, 0, 1000, 180, 0, 0, 0, 1001, 0, 0, + 181, 1002, 0, 1003, 1004, 1005, 1006, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, + 0, 0, 0, 0, 0, 1011, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, + 0, 0, 0, 0, 1013, 1014, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1015, 0, 0, 0, 0, 0, 0, + 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, + 0, 0, 0, 2300, 0, 1020, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, + 0, 0, 0, 1024, 1025, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, + 199, 200, 201, 202, 203, 204, 1031, 206, 207, 208, + 209, 210, 211, 212, 1032, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 1033, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 1038, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 1039, 1040, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 1041, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 1042, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 1043, 1044, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 1045, 403, 404, 405, 406, 407, 1046, 409, 410, + 411, 412, 413, 414, 415, 416, 1047, 1048, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 1049, 441, 442, 443, 444, 445, 446, 447, 1050, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 1051, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 1052, 505, 506, 507, 508, 509, + 510, 1053, 512, 513, 514, 515, 516, 517, 1054, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 1055, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 1056, 1057, + 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 1062, 590, 1063, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 1064, 604, 1065, 606, 607, 608, + 0, 609, 610, 611, 1066, 0, 0, 0, 0, 0, + 0, 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, + 0, 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, + 0, 0, 1073, 952, 953, 0, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 0, 0, 0, + 0, 0, 0, 0, 965, 0, 0, 0, 0, 0, + 0, 3081, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3082, 967, 968, 969, 0, 0, 0, 0, 0, + 0, 0, 970, 971, 0, 972, 0, 0, 0, 0, + 0, 0, 973, 974, 0, 0, 975, 976, 977, 978, + 0, 979, 176, 0, 980, 981, 0, 0, 0, 0, + 0, 0, 0, 3083, 0, 0, 983, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 984, 985, 986, 0, 987, 0, + 0, 0, 0, 0, 0, 0, 988, 989, 990, 178, + 0, 0, 0, 0, 0, 991, 0, 0, 179, 0, + 0, 0, 0, 0, 992, 0, 0, 993, 0, 0, + 0, 0, 0, 0, 0, 0, 994, 0, 995, 0, + 996, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 997, 998, 0, 999, 0, 0, + 0, 1000, 180, 0, 0, 0, 1001, 0, 0, 181, + 1002, 0, 1003, 1004, 1005, 1006, 0, 3084, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, + 0, 0, 0, 0, 1011, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, + 0, 0, 0, 1013, 1014, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1015, 0, 0, 0, 0, 0, 0, 1016, + 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1020, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, + 0, 0, 1024, 1025, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, + 200, 201, 202, 203, 204, 1031, 206, 207, 208, 209, + 210, 211, 212, 1032, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 1033, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 1038, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 1039, 1040, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 1041, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 1042, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 1043, 1044, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 1045, 403, 404, 405, 406, 407, 1046, 409, 410, 411, + 412, 413, 414, 415, 416, 1047, 1048, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 1049, + 441, 442, 443, 444, 445, 446, 447, 1050, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 1051, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 1052, 505, 506, 507, 508, 509, 510, + 1053, 512, 513, 514, 515, 516, 517, 1054, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 1055, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, + 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 1062, + 590, 1063, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 1064, 604, 1065, 606, 607, 608, 0, + 609, 610, 611, 1066, 0, 0, 0, 0, 0, 0, + 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, 0, + 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, 0, + 0, 1073, 952, 953, 0, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 0, 0, 0, 0, + 0, 0, 0, 965, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 966, 967, 968, 969, 0, 0, 0, 0, 0, 0, + 0, 970, 971, 0, 972, 0, 0, 0, 0, 0, + 0, 973, 974, 0, 0, 975, 976, 977, 978, 0, + 979, 176, 0, 980, 981, 0, 0, 0, 0, 0, + 0, 0, 982, 0, 0, 983, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 984, 985, 986, 0, 987, 0, 0, + 0, 0, 0, 0, 0, 988, 989, 990, 178, 0, + 0, 0, 0, 0, 991, 0, 0, 179, 0, 0, + 0, 0, 0, 992, 0, 0, 993, 0, 0, 0, + 0, 0, 0, 0, 0, 994, 0, 995, 0, 996, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 997, 998, 0, 999, 0, 0, 0, + 1000, 180, 0, 0, 0, 1001, 0, 0, 181, 1002, + 0, 1003, 1004, 1005, 1006, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, 0, + 0, 0, 0, 1011, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, + 0, 0, 1013, 1014, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1015, 0, 0, 0, 0, 0, 0, 1016, 1017, + 0, 1018, 1019, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1020, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, 0, + 0, 1024, 1025, 0, 1568, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, 200, + 201, 202, 203, 204, 1031, 206, 207, 208, 209, 210, + 211, 212, 1032, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 1033, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 1038, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 1039, 1040, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 1041, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 1042, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 1043, 1044, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 1045, + 403, 404, 405, 406, 407, 1046, 409, 410, 411, 412, + 413, 414, 415, 416, 1047, 1048, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 1049, 441, + 442, 443, 444, 445, 446, 447, 1050, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 1051, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 1052, 505, 506, 507, 508, 509, 510, 1053, + 512, 513, 514, 515, 516, 517, 1054, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 1055, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, 1059, + 571, 572, 573, 574, 1060, 1061, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 1062, 590, + 1063, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 1064, 604, 1065, 606, 607, 608, 0, 609, + 610, 611, 1066, 0, 0, 0, 0, 0, 0, 0, + 0, 1067, 1068, 0, 0, 949, 0, 1069, 0, 0, + 950, 951, 1070, 0, 0, 0, 1071, 1072, 0, 0, + 1073, 952, 953, 0, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 0, 0, 0, 0, 0, + 0, 0, 965, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 966, + 967, 968, 969, 0, 0, 0, 0, 0, 0, 0, + 970, 971, 0, 972, 0, 0, 0, 0, 0, 0, + 973, 974, 0, 0, 975, 976, 977, 978, 0, 979, + 176, 0, 980, 981, 0, 0, 0, 0, 0, 0, + 0, 2572, 0, 0, 983, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 984, 985, 986, 0, 987, 0, 0, 0, + 0, 0, 0, 0, 988, 989, 990, 178, 0, 0, + 0, 0, 0, 991, 0, 2573, 179, 0, 0, 0, + 0, 0, 992, 0, 0, 993, 0, 0, 0, 0, + 0, 0, 0, 0, 994, 0, 995, 0, 996, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 997, 998, 0, 999, 0, 0, 0, 1000, + 180, 0, 0, 0, 1001, 0, 0, 181, 1002, 0, + 1003, 1004, 1005, 1006, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 1007, 1008, 1009, 0, 1010, 0, 0, 0, 0, + 0, 0, 1011, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1012, 0, 0, 0, 0, 0, 0, + 0, 1013, 1014, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1015, 0, 0, 0, 0, 0, 0, 1016, 1017, 0, + 1018, 1019, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1020, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1021, 1022, 1023, 0, 0, 0, 0, 0, + 1024, 1025, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 1026, + 1027, 1028, 1029, 195, 196, 197, 1030, 199, 200, 201, + 202, 203, 204, 1031, 206, 207, 208, 209, 210, 211, + 212, 1032, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 1033, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 1034, 243, 1035, 1036, 1037, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 1038, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 1039, 1040, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 1041, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 1042, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 1043, 1044, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 1045, 403, + 404, 405, 406, 407, 1046, 409, 410, 411, 412, 413, + 414, 415, 416, 1047, 1048, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 1049, 441, 442, + 443, 444, 445, 446, 447, 1050, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 1051, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 1052, 505, 506, 507, 508, 509, 510, 1053, 512, + 513, 514, 515, 516, 517, 1054, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 1055, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 1056, 1057, 1058, 1059, 571, + 572, 573, 574, 1060, 1061, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 1062, 590, 1063, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 1064, 604, 1065, 606, 607, 608, 0, 609, 610, + 611, 1066, 0, 0, 0, 0, 0, 0, 0, 0, + 1067, 1068, 0, 0, 949, 0, 1069, 0, 0, 950, + 951, 1070, 0, 0, 0, 1071, 1072, 0, 0, 1073, + 952, 953, 0, 954, 955, 956, 957, 958, 959, 960, + 961, 962, 963, 964, 0, 0, 0, 0, 0, 0, + 0, 965, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 966, 967, + 968, 969, 0, 0, 0, 0, 0, 0, 0, 970, + 971, 0, 972, 0, 0, 0, 0, 0, 0, 973, + 974, 0, 0, 975, 976, 977, 978, 0, 979, 176, + 0, 980, 981, 0, 0, 0, 0, 0, 0, 0, + 982, 0, 0, 983, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 984, 985, 986, 0, 987, 0, 0, 0, 2931, + 0, 0, 0, 988, 989, 990, 178, 0, 0, 0, + 0, 0, 991, 0, 0, 179, 0, 0, 0, 0, + 0, 992, 0, 0, 993, 0, 0, 0, 0, 0, + 0, 0, 0, 994, 0, 995, 0, 996, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 997, 998, 0, 999, 0, 0, 0, 1000, 180, + 0, 0, 0, 1001, 0, 0, 181, 1002, 0, 1003, + 1004, 1005, 1006, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 1007, 1008, 1009, 0, 1010, 0, 0, 0, 0, 0, + 0, 1011, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1012, 0, 0, 0, 0, 0, 0, 0, + 1013, 1014, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1015, + 0, 0, 0, 0, 0, 0, 1016, 1017, 0, 1018, + 1019, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1020, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1021, 1022, 1023, 0, 0, 0, 0, 0, 1024, + 1025, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 1026, 1027, + 1028, 1029, 195, 196, 197, 1030, 199, 200, 201, 202, + 203, 204, 1031, 206, 207, 208, 209, 210, 211, 212, + 1032, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 1033, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 1034, 243, 1035, 1036, 1037, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 1038, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 1039, 1040, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 1041, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 1042, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 1043, 1044, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 1045, 403, 404, + 405, 406, 407, 1046, 409, 410, 411, 412, 413, 414, + 415, 416, 1047, 1048, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 1049, 441, 442, 443, + 444, 445, 446, 447, 1050, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 1051, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 1052, 505, 506, 507, 508, 509, 510, 1053, 512, 513, + 514, 515, 516, 517, 1054, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 1055, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 1056, 1057, 1058, 1059, 571, 572, + 573, 574, 1060, 1061, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 1062, 590, 1063, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 1064, 604, 1065, 606, 607, 608, 0, 609, 610, 611, + 1066, 0, 0, 0, 0, 0, 0, 0, 0, 1067, + 1068, 0, 0, 949, 0, 1069, 0, 0, 950, 951, + 1070, 0, 0, 0, 1071, 1072, 0, 0, 1073, 952, + 953, 0, 954, 955, 956, 957, 958, 959, 960, 961, + 962, 963, 964, 0, 0, 0, 0, 0, 0, 0, + 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 966, 967, 968, + 969, 0, 0, 0, 0, 0, 0, 0, 970, 971, + 0, 972, 0, 0, 0, 0, 0, 0, 973, 974, + 0, 0, 975, 976, 977, 978, 0, 979, 176, 0, + 980, 981, 0, 0, 0, 0, 0, 0, 0, 982, + 0, 0, 983, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 984, 985, 986, 0, 987, 0, 0, 0, 2933, 0, + 0, 0, 988, 989, 990, 178, 0, 0, 0, 0, + 0, 991, 0, 0, 179, 0, 0, 0, 0, 0, + 992, 0, 0, 993, 0, 0, 0, 0, 0, 0, + 0, 0, 994, 0, 995, 0, 996, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 997, 998, 0, 999, 0, 0, 0, 1000, 180, 0, + 0, 0, 1001, 0, 0, 181, 1002, 0, 1003, 1004, + 1005, 1006, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 1007, + 1008, 1009, 0, 1010, 0, 0, 0, 0, 0, 0, + 1011, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1012, 0, 0, 0, 0, 0, 0, 0, 1013, + 1014, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1015, 0, + 0, 0, 0, 0, 0, 1016, 1017, 0, 1018, 1019, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1020, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1021, 1022, 1023, 0, 0, 0, 0, 0, 1024, 1025, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 1026, 1027, 1028, + 1029, 195, 196, 197, 1030, 199, 200, 201, 202, 203, + 204, 1031, 206, 207, 208, 209, 210, 211, 212, 1032, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 1033, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 1034, + 243, 1035, 1036, 1037, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 1038, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 1039, 1040, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 1041, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 1042, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 1043, 1044, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 1045, 403, 404, 405, + 406, 407, 1046, 409, 410, 411, 412, 413, 414, 415, + 416, 1047, 1048, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 1049, 441, 442, 443, 444, + 445, 446, 447, 1050, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 1051, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 1052, + 505, 506, 507, 508, 509, 510, 1053, 512, 513, 514, + 515, 516, 517, 1054, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 1055, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 1056, 1057, 1058, 1059, 571, 572, 573, + 574, 1060, 1061, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 1062, 590, 1063, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 1064, + 604, 1065, 606, 607, 608, 0, 609, 610, 611, 1066, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 1068, + 0, 0, 949, 0, 1069, 0, 0, 950, 951, 1070, + 0, 0, 0, 1071, 1072, 0, 0, 1073, 952, 953, + 0, 954, 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 0, 0, 0, 0, 0, 0, 0, 965, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 966, 967, 968, 969, + 0, 0, 0, 0, 0, 0, 0, 970, 971, 0, + 972, 0, 0, 0, 0, 0, 0, 973, 974, 0, + 0, 975, 976, 977, 978, 0, 979, 176, 0, 980, + 981, 0, 0, 0, 0, 0, 0, 0, 982, 0, + 0, 983, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 984, + 985, 986, 0, 987, 0, 0, 0, 2935, 0, 0, + 0, 988, 989, 990, 178, 0, 0, 0, 0, 0, + 991, 0, 0, 179, 0, 0, 0, 0, 0, 992, + 0, 0, 993, 0, 0, 0, 0, 0, 0, 0, + 0, 994, 0, 995, 0, 996, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 997, + 998, 0, 999, 0, 0, 0, 1000, 180, 0, 0, + 0, 1001, 0, 0, 181, 1002, 0, 1003, 1004, 1005, + 1006, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 1007, 1008, + 1009, 0, 1010, 0, 0, 0, 0, 0, 0, 1011, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1012, 0, 0, 0, 0, 0, 0, 0, 1013, 1014, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1015, 0, 0, + 0, 0, 0, 0, 1016, 1017, 0, 1018, 1019, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1020, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1021, + 1022, 1023, 0, 0, 0, 0, 0, 1024, 1025, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 1026, 1027, 1028, 1029, + 195, 196, 197, 1030, 199, 200, 201, 202, 203, 204, + 1031, 206, 207, 208, 209, 210, 211, 212, 1032, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 1033, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 1034, 243, + 1035, 1036, 1037, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 1038, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 1039, + 1040, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 1041, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 1042, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 1043, + 1044, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 1045, 403, 404, 405, 406, + 407, 1046, 409, 410, 411, 412, 413, 414, 415, 416, + 1047, 1048, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 1049, 441, 442, 443, 444, 445, + 446, 447, 1050, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 1051, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 1052, 505, + 506, 507, 508, 509, 510, 1053, 512, 513, 514, 515, + 516, 517, 1054, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 1055, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 1056, 1057, 1058, 1059, 571, 572, 573, 574, + 1060, 1061, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 1062, 590, 1063, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 1064, 604, + 1065, 606, 607, 608, 0, 609, 610, 611, 1066, 0, + 0, 0, 0, 0, 0, 0, 0, 1067, 1068, 0, + 0, 949, 0, 1069, 0, 0, 950, 951, 1070, 0, + 0, 0, 1071, 1072, 0, 0, 1073, 952, 953, 0, + 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, + 964, 0, 0, 0, 0, 0, 0, 0, 965, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 966, 967, 968, 969, 0, + 0, 0, 0, 0, 0, 0, 970, 971, 0, 972, + 0, 0, 0, 0, 0, 0, 973, 974, 0, 0, + 975, 976, 977, 978, 0, 979, 176, 0, 980, 981, + 0, 0, 0, 0, 0, 0, 0, 4785, 0, 0, + 983, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 984, 985, + 986, 0, 987, 0, 0, 0, 0, 0, 0, 0, + 988, 989, 990, 178, 0, 0, 0, 0, 0, 991, + 0, 2573, 179, 0, 0, 0, 0, 0, 992, 0, + 0, 993, 0, 0, 0, 0, 0, 0, 0, 0, + 994, 0, 995, 0, 996, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 997, 998, + 0, 999, 0, 0, 0, 1000, 180, 0, 0, 0, + 1001, 0, 0, 181, 1002, 0, 1003, 1004, 1005, 1006, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 1007, 1008, 1009, + 0, 1010, 0, 0, 0, 0, 0, 0, 1011, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1012, + 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1015, 0, 0, 0, + 0, 0, 0, 1016, 1017, 0, 1018, 1019, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1020, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1021, 1022, + 1023, 0, 0, 0, 0, 0, 1024, 1025, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 1026, 1027, 1028, 1029, 195, + 196, 197, 1030, 199, 200, 201, 202, 203, 204, 1031, + 206, 207, 208, 209, 210, 211, 212, 1032, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 1033, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 1034, 243, 1035, + 1036, 1037, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 1038, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 1039, 1040, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 1041, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 1042, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 1043, 1044, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 1045, 403, 404, 405, 406, 407, + 1046, 409, 410, 411, 412, 413, 414, 415, 416, 1047, + 1048, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 1049, 441, 442, 443, 444, 445, 446, + 447, 1050, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 1051, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 1052, 505, 506, + 507, 508, 509, 510, 1053, 512, 513, 514, 515, 516, + 517, 1054, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 1055, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 1056, 1057, 1058, 1059, 571, 572, 573, 574, 1060, + 1061, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 1062, 590, 1063, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 1064, 604, 1065, + 606, 607, 608, 0, 609, 610, 611, 1066, 0, 0, + 0, 0, 0, 0, 0, 0, 1067, 1068, 0, 0, + 949, 0, 1069, 0, 0, 950, 951, 1070, 0, 0, + 0, 1071, 1072, 0, 0, 1073, 952, 953, 0, 954, + 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, + 0, 0, 0, 0, 0, 0, 0, 965, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 966, 967, 968, 969, 0, 0, + 0, 0, 0, 0, 0, 970, 971, 0, 972, 0, + 0, 0, 0, 0, 0, 973, 974, 0, 0, 975, + 976, 977, 978, 0, 979, 176, 0, 980, 981, 0, + 0, 0, 0, 0, 0, 0, 982, 0, 0, 983, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 984, 985, 986, + 0, 987, 0, 0, 0, 0, 0, 0, 0, 988, + 989, 990, 178, 0, 0, 0, 0, 0, 991, 0, + 0, 179, 0, 0, 0, 0, 0, 992, 0, 0, + 993, 0, 0, 0, 0, 0, 0, 0, 0, 994, + 0, 995, 0, 996, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 997, 998, 0, + 999, 0, 0, 0, 1000, 180, 0, 0, 0, 1001, + 0, 0, 181, 1002, 0, 1003, 1004, 1005, 1006, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 1007, 1008, 1009, 0, + 1010, 0, 0, 0, 0, 0, 0, 1011, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1012, 0, + 0, 0, 0, 0, 0, 0, 1013, 1014, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1015, 0, 0, 0, 0, + 0, 0, 1016, 1017, 0, 1018, 1019, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1020, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1021, 1022, 1023, + 0, 0, 0, 0, 0, 1024, 1025, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 1026, 1027, 1028, 1029, 195, 196, + 197, 1030, 199, 200, 201, 202, 203, 204, 1031, 206, + 207, 208, 209, 210, 211, 212, 1032, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 1033, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 1034, 243, 1035, 1036, + 1037, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 1038, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 1039, 1040, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 1041, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 1042, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 1043, 1044, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 1045, 403, 404, 405, 406, 407, 1046, + 409, 410, 411, 412, 413, 414, 415, 416, 1047, 1048, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 1049, 441, 442, 443, 444, 445, 446, 447, + 1050, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 1051, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 1052, 505, 506, 507, + 508, 509, 510, 1053, 512, 513, 514, 515, 516, 517, + 1054, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 1055, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 1056, 1057, 1058, 1059, 571, 572, 573, 574, 1060, 1061, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 1062, 590, 1063, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 1064, 604, 1065, 606, + 607, 608, 0, 609, 610, 611, 1066, 0, 0, 0, + 0, 0, 0, 0, 0, 1067, 1068, 0, 0, 949, + 0, 1069, 0, 0, 950, 951, 1070, 0, 0, 0, + 1071, 1072, 0, 0, 1073, 952, 953, 0, 954, 955, + 956, 957, 958, 959, 960, 961, 962, 963, 964, 0, + 0, 0, 0, 0, 0, 0, 965, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 966, 967, 968, 969, 0, 0, 0, + 0, 0, 0, 0, 970, 971, 0, 972, 0, 0, + 0, 0, 0, 0, 973, 974, 0, 0, 975, 976, + 977, 978, 0, 979, 176, 0, 980, 981, 0, 0, + 0, 0, 0, 0, 0, 982, 0, 0, 983, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 984, 985, 986, 0, + 987, 0, 0, 0, 0, 0, 0, 0, 988, 989, + 990, 178, 0, 0, 0, 0, 0, 991, 0, 0, + 179, 0, 0, 0, 0, 0, 992, 0, 0, 993, + 0, 0, 0, 0, 0, 0, 0, 0, 994, 0, + 995, 0, 996, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 997, 998, 0, 999, + 0, 0, 0, 1000, 180, 0, 0, 0, 1001, 0, + 0, 181, 1002, 0, 1003, 1004, 1005, 1006, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, + 0, 0, 0, 0, 0, 0, 1011, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, + 0, 0, 0, 0, 0, 1013, 1014, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1015, 0, 0, 0, 0, 0, + 0, 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1020, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, + 0, 0, 0, 0, 1024, 1025, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, + 1030, 199, 200, 201, 202, 203, 204, 1031, 206, 207, + 208, 209, 210, 211, 212, 1032, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 1033, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 1038, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 1039, 1040, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 1041, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 1042, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 1043, 1044, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 1045, 403, 404, 405, 406, 407, 1046, 409, + 410, 411, 412, 413, 414, 415, 416, 1047, 1048, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 1049, 441, 442, 443, 444, 445, 446, 447, 1050, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 1051, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 1052, 505, 506, 507, 508, + 509, 510, 1053, 512, 513, 514, 515, 516, 517, 1054, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 1055, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 1056, + 1057, 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 1062, 590, 1063, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 1064, 604, 1065, 606, 607, + 608, 0, 609, 610, 611, 1066, 0, 0, 0, 0, + 0, 0, 0, 0, 1067, 1068, 0, 0, 949, 0, + 1069, 0, 0, 950, 951, 1594, 0, 0, 0, 1071, + 1072, 0, 0, 1073, 952, 953, 0, 954, 955, 956, + 957, 958, 959, 960, 961, 962, 963, 964, 0, 0, + 0, 0, 0, 0, 0, 965, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 966, 967, 968, 969, 0, 0, 0, 0, + 0, 0, 0, 970, 971, 0, 972, 0, 0, 0, + 0, 0, 0, 973, 974, 0, 0, 975, 976, 977, + 978, 0, 979, 176, 0, 980, 981, 0, 0, 0, + 0, 0, 0, 0, 982, 0, 0, 983, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 984, 985, 986, 0, 987, + 0, 0, 0, 0, 0, 0, 0, 988, 989, 990, + 178, 0, 0, 0, 0, 0, 991, 0, 0, 179, + 0, 0, 0, 0, 0, 992, 0, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 994, 0, 995, + 0, 996, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 997, 998, 0, 999, 0, + 0, 0, 1000, 180, 0, 0, 0, 1001, 0, 0, + 181, 1002, 0, 1003, 1004, 1005, 1006, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, + 0, 0, 0, 0, 0, 1011, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, + 0, 0, 0, 0, 1013, 1014, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1015, 0, 0, 0, 0, 0, 0, + 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1020, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, + 0, 0, 0, 1024, 1025, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, + 199, 200, 201, 202, 203, 204, 1031, 206, 207, 208, + 209, 210, 211, 212, 1032, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 1033, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 1038, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 1039, 1040, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 1041, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 1042, 2149, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 1043, 1044, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 1045, 403, 404, 405, 406, 407, 1046, 409, 410, + 411, 412, 413, 414, 415, 416, 1047, 1048, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 1049, 441, 442, 443, 444, 445, 446, 447, 1050, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 1051, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 1052, 505, 506, 507, 508, 509, + 510, 1053, 512, 513, 514, 515, 516, 517, 1054, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 1055, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 1056, 1057, + 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 2150, 590, 1063, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 1064, 604, 1065, 606, 607, 608, + 0, 609, 610, 611, 1066, 0, 0, 0, 0, 0, + 0, 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, + 0, 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, + 0, 0, 1073, 952, 953, 0, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 0, 0, 0, + 0, 0, 0, 0, 965, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 966, 967, 968, 969, 0, 0, 0, 0, 0, + 0, 0, 970, 971, 0, 972, 0, 0, 0, 0, + 0, 0, 973, 974, 0, 0, 975, 976, 977, 978, + 0, 979, 176, 0, 980, 981, 0, 0, 0, 0, + 0, 0, 0, 982, 0, 0, 983, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 984, 985, 986, 0, 987, 0, + 0, 0, 0, 0, 0, 0, 988, 989, 990, 178, + 0, 0, 0, 0, 0, 991, 0, 0, 179, 0, + 0, 0, 0, 0, 992, 0, 0, 993, 0, 0, + 0, 0, 0, 0, 0, 0, 994, 0, 995, 0, + 996, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 997, 998, 0, 999, 0, 0, + 0, 1000, 180, 0, 0, 0, 1001, 0, 0, 181, + 1002, 0, 1003, 1004, 1005, 1006, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, + 0, 0, 0, 0, 1011, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, + 0, 0, 0, 1013, 1014, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1015, 0, 0, 0, 0, 0, 0, 1016, + 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1020, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, + 0, 0, 1024, 1025, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, + 200, 201, 202, 203, 204, 1031, 206, 207, 208, 209, + 210, 211, 212, 1032, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 1033, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 1038, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 1039, 1040, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 1041, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 1042, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 1043, 1044, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 1045, 403, 404, 405, 406, 407, 1046, 409, 410, 411, + 412, 413, 414, 415, 416, 1047, 1048, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 1049, + 441, 442, 443, 444, 445, 446, 447, 1050, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 1051, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 1052, 505, 506, 507, 508, 509, 510, + 1053, 512, 513, 514, 515, 516, 517, 1054, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 1055, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, + 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 2150, + 590, 1063, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 1064, 604, 1065, 606, 607, 608, 0, + 609, 610, 611, 1066, 0, 0, 0, 0, 0, 0, + 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, 0, + 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, 0, + 0, 1073, 952, 953, 0, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 0, 0, 0, 0, + 0, 0, 0, 965, 0, 0, 0, 0, 0, 0, + 2370, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 966, 967, 968, 969, 0, 0, 0, 0, 0, 0, + 0, 970, 971, 0, 972, 0, 0, 0, 0, 0, + 0, 973, 974, 0, 0, 975, 976, 977, 978, 0, + 979, 176, 0, 980, 981, 0, 0, 0, 0, 0, + 0, 0, 982, 0, 0, 983, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 984, 985, 986, 0, 987, 0, 0, + 0, 0, 0, 0, 0, 988, 989, 990, 178, 0, + 0, 0, 0, 0, 991, 0, 0, 179, 0, 0, + 0, 0, 0, 992, 0, 0, 993, 0, 0, 0, + 0, 0, 0, 0, 0, 994, 0, 995, 0, 996, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 997, 998, 0, 999, 0, 0, 0, + 1000, 180, 0, 0, 0, 1001, 0, 0, 181, 0, + 0, 1003, 1004, 1005, 1006, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, 0, + 0, 0, 0, 1011, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, + 0, 0, 1013, 1014, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1015, 0, 0, 0, 0, 0, 0, 1016, 1017, + 0, 1018, 1019, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1020, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, 0, + 0, 1024, 1025, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, 200, + 201, 202, 203, 2371, 1031, 206, 207, 208, 209, 210, + 211, 212, 1032, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 1033, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 1038, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 1039, 1040, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 1041, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 1042, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 1043, 1044, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 1045, + 403, 404, 405, 406, 407, 1046, 409, 410, 411, 412, + 413, 414, 415, 416, 1047, 1048, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 1049, 441, + 442, 443, 444, 445, 446, 447, 1050, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 1051, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 1052, 505, 506, 507, 508, 509, 510, 1053, + 512, 513, 514, 515, 516, 517, 1054, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 1055, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, 1059, + 571, 572, 573, 574, 1060, 1061, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 1062, 590, + 1063, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 1064, 604, 1065, 606, 607, 608, 0, 609, + 610, 611, 1066, 0, 0, 0, 0, 0, 0, 0, + 0, 1067, 1068, 0, 0, 949, 0, 1069, 0, 0, + 950, 951, 1070, 0, 0, 0, 1071, 1072, 0, 0, + 1073, 952, 953, 0, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 0, 0, 0, 0, 0, + 0, 0, 965, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 966, + 967, 968, 969, 0, 0, 0, 0, 0, 0, 0, + 970, 971, 0, 972, 0, 0, 0, 0, 0, 0, + 973, 974, 0, 0, 975, 976, 977, 978, 0, 979, + 176, 0, 980, 981, 0, 0, 0, 0, 0, 0, + 0, 982, 0, 0, 983, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 984, 985, 986, 0, 987, 0, 0, 0, + 0, 0, 0, 0, 988, 989, 990, 178, 0, 0, + 0, 0, 0, 991, 0, 0, 179, 0, 0, 0, + 0, 0, 992, 0, 0, 3758, 0, 0, 0, 0, + 0, 0, 0, 0, 994, 0, 995, 0, 996, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 997, 998, 0, 999, 0, 0, 0, 1000, + 180, 0, 0, 0, 1001, 0, 0, 181, 1002, 0, + 1003, 1004, 1005, 1006, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 1007, 1008, 1009, 0, 1010, 0, 0, 0, 0, + 0, 0, 1011, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1012, 0, 0, 0, 0, 0, 0, + 0, 1013, 1014, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1015, 0, 0, 0, 0, 0, 0, 1016, 1017, 0, + 1018, 1019, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1020, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1021, 1022, 1023, 0, 0, 0, 0, 0, + 1024, 1025, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 1026, + 1027, 1028, 1029, 195, 196, 197, 1030, 199, 200, 201, + 202, 203, 204, 1031, 206, 207, 208, 209, 210, 211, + 212, 1032, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 1033, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 1034, 243, 1035, 1036, 1037, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 1038, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 1039, 1040, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 1041, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 1042, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 1043, 1044, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 1045, 403, + 404, 405, 406, 407, 1046, 409, 410, 411, 412, 413, + 414, 415, 416, 1047, 1048, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 1049, 441, 442, + 443, 444, 445, 446, 447, 1050, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 1051, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 1052, 505, 506, 507, 508, 509, 510, 1053, 512, + 513, 514, 515, 516, 517, 1054, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 1055, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 1056, 1057, 1058, 1059, 571, + 572, 573, 574, 1060, 1061, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 1062, 590, 1063, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 1064, 604, 1065, 606, 607, 608, 0, 609, 610, + 611, 1066, 0, 0, 0, 0, 0, 0, 0, 0, + 1067, 1068, 0, 0, 949, 0, 1069, 0, 0, 950, + 951, 1070, 0, 0, 0, 1071, 1072, 0, 0, 1073, + 952, 953, 0, 954, 955, 956, 957, 958, 959, 960, + 961, 962, 963, 964, 0, 0, 0, 0, 0, 0, + 0, 965, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 966, 967, + 968, 969, 0, 0, 0, 0, 0, 0, 0, 970, + 971, 0, 972, 0, 0, 0, 0, 0, 0, 973, + 974, 0, 0, 975, 976, 977, 978, 0, 979, 176, + 0, 980, 981, 0, 0, 0, 0, 0, 0, 0, + 982, 0, 0, 983, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 984, 985, 986, 0, 987, 0, 0, 0, 0, + 0, 0, 0, 988, 989, 990, 178, 0, 0, 0, + 0, 0, 991, 0, 0, 179, 0, 0, 0, 0, + 0, 992, 0, 0, 3773, 0, 0, 0, 0, 0, + 0, 0, 0, 994, 0, 995, 0, 996, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 997, 998, 0, 999, 0, 0, 0, 1000, 180, + 0, 0, 0, 1001, 0, 0, 181, 1002, 0, 1003, + 1004, 1005, 1006, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 1007, 1008, 1009, 0, 1010, 0, 0, 0, 0, 0, + 0, 1011, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1012, 0, 0, 0, 0, 0, 0, 0, + 1013, 1014, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1015, + 0, 0, 0, 0, 0, 0, 1016, 1017, 0, 1018, + 1019, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1020, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1021, 1022, 1023, 0, 0, 0, 0, 0, 1024, + 1025, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 1026, 1027, + 1028, 1029, 195, 196, 197, 1030, 199, 200, 201, 202, + 203, 204, 1031, 206, 207, 208, 209, 210, 211, 212, + 1032, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 1033, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 1034, 243, 1035, 1036, 1037, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 1038, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 1039, 1040, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 1041, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 1042, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 1043, 1044, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 1045, 403, 404, + 405, 406, 407, 1046, 409, 410, 411, 412, 413, 414, + 415, 416, 1047, 1048, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 1049, 441, 442, 443, + 444, 445, 446, 447, 1050, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 1051, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 1052, 505, 506, 507, 508, 509, 510, 1053, 512, 513, + 514, 515, 516, 517, 1054, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 1055, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 1056, 1057, 1058, 1059, 571, 572, + 573, 574, 1060, 1061, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 1062, 590, 1063, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 1064, 604, 1065, 606, 607, 608, 0, 609, 610, 611, + 1066, 0, 0, 0, 0, 0, 0, 0, 0, 1067, + 1068, 0, 0, 949, 0, 1069, 0, 0, 950, 951, + 1070, 0, 0, 0, 1071, 1072, 0, 0, 1073, 952, + 953, 0, 954, 955, 956, 957, 958, 959, 960, 961, + 962, 963, 964, 0, 0, 0, 0, 0, 0, 0, + 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 966, 967, 968, + 969, 0, 0, 0, 0, 0, 0, 0, 970, 971, + 0, 972, 0, 0, 0, 0, 0, 0, 973, 974, + 0, 0, 975, 976, 977, 978, 0, 979, 176, 0, + 980, 981, 0, 0, 0, 0, 0, 0, 0, 982, + 0, 0, 983, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 984, 985, 986, 0, 987, 0, 0, 0, 0, 0, + 0, 0, 988, 989, 990, 178, 0, 0, 0, 0, + 0, 991, 0, 0, 179, 0, 0, 0, 0, 0, + 992, 0, 0, 993, 0, 0, 0, 0, 0, 0, + 0, 0, 994, 0, 995, 0, 996, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 997, 998, 6048, 999, 0, 0, 0, 1000, 180, 0, + 0, 0, 1001, 0, 0, 181, 0, 0, 1003, 1004, + 1005, 1006, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 1007, + 1008, 1009, 0, 1010, 0, 0, 0, 0, 0, 0, + 1011, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1012, 0, 0, 0, 0, 0, 0, 0, 1013, + 1014, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1015, 0, + 0, 0, 0, 0, 0, 1016, 1017, 0, 1018, 1019, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1020, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1021, 1022, 1023, 0, 0, 0, 0, 0, 1024, 1025, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 1026, 1027, 1028, + 1029, 195, 196, 197, 1030, 199, 200, 201, 202, 203, + 204, 1031, 206, 207, 208, 209, 210, 211, 212, 1032, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 1033, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 1034, + 243, 1035, 1036, 1037, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 1038, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 1039, 1040, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 1041, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 1042, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 1043, 1044, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 1045, 403, 404, 405, + 406, 407, 1046, 409, 410, 411, 412, 413, 414, 415, + 416, 1047, 1048, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 1049, 441, 442, 443, 444, + 445, 446, 447, 1050, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 1051, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 1052, + 505, 506, 507, 508, 509, 510, 1053, 512, 513, 514, + 515, 516, 517, 1054, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 1055, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 1056, 1057, 1058, 1059, 571, 572, 573, + 574, 1060, 1061, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 1062, 590, 1063, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 1064, + 604, 1065, 606, 607, 608, 0, 609, 610, 611, 1066, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 1068, + 0, 0, 949, 0, 1069, 0, 0, 950, 951, 1070, + 0, 0, 0, 1071, 1072, 0, 0, 1073, 952, 953, + 0, 954, 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 0, 0, 0, 0, 0, 0, 0, 965, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 966, 967, 968, 969, + 0, 0, 0, 0, 0, 0, 0, 970, 971, 0, + 972, 0, 0, 0, 0, 0, 0, 973, 974, 0, + 0, 975, 976, 977, 978, 0, 979, 176, 0, 980, + 981, 0, 0, 0, 0, 0, 0, 0, 982, 0, + 0, 983, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 984, + 985, 986, 0, 987, 0, 0, 0, 0, 0, 0, + 0, 988, 989, 990, 178, 0, 0, 0, 0, 0, + 991, 0, 0, 179, 0, 0, 0, 0, 0, 992, + 0, 0, 1561, 0, 0, 0, 0, 0, 0, 0, + 0, 994, 0, 995, 0, 996, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 997, + 998, 0, 999, 0, 0, 0, 1000, 180, 0, 0, + 0, 1001, 0, 0, 181, 0, 0, 1003, 1004, 1005, + 1006, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 1007, 1008, + 1009, 0, 1010, 0, 0, 0, 0, 0, 0, 1011, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1012, 0, 0, 0, 0, 0, 0, 0, 1013, 1014, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1015, 0, 0, + 0, 0, 0, 0, 1016, 1017, 0, 1018, 1019, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1020, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1021, + 1022, 1023, 0, 0, 0, 0, 0, 1024, 1025, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 1026, 1027, 1028, 1029, + 195, 196, 197, 1030, 199, 200, 201, 202, 203, 204, + 1031, 206, 207, 208, 209, 210, 211, 212, 1032, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 1033, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 1034, 243, + 1035, 1036, 1037, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 1038, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 1039, + 1040, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 1041, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 1042, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 1043, + 1044, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 1045, 403, 404, 405, 406, + 407, 1046, 409, 410, 411, 412, 413, 414, 415, 416, + 1047, 1048, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 1049, 441, 442, 443, 444, 445, + 446, 447, 1050, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 1051, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 1052, 505, + 506, 507, 508, 509, 510, 1053, 512, 513, 514, 515, + 516, 517, 1054, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 1055, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 1056, 1057, 1058, 1059, 571, 572, 573, 574, + 1060, 1061, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 1062, 590, 1063, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 1064, 604, + 1065, 606, 607, 608, 0, 609, 610, 611, 1066, 0, + 0, 0, 0, 0, 0, 0, 0, 1562, 1563, 0, + 0, 949, 0, 1069, 0, 0, 950, 951, 1070, 0, + 0, 0, 1071, 1072, 0, 0, 1073, 952, 953, 0, + 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, + 964, 0, 0, 0, 0, 0, 0, 0, 965, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 966, 967, 968, 969, 0, + 0, 0, 0, 0, 0, 0, 970, 971, 0, 972, + 0, 0, 0, 0, 0, 0, 973, 974, 0, 0, + 975, 976, 977, 978, 0, 979, 176, 0, 980, 981, + 0, 0, 0, 0, 0, 0, 0, 982, 0, 0, + 983, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 984, 985, + 986, 0, 987, 0, 0, 0, 0, 0, 0, 0, + 988, 989, 990, 178, 0, 0, 0, 0, 0, 991, + 0, 0, 179, 0, 0, 0, 0, 0, 992, 0, + 0, 1675, 0, 0, 0, 0, 0, 0, 0, 0, + 994, 0, 995, 0, 996, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 997, 998, + 0, 999, 0, 0, 0, 1000, 180, 0, 0, 0, + 1001, 0, 0, 181, 0, 0, 1003, 1004, 1005, 1006, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 1007, 1008, 1009, + 0, 1010, 0, 0, 0, 0, 0, 0, 1011, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1012, + 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1015, 0, 0, 0, + 0, 0, 0, 1016, 1017, 0, 1018, 1019, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1020, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1021, 1022, + 1023, 0, 0, 0, 0, 0, 1024, 1025, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 1026, 1027, 1028, 1029, 195, + 196, 197, 1030, 199, 200, 201, 202, 203, 204, 1031, + 206, 207, 208, 209, 210, 211, 212, 1032, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 1033, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 1034, 243, 1035, + 1036, 1037, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 1038, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 1039, 1040, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 1041, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 1042, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 1043, 1044, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 1045, 403, 404, 405, 406, 407, + 1046, 409, 410, 411, 412, 413, 414, 415, 416, 1047, + 1048, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 1049, 441, 442, 443, 444, 445, 446, + 447, 1050, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 1051, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 1052, 505, 506, + 507, 508, 509, 510, 1053, 512, 513, 514, 515, 516, + 517, 1054, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 1055, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 1056, 1057, 1058, 1059, 571, 572, 573, 574, 1060, + 1061, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 1062, 590, 1063, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 1064, 604, 1065, + 606, 607, 608, 0, 609, 610, 611, 1066, 0, 0, + 0, 0, 0, 0, 0, 0, 1562, 1563, 0, 0, + 949, 0, 1069, 0, 0, 950, 951, 1070, 0, 0, + 0, 1071, 1072, 0, 0, 1073, 952, 953, 0, 954, + 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, + 0, 0, 0, 0, 0, 0, 0, 965, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 966, 967, 968, 969, 0, 0, + 0, 0, 0, 0, 0, 970, 971, 0, 972, 0, + 0, 0, 0, 0, 0, 973, 974, 0, 0, 975, + 976, 977, 978, 0, 979, 176, 0, 980, 981, 0, + 0, 0, 0, 0, 0, 0, 982, 0, 0, 983, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 984, 985, 986, + 0, 987, 0, 0, 0, 0, 0, 0, 0, 988, + 989, 990, 178, 0, 0, 0, 0, 0, 991, 0, + 0, 179, 0, 0, 0, 0, 0, 992, 0, 0, + 1677, 0, 0, 0, 0, 0, 0, 0, 0, 994, + 0, 995, 0, 996, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 997, 998, 0, + 999, 0, 0, 0, 1000, 180, 0, 0, 0, 1001, + 0, 0, 181, 0, 0, 1003, 1004, 1005, 1006, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 1007, 1008, 1009, 0, + 1010, 0, 0, 0, 0, 0, 0, 1011, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1012, 0, + 0, 0, 0, 0, 0, 0, 1013, 1014, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1015, 0, 0, 0, 0, + 0, 0, 1016, 1017, 0, 1018, 1019, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1020, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1021, 1022, 1023, + 0, 0, 0, 0, 0, 1024, 1025, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 1026, 1027, 1028, 1029, 195, 196, + 197, 1030, 199, 200, 201, 202, 203, 204, 1031, 206, + 207, 208, 209, 210, 211, 212, 1032, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 1033, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 1034, 243, 1035, 1036, + 1037, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 1038, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 1039, 1040, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 1041, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 1042, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 1043, 1044, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 1045, 403, 404, 405, 406, 407, 1046, + 409, 410, 411, 412, 413, 414, 415, 416, 1047, 1048, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 1049, 441, 442, 443, 444, 445, 446, 447, + 1050, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 1051, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 1052, 505, 506, 507, + 508, 509, 510, 1053, 512, 513, 514, 515, 516, 517, + 1054, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 1055, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 1056, 1057, 1058, 1059, 571, 572, 573, 574, 1060, 1061, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 1062, 590, 1063, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 1064, 604, 1065, 606, + 607, 608, 0, 609, 610, 611, 1066, 0, 0, 0, + 0, 0, 0, 0, 0, 1562, 1563, 0, 0, 949, + 0, 1069, 0, 0, 950, 951, 1070, 0, 0, 0, + 1071, 1072, 0, 0, 1073, 952, 953, 0, 954, 955, + 956, 957, 958, 959, 960, 961, 962, 963, 964, 0, + 0, 0, 0, 0, 0, 0, 965, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 966, 967, 968, 969, 0, 0, 0, + 0, 0, 0, 0, 970, 971, 0, 972, 0, 0, + 0, 0, 0, 0, 973, 974, 0, 0, 975, 976, + 977, 978, 0, 979, 176, 0, 980, 981, 0, 0, + 0, 0, 0, 0, 0, 982, 0, 0, 983, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 984, 985, 986, 0, + 987, 0, 0, 0, 0, 0, 0, 0, 988, 989, + 990, 178, 0, 0, 0, 0, 0, 991, 0, 0, + 179, 0, 0, 0, 0, 0, 992, 0, 0, 993, + 0, 0, 0, 0, 0, 0, 0, 0, 994, 0, + 995, 0, 996, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 997, 998, 0, 999, + 0, 0, 0, 1000, 180, 0, 0, 0, 1001, 0, + 0, 181, 0, 0, 1003, 1004, 1005, 1006, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, + 0, 0, 0, 0, 0, 0, 1011, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, + 0, 0, 0, 0, 0, 1013, 1014, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1015, 0, 0, 0, 0, 0, + 0, 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1020, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, + 0, 0, 0, 0, 1024, 1025, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, + 1030, 199, 200, 201, 202, 203, 204, 1031, 206, 207, + 208, 209, 210, 211, 212, 1032, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 1033, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 1038, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 1039, 1040, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 1041, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 1042, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 1043, 1044, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 1045, 403, 404, 405, 406, 407, 1046, 409, + 410, 411, 412, 413, 414, 415, 416, 1047, 1048, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 1049, 441, 442, 443, 444, 445, 446, 447, 1050, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 1051, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 1052, 505, 506, 507, 508, + 509, 510, 1053, 512, 513, 514, 515, 516, 517, 1054, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 1055, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 1056, + 1057, 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 1062, 590, 1063, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 1064, 604, 1065, 606, 607, + 608, 0, 609, 610, 611, 1066, 0, 0, 0, 0, + 0, 0, 0, 0, 1067, 1068, 0, 0, 949, 0, + 1069, 0, 0, 950, 951, 1070, 0, 0, 0, 1071, + 1072, 0, 0, 1073, 952, 953, 0, 954, 955, 956, + 957, 958, 959, 960, 961, 962, 963, 964, 0, 0, + 0, 0, 0, 0, 0, 965, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 966, 967, 968, 969, 0, 0, 0, 0, + 0, 0, 0, 970, 971, 0, 972, 0, 0, 0, + 0, 0, 0, 973, 974, 0, 0, 975, 976, 977, + 978, 0, 979, 176, 0, 980, 981, 0, 0, 0, + 0, 0, 0, 0, 982, 0, 0, 983, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 984, 985, 986, 0, 987, + 0, 0, 0, 0, 0, 0, 0, 988, 989, 990, + 178, 0, 0, 0, 0, 0, 991, 0, 0, 179, + 0, 0, 0, 0, 0, 992, 0, 0, 2391, 0, + 0, 0, 0, 0, 0, 0, 0, 994, 0, 995, + 0, 996, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 997, 998, 0, 999, 0, + 0, 0, 1000, 180, 0, 0, 0, 1001, 0, 0, + 181, 0, 0, 1003, 1004, 1005, 1006, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, + 0, 0, 0, 0, 0, 1011, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, + 0, 0, 0, 0, 1013, 1014, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1015, 0, 0, 0, 0, 0, 0, + 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1020, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, + 0, 0, 0, 1024, 1025, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, + 199, 200, 201, 202, 203, 204, 1031, 206, 207, 208, + 209, 210, 211, 212, 1032, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 1033, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 1038, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 1039, 1040, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 1041, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 1042, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 1043, 1044, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 1045, 403, 404, 405, 406, 407, 1046, 409, 410, + 411, 412, 413, 414, 415, 416, 1047, 1048, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 1049, 441, 442, 443, 444, 445, 446, 447, 1050, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 1051, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 1052, 505, 506, 507, 508, 509, + 510, 1053, 512, 513, 514, 515, 516, 517, 1054, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 1055, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 1056, 1057, + 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 1062, 590, 1063, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 1064, 604, 1065, 606, 607, 608, + 0, 609, 610, 611, 1066, 0, 0, 0, 0, 0, + 0, 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, + 0, 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, + 0, 0, 1073, 952, 953, 0, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 0, 0, 0, + 0, 0, 0, 0, 965, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 966, 967, 968, 969, 0, 0, 0, 0, 0, + 0, 0, 970, 971, 0, 972, 0, 0, 0, 0, + 0, 0, 973, 974, 0, 0, 975, 976, 977, 978, + 0, 979, 176, 0, 980, 981, 0, 0, 0, 0, + 0, 0, 0, 982, 0, 0, 983, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 984, 985, 986, 0, 987, 0, + 0, 0, 0, 0, 0, 0, 988, 989, 990, 178, + 0, 0, 0, 0, 0, 991, 0, 0, 179, 0, + 0, 0, 0, 0, 992, 0, 0, 2393, 0, 0, + 0, 0, 0, 0, 0, 0, 994, 0, 995, 0, + 996, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 997, 998, 0, 999, 0, 0, + 0, 1000, 180, 0, 0, 0, 1001, 0, 0, 181, + 0, 0, 1003, 1004, 1005, 1006, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, + 0, 0, 0, 0, 1011, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, + 0, 0, 0, 1013, 1014, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1015, 0, 0, 0, 0, 0, 0, 1016, + 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1020, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, + 0, 0, 1024, 1025, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, + 200, 201, 202, 203, 204, 1031, 206, 207, 208, 209, + 210, 211, 212, 1032, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 1033, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 1038, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 1039, 1040, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 1041, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 1042, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 1043, 1044, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 1045, 403, 404, 405, 406, 407, 1046, 409, 410, 411, + 412, 413, 414, 415, 416, 1047, 1048, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 1049, + 441, 442, 443, 444, 445, 446, 447, 1050, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 1051, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 1052, 505, 506, 507, 508, 509, 510, + 1053, 512, 513, 514, 515, 516, 517, 1054, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 1055, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, + 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 1062, + 590, 1063, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 1064, 604, 1065, 606, 607, 608, 0, + 609, 610, 611, 1066, 0, 0, 0, 0, 0, 0, + 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, 0, + 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, 0, + 0, 1073, 5920, 5921, 0, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 967, 968, 969, 0, 0, 0, 0, 0, 0, + 0, 970, 971, 0, 972, 0, 0, 0, 0, 0, + 0, 973, 974, 0, 0, 975, 976, 977, 978, 0, + 979, 176, 0, 980, 981, 0, 0, 0, 0, 0, + 0, 0, 982, 0, 0, 983, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 984, 985, 986, 0, 987, 0, 0, + 0, 0, 0, 0, 0, 988, 989, 990, 178, 0, + 0, 0, 0, 0, 991, 0, 0, 179, 0, 0, + 0, 0, 0, 992, 0, 0, 1561, 0, 0, 0, + 0, 0, 0, 0, 0, 994, 0, 995, 0, 996, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 997, 998, 0, 999, 0, 0, 0, + 1000, 180, 0, 0, 0, 1001, 0, 0, 181, 0, + 0, 1003, 1004, 1005, 1006, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, 0, + 0, 0, 0, 1011, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, + 0, 0, 1013, 1014, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1015, 0, 0, 0, 0, 0, 0, 1016, 1017, + 0, 1018, 1019, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1020, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, 0, + 0, 1024, 1025, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, 200, + 201, 202, 203, 204, 1031, 206, 207, 208, 209, 210, + 211, 212, 1032, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 1033, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 1038, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 1039, 1040, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 1041, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 1042, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 1043, 1044, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 1045, + 403, 404, 405, 406, 407, 1046, 409, 410, 411, 412, + 413, 414, 415, 416, 1047, 1048, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 1049, 441, + 442, 443, 444, 445, 446, 447, 1050, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 1051, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 1052, 505, 506, 507, 508, 509, 510, 1053, + 512, 513, 514, 515, 516, 517, 1054, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 1055, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, 1059, + 571, 572, 573, 574, 1060, 1061, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 1062, 590, + 1063, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 1064, 604, 1065, 606, 607, 608, 0, 609, + 610, 611, 1066, 0, 0, 0, 0, 0, 0, 0, + 0, 5922, 5923, 0, 0, 949, 0, 0, 0, 0, + 1599, 0, 5924, 0, 0, 0, 0, 1072, 0, 0, + 1073, 1554, 1555, 0, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 986, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 1006, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1020, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 2427, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 2428, 568, 569, 2429, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 6200, 609, 610, + 611, 612, 2347, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 174, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1073, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 6200, + 609, 610, 611, 612, 2347, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 174, 175, 0, 0, 0, + 0, 0, 0, 0, 6201, 0, 0, 0, 0, 0, + 0, 2348, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 1599, 609, 610, 611, 612, 0, 0, 0, 0, + 0, 0, 1554, 1555, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2348, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 1599, 609, + 610, 611, 612, 0, 0, 0, 0, 0, 0, 1554, + 1555, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1600, 0, 0, 0, 0, 0, 0, 0, + 1073, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 2347, 609, 610, 611, 612, + 0, 0, 0, 0, 0, 0, 174, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1073, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2348, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4821, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 745, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 3155, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3156, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 747, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 4822, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4823, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1336, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 41, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1337, 0, + 0, 0, 0, 0, 0, 0, 776, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1335, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1336, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1337, + 0, 0, 0, 0, 1338, 0, 0, 776, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1336, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1337, 0, 0, 0, 0, 1338, 0, 0, 776, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1336, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1337, 0, 0, 0, 0, 0, 0, 0, 776, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 2801, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 776, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 174, 175, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4981, 0, 0, 0, 0, 0, 0, + 0, 4823, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 5290, 0, 0, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4823, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 773, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 774, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 775, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 174, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 776, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 776, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4823, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 902, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 903, 0, 0, 0, 14, 0, 0, 904, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 16, 0, 0, 905, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 906, 0, 0, 0, + 0, 0, 0, 0, 907, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 908, 909, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 0, 185, 186, 187, + 910, 189, 0, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 0, 206, 207, 208, 209, 210, 211, 212, 213, 0, + 911, 0, 0, 217, 218, 219, 220, 221, 0, 0, + 224, 225, 226, 227, 228, 0, 0, 0, 232, 233, + 234, 235, 236, 912, 238, 239, 240, 241, 0, 0, + 0, 0, 0, 0, 247, 0, 249, 0, 251, 252, + 0, 254, 255, 256, 257, 258, 259, 0, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 0, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 0, 284, 285, 286, 287, 0, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 0, 0, + 0, 303, 0, 913, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 0, 0, 0, 0, 0, + 319, 320, 914, 322, 323, 324, 0, 326, 327, 0, + 329, 330, 0, 0, 332, 0, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 0, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 0, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 0, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 915, 0, 0, 440, 0, 442, 443, 0, 445, + 446, 447, 448, 0, 450, 451, 452, 453, 0, 0, + 0, 0, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 0, 485, + 0, 487, 488, 489, 0, 491, 492, 0, 494, 495, + 496, 497, 498, 499, 0, 501, 502, 503, 504, 505, + 506, 507, 0, 509, 510, 511, 0, 513, 514, 515, + 516, 0, 518, 519, 0, 0, 522, 523, 0, 0, + 526, 527, 528, 0, 530, 0, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 0, 541, 542, 0, 544, + 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 0, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 0, 577, 578, 0, 580, 581, 582, 583, 0, + 0, 586, 587, 0, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 0, + 0, 606, 607, 0, 0, 609, 0, 611, 612, 174, + 175, 793, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 698, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5590, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1412, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 0, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1670, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 1162, 609, 610, 611, + 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 174, 175, 0, 0, 0, 0, 0, 0, + 2402, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1163, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1164, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 1165, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 1166, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 1167, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 1168, 322, 323, 324, + 325, 1169, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 1170, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 1171, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 1172, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 1173, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 1174, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 1175, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 1176, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 1177, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 1178, 605, 606, 607, 608, 1162, 609, + 610, 611, 612, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 174, 175, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1163, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1164, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 1165, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 1166, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 1167, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 1168, 322, + 323, 324, 325, 1169, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 1170, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 1171, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 1172, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 1173, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 1174, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 1175, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 1178, 605, 606, 607, 608, + 1749, 609, 610, 611, 612, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 174, 175, 793, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 698, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 1990, 609, 610, 611, 612, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, + 793, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 698, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 2188, 609, 610, 611, 612, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 174, 175, 793, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 698, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 1899, 609, 610, 611, + 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1554, 1555, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1900, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 1899, 609, + 610, 611, 612, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1554, 1555, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 2004, 951, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1554, 1555, 0, 0, + 0, 0, 0, 0, 0, 2005, 0, 2006, 0, 2007, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2008, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 2004, 951, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1554, 1555, + 0, 0, 0, 0, 0, 0, 0, 2005, 0, 2006, + 0, 2007, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2679, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 2680, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 2004, + 951, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1554, 1555, 0, 0, 0, 0, 0, 0, 0, 2005, + 0, 2006, 0, 2007, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4100, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 2004, 951, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1554, 1555, 0, 0, 0, 0, 0, 0, + 0, 2005, 0, 2006, 0, 2007, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 1554, 1555, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 2408, 2409, 2410, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 174, 175, 0, 0, 0, 0, + 0, 0, 0, 0, 4337, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 2782, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 1554, 1555, 0, 0, + 0, 0, 0, 0, 0, 0, 4116, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 0, + 0, 0, 0, 0, 0, 0, 0, 5129, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 5430, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 0, 0, 0, 0, 0, 2838, 0, 0, 5755, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 694, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 5384, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5385, 0, 665, 0, 5386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 793, 0, 0, 0, 0, 0, 0, 2839, + 0, 0, 698, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1401, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1754, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1755, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 793, 1402, 0, 0, 0, 0, 0, + 0, 0, 0, 698, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1401, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 0, 1402, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3451, 3452, + 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 4130, + 4131, 3463, 3464, 3465, 4132, 4133, 3466, 3467, 3468, 3469, + 3470, 3471, 3472, 3473, 4134, 3475, 3476, 0, 3477, 3478, + 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 0, + 3488, 176, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 4135, + 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, + 3507, 3508, 4136, 3510, 3511, 3512, 3513, 3514, 3515, 177, + 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 4137, 3525, + 0, 3526, 3527, 3528, 3529, 3530, 0, 0, 178, 3531, + 3532, 3533, 3534, 3535, 3536, 3537, 3538, 5460, 3540, 3541, + 3542, 3543, 3544, 3545, 3546, 3547, 4138, 3549, 4139, 3551, + 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, + 3562, 3563, 3564, 3565, 3566, 3567, 3568, 4140, 4141, 4142, + 3569, 3570, 3571, 3572, 3573, 3574, 3575, 4143, 4144, 4145, + 3576, 180, 3577, 3578, 3579, 3580, 3581, 3582, 181, 3583, + 3584, 3585, 3586, 3587, 3588, 4146, 3589, 3590, 3591, 3592, + 182, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, + 3602, 183, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, + 3611, 3612, 3613, 3614, 3615, 3616, 3617, 4147, 3618, 3619, + 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, + 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, + 3640, 4148, 3641, 3642, 4149, 3643, 3644, 3645, 3646, 3647, + 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, + 3658, 3659, 184, 3660, 3661, 3662, 3663, 4150, 4151, 4152, + 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 0, 3673, + 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 4153, + 4154, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, + 3693, 185, 186, 187, 0, 189, 190, 191, 192, 193, + 194, 3694, 3695, 3696, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 5461, 218, 5462, + 5463, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 5464, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 5465, 5466, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 5467, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 5468, 315, + 316, 317, 0, 318, 319, 320, 3410, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 5469, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 5470, 5471, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 5472, 5473, 432, + 3700, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 5474, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 5475, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 5476, 565, 566, 5477, 568, 569, 5478, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 5479, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 3411, 605, 606, 607, 608, 0, 609, + 610, 611, 5480, 174, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3451, + 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, + 4130, 4131, 3463, 3464, 3465, 4132, 4133, 3466, 3467, 3468, + 3469, 3470, 3471, 3472, 3473, 4134, 3475, 3476, 0, 3477, + 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, + 0, 3488, 176, 3489, 3490, 3491, 3492, 3493, 3494, 3495, + 4135, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, + 3506, 3507, 3508, 4136, 3510, 3511, 3512, 3513, 3514, 3515, + 177, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 4137, + 3525, 0, 3526, 3527, 3528, 3529, 3530, 0, 0, 178, + 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, + 3541, 3542, 3543, 3544, 3545, 3546, 3547, 4138, 3549, 4139, + 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, + 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 4140, 4141, + 4142, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 4143, 4144, + 4145, 3576, 180, 3577, 3578, 3579, 3580, 3581, 3582, 181, + 3583, 3584, 3585, 3586, 3587, 3588, 4146, 3589, 3590, 3591, + 3592, 182, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, + 3601, 3602, 183, 3603, 3604, 3605, 3606, 3607, 3608, 3609, + 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 4147, 3618, + 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, + 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, + 3639, 3640, 4148, 3641, 3642, 4149, 3643, 3644, 3645, 3646, + 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, + 3657, 3658, 3659, 184, 3660, 3661, 3662, 3663, 4150, 4151, + 4152, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 0, + 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, + 4153, 4154, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, + 3692, 3693, 185, 186, 187, 0, 189, 190, 191, 192, + 193, 194, 3694, 3695, 3696, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 4155, 218, + 4156, 4157, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 0, 4158, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 4159, 4160, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 4161, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 4162, + 315, 316, 317, 0, 318, 319, 320, 0, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 4163, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 0, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 4164, 4165, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 0, 4166, 4167, + 432, 3700, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 0, + 4168, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 4169, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 0, 516, 517, 518, 519, 520, + 0, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 4170, 565, 566, 4171, 568, 569, + 4172, 571, 572, 573, 574, 575, 576, 4173, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 0, 4174, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 0, 605, 606, 607, 608, 0, + 609, 610, 611, 4175, 174, 175, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, + 3461, 4130, 4131, 3463, 3464, 3465, 4132, 4133, 3466, 3467, + 3468, 3469, 3470, 3471, 3472, 3473, 4134, 3475, 3476, 0, + 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, + 3487, 0, 3488, 176, 3489, 3490, 3491, 3492, 3493, 3494, + 3495, 4135, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, + 3505, 3506, 3507, 3508, 4136, 3510, 3511, 3512, 3513, 3514, + 3515, 177, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, + 4137, 3525, 0, 3526, 3527, 3528, 3529, 3530, 0, 0, + 178, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, + 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 4138, 3549, + 4139, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, + 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 4140, + 4141, 4142, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 4143, + 4144, 4145, 3576, 180, 3577, 3578, 3579, 3580, 3581, 3582, + 181, 3583, 3584, 3585, 3586, 3587, 3588, 4146, 3589, 3590, + 3591, 3592, 182, 3593, 3594, 3595, 3596, 3597, 3598, 3599, + 3600, 3601, 3602, 183, 3603, 3604, 3605, 3606, 3607, 3608, + 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 4147, + 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, + 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, + 3638, 3639, 3640, 4148, 3641, 3642, 4149, 3643, 3644, 3645, + 3646, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, + 3656, 3657, 3658, 3659, 184, 3660, 3661, 3662, 3663, 4150, + 4151, 4152, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, + 0, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, + 3682, 4153, 4154, 3684, 3685, 3686, 3687, 3688, 3689, 3690, + 3691, 3692, 3693, 185, 186, 187, 0, 189, 190, 191, + 192, 193, 194, 3694, 3695, 3696, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 4155, + 218, 4156, 4157, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 0, 4158, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 4159, 4160, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 4161, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 4162, 315, 316, 317, 0, 318, 319, 320, 0, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 4163, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 0, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 4164, 4165, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 0, 4166, + 4167, 432, 3700, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 0, 4168, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 5504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 0, 516, 517, 518, 519, + 520, 0, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 4170, 565, 566, 4171, 568, + 569, 4172, 571, 572, 573, 574, 575, 576, 5505, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 0, 4174, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 0, 605, 606, 607, 608, + 0, 609, 610, 611, 4175, 174, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, + 3460, 3461, 4130, 4131, 3463, 3464, 3465, 4132, 4133, 3466, + 3467, 3468, 3469, 3470, 3471, 3472, 3473, 4134, 3475, 3476, + 0, 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, + 3486, 3487, 0, 3488, 176, 3489, 3490, 3491, 3492, 3493, + 3494, 3495, 4135, 3497, 3498, 3499, 3500, 3501, 3502, 3503, + 3504, 3505, 3506, 3507, 3508, 4136, 3510, 3511, 3512, 3513, + 3514, 3515, 177, 3516, 3517, 3518, 3519, 3520, 3521, 3522, + 3523, 4137, 3525, 0, 3526, 3527, 3528, 3529, 3530, 0, + 0, 178, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, + 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 4138, + 3549, 4139, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, + 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, + 4140, 4141, 4142, 3569, 3570, 3571, 3572, 3573, 3574, 3575, + 4143, 4144, 4145, 3576, 180, 3577, 3578, 3579, 3580, 3581, + 3582, 181, 3583, 3584, 3585, 3586, 3587, 3588, 4146, 3589, + 3590, 3591, 3592, 182, 3593, 3594, 3595, 3596, 3597, 3598, + 3599, 3600, 3601, 3602, 183, 3603, 3604, 3605, 3606, 3607, + 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, + 4147, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, + 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, + 3637, 3638, 3639, 3640, 4148, 3641, 3642, 4149, 3643, 3644, + 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, + 3655, 3656, 3657, 3658, 3659, 184, 3660, 3661, 3662, 3663, + 4150, 4151, 4152, 3664, 3665, 3666, 3667, 3668, 3669, 3670, + 3671, 0, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, + 3681, 3682, 4153, 4154, 3684, 3685, 3686, 3687, 3688, 3689, + 3690, 3691, 3692, 3693, 185, 186, 187, 0, 189, 190, + 191, 192, 193, 194, 3694, 3695, 3696, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 4155, 218, 4156, 4157, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 0, 4158, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 4159, 4160, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 4161, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 4162, 315, 316, 317, 0, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 4163, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 0, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 4164, 4165, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 0, + 4166, 4167, 432, 3700, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 0, 4168, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 0, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 0, 516, 517, 518, + 519, 520, 0, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 4170, 565, 566, 4171, + 568, 569, 4172, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 0, 4174, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 0, 605, 606, 607, + 608, 0, 609, 610, 611, 4175, 174, 175, 793, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 698, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 851, 852, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 853, 0, 0, + 0, 854, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 855, 0, + 0, 0, 0, 0, 0, 0, 0, 856, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 857, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 858, 0, 0, 0, 0, 859, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 860, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 861, + 0, 0, 0, 862, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 863, 0, 0, 0, 864, 865, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 866, 0, 0, 0, + 0, 0, 0, 867, 868, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 869, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 870, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 871, 298, 299, 300, 301, 872, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 873, + 874, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 875, 463, 464, 465, 876, 467, + 468, 469, 470, 471, 877, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 878, 484, 485, 486, 487, + 488, 879, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 880, 521, 522, 523, 881, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 882, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 793, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 698, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1140, 852, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 853, 0, + 0, 0, 854, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 855, + 0, 0, 0, 0, 0, 0, 0, 0, 856, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 857, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 858, 0, 0, 0, 0, 859, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 860, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 861, 0, 0, 0, 862, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 863, 0, 0, 0, 864, 865, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 866, 0, 0, + 0, 0, 0, 0, 867, 868, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 1141, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 869, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 870, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 871, 298, 299, 300, 301, 872, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 873, 874, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 875, 463, 464, 465, 1142, + 467, 468, 469, 470, 471, 877, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 878, 484, 485, 486, + 487, 488, 879, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 880, 521, 522, 523, 881, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 882, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 0, 0, 0, 2210, 2211, 5227, 0, 5228, 0, 5229, + 698, 5230, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 793, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 698, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 854, 1412, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 793, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 698, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1769, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1770, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 0, 0, 1298, 0, 0, 1299, 1300, + 0, 0, 0, 1301, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 793, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 698, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1754, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1755, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 793, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 698, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1412, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 174, 175, 793, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 698, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1805, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 793, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 698, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 854, 0, 0, 0, 176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 1554, 1555, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 2408, 2409, 2410, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 793, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 698, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3073, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3405, 3406, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 3407, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 0, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 3408, 3409, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 3410, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 3411, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 793, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 698, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1754, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 793, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 698, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5027, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, + 5236, 0, 0, 5237, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 5238, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 793, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 698, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5369, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, + 0, 665, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 174, 175, 793, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 698, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1526, 0, 0, 0, 0, 0, + 0, 178, 1527, 0, 0, 0, 0, 0, 0, 0, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 1528, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 174, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 698, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4333, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 665, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1450, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 1554, + 1555, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1556, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 1554, 1555, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1764, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 1554, 1555, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2476, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 2477, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2489, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3148, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 1554, 1555, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2476, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 4382, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 174, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 698, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4801, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5313, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5323, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 5714, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 705, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 783, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 1554, 1555, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 1919, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 174, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2494, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 698, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3052, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 3053, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 3054, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 3055, 322, 323, 324, 325, 0, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 0, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 3056, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 3057, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 3175, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 3176, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 5666, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 2819, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 2820, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 2821, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 0, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 698, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 3053, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 3054, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 3055, 322, 323, 324, 325, + 0, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 0, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 3056, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 0, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 3057, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 3407, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 0, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 3410, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 3411, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 902, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3623, -3623, -3623, + 177, 0, 0, 0, 0, 0, 0, 903, 0, 0, + 0, 14, 0, 0, 904, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 16, 0, 0, 905, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 906, 0, 0, 0, 0, 0, 0, 0, 907, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 908, 909, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, + 0, 0, 185, 186, 187, 910, 189, 0, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 0, 206, 207, 208, 209, + 210, 211, 212, 213, 0, 911, 0, 0, 217, 218, + 219, 220, 221, 0, 0, 224, 225, 226, 227, 228, + 0, 0, 0, 232, 233, 234, 235, 236, 912, 238, + 239, 240, 241, 0, 0, 0, 0, 0, 0, 247, + 0, 249, 0, 251, 252, 0, 254, 255, 256, 257, + 258, 259, 0, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 0, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 0, 284, 285, 286, + 287, -3623, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 0, 0, 0, 303, 0, 913, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 0, 0, 0, 0, 0, 319, 320, 914, 322, 323, + 324, 0, 326, 327, 0, 329, 330, 0, 0, 332, + 0, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 0, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 0, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 0, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 915, 0, 0, 440, + 0, 442, 443, 0, 445, 446, 447, 448, 0, 450, + 451, 452, 453, 0, 0, 0, 0, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 0, 485, 0, 487, 488, 489, 0, + 491, 492, 0, 494, 495, 496, 497, 498, 499, 0, + 501, 502, 503, 504, 505, 506, 507, 0, 509, 510, + 511, 0, 513, 514, 515, 516, 0, 518, 519, 0, + 0, 522, 523, 0, 0, 526, 527, 528, 0, 530, + 0, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 0, 541, 542, 0, 544, 0, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 0, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 0, 577, 578, 0, + 580, 581, 582, 583, 174, 175, 586, 587, 0, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 0, 0, 606, 607, 0, 0, + 609, 0, 611, 612, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 902, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -3624, + 0, 177, 0, 0, 0, 0, 0, 0, 903, 0, + 0, 0, 14, 0, 0, 904, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 16, 0, 0, 905, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 906, 0, 0, 0, 0, 0, 0, 0, + 907, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 908, 909, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3624, 0, 40, 0, + 0, 0, 0, 185, 186, 187, 910, 189, 0, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 0, 206, 207, 208, + 209, 210, 211, 212, 213, 0, 911, 0, 0, 217, + 218, 219, 220, 221, 0, 0, 224, 225, 226, 227, + 228, 0, 0, 0, 232, 233, 234, 235, 236, 912, + 238, 239, 240, 241, 0, 0, 0, 0, 0, 0, + 247, 0, 249, 0, 251, 252, 0, 254, 255, 256, + 257, 258, 259, 0, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 0, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 0, 284, 285, + 286, 287, -3624, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 0, 0, 0, 303, 0, 913, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 0, 0, 0, 0, 0, 319, 320, 914, 322, + 323, 324, 0, 326, 327, 0, 329, 330, 0, 0, + 332, 0, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 0, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 0, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 0, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 915, 0, 0, + 440, 0, 442, 443, 0, 445, 446, 447, 448, 0, + 450, 451, 452, 453, 0, 0, 0, 0, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 0, 485, 0, 487, 488, 489, + 0, 491, 492, 0, 494, 495, 496, 497, 498, 499, + 0, 501, 502, 503, 504, 505, 506, 507, 0, 509, + 510, 511, 0, 513, 514, 515, 516, 0, 518, 519, + 0, 0, 522, 523, 0, 0, 526, 527, 528, 0, + 530, 0, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 0, 541, 542, 0, 544, 0, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 0, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 0, 577, 578, + 0, 580, 581, 582, 583, 174, 175, 586, 587, 0, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 0, 0, 606, 607, 0, + 0, 609, 0, 611, 612, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 902, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 0, 0, 0, 903, + 0, 0, 0, 14, 0, 0, 904, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 16, 0, 0, + 905, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 906, 0, 0, 0, 0, 0, 0, + 0, 907, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 908, 909, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, + 0, 0, 0, 0, 185, 186, 187, 910, 189, 0, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 0, 206, 207, + 208, 209, 210, 211, 212, 213, 0, 911, 0, 0, + 217, 218, 219, 220, 221, 0, 0, 224, 225, 226, + 227, 228, 0, 0, 0, 232, 233, 234, 235, 236, + 912, 238, 239, 240, 241, 0, 0, 0, 0, 0, + 0, 247, 0, 249, 0, 251, 252, 0, 254, 255, + 256, 257, 258, 259, 0, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 0, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 0, 284, + 285, 286, 287, 1538, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 0, 0, 0, 303, 0, + 913, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 0, 0, 0, 0, 0, 319, 320, 914, + 322, 323, 324, 0, 326, 327, 0, 329, 330, 0, + 0, 332, 0, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 0, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 0, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 0, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 915, 0, + 0, 440, 0, 442, 443, 0, 445, 446, 447, 448, + 0, 450, 451, 452, 453, 0, 0, 0, 0, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 0, 485, 0, 487, 488, + 489, 0, 491, 492, 0, 494, 495, 496, 497, 498, + 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, + 509, 510, 511, 0, 513, 514, 515, 516, 0, 518, + 519, 0, 0, 522, 523, 0, 0, 526, 527, 528, + 0, 530, 0, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 0, 541, 542, 0, 544, 0, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 0, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 0, 577, + 578, 0, 580, 581, 582, 583, 174, 175, 586, 587, + 0, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 0, 0, 606, 607, + 0, 0, 609, 0, 611, 612, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 902, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 903, 0, 0, 0, 14, 0, 0, 904, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 16, 0, + 0, 905, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 906, 0, 0, 0, 0, 0, + 0, 0, 907, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 908, 909, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 0, 0, 0, 0, 185, 186, 187, 910, 189, + 0, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 0, 206, + 207, 208, 209, 210, 211, 212, 213, 0, 911, 0, + 0, 217, 218, 219, 220, 221, 0, 0, 224, 225, + 226, 227, 228, 0, 0, 0, 232, 233, 234, 235, + 236, 912, 238, 239, 240, 241, 0, 0, 0, 0, + 0, 0, 247, 0, 249, 0, 251, 252, 0, 254, + 255, 256, 257, 258, 259, 0, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 0, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 0, + 284, 285, 286, 287, 3377, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 0, 0, 0, 303, + 0, 913, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 0, 0, 0, 0, 0, 319, 320, + 914, 322, 323, 324, 0, 326, 327, 0, 329, 330, + 0, 0, 332, 0, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 0, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 0, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 0, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 915, + 0, 0, 440, 0, 442, 443, 0, 445, 446, 447, + 448, 0, 450, 451, 452, 453, 0, 0, 0, 0, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 0, 485, 0, 487, + 488, 489, 0, 491, 492, 0, 494, 495, 496, 497, + 498, 499, 0, 501, 502, 503, 504, 505, 506, 507, + 0, 509, 510, 511, 0, 513, 514, 515, 516, 0, + 518, 519, 0, 0, 522, 523, 0, 0, 526, 527, + 528, 0, 530, 0, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 0, 541, 542, 0, 544, 0, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 0, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 0, + 577, 578, 0, 580, 581, 582, 583, 174, 175, 586, + 587, 0, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 0, 0, 606, + 607, 0, 0, 609, 0, 611, 612, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 902, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 903, 0, 0, 0, 14, 0, 0, 904, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 16, + 0, 0, 905, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 906, 0, 0, 0, 0, + 0, 0, 0, 907, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 908, 909, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 40, 0, 0, 0, 0, 185, 186, 187, 910, + 189, 0, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 0, + 206, 207, 208, 209, 210, 211, 212, 213, 0, 911, + 0, 0, 217, 218, 219, 220, 221, 0, 0, 224, + 225, 226, 227, 228, 0, 0, 0, 232, 233, 234, + 235, 236, 912, 238, 239, 240, 241, 0, 0, 0, + 0, 0, 0, 247, 0, 249, 0, 251, 252, 0, + 254, 255, 256, 257, 258, 259, 0, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 0, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 0, 284, 285, 286, 287, 3431, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 0, 0, 0, + 303, 0, 913, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 0, 0, 0, 0, 0, 319, + 320, 914, 322, 323, 324, 0, 326, 327, 0, 329, + 330, 0, 0, 332, 0, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 0, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 0, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 0, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 915, 0, 0, 440, 0, 442, 443, 0, 445, 446, + 447, 448, 0, 450, 451, 452, 453, 0, 0, 0, + 0, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 0, 485, 0, + 487, 488, 489, 0, 491, 492, 0, 494, 495, 496, + 497, 498, 499, 0, 501, 502, 503, 504, 505, 506, + 507, 0, 509, 510, 511, 0, 513, 514, 515, 516, + 0, 518, 519, 0, 0, 522, 523, 0, 0, 526, + 527, 528, 0, 530, 0, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 0, 541, 542, 0, 544, 0, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 0, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 0, 577, 578, 0, 580, 581, 582, 583, 174, 175, + 586, 587, 0, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 0, 0, + 606, 607, 0, 0, 609, 0, 611, 612, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 902, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 903, 0, 0, 0, 14, 0, 0, 904, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 16, 0, 0, 905, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 906, 0, 0, 0, + 0, 0, 0, 0, 907, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 908, 909, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 0, 185, 186, 187, + 910, 189, 0, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 0, 206, 207, 208, 209, 210, 211, 212, 213, 0, + 911, 0, 0, 217, 218, 219, 220, 221, 0, 0, + 224, 225, 226, 227, 228, 0, 0, 0, 232, 233, + 234, 235, 236, 912, 238, 239, 240, 241, 0, 0, + 0, 0, 0, 0, 247, 0, 249, 0, 251, 252, + 0, 254, 255, 256, 257, 258, 259, 0, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 0, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 0, 284, 285, 286, 287, 3893, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 0, 0, + 0, 303, 0, 913, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 0, 0, 0, 0, 0, + 319, 320, 914, 322, 323, 324, 0, 326, 327, 0, + 329, 330, 0, 0, 332, 0, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 0, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 0, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 0, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 915, 0, 0, 440, 0, 442, 443, 0, 445, + 446, 447, 448, 0, 450, 451, 452, 453, 0, 0, + 0, 0, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 0, 485, + 0, 487, 488, 489, 0, 491, 492, 0, 494, 495, + 496, 497, 498, 499, 0, 501, 502, 503, 504, 505, + 506, 507, 0, 509, 510, 511, 0, 513, 514, 515, + 516, 0, 518, 519, 0, 0, 522, 523, 0, 0, + 526, 527, 528, 0, 530, 0, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 0, 541, 542, 0, 544, + 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 0, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 0, 577, 578, 0, 580, 581, 582, 583, 174, + 175, 586, 587, 0, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 0, + 0, 606, 607, 0, 0, 609, 0, 611, 612, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 902, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 903, 0, 0, 0, 14, 0, 0, + 904, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 16, 0, 0, 905, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 906, 0, 0, + 0, 0, 0, 0, 0, 907, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 908, 909, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 40, 0, 0, 0, 0, 185, 186, + 187, 910, 189, 0, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 0, 206, 207, 208, 209, 210, 211, 212, 213, + 0, 911, 0, 0, 217, 218, 219, 220, 221, 0, + 0, 224, 225, 226, 227, 228, 0, 0, 0, 232, + 233, 234, 235, 236, 912, 238, 239, 240, 241, 0, + 0, 0, 0, 0, 0, 247, 0, 249, 0, 251, + 252, 0, 254, 255, 256, 257, 258, 259, 0, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 0, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 0, 284, 285, 286, 287, 3899, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 0, + 0, 0, 303, 0, 913, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 0, 0, 0, 0, + 0, 319, 320, 914, 322, 323, 324, 0, 326, 327, + 0, 329, 330, 0, 0, 332, 0, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 0, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 0, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 0, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 915, 0, 0, 440, 0, 442, 443, 0, + 445, 446, 447, 448, 0, 450, 451, 452, 453, 0, + 0, 0, 0, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 0, + 485, 0, 487, 488, 489, 0, 491, 492, 0, 494, + 495, 496, 497, 498, 499, 0, 501, 502, 503, 504, + 505, 506, 507, 0, 509, 510, 511, 0, 513, 514, + 515, 516, 0, 518, 519, 0, 0, 522, 523, 0, + 0, 526, 527, 528, 0, 530, 0, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 0, 541, 542, 0, + 544, 0, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 0, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 0, 577, 578, 0, 580, 581, 582, 583, + 174, 175, 586, 587, 0, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 0, 0, 606, 607, 0, 0, 609, 0, 611, 612, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 903, 0, 0, 0, 14, 0, + 0, 904, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 16, 0, 0, 905, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 906, 0, + 0, 0, 0, 0, 0, 0, 907, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 908, 909, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40, 0, 0, 0, 0, 185, + 186, 187, 910, 189, 0, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 0, 206, 207, 208, 209, 210, 211, 212, + 213, 0, 911, 0, 0, 217, 218, 219, 220, 221, + 0, 0, 224, 225, 226, 227, 228, 0, 0, 0, + 232, 233, 234, 235, 236, 912, 238, 239, 240, 241, + 0, 0, 0, 0, 0, 0, 247, 0, 249, 0, + 251, 252, 0, 254, 255, 256, 257, 258, 259, 0, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 0, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 0, 284, 285, 286, 287, 4198, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 0, 0, 0, 303, 0, 913, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 0, 0, 0, + 0, 0, 319, 320, 914, 322, 323, 324, 0, 326, + 327, 0, 329, 330, 0, 0, 332, 0, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 0, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 0, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 0, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 915, 0, 0, 440, 0, 442, 443, + 0, 445, 446, 447, 448, 0, 450, 451, 452, 453, + 0, 0, 0, 0, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 0, 485, 0, 487, 488, 489, 0, 491, 492, 0, + 494, 495, 496, 497, 498, 499, 0, 501, 502, 503, + 504, 505, 506, 507, 0, 509, 510, 511, 0, 513, + 514, 515, 516, 0, 518, 519, 0, 0, 522, 523, + 0, 0, 526, 527, 528, 0, 530, 0, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 0, 541, 542, + 0, 544, 0, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 0, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 0, 577, 578, 0, 580, 581, 582, + 583, 174, 175, 586, 587, 0, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 0, 0, 606, 607, 0, 0, 609, 0, 611, + 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 902, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 903, 0, 0, 0, 14, + 0, 0, 904, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 16, 0, 0, 905, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 906, + 0, 0, 0, 0, 0, 0, 0, 907, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 908, 909, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, + 185, 186, 187, 910, 189, 0, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 0, 206, 207, 208, 209, 210, 211, + 212, 213, 0, 911, 0, 0, 217, 218, 219, 220, + 221, 0, 0, 224, 225, 226, 227, 228, 0, 0, + 0, 232, 233, 234, 235, 236, 912, 238, 239, 240, + 241, 0, 0, 0, 0, 0, 0, 247, 0, 249, + 0, 251, 252, 0, 254, 255, 256, 257, 258, 259, + 0, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 0, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 0, 284, 285, 286, 287, 0, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 0, 0, 0, 303, 0, 913, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 0, 0, + 0, 0, 0, 319, 320, 914, 322, 323, 324, 0, + 326, 327, 0, 329, 330, 0, 0, 332, 0, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 0, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 0, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 0, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 915, 0, 0, 440, 0, 442, + 443, 0, 445, 446, 447, 448, 0, 450, 451, 452, + 453, 0, 0, 0, 0, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 0, 485, 0, 487, 488, 489, 0, 491, 492, + 0, 494, 495, 496, 497, 498, 499, 0, 501, 502, + 503, 504, 505, 506, 507, 0, 509, 510, 511, 0, + 513, 514, 515, 516, 0, 518, 519, 0, 0, 522, + 523, 0, 0, 526, 527, 528, 0, 530, 0, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 0, 541, + 542, 0, 544, 0, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 0, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 0, 577, 578, 0, 580, 581, + 582, 583, 174, 175, 586, 587, 0, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 0, 0, 606, 607, 0, 0, 609, 0, + 611, 612, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 902, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 903, 0, 0, 0, + 14, 0, 0, 904, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 16, 0, 0, 905, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 906, 0, 0, 0, 0, 0, 0, 0, 907, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 908, + 909, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, + 0, 185, 186, 187, 910, 189, 0, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 0, 206, 207, 208, 209, 210, + 211, 212, 213, 0, 911, 0, 0, 217, 218, 219, + 220, 221, 0, 0, 224, 225, 226, 227, 228, 0, + 0, 0, 232, 233, 234, 235, 236, 912, 238, 239, + 240, 241, 0, 0, 0, 0, 0, 0, 247, 0, + 249, 0, 251, 252, 0, 254, 255, 256, 257, 258, + 259, 0, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 0, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 0, 284, 285, 286, 287, + 0, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 0, 0, 0, 303, 0, 913, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 0, + 0, 0, 0, 0, 319, 320, 914, 322, 323, 324, + 0, 326, 327, 0, 329, 330, 0, 0, 332, 0, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 0, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 0, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 0, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 915, 0, 0, 440, 0, + 442, 443, 0, 445, 446, 447, 448, 0, 450, 451, + 452, 453, 0, 0, 0, 0, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 0, 485, 0, 487, 488, 489, 0, 491, + 492, 0, 494, 495, 496, 497, 498, 499, 0, 501, + 502, 503, 504, 505, 506, 507, 0, 509, 510, 511, + 0, 513, 514, 515, 516, 0, 518, 519, 0, 0, + 522, 523, 0, 0, 526, 527, 528, 0, 530, 0, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 0, + 541, 542, 0, 544, 0, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 0, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 0, 577, 578, 0, 580, + 581, 582, 583, 174, 175, 586, 1741, 0, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 0, 0, 606, 607, 0, 0, 609, + 0, 611, 612, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 16, 0, 0, 905, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 908, 909, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, + 0, 0, 185, 186, 187, 910, 189, 0, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 0, 206, 207, 208, 209, + 210, 211, 212, 213, 0, 911, 0, 0, 217, 218, + 219, 220, 221, 0, 0, 224, 225, 226, 227, 228, + 0, 0, 0, 232, 233, 234, 235, 236, 0, 238, + 239, 240, 241, 0, 0, 0, 0, 0, 0, 247, + 0, 249, 0, 251, 252, 0, 254, 255, 256, 257, + 258, 259, 0, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 0, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 0, 284, 285, 286, + 287, 0, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 0, 0, 0, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 0, 0, 0, 0, 0, 319, 320, 914, 322, 323, + 324, 0, 326, 327, 0, 329, 330, 0, 0, 332, + 0, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 0, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 0, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 0, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 0, 0, 0, 440, + 0, 442, 443, 0, 445, 446, 447, 448, 0, 450, + 451, 452, 453, 0, 0, 0, 0, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 0, 485, 0, 487, 488, 489, 0, + 491, 492, 0, 494, 495, 496, 497, 498, 499, 0, + 501, 502, 503, 504, 505, 506, 507, 0, 509, 510, + 511, 0, 513, 514, 515, 516, 0, 518, 519, 174, + 175, 522, 523, 0, 0, 526, 527, 528, 0, 530, + 0, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 0, 541, 542, 0, 544, 0, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 0, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 0, 577, 578, 0, + 580, 581, 582, 583, 0, 0, 586, 587, 176, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 0, 0, 606, 607, 0, 0, + 609, 0, 611, 612, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 905, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1524, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 910, 189, 0, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 0, 206, 207, 208, 209, 210, 211, 212, 213, + 0, 0, 0, 0, 217, 218, 219, 220, 221, 0, + 0, 224, 225, 226, 227, 228, 0, 0, 0, 232, + 233, 234, 235, 236, 0, 238, 239, 240, 241, 0, + 0, 0, 0, 0, 0, 247, 0, 249, 0, 251, + 252, 0, 254, 255, 256, 257, 258, 259, 0, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 0, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 0, 284, 285, 286, 287, 0, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 0, + 0, 0, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 0, 0, 0, 0, + 0, 319, 320, 914, 322, 323, 324, 0, 326, 327, + 0, 329, 330, 0, 0, 332, 0, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 0, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 0, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 0, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 0, 0, 0, 440, 0, 442, 443, 0, + 445, 446, 447, 448, 0, 450, 451, 452, 453, 0, + 0, 0, 0, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 0, + 485, 0, 487, 488, 489, 0, 491, 492, 0, 494, + 495, 496, 497, 498, 499, 0, 501, 502, 503, 504, + 505, 506, 507, 0, 509, 510, 511, 0, 513, 514, + 515, 516, 0, 518, 519, 174, 175, 522, 523, 0, + 0, 526, 527, 528, 0, 530, 0, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 0, 541, 542, 0, + 544, 0, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 0, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 0, 577, 578, 0, 580, 581, 582, 583, + 0, 0, 586, 587, 176, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 0, 0, 606, 607, 0, 0, 609, 0, 611, 612, + 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 905, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1535, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 910, 189, 0, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 0, 206, 207, + 208, 209, 210, 211, 212, 213, 0, 0, 0, 0, + 217, 218, 219, 220, 221, 0, 0, 224, 225, 226, + 227, 228, 0, 0, 0, 232, 233, 234, 235, 236, + 0, 238, 239, 240, 241, 0, 0, 0, 0, 0, + 0, 247, 0, 249, 0, 251, 252, 0, 254, 255, + 256, 257, 258, 259, 0, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 0, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 0, 284, + 285, 286, 287, 0, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 0, 0, 0, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 0, 0, 0, 0, 0, 319, 320, 914, + 322, 323, 324, 0, 326, 327, 0, 329, 330, 0, + 0, 332, 0, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 0, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 0, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 0, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 0, 0, + 0, 440, 0, 442, 443, 0, 445, 446, 447, 448, + 0, 450, 451, 452, 453, 0, 0, 0, 0, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 0, 485, 0, 487, 488, + 489, 0, 491, 492, 0, 494, 495, 496, 497, 498, + 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, + 509, 510, 511, 0, 513, 514, 515, 516, 0, 518, + 519, 174, 175, 522, 523, 0, 0, 526, 527, 528, + 0, 530, 0, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 0, 541, 542, 0, 544, 0, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 0, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 0, 577, + 578, 0, 580, 581, 582, 583, 0, 0, 586, 587, + 176, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 0, 0, 606, 607, + 0, 0, 609, 0, 611, 612, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 905, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 910, 189, 0, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 0, 206, 207, 208, 209, 210, 211, + 212, 213, 0, 0, 0, 0, 217, 218, 219, 220, + 221, 0, 0, 224, 225, 226, 227, 228, 0, 0, + 0, 232, 233, 234, 235, 236, 0, 238, 239, 240, + 241, 0, 0, 0, 0, 0, 0, 247, 0, 249, + 0, 251, 252, 0, 254, 255, 256, 257, 258, 259, + 0, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 0, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 0, 284, 285, 286, 287, 0, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 0, 0, 0, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 0, 0, + 0, 0, 0, 319, 320, 914, 322, 323, 324, 0, + 326, 327, 0, 329, 330, 0, 0, 332, 0, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 0, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 0, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 0, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 0, 0, 0, 440, 0, 442, + 443, 0, 445, 446, 447, 448, 0, 450, 451, 452, + 453, 0, 0, 0, 0, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 0, 485, 0, 487, 488, 489, 0, 491, 492, + 0, 494, 495, 496, 497, 498, 499, 0, 501, 502, + 503, 504, 505, 506, 507, 0, 509, 510, 511, 0, + 513, 514, 515, 516, 0, 518, 519, 0, 0, 522, + 523, 0, 0, 526, 527, 528, 0, 530, 0, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 0, 541, + 542, 0, 544, 0, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 0, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 0, 577, 578, 0, 580, 581, + 582, 583, 0, 0, 586, 587, 0, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 174, 175, 606, 607, 0, 0, 609, 0, + 611, 612, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3451, 3452, + 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 0, + 3462, 3463, 3464, 3465, 0, 0, 3466, 3467, 3468, 3469, + 3470, 3471, 3472, 3473, 3474, 3475, 3476, 0, 3477, 3478, + 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 0, + 3488, 176, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, + 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, + 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 3515, 177, + 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, + 0, 3526, 3527, 3528, 3529, 3530, 0, 0, 178, 3531, + 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, + 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, + 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, + 3562, 3563, 3564, 3565, 3566, 3567, 3568, 0, 0, 0, + 3569, 3570, 3571, 3572, 3573, 3574, 3575, 0, 0, 0, + 3576, 180, 3577, 3578, 3579, 3580, 3581, 3582, 181, 3583, + 3584, 3585, 3586, 3587, 3588, 0, 3589, 3590, 3591, 3592, + 182, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, + 3602, 183, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, + 3611, 3612, 3613, 3614, 3615, 3616, 3617, 0, 3618, 3619, + 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, + 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, + 3640, 0, 3641, 3642, 0, 3643, 3644, 3645, 3646, 3647, + 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, + 3658, 3659, 184, 3660, 3661, 3662, 3663, 0, 0, 0, + 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, + 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 0, + 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, + 3693, 185, 186, 187, 0, 189, 190, 191, 192, 193, + 194, 3694, 3695, 3696, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 0, 218, 0, + 0, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 0, 0, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 3697, 3698, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 0, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 0, 315, + 316, 317, 0, 318, 319, 320, 0, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 0, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 0, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 0, 3699, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 0, 0, 0, 432, + 3700, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 0, 0, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 0, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 0, 516, 517, 518, 519, 520, 3701, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 0, 565, 566, 0, 568, 569, 3702, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 0, 3703, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 0, 605, 606, 607, 608, 0, 609, + 610, 611 +}; + +static const yytype_int16 yycheck[] = +{ + 5, 165, 68, 44, 163, 916, 0, 0, 678, 679, + 1671, 1397, 0, 1171, 1906, 1173, 1174, 1722, 657, 1876, + 173, 26, 789, 1181, 1932, 30, 2086, 22, 2044, 657, + 35, 1456, 789, 38, 673, 0, 162, 1595, 1735, 678, + 1580, 3047, 759, 2694, 0, 673, 51, 1586, 3355, 2553, + 2096, 1931, 57, 678, 2015, 1229, 61, 52, 2848, 1365, + 678, 3273, 1368, 58, 3376, 744, 646, 746, 704, 3202, + 749, 750, 3243, 997, 68, 1135, 31, 902, 160, 904, + 3268, 906, 907, 3119, 4051, 1625, 3973, 4051, 913, 2564, + 1368, 1362, 678, 2859, 2860, 1616, 676, 646, 1533, 3948, + 3949, 1850, 678, 3274, 2475, 1405, 2876, 2627, 2878, 1502, + 678, 1405, 2562, 1356, 45, 3257, 966, 1655, 123, 1295, + 2879, 1208, 1792, 1793, 3496, 2591, 827, 676, 721, 3135, + 2664, 724, 4206, 2875, 2967, 1673, 2734, 2879, 1735, 1799, + 134, 134, 4216, 1230, 2063, 2176, 1337, 2034, 678, 4223, + 657, 156, 157, 1900, 173, 160, 173, 162, 173, 1819, + 4051, 4216, 3702, 4874, 173, 173, 673, 4572, 4223, 134, + 2655, 678, 123, 3697, 4679, 2654, 2655, 3327, 3702, 173, + 173, 1452, 3949, 1843, 1844, 173, 5035, 1708, 1709, 1710, + 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, + 3025, 12, 4051, 1900, 3930, 15, 4529, 4529, 173, 4529, + 4486, 16, 17, 1693, 6, 7, 3496, 1067, 1068, 1069, + 15, 1701, 1702, 26, 1704, 1705, 1137, 1897, 42, 4530, + 1080, 4532, 31, 3319, 4535, 6, 7, 31, 42, 6, + 7, 31, 4141, 4142, 26, 51, 4145, 47, 4549, 6, + 7, 6, 7, 4152, 6, 7, 26, 1433, 31, 4158, + 67, 53, 783, 902, 26, 904, 127, 906, 907, 657, + 31, 6, 7, 47, 913, 4581, 42, 916, 28, 2187, + 3509, 42, 42, 26, 127, 673, 3119, 2772, 71, 5159, + 5160, 5126, 4377, 2772, 11, 12, 33, 47, 104, 26, + 89, 26, 42, 1900, 41, 1231, 3342, 33, 24, 25, + 26, 4669, 28, 50, 30, 41, 32, 24, 25, 26, + 26, 28, 771, 30, 50, 32, 47, 628, 99, 33, + 28, 33, 24, 25, 26, 770, 28, 41, 30, 41, + 32, 755, 33, 145, 53, 173, 50, 42, 50, 203, + 41, 53, 31, 42, 123, 88, 123, 203, 42, 50, + 47, 26, 14, 178, 242, 203, 299, 2817, 14, 5709, + 182, 123, 99, 3295, 99, 206, 65, 3842, 3843, 42, + 65, 244, 314, 158, 685, 5180, 3462, 254, 33, 136, + 804, 43, 44, 99, 268, 902, 41, 904, 3474, 906, + 907, 168, 143, 3683, 314, 50, 913, 1467, 143, 916, + 57, 33, 33, 26, 127, 128, 168, 232, 378, 41, + 41, 143, 172, 3703, 128, 42, 1861, 314, 50, 50, + 4420, 2557, 127, 318, 99, 168, 1496, 244, 305, 391, + 26, 281, 42, 254, 42, 99, 33, 63, 310, 391, + 33, 427, 5482, 295, 41, 107, 178, 1979, 41, 387, + 14, 107, 1861, 50, 267, 127, 294, 50, 99, 51, + 5327, 208, 40, 5813, 633, 317, 635, 636, 637, 638, + 639, 640, 208, 642, 643, 2545, 99, 369, 33, 43, + 44, 4835, 4454, 591, 305, 4876, 41, 435, 1137, 151, + 60, 67, 14, 314, 208, 50, 208, 116, 47, 3342, + 114, 299, 53, 672, 902, 816, 904, 208, 906, 907, + 646, 5306, 104, 197, 337, 913, 33, 53, 916, 314, + 2438, 43, 44, 54, 41, 4875, 122, 254, 239, 644, + 192, 258, 299, 50, 33, 312, 192, 201, 33, 1935, + 676, 572, 41, 107, 122, 1256, 41, 1950, 341, 75, + 312, 50, 4636, 208, 5069, 50, 119, 726, 727, 209, + 31, 697, 5442, 4563, 10, 4881, 433, 96, 315, 471, + 122, 4636, 31, 366, 141, 711, 208, 208, 305, 315, + 5891, 170, 1750, 328, 5895, 107, 764, 314, 4672, 152, + 232, 769, 53, 771, 145, 4454, 408, 1765, 299, 458, + 160, 315, 494, 315, 33, 386, 71, 4672, 919, 160, + 1337, 208, 50, 3699, 315, 208, 1100, 203, 196, 314, + 1137, 50, 1225, 201, 1227, 779, 155, 217, 192, 1318, + 645, 646, 1321, 787, 528, 33, 1325, 1326, 1327, 31, + 463, 314, 4539, 41, 2534, 4729, 403, 203, 1132, 201, + 1584, 57, 50, 208, 1421, 670, 4557, 67, 225, 203, + 315, 676, 251, 203, 4729, 71, 1600, 73, 244, 805, + 192, 779, 787, 323, 1744, 5542, 691, 846, 847, 2546, + 4214, 127, 697, 315, 315, 251, 2002, 5055, 629, 3233, + 182, 208, 364, 3237, 290, 710, 711, 311, 4557, 1796, + 686, 1798, 1562, 1563, 1801, 234, 671, 843, 3089, 208, + 236, 2682, 290, 208, 2002, 746, 1813, 178, 315, 1816, + 1790, 99, 315, 1820, 2034, 2861, 4635, 4044, 743, 292, + 2034, 3226, 374, 1444, 281, 1502, 287, 3226, 290, 1137, + 688, 2186, 601, 475, 759, 386, 838, 839, 840, 1846, + 1847, 1848, 6063, 4135, 4663, 4137, 287, 1468, 4667, 307, + 315, 776, 310, 299, 4146, 4674, 770, 2669, 432, 5564, + 1971, 232, 713, 675, 789, 153, 448, 2186, 450, 3825, + 721, 1982, 5822, 724, 4166, 580, 2354, 2355, 726, 33, + 805, 1440, 504, 688, 3954, 4177, 143, 41, 315, 814, + 577, 1735, 3818, 695, 169, 2723, 50, 281, 658, 779, + 208, 568, 827, 432, 666, 577, 315, 779, 5172, 834, + 315, 836, 506, 838, 839, 840, 841, 643, 843, 378, + 581, 178, 797, 384, 244, 787, 33, 780, 123, 782, + 782, 1552, 5647, 4133, 41, 4135, 684, 4137, 258, 287, + 33, 281, 299, 50, 639, 4330, 4146, 568, 41, 743, + 911, 33, 782, 1723, 229, 2535, 6216, 50, 540, 41, + 630, 528, 4162, 2763, 2792, 1465, 4166, 842, 50, 844, + 747, 50, 614, 168, 644, 782, 901, 4177, 903, 2379, + 2380, 54, 2382, 2383, 782, 281, 2082, 912, 658, 4871, + 915, 366, 779, 376, 593, 1841, 107, 779, 72, 782, + 1334, 782, 472, 928, 918, 918, 33, 315, 782, 5014, + 918, 681, 299, 1440, 41, 723, 782, 1573, 33, 782, + 755, 710, 3392, 50, 782, 341, 41, 730, 669, 763, + 1399, 782, 614, 918, 743, 50, 758, 1392, 5264, 763, + 4189, 4047, 768, 359, 33, 712, 769, 779, 779, 779, + 366, 763, 41, 787, 208, 782, 1900, 782, 1745, 779, + 779, 50, 669, 787, 779, 779, 1703, 769, 1745, 779, + 759, 4981, 3825, 5269, 786, 5271, 5831, 763, 780, 769, + 782, 192, 763, 763, 1070, 779, 779, 769, 3833, 5332, + 5332, 4978, 5332, 1649, 4978, 786, 477, 5375, 780, 786, + 782, 208, 4871, 763, 4873, 758, 769, 787, 3950, 786, + 717, 786, 2781, 5334, 786, 208, 1162, 780, 5908, 782, + 5910, 5911, 769, 780, 769, 1171, 208, 787, 1174, 629, + 1817, 786, 1440, 1179, 763, 4131, 4132, 742, 33, 785, + 1817, 643, 779, 769, 780, 547, 41, 1072, 763, 782, + 768, 769, 688, 780, 763, 50, 1070, 4153, 782, 763, + 782, 315, 1070, 4159, 1210, 5590, 5935, 4978, 780, 4815, + 2150, 782, 4168, 649, 4170, 4171, 4172, 314, 4174, 4175, + 763, 208, 1781, 787, 769, 5510, 4873, 1777, 4184, 4185, + 4186, 4187, 4188, 208, 766, 767, 768, 769, 770, 771, + 772, 773, 768, 769, 770, 771, 772, 773, 315, 4978, + 1135, 5512, 901, 1850, 6004, 6005, 696, 782, 1777, 208, + 2662, 2663, 315, 88, 593, 6015, 763, 35, 36, 37, + 505, 39, 1777, 315, 5865, 5866, 769, 1162, 780, 1777, + 2071, 782, 5502, 763, 732, 763, 1171, 704, 568, 1174, + 787, 5511, 1752, 692, 1179, 4008, 4009, 376, 5168, 4012, + 4013, 232, 335, 769, 4724, 4018, 4019, 787, 4728, 787, + 732, 1777, 560, 1950, 376, 782, 578, 780, 6068, 782, + 4724, 1777, 782, 1752, 4728, 1210, 782, 361, 315, 1777, + 369, 593, 4045, 1914, 768, 769, 770, 771, 772, 773, + 315, 33, 763, 1524, 281, 688, 143, 780, 376, 41, + 1271, 1399, 1358, 208, 1535, 780, 782, 782, 50, 208, + 704, 254, 1395, 1248, 1195, 1250, 315, 1777, 782, 787, + 1255, 1256, 782, 232, 1971, 767, 768, 769, 770, 771, + 772, 773, 333, 1422, 331, 1982, 1983, 1272, 156, 2127, + 1777, 1337, 232, 1952, 1953, 782, 1281, 614, 160, 743, + 1959, 1960, 1961, 3163, 704, 1236, 3033, 653, 393, 270, + 1295, 1296, 305, 782, 1225, 780, 1227, 1890, 5372, 2457, + 5374, 314, 577, 3160, 755, 4493, 143, 5297, 4496, 5299, + 3190, 1316, 763, 3200, 5304, 735, 2474, 5372, 5562, 5374, + 2478, 5311, 5312, 2623, 1917, 4475, 448, 178, 704, 2623, + 3981, 5321, 1337, 1338, 730, 494, 3033, 5327, 448, 1465, + 315, 2265, 371, 1337, 3995, 782, 4718, 1429, 703, 1337, + 787, 390, 506, 1358, 580, 4497, 33, 2531, 2783, 211, + 14, 4367, 33, 580, 1319, 1320, 1297, 743, 2038, 1949, + 41, 1376, 232, 50, 2434, 2435, 1395, 5627, 1395, 50, + 1395, 298, 2688, 2904, 2690, 2691, 1395, 1395, 369, 43, + 44, 178, 1397, 1398, 782, 178, 208, 53, 1392, 2699, + 2460, 1395, 1395, 1408, 2797, 2699, 3437, 1395, 2109, 2110, + 2688, 3330, 2690, 2691, 1419, 782, 1421, 2504, 409, 410, + 787, 2508, 40, 2510, 1429, 1430, 71, 1553, 1433, 173, + 1395, 723, 2071, 3967, 3968, 580, 3033, 2524, 4718, 1444, + 1741, 492, 5824, 1448, 3910, 1450, 5690, 510, 3006, 3007, + 2537, 2538, 2643, 107, 5176, 1460, 5802, 2996, 2649, 779, + 1465, 298, 1467, 1468, 101, 3373, 4064, 787, 71, 3129, + 73, 40, 2111, 1404, 3012, 3013, 3014, 3015, 3963, 3964, + 551, 1250, 3853, 2111, 3963, 3964, 1255, 143, 3028, 688, + 553, 1496, 614, 4499, 33, 787, 3867, 1502, 649, 528, + 3871, 3022, 41, 315, 614, 4264, 688, 2146, 613, 5759, + 31, 50, 2033, 494, 1264, 145, 33, 2997, 2146, 2999, + 2159, 1526, 4264, 358, 41, 1275, 593, 143, 1594, 755, + 160, 476, 492, 50, 2159, 72, 695, 208, 192, 127, + 688, 2159, 459, 193, 2183, 2184, 780, 1552, 1553, 33, + 462, 2727, 5542, 33, 4387, 2183, 2184, 41, 5548, 33, + 2163, 41, 633, 414, 2071, 5464, 50, 41, 1337, 33, + 50, 423, 976, 977, 978, 2818, 50, 41, 196, 770, + 771, 772, 773, 2159, 363, 566, 50, 2445, 2446, 126, + 472, 2159, 1586, 780, 338, 782, 1722, 4117, 4118, 448, + 1594, 658, 258, 657, 2111, 392, 1594, 780, 40, 782, + 755, 110, 5646, 33, 736, 654, 3365, 1021, 780, 673, + 782, 41, 459, 474, 678, 688, 1752, 196, 779, 2159, + 50, 414, 492, 287, 572, 10, 5050, 472, 315, 2146, + 669, 586, 298, 33, 315, 1650, 167, 704, 593, 1654, + 1419, 41, 2159, 632, 599, 1660, 1697, 33, 6040, 296, + 50, 1430, 307, 572, 2381, 41, 1671, 582, 71, 208, + 73, 235, 782, 780, 50, 4125, 2183, 2184, 590, 1448, + 659, 1450, 6028, 2071, 40, 780, 57, 1851, 225, 1683, + 1683, 208, 5682, 101, 19, 20, 99, 3367, 99, 99, + 1782, 1783, 73, 1785, 1786, 1787, 1788, 357, 3229, 641, + 145, 5701, 328, 782, 695, 1797, 28, 1722, 30, 1724, + 214, 2357, 713, 2111, 208, 716, 314, 2787, 208, 674, + 42, 5453, 226, 1815, 208, 1740, 5458, 5459, 167, 1744, + 1745, 335, 150, 577, 208, 33, 232, 1752, 1753, 10, + 5814, 5785, 127, 41, 384, 667, 293, 226, 2146, 258, + 3195, 378, 50, 366, 196, 614, 779, 2068, 468, 1774, + 5619, 2159, 688, 1899, 4916, 756, 315, 1782, 1783, 1784, + 1785, 1786, 1787, 1788, 1789, 1790, 1791, 281, 208, 568, + 735, 312, 1797, 1957, 1958, 2183, 2184, 5646, 315, 268, + 201, 5650, 1733, 459, 160, 780, 506, 782, 746, 1814, + 1815, 4847, 1817, 127, 1940, 2454, 434, 652, 208, 144, + 289, 4857, 4858, 1949, 740, 1951, 33, 753, 314, 2454, + 5244, 315, 208, 1838, 41, 315, 2454, 746, 3898, 5857, + 196, 315, 5860, 50, 782, 1850, 33, 5261, 902, 598, + 904, 315, 906, 907, 41, 787, 74, 3128, 173, 913, + 454, 2441, 916, 50, 1990, 434, 2167, 4637, 86, 225, + 457, 196, 787, 782, 2175, 763, 764, 765, 2454, 10, + 141, 1650, 2793, 312, 2185, 1654, 2454, 736, 296, 1820, + 404, 1660, 2441, 33, 1899, 315, 5084, 2808, 2599, 5748, + 3200, 41, 3060, 303, 304, 33, 3200, 3178, 197, 1914, + 50, 33, 2551, 41, 1919, 5637, 4682, 2043, 3076, 41, + 208, 595, 50, 2551, 2454, 315, 2643, 676, 50, 3087, + 3088, 5119, 2649, 782, 4943, 1940, 5785, 293, 2849, 315, + 598, 3366, 1947, 5830, 1949, 1950, 1951, 2664, 782, 5836, + 1955, 36, 37, 5802, 119, 2634, 3262, 542, 2637, 1890, + 4969, 661, 2641, 366, 2721, 33, 1971, 436, 780, 463, + 4341, 1740, 6036, 41, 6071, 4346, 4347, 1982, 1983, 294, + 33, 3041, 50, 386, 3262, 1990, 1917, 152, 41, 314, + 2583, 608, 281, 3386, 3387, 3887, 342, 50, 2601, 33, + 2670, 208, 314, 403, 458, 4021, 403, 41, 1412, 413, + 141, 3071, 723, 600, 4847, 1784, 50, 691, 676, 128, + 1789, 208, 1791, 6087, 4857, 4858, 5993, 315, 5992, 6047, + 386, 4141, 3889, 2858, 2859, 2860, 3997, 572, 2043, 5794, + 2797, 33, 3233, 454, 2551, 154, 3237, 2052, 4699, 41, + 364, 293, 461, 2058, 568, 4530, 528, 2062, 50, 154, + 4535, 386, 3368, 6127, 2781, 4540, 2454, 627, 208, 1838, + 5106, 745, 413, 5828, 421, 475, 787, 2082, 6175, 6176, + 208, 1850, 2685, 1137, 493, 489, 208, 704, 5937, 33, + 3368, 437, 2097, 33, 2099, 2734, 14, 41, 2103, 3370, + 5472, 41, 4753, 720, 2109, 2110, 50, 763, 315, 3033, + 50, 782, 766, 767, 768, 769, 770, 771, 772, 773, + 120, 2126, 2127, 683, 709, 43, 44, 292, 315, 33, + 5318, 226, 5303, 668, 448, 33, 450, 41, 5147, 495, + 208, 613, 727, 41, 386, 2150, 50, 601, 489, 2154, + 561, 4261, 50, 33, 2793, 208, 33, 671, 567, 2164, + 779, 41, 454, 2551, 41, 2170, 47, 55, 787, 2808, + 50, 460, 497, 50, 208, 315, 2181, 2182, 419, 6028, + 0, 2702, 2703, 117, 118, 426, 1955, 315, 5468, 107, + 47, 33, 5472, 315, 541, 33, 131, 669, 47, 41, + 647, 123, 1971, 41, 7, 127, 2786, 499, 50, 2848, + 2849, 746, 50, 1982, 1983, 144, 208, 506, 218, 2858, + 2859, 2860, 723, 2848, 2863, 106, 540, 2734, 3139, 51, + 2848, 47, 3082, 2227, 2227, 3146, 2875, 2786, 2863, 648, + 2879, 5553, 602, 782, 2880, 2863, 168, 315, 2412, 106, + 2875, 173, 5440, 495, 2879, 2891, 2892, 106, 705, 6123, + 2896, 708, 315, 151, 208, 782, 3, 196, 208, 6097, + 217, 205, 2848, 5106, 192, 3042, 568, 57, 779, 167, + 2848, 315, 104, 2052, 206, 3042, 2793, 2863, 735, 2058, + 106, 71, 6156, 73, 31, 2863, 743, 128, 782, 2875, + 614, 2808, 782, 2879, 208, 33, 763, 2875, 782, 2375, + 208, 2879, 2948, 41, 6142, 2441, 780, 5150, 2848, 3799, + 151, 3801, 50, 315, 47, 14, 2331, 33, 208, 2965, + 2335, 208, 2458, 2863, 281, 41, 573, 574, 47, 229, + 287, 2848, 2849, 2348, 50, 2875, 2734, 763, 282, 2879, + 238, 2858, 2859, 2860, 43, 44, 3895, 2126, 2127, 4834, + 4835, 251, 782, 145, 752, 33, 208, 141, 2875, 454, + 208, 315, 2879, 41, 127, 315, 127, 136, 160, 2982, + 6067, 2375, 50, 106, 413, 2154, 1440, 2375, 47, 5465, + 5180, 779, 782, 763, 53, 2164, 55, 106, 5474, 158, + 5476, 5477, 5478, 5479, 5480, 2793, 782, 2489, 5596, 4780, + 4781, 315, 2494, 650, 499, 704, 6103, 315, 107, 744, + 2808, 2503, 173, 4898, 177, 4900, 1003, 2509, 99, 2434, + 2435, 33, 2558, 3103, 3104, 315, 2441, 723, 315, 41, + 2445, 2446, 779, 6079, 6080, 1022, 1023, 206, 50, 30, + 787, 763, 153, 2458, 35, 2460, 768, 769, 2463, 2464, + 2848, 2849, 151, 5114, 3103, 3104, 779, 168, 782, 128, + 2858, 2859, 2860, 315, 787, 2863, 561, 315, 3103, 3104, + 208, 6117, 5694, 2488, 2489, 3103, 3104, 2875, 241, 2494, + 22, 2879, 57, 779, 782, 768, 769, 29, 2503, 31, + 3139, 667, 208, 192, 2509, 787, 71, 3146, 5641, 675, + 5643, 271, 4369, 33, 680, 311, 3233, 3103, 3104, 604, + 3237, 41, 282, 2454, 33, 713, 33, 3103, 3104, 717, + 50, 2536, 41, 3444, 41, 3103, 3104, 4498, 769, 31, + 208, 50, 33, 50, 779, 769, 2672, 2552, 4624, 780, + 41, 2633, 787, 2558, 2559, 2560, 780, 2639, 2640, 50, + 313, 341, 2331, 4579, 779, 328, 2335, 4643, 2523, 5757, + 2501, 154, 787, 3103, 3104, 782, 4652, 65, 769, 359, + 779, 2512, 4658, 2588, 510, 4601, 366, 315, 787, 780, + 2595, 782, 4668, 3196, 2599, 782, 3103, 3104, 533, 534, + 4676, 4677, 537, 538, 539, 33, 208, 57, 737, 315, + 779, 391, 4862, 41, 258, 5922, 5923, 4867, 787, 779, + 2625, 71, 50, 73, 2629, 2630, 2631, 787, 2633, 3386, + 3387, 178, 3139, 2638, 2639, 2640, 5769, 307, 2643, 3146, + 310, 779, 782, 779, 2649, 33, 4288, 315, 3365, 787, + 4292, 787, 2583, 41, 782, 577, 33, 33, 780, 2664, + 2786, 779, 50, 2668, 41, 41, 2597, 2672, 2673, 19, + 20, 4229, 4230, 50, 50, 50, 2445, 2446, 763, 764, + 765, 343, 5762, 5763, 299, 33, 33, 513, 208, 515, + 516, 3997, 950, 41, 41, 6132, 6133, 5172, 3301, 208, + 4258, 208, 50, 50, 530, 3879, 532, 113, 114, 115, + 3868, 4372, 3870, 315, 782, 4273, 2721, 208, 389, 3997, + 391, 417, 2727, 1777, 141, 1286, 4141, 4142, 3886, 782, + 4145, 1292, 1293, 3336, 128, 3338, 3339, 4152, 4784, 997, + 5873, 3344, 4282, 5876, 746, 5396, 780, 670, 3922, 3352, + 2876, 3139, 2878, 3356, 425, 3358, 1664, 1665, 3146, 5130, + 5131, 670, 3283, 3284, 191, 3286, 3287, 2536, 2773, 2700, + 2775, 19, 20, 3412, 4312, 3835, 2781, 2708, 281, 2784, + 208, 2786, 2787, 4799, 455, 4325, 33, 3412, 5865, 5866, + 782, 2560, 2797, 460, 41, 315, 3883, 767, 768, 625, + 626, 128, 780, 50, 231, 3444, 315, 780, 315, 782, + 19, 20, 5892, 145, 786, 1073, 5896, 33, 731, 732, + 208, 734, 33, 736, 315, 41, 4097, 145, 662, 33, + 41, 208, 208, 28, 50, 30, 3412, 41, 782, 50, + 145, 268, 782, 312, 3412, 101, 50, 147, 766, 767, + 768, 769, 770, 771, 772, 773, 127, 787, 158, 5334, + 208, 208, 2631, 780, 33, 782, 166, 734, 33, 2638, + 281, 2876, 41, 2878, 2643, 780, 41, 782, 782, 787, + 2649, 50, 3412, 120, 782, 50, 780, 315, 782, 33, + 33, 341, 657, 436, 150, 2664, 144, 41, 41, 4119, + 780, 4121, 4782, 780, 743, 3412, 50, 50, 47, 359, + 268, 779, 33, 33, 33, 114, 366, 588, 1176, 287, + 41, 41, 41, 4628, 5428, 33, 33, 315, 128, 50, + 50, 50, 2863, 41, 41, 144, 3002, 3444, 315, 315, + 782, 391, 50, 50, 782, 780, 151, 782, 196, 249, + 730, 622, 33, 780, 141, 782, 606, 81, 33, 386, + 41, 208, 101, 647, 19, 20, 41, 315, 315, 50, + 780, 398, 782, 3137, 2979, 50, 4942, 277, 53, 4995, + 4008, 4009, 779, 584, 4012, 4013, 475, 196, 5004, 779, + 4018, 4019, 208, 704, 6074, 6075, 101, 208, 254, 780, + 580, 782, 2996, 3008, 208, 33, 779, 1265, 3002, 779, + 4976, 150, 2781, 41, 3002, 2784, 1375, 2071, 735, 1378, + 1379, 779, 50, 147, 3412, 333, 18, 19, 20, 333, + 780, 3036, 782, 780, 158, 782, 3041, 3042, 333, 208, + 296, 4580, 166, 208, 780, 150, 782, 81, 40, 305, + 203, 299, 780, 780, 551, 782, 3444, 2111, 314, 88, + 780, 780, 782, 782, 208, 208, 3071, 287, 315, 193, + 203, 498, 328, 427, 780, 3842, 3843, 766, 767, 768, + 769, 770, 771, 772, 773, 3842, 3843, 208, 208, 208, + 145, 782, 2146, 4364, 3099, 283, 3101, 3091, 3091, 315, + 208, 208, 779, 3091, 315, 2159, 3270, 1365, 360, 788, + 1368, 315, 780, 147, 24, 254, 351, 3243, 28, 780, + 30, 782, 32, 351, 158, 249, 3091, 208, 3133, 2183, + 2184, 786, 166, 208, 3216, 3091, 779, 4798, 386, 779, + 3145, 568, 779, 515, 516, 779, 315, 3273, 3274, 254, + 315, 779, 40, 277, 780, 779, 782, 296, 530, 193, + 532, 3797, 50, 780, 15, 782, 305, 55, 160, 779, + 4595, 315, 315, 779, 779, 314, 3943, 386, 780, 779, + 208, 4339, 4340, 3309, 24, 25, 3943, 4361, 28, 328, + 30, 296, 32, 779, 315, 315, 315, 226, 737, 73, + 305, 779, 779, 4761, 196, 57, 81, 315, 315, 314, + 5996, 3216, 780, 779, 782, 249, 3221, 6223, 33, 71, + 4635, 73, 780, 328, 782, 780, 41, 782, 3233, 780, + 311, 782, 3237, 225, 315, 50, 1566, 1567, 3243, 268, + 315, 737, 780, 277, 782, 1575, 3251, 1505, 4663, 497, + 3967, 3968, 4667, 625, 626, 283, 779, 779, 4644, 4674, + 780, 779, 3193, 151, 780, 4651, 782, 3036, 3273, 3274, + 24, 780, 147, 780, 28, 1605, 30, 1607, 32, 167, + 730, 38, 780, 158, 782, 779, 6072, 315, 497, 780, + 213, 166, 1622, 1623, 1624, 4956, 780, 779, 782, 1629, + 1630, 293, 4460, 780, 3309, 782, 779, 1637, 196, 338, + 213, 533, 534, 128, 4700, 537, 538, 539, 193, 33, + 3325, 213, 780, 47, 782, 6111, 1584, 41, 203, 5034, + 779, 386, 5298, 780, 779, 782, 50, 787, 393, 779, + 779, 1599, 1600, 18, 19, 20, 779, 779, 5364, 5315, + 238, 213, 780, 408, 780, 40, 782, 779, 779, 6145, + 3365, 780, 5328, 782, 5330, 40, 3297, 3298, 3299, 3300, + 55, 3302, 3303, 4198, 249, 430, 3145, 780, 53, 782, + 3385, 3386, 3387, 780, 413, 782, 3391, 23, 6174, 779, + 26, 27, 780, 208, 386, 31, 4702, 780, 73, 782, + 2454, 779, 277, 780, 780, 88, 75, 436, 779, 3340, + 3341, 751, 3343, 127, 3345, 3346, 3347, 3348, 3349, 3350, + 3351, 5118, 3353, 779, 99, 4064, 3357, 4985, 780, 780, + 782, 782, 780, 780, 463, 780, 779, 782, 4041, 4042, + 4043, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 3221, 779, 306, 307, 780, 126, 782, 780, + 4618, 782, 4065, 4066, 3233, 4068, 151, 780, 3237, 782, + 1728, 780, 779, 782, 55, 723, 145, 1735, 5139, 31, + 535, 4120, 167, 88, 5005, 160, 780, 33, 782, 341, + 779, 160, 4120, 548, 208, 41, 744, 2551, 23, 779, + 315, 26, 27, 495, 50, 779, 31, 359, 787, 779, + 565, 196, 119, 780, 366, 782, 123, 779, 1776, 33, + 127, 196, 5582, 779, 779, 779, 201, 41, 203, 15, + 780, 214, 782, 780, 779, 744, 50, 779, 779, 391, + 145, 122, 780, 226, 782, 152, 92, 93, 94, 95, + 225, 15, 779, 238, 33, 779, 225, 4064, 4133, 4198, + 779, 168, 41, 4330, 780, 4140, 173, 779, 4143, 780, + 780, 50, 782, 4330, 782, 4150, 780, 5434, 779, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 779, 584, 138, 139, 140, 780, 3365, 782, 281, 206, + 780, 315, 782, 4239, 5620, 780, 289, 782, 780, 779, + 782, 780, 779, 4120, 128, 780, 203, 780, 293, 782, + 201, 226, 3391, 779, 779, 4264, 5518, 763, 780, 658, + 782, 355, 779, 662, 779, 690, 780, 780, 779, 4264, + 779, 324, 1900, 189, 190, 779, 128, 779, 779, 128, + 705, 779, 779, 81, 779, 203, 3820, 75, 782, 780, + 780, 780, 208, 779, 4300, 779, 779, 779, 779, 4272, + 779, 346, 780, 780, 779, 399, 4064, 401, 779, 122, + 2734, 779, 779, 779, 289, 292, 81, 779, 4264, 779, + 4293, 4198, 779, 779, 208, 22, 4264, 24, 25, 779, + 779, 28, 29, 30, 31, 779, 735, 253, 126, 290, + 5407, 386, 779, 779, 743, 384, 258, 782, 5626, 147, + 5417, 670, 460, 779, 5632, 5633, 688, 145, 127, 208, + 158, 688, 4120, 704, 4264, 676, 510, 429, 166, 2793, + 143, 782, 160, 422, 2002, 782, 2004, 782, 582, 360, + 782, 785, 147, 436, 2808, 127, 394, 4264, 201, 782, + 752, 782, 579, 158, 699, 193, 763, 491, 7, 315, + 316, 166, 5433, 40, 743, 3780, 463, 463, 24, 25, + 463, 779, 28, 50, 30, 5325, 32, 10, 55, 677, + 465, 782, 217, 31, 2848, 2849, 136, 296, 193, 217, + 151, 315, 65, 393, 2858, 2859, 2860, 225, 203, 2863, + 4198, 18, 19, 20, 408, 3, 3821, 541, 583, 743, + 495, 249, 403, 40, 787, 427, 311, 54, 47, 410, + 3835, 436, 3837, 40, 127, 782, 315, 3842, 3843, 787, + 3845, 120, 787, 3848, 3849, 182, 422, 290, 643, 277, + 704, 780, 333, 333, 249, 33, 333, 4682, 463, 141, + 506, 311, 561, 41, 588, 411, 73, 24, 25, 26, + 3952, 28, 50, 30, 128, 32, 4264, 5035, 730, 154, + 311, 779, 277, 177, 151, 786, 782, 106, 105, 47, + 5276, 5277, 99, 5279, 5555, 779, 3901, 787, 427, 5420, + 167, 3895, 3896, 780, 4425, 4426, 4427, 4428, 4429, 4430, + 4431, 4432, 4433, 4434, 3845, 4436, 4437, 4438, 4439, 4440, + 4441, 4442, 4443, 4444, 4445, 594, 106, 4448, 4449, 196, + 780, 336, 478, 2191, 782, 780, 3941, 2267, 3943, 780, + 2270, 3946, 3947, 787, 24, 25, 26, 3952, 28, 780, + 30, 648, 32, 160, 678, 4108, 2286, 780, 127, 127, + 403, 250, 3967, 3968, 780, 787, 384, 410, 780, 3974, + 577, 238, 779, 167, 191, 658, 700, 2307, 779, 196, + 5888, 136, 18, 19, 20, 660, 5144, 5373, 782, 196, + 287, 788, 677, 782, 201, 127, 203, 602, 544, 770, + 546, 73, 4938, 4939, 40, 4941, 552, 2265, 2266, 787, + 4946, 4052, 782, 4949, 231, 4536, 4952, 4953, 225, 127, + 4541, 688, 770, 360, 4960, 151, 4962, 4666, 5725, 490, + 208, 701, 451, 702, 127, 4971, 782, 73, 435, 644, + 688, 4666, 4617, 4682, 4619, 264, 127, 266, 4666, 3103, + 3104, 268, 735, 33, 4629, 780, 5577, 662, 277, 779, + 743, 41, 779, 99, 782, 154, 612, 3, 3837, 406, + 50, 782, 4647, 362, 293, 151, 217, 752, 363, 239, + 510, 370, 360, 510, 4659, 3139, 293, 510, 5793, 2347, + 4666, 4096, 3146, 510, 4099, 510, 385, 510, 4666, 763, + 4675, 782, 2360, 708, 782, 283, 395, 396, 397, 120, + 656, 19, 20, 676, 4108, 4108, 405, 24, 25, 47, + 4108, 28, 287, 30, 160, 32, 127, 596, 71, 4123, + 735, 743, 713, 673, 158, 716, 4666, 315, 743, 346, + 5526, 780, 5528, 5529, 725, 780, 780, 484, 128, 57, + 780, 780, 158, 96, 4833, 210, 779, 782, 137, 4666, + 196, 787, 65, 33, 251, 201, 109, 203, 439, 386, + 787, 41, 3941, 780, 664, 4682, 594, 3946, 3947, 386, + 50, 398, 125, 53, 391, 418, 779, 782, 4193, 225, + 6206, 595, 2450, 480, 4199, 5735, 480, 33, 3967, 3968, + 780, 283, 748, 782, 68, 41, 734, 703, 2466, 782, + 547, 206, 155, 759, 50, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 563, 564, 208, 222, + 33, 568, 569, 570, 6091, 128, 19, 20, 41, 4842, + 4843, 4844, 4845, 203, 782, 4848, 4849, 50, 782, 779, + 4853, 4930, 33, 4856, 543, 474, 4859, 293, 287, 4862, + 41, 63, 146, 4866, 4867, 154, 555, 649, 97, 50, + 713, 42, 53, 716, 57, 4945, 4281, 780, 4666, 780, + 780, 498, 725, 5823, 702, 427, 780, 770, 495, 780, + 128, 234, 128, 780, 4682, 2553, 780, 769, 787, 636, + 217, 779, 31, 5964, 780, 780, 780, 780, 4313, 780, + 346, 378, 780, 780, 780, 122, 763, 780, 780, 4840, + 780, 4326, 145, 780, 782, 4330, 782, 5867, 4333, 81, + 782, 4852, 780, 2591, 2592, 315, 780, 4501, 208, 5250, + 780, 782, 780, 782, 780, 780, 780, 779, 591, 686, + 386, 568, 295, 411, 780, 779, 31, 779, 4363, 773, + 31, 782, 270, 779, 427, 6222, 655, 4372, 779, 5305, + 779, 779, 208, 281, 131, 128, 4381, 787, 127, 127, + 782, 782, 4313, 504, 4378, 4373, 128, 787, 782, 4515, + 3444, 787, 782, 782, 201, 147, 4999, 782, 5001, 787, + 5003, 780, 4333, 613, 693, 208, 158, 5046, 258, 4414, + 677, 5050, 780, 782, 166, 4420, 53, 782, 707, 4424, + 478, 5046, 100, 47, 782, 5050, 670, 208, 5046, 6090, + 2688, 365, 2690, 2691, 2692, 782, 127, 576, 158, 158, + 750, 193, 4447, 507, 72, 315, 549, 75, 439, 123, + 5971, 203, 557, 660, 779, 268, 268, 657, 268, 495, + 679, 680, 681, 682, 268, 314, 409, 410, 268, 203, + 5046, 779, 127, 763, 5050, 763, 5387, 763, 5046, 315, + 763, 4486, 5050, 290, 734, 299, 544, 270, 546, 763, + 4495, 4573, 576, 763, 552, 5174, 168, 249, 126, 5178, + 5179, 129, 4628, 763, 763, 763, 763, 763, 416, 5112, + 4515, 4637, 315, 18, 19, 20, 5046, 145, 763, 787, + 5050, 763, 430, 763, 432, 277, 763, 119, 763, 763, + 6191, 123, 160, 763, 315, 127, 34, 6077, 763, 5046, + 333, 5180, 763, 5050, 6205, 752, 782, 299, 763, 2807, + 6211, 763, 763, 782, 612, 5180, 464, 6218, 4563, 763, + 152, 763, 5180, 386, 287, 787, 287, 787, 4573, 477, + 393, 755, 392, 4578, 6095, 506, 168, 154, 786, 780, + 153, 173, 4513, 153, 787, 408, 4580, 780, 780, 217, + 780, 780, 213, 769, 99, 780, 787, 225, 656, 769, + 787, 65, 510, 410, 5180, 5244, 780, 430, 780, 4603, + 4603, 5250, 5180, 779, 206, 558, 559, 779, 782, 5244, + 528, 338, 5261, 4628, 660, 287, 697, 287, 241, 584, + 492, 128, 4637, 416, 262, 128, 5261, 787, 787, 779, + 145, 779, 232, 30, 769, 4414, 780, 430, 763, 432, + 5180, 782, 779, 763, 782, 4424, 4661, 779, 5046, 5570, + 733, 203, 5050, 545, 333, 293, 126, 203, 5244, 203, + 50, 287, 158, 5180, 158, 712, 5244, 408, 782, 780, + 408, 464, 31, 31, 31, 5261, 240, 283, 53, 779, + 748, 779, 4818, 5261, 477, 787, 779, 245, 606, 127, + 292, 759, 770, 780, 584, 613, 72, 143, 770, 75, + 215, 470, 535, 782, 5244, 623, 752, 787, 779, 779, + 786, 95, 351, 352, 155, 548, 779, 510, 4854, 637, + 155, 5261, 780, 780, 780, 780, 30, 5244, 787, 779, + 782, 782, 565, 5250, 206, 528, 780, 780, 5387, 780, + 780, 153, 780, 4758, 5261, 780, 384, 780, 3016, 388, + 126, 669, 779, 129, 672, 780, 65, 272, 273, 274, + 779, 5450, 779, 716, 763, 3033, 128, 5935, 31, 145, + 688, 31, 232, 782, 6170, 782, 780, 292, 313, 4948, + 232, 88, 5180, 4798, 160, 779, 704, 779, 427, 734, + 554, 408, 4807, 4797, 4797, 203, 779, 779, 299, 299, + 779, 719, 378, 4818, 53, 782, 4821, 780, 4823, 31, + 782, 446, 208, 606, 287, 53, 131, 439, 251, 502, + 613, 224, 129, 4838, 391, 4876, 576, 779, 779, 127, + 623, 346, 127, 348, 30, 65, 256, 3105, 145, 4854, + 780, 168, 504, 780, 637, 314, 5244, 780, 643, 225, + 782, 206, 5250, 368, 65, 780, 780, 690, 347, 4874, + 4875, 782, 782, 5261, 169, 217, 780, 314, 4883, 780, + 5387, 386, 705, 4814, 780, 6043, 669, 447, 393, 672, + 780, 173, 779, 754, 763, 167, 262, 782, 741, 250, + 418, 418, 217, 408, 53, 688, 713, 203, 5034, 716, + 415, 641, 780, 676, 641, 299, 299, 30, 170, 4850, + 4851, 779, 30, 593, 4929, 430, 217, 293, 384, 4860, + 217, 5570, 65, 217, 217, 159, 719, 4942, 4943, 4944, + 705, 159, 217, 4874, 705, 4940, 217, 592, 217, 4954, + 217, 4956, 217, 603, 4885, 203, 203, 386, 4963, 4964, + 4955, 485, 128, 439, 4969, 262, 594, 584, 203, 154, + 4965, 4976, 310, 602, 314, 391, 4981, 4972, 310, 4974, + 4975, 576, 487, 99, 281, 577, 237, 57, 779, 498, + 619, 4996, 497, 780, 780, 613, 293, 549, 780, 5387, + 780, 155, 780, 782, 3262, 780, 780, 71, 5647, 782, + 4064, 362, 780, 5018, 780, 65, 645, 406, 384, 370, + 780, 50, 5647, 787, 780, 780, 5665, 654, 5069, 5034, + 535, 782, 782, 780, 385, 779, 779, 53, 779, 31, + 779, 338, 787, 548, 395, 396, 397, 780, 378, 117, + 65, 65, 65, 779, 405, 779, 6214, 686, 446, 4990, + 30, 331, 741, 5570, 5069, 141, 4120, 160, 5073, 4838, + 225, 5647, 390, 741, 702, 669, 314, 5794, 422, 5647, + 317, 424, 587, 281, 295, 787, 763, 127, 593, 30, + 782, 780, 549, 780, 780, 445, 685, 779, 782, 780, + 419, 583, 160, 779, 160, 236, 53, 105, 203, 127, + 3368, 5828, 779, 779, 65, 780, 413, 5647, 779, 782, + 65, 780, 5127, 779, 782, 65, 780, 127, 31, 287, + 411, 127, 160, 782, 5139, 5140, 314, 287, 780, 782, + 5647, 584, 5147, 30, 4198, 461, 651, 780, 780, 780, + 649, 5156, 601, 658, 5159, 5160, 601, 779, 5665, 5164, + 440, 787, 367, 5168, 779, 779, 72, 299, 779, 576, + 6, 5176, 120, 287, 120, 4944, 5181, 5303, 5848, 787, + 281, 787, 5570, 787, 787, 690, 787, 787, 92, 93, + 94, 95, 543, 780, 4963, 73, 787, 287, 287, 787, + 705, 706, 787, 787, 555, 787, 787, 787, 787, 787, + 281, 787, 685, 718, 584, 72, 72, 5934, 160, 5740, + 5741, 50, 5743, 5744, 5745, 5746, 787, 780, 594, 696, + 711, 30, 782, 782, 138, 139, 140, 5242, 779, 18, + 780, 576, 218, 65, 65, 144, 779, 779, 99, 5290, + 99, 5292, 5183, 217, 428, 584, 584, 296, 649, 5647, + 779, 418, 418, 779, 5269, 430, 5271, 780, 5199, 780, + 782, 180, 779, 779, 160, 779, 48, 5665, 702, 160, + 741, 201, 339, 99, 296, 189, 190, 53, 154, 640, + 779, 5296, 5297, 5298, 5299, 787, 5291, 6208, 5303, 5304, + 697, 5306, 780, 589, 655, 779, 5311, 5312, 80, 779, + 5315, 203, 787, 659, 779, 5320, 5321, 426, 198, 737, + 127, 779, 5327, 5328, 779, 5330, 422, 780, 207, 101, + 173, 779, 338, 5338, 780, 779, 702, 251, 110, 585, + 5861, 780, 693, 5864, 779, 5509, 787, 644, 218, 253, + 782, 5872, 782, 480, 5875, 332, 707, 203, 704, 131, + 5365, 658, 203, 108, 112, 662, 780, 780, 780, 203, + 65, 780, 5377, 145, 296, 101, 5381, 203, 150, 203, + 143, 649, 116, 432, 30, 779, 5989, 258, 3091, 2571, + 782, 3359, 5003, 4999, 5001, 3212, 5631, 142, 4030, 5255, + 5662, 173, 5812, 6032, 757, 1746, 5073, 1417, 4463, 5242, + 3957, 708, 316, 5046, 5377, 5504, 5394, 5590, 4679, 1734, + 3910, 2592, 3437, 3381, 2069, 820, 4198, 2182, 5433, 5500, + 2183, 5499, 2184, 5226, 179, 4562, 4051, 5442, 735, 5319, + 5123, 5446, 4322, 4326, 4758, 2420, 5855, 5420, 5453, 5454, + 5966, 6095, 6056, 5458, 5459, 5748, 5418, 1405, 4937, 2699, + 232, 4557, 5653, 4981, 236, 5168, 4563, 5293, 4832, 6080, + 5924, 5512, 818, 5934, 5828, 5817, 5817, 5817, 5817, 4261, + 4141, 3739, 254, 4214, 4189, 5937, 258, 259, 5848, 4626, + 3783, 5496, 5066, 4289, 4292, 4284, 6101, 5502, 88, 88, + 6074, 5638, 6075, 5880, 3204, 5499, 5511, 411, 5892, 5896, + 5539, 4651, 5517, 5289, 3944, 5287, 4562, 289, 4978, 1511, + 1426, 3779, 1929, 3192, 296, 297, 5706, 3187, 5846, 2727, + 5543, 2085, 3036, 2560, 2817, 3391, 4126, 5542, 134, 1392, + 2996, 763, 3134, 5548, 1339, 5550, 1379, 4600, 3266, 5590, + 5555, 4313, 3045, 2944, 1159, 2947, 1668, 3014, 3013, 5564, + 3820, 1724, 3729, 1590, 1569, 4701, 6033, 5816, 5694, 6208, + 5575, 5576, 6133, 6132, 478, 1337, 4902, 1983, 1600, 1337, + 1978, 353, 4366, 5820, 5274, 5590, 4807, 5821, 1575, 3847, + 1973, 1337, 3806, 2678, 4495, 3253, 5365, 4494, 3804, 1337, + 1337, 5118, 5725, 4784, 950, 5646, 5611, 1999, 5555, 5650, + 5114, 4702, 4666, 3269, 3262, 5135, 769, 5622, 2672, 4272, + 966, 393, 5627, 1400, 970, 4501, 106, 2773, 4682, 88, + 5635, 2148, 5637, 688, 1370, 4123, 2810, 4378, 4813, 1249, + 544, 3294, 546, 4365, 4363, 6090, 5651, 993, 552, 5433, + 834, 997, 3910, 5658, 835, 2097, 1002, 679, 1806, 2532, + 679, 2533, 3126, 1395, 436, 2586, 5496, 5793, 679, 441, + 5150, 1918, 1516, 4129, 6093, 4907, 6138, 5682, 5283, 6211, + 452, 453, 6218, 2552, 2807, 5454, 5139, 5692, 954, 5694, + 2863, 3103, 678, 2188, 3104, 5700, 5701, 5702, 2466, 678, + 3105, 6208, 3100, 5698, 3854, 2164, 1174, 3096, 612, 3095, + 676, 1746, 1504, 1140, 1504, 2721, 5721, 1949, 4040, 3041, + 4515, 1067, 1068, 1069, 1070, 4606, 3207, 1073, 4052, 717, + 112, 5361, 88, 88, 1080, 1282, 481, 88, 918, 3997, + 4886, 4120, 5868, 3438, 5785, 5665, -1, -1, 2185, 5263, + -1, -1, 656, -1, 5759, -1, -1, -1, -1, 5764, + -1, 5802, -1, -1, -1, 5770, 511, 512, -1, 514, + 515, 516, 517, 518, -1, 520, 521, 522, 523, 524, + 525, 526, 527, -1, 529, 530, 531, 532, 5793, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5809, -1, 5811, -1, -1, -1, + -1, 5816, -1, -1, -1, 5820, 5821, -1, -1, -1, + 6208, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1176, -1, -1, -1, -1, 607, -1, -1, -1, -1, + -1, 5846, -1, -1, 748, 617, -1, -1, -1, 5780, + 5855, -1, -1, -1, -1, 759, 628, -1, 5924, -1, + 5986, -1, 634, 5868, -1, -1, -1, 6031, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 625, 626, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 665, -1, 5900, 5937, 669, -1, -1, + -1, -1, -1, 5908, -1, 5910, 5911, -1, -1, -1, + -1, -1, -1, -1, -1, 1261, -1, -1, -1, 1265, + -1, -1, -1, 5692, -1, -1, 698, -1, 6054, -1, + 5924, 5862, 5863, 5702, 5939, -1, 5924, -1, -1, -1, + -1, -1, -1, 5874, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5964, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5986, -1, -1, -1, -1, -1, 6028, -1, -1, + -1, -1, 5046, -1, -1, -1, -1, -1, -1, 6004, + 6005, -1, -1, 6008, -1, -1, -1, -1, -1, -1, + 6015, -1, -1, -1, -1, -1, -1, -1, -1, 1365, + -1, -1, 1368, -1, 6029, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6079, 6080, + -1, -1, 5811, -1, 5975, -1, -1, 5978, -1, 6054, + -1, -1, -1, -1, -1, 6219, -1, -1, -1, -1, + -1, -1, -1, 6068, -1, -1, -1, -1, -1, 6195, + -1, -1, -1, -1, 6200, -1, 6117, -1, 6083, -1, + -1, -1, -1, -1, -1, 6090, -1, -1, -1, 1435, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5180, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1505, + -1, -1, -1, -1, -1, -1, -1, -1, 1514, -1, + 1516, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 6191, -1, -1, -1, + 6195, -1, -1, -1, -1, 6200, 5250, -1, -1, -1, + 6205, -1, -1, -1, -1, -1, 6211, -1, -1, -1, + -1, -1, -1, 6218, -1, -1, 1562, 1563, -1, -1, + -1, -1, 1568, -1, -1, -1, 1572, 1573, 1574, -1, + -1, -1, -1, -1, -1, -1, 1582, 1583, 1584, -1, + -1, -1, 1588, -1, -1, -1, 1592, 1593, 1594, -1, + 1596, 1597, 1598, 1599, 1600, -1, -1, -1, -1, -1, + 1606, -1, 1608, -1, -1, 1611, 1612, 1613, 1614, -1, + 1616, -1, 1618, 1619, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1632, 1633, 1634, 1635, + 1636, -1, 1638, 1639, 1640, 1641, 1642, 1643, -1, 1645, + 1646, -1, 1648, 1649, -1, 1651, 1652, -1, -1, 1655, + 1656, -1, 1658, 1659, -1, 1661, -1, 1663, -1, -1, + -1, 1667, 1668, 1669, -1, -1, 1672, 1673, 1674, 1675, + -1, 1677, -1, 5387, -1, -1, -1, -1, 1684, -1, + -1, -1, -1, -1, 1690, 1691, 1692, 1693, -1, -1, + -1, -1, -1, -1, -1, 1701, 1702, -1, 1704, 1705, + -1, -1, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, + 1716, 1717, 1718, 1719, 1720, -1, -1, 1723, -1, -1, + -1, -1, 1728, -1, -1, -1, -1, -1, -1, 1735, + -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, + 20, -1, 1758, -1, -1, -1, 6, 7, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, + 1776, -1, -1, -1, -1, -1, 46, -1, 48, 49, + -1, -1, -1, -1, 4702, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 70, -1, 72, 53, -1, -1, -1, -1, 78, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, + 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4772, -1, 5570, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1874, 119, + 1876, -1, -1, 123, -1, 145, -1, 127, 18, 19, + 20, -1, -1, -1, -1, -1, 136, 137, -1, -1, + -1, -1, -1, 143, 1900, -1, -1, 147, -1, -1, + -1, -1, 152, 173, 154, 1911, -1, -1, 158, -1, + -1, -1, -1, -1, -1, -1, 166, -1, 168, -1, + -1, -1, -1, 173, -1, -1, -1, -1, -1, -1, + -1, 71, -1, 73, 204, -1, 206, -1, -1, -1, + -1, -1, -1, 193, -1, 215, -1, 217, -1, -1, + -1, 5665, -1, 203, -1, -1, 206, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 240, -1, -1, -1, -1, -1, 226, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1996, -1, -1, -1, -1, 245, 2002, -1, 2004, 249, + -1, -1, 272, 273, 274, 145, -1, -1, 258, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2024, -1, + -1, -1, 292, -1, -1, -1, -1, 277, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 292, -1, -1, -1, -1, -1, 298, 299, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 312, -1, 314, -1, -1, -1, 338, -1, + -1, -1, -1, -1, -1, 215, 346, -1, 348, -1, + -1, -1, 11, -1, 13, -1, -1, -1, -1, 18, + 19, 20, -1, -1, -1, -1, -1, -1, 368, -1, + -1, -1, -1, -1, -1, 375, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 386, -1, -1, -1, + -1, -1, -1, 393, -1, -1, -1, -1, -1, -1, + -1, -1, 272, 273, 274, -1, -1, -1, 408, -1, + -1, -1, 71, 2149, 73, 415, -1, -1, -1, 419, + 420, -1, 292, -1, -1, -1, 426, -1, -1, -1, + 430, -1, -1, -1, -1, -1, -1, -1, 438, -1, + 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2191, 2192, -1, -1, 459, + -1, -1, -1, -1, 2200, 2201, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 346, -1, 348, 459, + -1, -1, -1, 483, -1, -1, 145, 487, -1, -1, + -1, -1, -1, -1, -1, -1, 366, 497, 368, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 167, -1, + -1, -1, -1, -1, -1, -1, 386, -1, 2254, -1, + -1, -1, -1, 393, -1, -1, -1, -1, -1, 2265, + 2266, -1, -1, -1, -1, 535, -1, -1, 408, -1, + -1, -1, -1, -1, -1, 415, -1, -1, 548, -1, + 550, -1, -1, -1, -1, -1, 215, -1, -1, -1, + 430, -1, 2298, 2299, 2300, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 587, -1, -1, + -1, -1, -1, 593, -1, -1, -1, 577, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6, 7, -1, + -1, 2347, -1, 272, 273, 274, -1, 487, 618, 18, + -1, 2357, -1, -1, 2360, -1, -1, 497, -1, 629, + 630, 631, -1, 292, -1, -1, -1, -1, -1, 2375, + -1, -1, -1, 2379, 2380, -1, 2382, 2383, -1, -1, + -1, 651, -1, -1, 53, 2391, -1, 2393, 658, -1, + -1, -1, -1, -1, -1, 535, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 548, -1, + -1, -1, 81, -1, -1, -1, -1, 346, 2424, 348, + 690, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 705, 706, 366, -1, 368, + -1, -1, -1, -1, 2450, -1, -1, 587, 718, -1, + 119, -1, 722, 593, 123, -1, 2462, 386, 127, -1, + 2466, -1, -1, -1, 393, -1, -1, 136, 137, 2475, + -1, -1, -1, -1, -1, -1, -1, -1, 147, 408, + 2486, -1, -1, 152, -1, 154, 415, -1, -1, 158, + -1, -1, -1, -1, 6208, -1, 2502, 166, -1, 168, + 750, 430, -1, -1, 173, -1, -1, -1, -1, -1, + 5428, 651, -1, 763, -1, -1, 786, -1, 658, -1, + -1, -1, -1, -1, 193, -1, -1, -1, -1, -1, + 780, -1, 782, 2539, 203, 785, 786, 206, -1, -1, + 2546, -1, -1, -1, -1, -1, -1, 2553, -1, -1, + 690, -1, -1, -1, -1, -1, -1, 226, 487, -1, + -1, -1, -1, -1, -1, 705, 706, -1, 497, -1, + -1, -1, -1, -1, -1, -1, 245, -1, 718, -1, + 249, -1, -1, -1, -1, 2591, 2592, -1, -1, 258, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 535, -1, 277, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 548, + -1, -1, -1, 292, -1, -1, -1, -1, -1, -1, + 299, -1, -1, -1, -1, -1, 2642, -1, -1, -1, + -1, -1, 782, 312, -1, 314, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 587, -1, + -1, -1, -1, -1, 593, -1, -1, -1, -1, 2675, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2688, -1, 2690, 2691, 2692, -1, 2694, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 651, -1, -1, -1, -1, 2733, -1, 658, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 690, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 705, 706, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 718, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2807, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2864, -1, + -1, -1, 2868, -1, -1, 2871, -1, -1, -1, -1, + -1, -1, -1, -1, 2880, -1, -1, -1, -1, -1, + -1, -1, -1, 2889, -1, 2891, 2892, -1, 2894, 2895, + 2896, 2897, -1, 2899, -1, 2901, 2902, -1, 2904, -1, + -1, -1, -1, -1, -1, -1, 2912, 2913, 577, -1, + -1, 2917, 2918, 2919, -1, -1, -1, -1, -1, -1, + -1, 2927, 2928, 2929, -1, 2931, -1, 2933, -1, 2935, + -1, 2937, -1, 2939, -1, -1, -1, -1, 2944, 2945, + -1, 2947, 2948, 2949, -1, -1, -1, 2953, -1, -1, + 2956, -1, -1, -1, -1, -1, -1, -1, -1, 2965, + -1, -1, 2968, -1, 2970, 2971, 2972, -1, -1, 2975, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2997, 5, 2999, 7, -1, 3002, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3012, 3013, 3014, 3015, + 3016, 3017, -1, -1, -1, -1, 3022, -1, -1, -1, + -1, -1, -1, -1, -1, 659, -1, 3033, -1, -1, + -1, -1, -1, -1, -1, 48, 49, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, -1, 68, -1, 70, -1, 72, + -1, -1, -1, -1, 3070, -1, -1, 80, -1, -1, + 704, -1, -1, -1, -1, -1, 3082, -1, -1, -1, + -1, 750, -1, 3089, -1, -1, -1, -1, 101, -1, + 103, 104, 19, 20, 763, -1, -1, 110, -1, 3105, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 780, -1, 782, 127, -1, 785, 786, 131, -1, + 47, -1, 49, -1, -1, -1, -1, -1, 141, -1, + 57, -1, 3138, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, 71, -1, -1, -1, 161, -1, + -1, -1, 79, 80, 3160, -1, -1, -1, 171, -1, + 173, -1, 89, -1, 177, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 103, 104, -1, -1, + -1, -1, -1, -1, 818, -1, -1, -1, -1, -1, + -1, 204, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 216, 217, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 227, 228, -1, -1, 145, -1, + -1, -1, -1, 3229, -1, -1, 239, 240, 241, -1, + 243, -1, 159, -1, -1, 248, -1, -1, -1, -1, + -1, 254, -1, -1, 3250, 258, 259, 260, -1, -1, + -1, -1, -1, -1, -1, -1, 3262, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 294, -1, 296, -1, 298, -1, 214, -1, -1, + -1, -1, 305, -1, -1, -1, -1, -1, -1, 226, + 313, 314, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 328, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 966, -1, -1, -1, 970, 350, 351, -1, + 353, -1, -1, -1, -1, -1, -1, 360, -1, -1, + -1, -1, -1, -1, 281, 368, -1, -1, -1, 993, + -1, -1, 3368, -1, -1, -1, -1, -1, 1002, -1, + -1, -1, -1, -1, 3380, 388, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 324, -1, 412, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 422, + -1, -1, -1, -1, -1, -1, -1, 344, -1, -1, + -1, -1, -1, -1, -1, -1, 353, -1, 441, 3435, + -1, -1, -1, 1067, 1068, 1069, 1070, -1, -1, 366, + -1, 3447, -1, 456, 3450, -1, 1080, -1, -1, -1, + 377, -1, -1, -1, 467, -1, -1, 470, -1, -1, + 473, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 400, -1, 488, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 429, 430, -1, -1, 433, -1, 435, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 462, 463, -1, -1, -1, + -1, 468, 469, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 485, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 506, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 602, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 528, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 631, -1, + -1, -1, 635, -1, -1, -1, -1, 1261, -1, -1, + -1, -1, 645, -1, -1, -1, -1, -1, -1, -1, + 653, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 665, -1, -1, 582, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 597, -1, -1, 686, -1, -1, 689, -1, -1, 606, + -1, -1, 609, 610, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 624, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 722, + -1, -1, -1, -1, -1, -1, -1, -1, 731, 3725, + 3726, -1, -1, -1, 3730, -1, -1, -1, -1, -1, + -1, -1, -1, 3739, 661, -1, -1, -1, -1, -1, + -1, -1, 669, -1, 757, -1, 3752, -1, 3754, -1, + 3756, -1, 3758, -1, -1, -1, -1, -1, -1, -1, + -1, 688, -1, 690, -1, -1, 779, 3773, -1, -1, + -1, -1, -1, 3779, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3792, 3793, -1, -1, + -1, 3797, -1, 3799, -1, 3801, -1, -1, -1, -1, + 3806, 1435, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 740, -1, -1, -1, -1, -1, -1, + 747, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3847, -1, -1, -1, -1, -1, 3853, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3867, -1, -1, -1, 3871, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1514, -1, 1516, 3889, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3910, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1562, 1563, + -1, -1, -1, -1, 1568, -1, -1, -1, 1572, 1573, + 1574, -1, -1, -1, -1, -1, -1, -1, 1582, 1583, + -1, -1, -1, -1, 1588, -1, -1, -1, 1592, 1593, + 1594, -1, 1596, 1597, 1598, 3971, -1, -1, -1, -1, + -1, -1, 1606, -1, 1608, 3981, -1, 1611, 1612, 1613, + 1614, -1, 1616, -1, 1618, 1619, -1, -1, -1, 3995, + -1, 3997, 3998, -1, -1, -1, -1, -1, 1632, 1633, + 1634, 1635, 1636, -1, 1638, 1639, 1640, 1641, 1642, 1643, + -1, 1645, 1646, -1, 1648, 1649, -1, 1651, 1652, -1, + -1, 1655, 1656, -1, 1658, 1659, -1, 1661, -1, 1663, + -1, -1, -1, 1667, 1668, 1669, -1, -1, 1672, 1673, + 1674, 1675, -1, 1677, -1, -1, -1, -1, -1, -1, + 1684, -1, -1, -1, -1, -1, 1690, 1691, 1692, 1693, + -1, -1, -1, -1, -1, -1, -1, 1701, 1702, -1, + 1704, 1705, -1, -1, 1708, 1709, 1710, 1711, 1712, 1713, + 1714, 1715, 1716, 1717, 1718, 1719, 1720, -1, -1, 1723, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1758, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4236, 4237, 5, 4239, -1, -1, -1, -1, -1, -1, + 1874, -1, 1876, -1, -1, -1, 4252, 4253, 4254, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4276, 4277, -1, -1, -1, 48, 49, 1911, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, 4300, 68, -1, 70, -1, 72, + -1, -1, -1, -1, -1, -1, 4312, 80, -1, -1, + -1, -1, -1, -1, -1, 4321, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, + 103, 104, -1, -1, -1, 4341, -1, 110, -1, -1, + 4346, 4347, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 127, -1, -1, -1, 131, 4365, + -1, -1, 1996, 4369, -1, -1, -1, -1, 141, -1, + -1, -1, -1, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 161, -1, + 2024, -1, -1, -1, -1, -1, -1, -1, 171, -1, + 173, -1, -1, -1, 177, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 204, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 216, 217, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 227, 228, -1, -1, -1, -1, + -1, -1, -1, 18, 19, 20, 239, 240, 241, -1, + 243, -1, -1, -1, -1, 248, -1, -1, -1, -1, + -1, 254, -1, -1, -1, 258, 259, 260, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2149, 71, -1, 73, -1, + -1, 294, -1, 296, -1, 298, -1, -1, -1, -1, + -1, -1, 305, -1, -1, -1, -1, -1, -1, -1, + 313, 314, -1, -1, 99, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 328, -1, -1, 2192, -1, + -1, -1, -1, -1, 4570, 4571, 2200, 2201, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 350, 351, -1, + 353, -1, -1, -1, -1, -1, -1, 360, -1, -1, + 145, -1, -1, -1, -1, 368, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 659, -1, -1, -1, -1, 388, -1, -1, -1, -1, + 2254, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 412, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 422, + -1, -1, -1, -1, -1, 704, -1, -1, -1, -1, + 215, -1, -1, -1, 2298, 2299, 2300, -1, 441, 56, + 57, -1, -1, -1, 61, 62, -1, -1, -1, -1, + -1, -1, -1, 456, 71, -1, -1, -1, -1, -1, + -1, -1, -1, 4699, 467, -1, 4702, 470, -1, -1, + 473, -1, -1, -1, -1, -1, -1, -1, -1, 96, + -1, -1, -1, -1, -1, 488, -1, 272, 273, 274, + -1, -1, 109, 2357, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 292, 125, -1, + 127, 2375, -1, -1, -1, 2379, 2380, 4753, 2382, 2383, + -1, -1, -1, -1, -1, -1, -1, 2391, -1, 2393, + -1, -1, -1, -1, -1, -1, 4772, -1, 155, 818, + -1, -1, -1, -1, 4780, 4781, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 174, 175, 176, + 2424, 346, -1, 348, -1, -1, -1, 184, 185, 186, + -1, -1, -1, -1, -1, -1, -1, 4813, -1, -1, + -1, 366, -1, 368, -1, 202, 2450, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2462, 602, + -1, 386, -1, -1, -1, -1, -1, -1, 393, -1, + -1, 2475, -1, -1, -1, -1, -1, 234, -1, -1, + -1, -1, 2486, 408, -1, -1, -1, -1, 631, -1, + 415, -1, 635, -1, -1, -1, -1, -1, 2502, -1, + -1, -1, 645, -1, 261, 430, -1, -1, -1, -1, + 653, -1, -1, -1, -1, -1, 4892, -1, 4894, -1, + -1, -1, 665, -1, -1, -1, -1, 284, 285, 286, + -1, -1, -1, -1, -1, 2539, -1, -1, -1, -1, + -1, -1, 2546, 686, -1, -1, 689, 966, -1, 306, + 307, 970, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 487, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 497, -1, 993, -1, -1, -1, -1, 722, + -1, -1, -1, 1002, -1, -1, -1, -1, 731, -1, + -1, -1, -1, -1, -1, -1, -1, 354, -1, 356, + 357, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 535, -1, -1, -1, 757, -1, 373, -1, -1, -1, + -1, -1, -1, 548, -1, -1, -1, -1, -1, 5005, + -1, -1, -1, -1, -1, -1, 779, -1, 2642, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1067, 1068, + 1069, 1070, 409, 410, -1, -1, -1, -1, -1, -1, + -1, 1080, 587, -1, -1, -1, -1, -1, 593, -1, + -1, 2675, -1, -1, -1, 5051, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2694, -1, -1, -1, -1, -1, -1, -1, 455, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5091, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 651, -1, -1, 2733, + -1, -1, -1, 658, -1, -1, -1, -1, 5114, 496, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5130, 5131, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 690, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 705, 706, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 718, -1, -1, -1, -1, -1, -1, + -1, 558, 559, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 574, 575, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1261, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 616, + 2864, -1, -1, -1, 2868, -1, -1, 2871, -1, -1, + -1, -1, -1, -1, -1, -1, 2880, -1, -1, -1, + -1, -1, -1, -1, -1, 2889, -1, 2891, 2892, -1, + 2894, 2895, 2896, 2897, -1, 2899, -1, 2901, 2902, -1, + 2904, -1, -1, -1, -1, -1, -1, -1, 2912, 2913, + -1, -1, -1, 2917, 2918, 2919, -1, -1, -1, -1, + -1, -1, -1, 2927, 2928, 2929, -1, 2931, -1, 2933, + -1, 2935, -1, 2937, -1, 2939, -1, -1, -1, -1, + 2944, 2945, -1, 2947, 2948, 2949, -1, -1, -1, 2953, + -1, -1, 2956, 710, -1, -1, 713, -1, -1, 716, + -1, 2965, -1, -1, 2968, -1, 2970, 2971, 2972, -1, + -1, 2975, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 739, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2997, -1, 2999, -1, -1, 3002, -1, + -1, -1, 759, -1, -1, -1, -1, -1, 3012, 3013, + 3014, 3015, -1, 3017, -1, -1, 1435, -1, 3022, -1, + 5396, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5420, -1, -1, -1, -1, -1, + -1, -1, 5428, -1, -1, -1, -1, -1, 5434, -1, + -1, -1, -1, -1, -1, -1, 3070, -1, -1, -1, + -1, -1, -1, 5449, -1, -1, -1, -1, 3082, -1, + -1, -1, -1, -1, -1, 3089, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1514, -1, 1516, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3138, -1, -1, -1, -1, -1, + -1, -1, -1, 1562, 1563, -1, -1, -1, -1, 1568, + -1, -1, -1, 1572, 1573, 1574, 3160, -1, -1, -1, + -1, -1, -1, 1582, 1583, -1, -1, -1, -1, 1588, + -1, -1, -1, 1592, 1593, 1594, -1, 1596, 1597, 1598, + -1, -1, -1, -1, -1, -1, -1, 1606, -1, 1608, + -1, -1, 1611, 1612, 1613, 1614, -1, 1616, -1, 1618, + 1619, 5577, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1632, 1633, 1634, 1635, 1636, -1, 1638, + 1639, 1640, 1641, 1642, 1643, 3229, 1645, 1646, -1, 1648, + 1649, -1, 1651, 1652, -1, -1, 1655, 1656, -1, 1658, + 1659, -1, 1661, -1, 1663, -1, 3250, -1, 1667, 1668, + 1669, -1, -1, 1672, 1673, 1674, 1675, -1, 1677, -1, + -1, -1, -1, -1, -1, 1684, -1, -1, -1, -1, + -1, 1690, 1691, 1692, 1693, -1, -1, -1, -1, -1, + -1, -1, 1701, 1702, -1, 1704, 1705, -1, -1, 1708, + 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, + 1719, 1720, -1, -1, 1723, -1, -1, -1, 18, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 657, -1, -1, -1, -1, -1, + -1, 5707, -1, -1, -1, -1, 46, -1, 48, 1758, + 673, -1, -1, -1, -1, -1, 679, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 70, -1, -1, -1, -1, -1, -1, -1, 78, -1, + -1, -1, -1, -1, -1, -1, 3380, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5794, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3435, -1, -1, -1, 145, -1, -1, -1, -1, + -1, -1, -1, 3447, -1, -1, 3450, -1, -1, -1, + -1, -1, 5828, -1, -1, 1874, -1, 1876, -1, -1, + -1, -1, -1, 173, 5840, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1911, -1, -1, -1, 206, -1, -1, -1, + -1, -1, -1, -1, -1, 215, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 240, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5924, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 272, 273, 274, -1, -1, -1, -1, 902, + -1, 904, -1, 906, 907, -1, -1, 1996, -1, -1, + 913, -1, 292, 916, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5971, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2024, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 338, -1, + -1, -1, -1, -1, -1, -1, 346, -1, 348, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 368, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 386, -1, -1, -1, + -1, -1, -1, 393, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 408, -1, + -1, -1, -1, -1, -1, 415, -1, -1, -1, 419, + -1, -1, -1, -1, -1, 6091, 426, -1, -1, 6095, + 430, 3725, 3726, -1, -1, -1, 3730, -1, -1, -1, + 2149, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3752, 459, + 3754, -1, 3756, -1, 3758, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3773, + -1, -1, -1, 2192, -1, -1, -1, 487, -1, -1, + -1, 2200, 2201, -1, -1, -1, -1, 497, 3792, 3793, + -1, -1, -1, 3797, -1, 3799, -1, 3801, -1, -1, + -1, -1, 3806, -1, 1137, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 535, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2254, -1, -1, 548, -1, + 550, -1, -1, -1, -1, -1, 6222, -1, -1, 3853, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3867, -1, -1, -1, 3871, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 587, -1, 2298, + 2299, 2300, -1, 593, -1, 3889, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1264, -1, -1, -1, -1, -1, -1, 2357, -1, + -1, 651, -1, -1, -1, -1, -1, -1, 658, -1, + -1, -1, -1, -1, -1, -1, 2375, -1, -1, -1, + 2379, 2380, -1, 2382, 2383, -1, -1, 3971, -1, -1, + -1, -1, 2391, -1, 2393, -1, -1, 3981, -1, -1, + 690, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3995, -1, -1, 3998, 705, 706, -1, -1, -1, + -1, -1, -1, -1, -1, 2424, -1, -1, 718, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2450, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2462, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2475, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2486, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2502, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1440, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2539, -1, -1, -1, -1, -1, -1, 2546, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2642, -1, -1, -1, -1, -1, -1, + -1, -1, 4236, 4237, -1, 4239, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 659, 4252, 4253, + 4254, -1, -1, -1, -1, -1, 2675, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4276, 4277, -1, 2694, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4300, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4312, -1, + -1, -1, -1, -1, 2733, -1, -1, 4321, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4341, -1, -1, + -1, -1, 4346, 4347, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4365, -1, -1, -1, 4369, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 818, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2864, -1, -1, -1, 2868, + -1, -1, 2871, -1, -1, -1, -1, -1, -1, -1, + -1, 2880, -1, -1, -1, -1, -1, -1, -1, -1, + 2889, -1, 2891, 2892, -1, 2894, 2895, 2896, 2897, -1, + 2899, -1, 2901, 2902, -1, 2904, -1, -1, -1, -1, + -1, -1, -1, 2912, 2913, -1, -1, -1, 2917, 2918, + 2919, -1, -1, -1, -1, -1, -1, -1, 2927, 2928, + 2929, -1, 2931, -1, 2933, -1, 2935, -1, 2937, -1, + 2939, -1, -1, -1, -1, 2944, 2945, -1, 2947, 2948, + 2949, -1, -1, -1, 2953, -1, -1, 2956, -1, -1, + -1, -1, -1, -1, -1, -1, 2965, -1, -1, 2968, + -1, 2970, 2971, 2972, -1, -1, 2975, -1, 970, -1, + -1, -1, -1, -1, -1, -1, 4570, 4571, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2997, -1, + 2999, 993, -1, 3002, -1, -1, -1, -1, -1, -1, + 1002, -1, -1, 3012, 3013, 3014, 3015, -1, 3017, -1, + -1, -1, -1, 3022, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3070, -1, -1, -1, -1, -1, -1, 1070, -1, + -1, -1, -1, 3082, -1, -1, -1, -1, -1, 5, + 3089, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4699, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 48, 49, -1, -1, -1, -1, -1, 3138, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 66, -1, -1, -1, 70, -1, 72, -1, 2071, -1, + -1, 3160, -1, -1, 80, -1, -1, -1, -1, 4753, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 101, -1, 103, 104, -1, + -1, -1, -1, -1, 110, -1, 4780, 4781, 2111, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 131, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 4813, + 3229, -1, -1, 2146, 150, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 161, 2159, -1, -1, -1, + -1, 3250, -1, -1, -1, 171, -1, 173, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1261, + 2183, 2184, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 204, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 216, 217, -1, -1, -1, -1, -1, -1, 4892, -1, + 4894, 227, 228, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, -1, -1, -1, -1, -1, 254, -1, + -1, -1, 258, 259, 260, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 294, -1, + 296, 3380, 298, -1, -1, -1, -1, -1, -1, 305, + -1, -1, -1, -1, -1, -1, -1, -1, 314, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 328, -1, -1, -1, -1, -1, -1, -1, + -1, 5005, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 350, -1, 3435, 353, -1, -1, + -1, -1, -1, 1435, 360, -1, -1, -1, 3447, -1, + -1, 3450, 368, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5051, -1, -1, + -1, -1, 388, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 412, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 422, 5091, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1514, -1, 1516, 441, -1, -1, -1, -1, + 5114, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 456, 2454, -1, -1, -1, -1, 5130, 5131, -1, -1, + -1, 467, -1, -1, 470, -1, -1, 473, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 488, -1, -1, -1, 1568, -1, -1, -1, + 1572, -1, 1574, -1, -1, -1, -1, -1, -1, -1, + 1582, 1583, -1, -1, -1, -1, 1588, -1, -1, -1, + 1592, 1593, 1594, -1, 1596, 1597, 1598, -1, -1, -1, + -1, -1, -1, -1, 1606, -1, 1608, -1, -1, 1611, + 1612, 1613, 1614, -1, -1, -1, 1618, 1619, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2551, -1, + 1632, 1633, 1634, 1635, 1636, -1, 1638, 1639, 1640, 1641, + 1642, -1, -1, 1645, 1646, -1, 1648, 1649, -1, 1651, + 1652, -1, -1, -1, 1656, -1, 1658, 1659, -1, 1661, + -1, 1663, -1, 2586, -1, 1667, 1668, 1669, -1, -1, + 1672, -1, 1674, 1675, -1, 1677, 602, -1, -1, -1, + -1, -1, 1684, -1, -1, -1, -1, -1, 1690, 1691, + 1692, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 631, -1, -1, -1, 635, + -1, -1, -1, -1, -1, -1, 3725, 3726, -1, 645, + -1, 3730, -1, -1, -1, -1, -1, 653, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 665, + -1, -1, -1, 3752, -1, 3754, -1, 3756, -1, 3758, + -1, -1, -1, -1, -1, -1, 1758, -1, -1, -1, + 686, -1, -1, 689, 3773, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3792, 3793, -1, -1, -1, 3797, -1, + 3799, -1, 3801, -1, -1, -1, 722, 3806, -1, -1, + -1, -1, 5396, -1, -1, 731, -1, -1, -1, -1, + -1, 2734, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5420, -1, -1, -1, + -1, 757, -1, -1, -1, -1, -1, -1, -1, -1, + 5434, -1, -1, -1, 3853, -1, -1, -1, -1, -1, + -1, -1, -1, 779, -1, 5449, -1, -1, 3867, -1, + -1, -1, 3871, -1, -1, -1, -1, -1, -1, -1, + 2793, -1, 1874, -1, 1876, -1, -1, -1, -1, -1, + 3889, -1, -1, -1, -1, 2808, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1911, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2848, 2849, -1, -1, -1, + -1, -1, -1, -1, -1, 2858, 2859, 2860, -1, -1, + 2863, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2875, -1, -1, -1, 2879, -1, -1, -1, + -1, -1, 3971, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3981, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5577, -1, -1, 3995, -1, -1, 3998, + -1, -1, -1, -1, 1996, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2024, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5707, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2149, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2192, -1, -1, -1, -1, -1, -1, -1, 2200, 2201, + 5794, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3139, -1, -1, -1, + -1, -1, -1, 3146, -1, -1, -1, 4236, 4237, -1, + 4239, -1, -1, -1, 5828, -1, -1, -1, -1, -1, + -1, -1, -1, 4252, 4253, 4254, 5840, -1, -1, -1, + -1, -1, 2254, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4276, 4277, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4300, -1, -1, -1, -1, 2298, 2299, 2300, -1, + -1, -1, -1, 4312, -1, -1, -1, -1, -1, -1, + -1, -1, 4321, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5924, -1, 4341, -1, -1, -1, -1, 4346, 4347, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4365, -1, -1, -1, + 4369, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2375, -1, -1, -1, 5971, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2391, + -1, 2393, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2424, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2450, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2462, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2475, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2486, -1, -1, -1, -1, 3412, + -1, -1, -1, -1, -1, -1, -1, 6091, -1, -1, + 2502, 6095, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3444, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2539, -1, -1, + -1, -1, -1, -1, 2546, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4570, 4571, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6222, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2642, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2675, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4699, -1, 2694, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2733, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4753, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4780, 4781, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4813, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2864, -1, -1, -1, 2868, -1, -1, 2871, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4892, -1, 4894, -1, 2889, -1, -1, + -1, -1, 2894, 2895, 2896, 2897, -1, 2899, -1, 2901, + 2902, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2912, 2913, -1, -1, -1, 2917, 2918, 2919, -1, -1, + -1, -1, -1, -1, -1, 2927, 2928, 2929, -1, 2931, + -1, 2933, -1, 2935, -1, 2937, -1, 2939, -1, -1, + -1, -1, 2944, 2945, -1, 2947, -1, 2949, -1, -1, + -1, 2953, -1, -1, 2956, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2968, -1, 2970, 2971, + 2972, -1, -1, 2975, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5005, -1, -1, -1, + 3002, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3013, 3014, -1, -1, 3017, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3948, 3949, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5051, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3070, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5091, -1, -1, -1, -1, 3089, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5114, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5130, 5131, -1, -1, -1, -1, -1, 4051, -1, + -1, -1, -1, -1, -1, -1, 3138, -1, -1, -1, + -1, 4064, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3160, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4120, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4198, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4264, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3380, -1, + -1, -1, -1, -1, -1, -1, -1, 5396, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5420, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5434, -1, -1, -1, -1, + -1, -1, -1, 3435, -1, -1, -1, -1, -1, -1, + 5449, -1, -1, -1, -1, 3447, -1, -1, 3450, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4454, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5577, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4557, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5707, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3725, 3726, -1, -1, -1, 3730, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4666, -1, -1, -1, -1, -1, -1, + 3752, -1, 3754, -1, 3756, -1, 3758, -1, -1, 4682, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3773, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5794, -1, -1, -1, -1, + 3792, 3793, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3806, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5828, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5840, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3853, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3867, -1, -1, -1, 3871, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3889, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5924, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4871, -1, + 4873, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5971, -1, -1, -1, -1, -1, -1, 3971, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3981, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3995, -1, -1, 3998, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4978, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6091, -1, -1, -1, 6095, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5046, -1, -1, -1, 5050, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6222, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4236, 4237, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4252, 4253, 4254, -1, -1, -1, -1, 5180, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4276, 4277, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 4321, + -1, 5244, -1, -1, -1, -1, -1, 5250, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5261, 4341, + -1, -1, -1, -1, 4346, 4347, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4365, -1, -1, -1, 4369, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5387, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4570, 4571, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5570, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5619, 4699, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5646, 5647, -1, -1, 5650, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5665, -1, -1, -1, -1, -1, -1, -1, + -1, 4753, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4780, 4781, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4813, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5748, -1, -1, -1, -1, + -1, -1, -1, 5756, -1, -1, -1, -1, -1, 5762, + 5763, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5785, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5802, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4892, -1, 4894, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5880, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5892, + -1, -1, -1, 5896, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5937, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5051, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5996, 5997, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5091, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 6028, -1, -1, -1, -1, + -1, -1, 5114, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5130, 5131, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6072, + -1, 6074, 6075, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6111, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6145, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 6174, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 6208, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5396, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5434, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5449, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5707, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, + -1, -1, -1, -1, 8, 9, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 19, 20, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 57, 58, 59, 60, -1, 5840, -1, + -1, -1, -1, -1, 68, 69, -1, 71, -1, -1, + -1, -1, -1, -1, 78, 79, -1, -1, 82, 83, + 84, 85, -1, 87, 88, -1, 90, 91, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, 120, 121, 122, -1, + 124, -1, -1, -1, -1, -1, -1, -1, 132, 133, + 134, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, 5924, -1, -1, -1, 150, -1, -1, 153, + -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 180, 181, -1, 183, + -1, -1, -1, 187, 188, -1, -1, -1, 192, -1, + -1, 195, 196, -1, 198, 199, 200, 201, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, 219, 220, 221, -1, 223, + -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, -1, -1, -1, 249, 250, -1, -1, -1, + 254, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, 275, 276, -1, 278, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 300, 301, 302, -1, + -1, 305, -1, -1, 308, 309, -1, -1, -1, 6091, + 314, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + 6222, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, -1, 3, -1, + 774, -1, -1, 8, 9, 779, -1, -1, -1, 783, + 784, -1, -1, 787, 19, 20, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 57, 58, 59, 60, -1, -1, -1, 64, + -1, -1, -1, 68, 69, -1, 71, -1, -1, -1, + -1, -1, -1, 78, 79, -1, -1, 82, 83, 84, + 85, -1, 87, 88, -1, 90, 91, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, 120, 121, 122, -1, 124, + -1, -1, -1, -1, -1, -1, -1, 132, 133, 134, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, 150, -1, -1, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 162, 163, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, 181, -1, 183, -1, + -1, -1, 187, 188, -1, -1, -1, 192, -1, -1, + 195, 196, -1, 198, 199, 200, 201, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, 219, 220, 221, -1, 223, -1, + -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, -1, -1, -1, 249, 250, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, + 275, 276, -1, 278, 279, -1, -1, -1, -1, -1, + -1, -1, -1, 288, -1, 290, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 300, 301, 302, -1, -1, + -1, -1, -1, 308, 309, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, 768, 769, -1, -1, 3, -1, 774, + -1, -1, 8, 9, 779, -1, -1, -1, 783, 784, + -1, -1, 787, 19, 20, -1, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 57, 58, 59, 60, -1, -1, -1, -1, -1, + -1, -1, 68, 69, -1, 71, -1, -1, -1, -1, + -1, -1, 78, 79, -1, -1, 82, 83, 84, 85, + -1, 87, 88, -1, 90, 91, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, 102, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, 120, 121, 122, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 132, 133, 134, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, 150, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, -1, 162, -1, 164, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 180, 181, -1, 183, -1, -1, + -1, 187, 188, -1, -1, -1, 192, -1, -1, 195, + 196, -1, 198, 199, 200, 201, -1, 203, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, 219, 220, 221, -1, 223, -1, -1, + -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, -1, 249, 250, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, -1, 275, + 276, -1, 278, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 300, 301, 302, -1, -1, -1, + -1, -1, 308, 309, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, 768, 769, -1, -1, 3, -1, 774, -1, + -1, 8, 9, 779, -1, -1, -1, 783, 784, -1, + -1, 787, 19, 20, -1, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, 58, 59, 60, -1, -1, -1, -1, -1, -1, + -1, 68, 69, -1, 71, -1, -1, -1, -1, -1, + -1, 78, 79, -1, -1, 82, 83, 84, 85, -1, + 87, 88, -1, 90, 91, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, 102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, 120, 121, 122, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + -1, -1, -1, 150, -1, -1, 153, -1, -1, -1, + -1, -1, -1, -1, -1, 162, -1, 164, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 180, 181, -1, 183, -1, -1, -1, + 187, 188, -1, -1, -1, 192, -1, -1, 195, 196, + -1, 198, 199, 200, 201, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, 219, 220, 221, -1, 223, -1, -1, -1, + -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, -1, + -1, -1, 249, 250, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 268, -1, -1, -1, -1, -1, -1, 275, 276, + -1, 278, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 300, 301, 302, -1, -1, -1, -1, + -1, 308, 309, -1, 311, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, 768, 769, -1, -1, 3, -1, 774, -1, -1, + 8, 9, 779, -1, -1, -1, 783, 784, -1, -1, + 787, 19, 20, -1, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + 58, 59, 60, -1, -1, -1, -1, -1, -1, -1, + 68, 69, -1, 71, -1, -1, -1, -1, -1, -1, + 78, 79, -1, -1, 82, 83, 84, 85, -1, 87, + 88, -1, 90, 91, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, 102, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, 120, 121, 122, -1, 124, -1, -1, -1, + -1, -1, -1, -1, 132, 133, 134, 135, -1, -1, + -1, -1, -1, 141, -1, 143, 144, -1, -1, -1, + -1, -1, 150, -1, -1, 153, -1, -1, -1, -1, + -1, -1, -1, -1, 162, -1, 164, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 180, 181, -1, 183, -1, -1, -1, 187, + 188, -1, -1, -1, 192, -1, -1, 195, 196, -1, + 198, 199, 200, 201, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, 219, 220, 221, -1, 223, -1, -1, -1, -1, + -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, -1, -1, + -1, 249, 250, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 268, -1, -1, -1, -1, -1, -1, 275, 276, -1, + 278, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 300, 301, 302, -1, -1, -1, -1, -1, + 308, 309, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + 768, 769, -1, -1, 3, -1, 774, -1, -1, 8, + 9, 779, -1, -1, -1, 783, 784, -1, -1, 787, + 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, 58, + 59, 60, -1, -1, -1, -1, -1, -1, -1, 68, + 69, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, -1, -1, 82, 83, 84, 85, -1, 87, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, 102, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, 120, 121, 122, -1, 124, -1, -1, -1, 128, + -1, -1, -1, 132, 133, 134, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, 150, -1, -1, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 162, -1, 164, -1, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 180, 181, -1, 183, -1, -1, -1, 187, 188, + -1, -1, -1, 192, -1, -1, 195, 196, -1, 198, + 199, 200, 201, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + 219, 220, 221, -1, 223, -1, -1, -1, -1, -1, + -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, -1, -1, -1, + 249, 250, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, 275, 276, -1, 278, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 300, 301, 302, -1, -1, -1, -1, -1, 308, + 309, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, 3, -1, 774, -1, -1, 8, 9, + 779, -1, -1, -1, 783, 784, -1, -1, 787, 19, + 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, 58, 59, + 60, -1, -1, -1, -1, -1, -1, -1, 68, 69, + -1, 71, -1, -1, -1, -1, -1, -1, 78, 79, + -1, -1, 82, 83, 84, 85, -1, 87, 88, -1, + 90, 91, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + 120, 121, 122, -1, 124, -1, -1, -1, 128, -1, + -1, -1, 132, 133, 134, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + 150, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162, -1, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 181, -1, 183, -1, -1, -1, 187, 188, -1, + -1, -1, 192, -1, -1, 195, 196, -1, 198, 199, + 200, 201, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, 219, + 220, 221, -1, 223, -1, -1, -1, -1, -1, -1, + 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, -1, -1, -1, 249, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 268, -1, + -1, -1, -1, -1, -1, 275, 276, -1, 278, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 300, 301, 302, -1, -1, -1, -1, -1, 308, 309, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, 768, 769, + -1, -1, 3, -1, 774, -1, -1, 8, 9, 779, + -1, -1, -1, 783, 784, -1, -1, 787, 19, 20, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 57, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, + 71, -1, -1, -1, -1, -1, -1, 78, 79, -1, + -1, 82, 83, 84, 85, -1, 87, 88, -1, 90, + 91, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, 120, + 121, 122, -1, 124, -1, -1, -1, 128, -1, -1, + -1, 132, 133, 134, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, 150, + -1, -1, 153, -1, -1, -1, -1, -1, -1, -1, + -1, 162, -1, 164, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 181, -1, 183, -1, -1, -1, 187, 188, -1, -1, + -1, 192, -1, -1, 195, 196, -1, 198, 199, 200, + 201, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, 219, 220, + 221, -1, 223, -1, -1, -1, -1, -1, -1, 230, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, -1, -1, -1, 249, 250, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 268, -1, -1, + -1, -1, -1, -1, 275, 276, -1, 278, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 300, + 301, 302, -1, -1, -1, -1, -1, 308, 309, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, 768, 769, -1, + -1, 3, -1, 774, -1, -1, 8, 9, 779, -1, + -1, -1, 783, 784, -1, -1, 787, 19, 20, -1, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 57, 58, 59, 60, -1, + -1, -1, -1, -1, -1, -1, 68, 69, -1, 71, + -1, -1, -1, -1, -1, -1, 78, 79, -1, -1, + 82, 83, 84, 85, -1, 87, 88, -1, 90, 91, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, 120, 121, + 122, -1, 124, -1, -1, -1, -1, -1, -1, -1, + 132, 133, 134, 135, -1, -1, -1, -1, -1, 141, + -1, 143, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 162, -1, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, 181, + -1, 183, -1, -1, -1, 187, 188, -1, -1, -1, + 192, -1, -1, 195, 196, -1, 198, 199, 200, 201, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, 219, 220, 221, + -1, 223, -1, -1, -1, -1, -1, -1, 230, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, -1, -1, -1, 249, 250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 268, -1, -1, -1, + -1, -1, -1, 275, 276, -1, 278, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 300, 301, + 302, -1, -1, -1, -1, -1, 308, 309, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, 768, 769, -1, -1, + 3, -1, 774, -1, -1, 8, 9, 779, -1, -1, + -1, 783, 784, -1, -1, 787, 19, 20, -1, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 57, 58, 59, 60, -1, -1, + -1, -1, -1, -1, -1, 68, 69, -1, 71, -1, + -1, -1, -1, -1, -1, 78, 79, -1, -1, 82, + 83, 84, 85, -1, 87, 88, -1, 90, 91, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, 102, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, 120, 121, 122, + -1, 124, -1, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, -1, -1, -1, -1, -1, 141, -1, + -1, 144, -1, -1, -1, -1, -1, 150, -1, -1, + 153, -1, -1, -1, -1, -1, -1, -1, -1, 162, + -1, 164, -1, 166, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 180, 181, -1, + 183, -1, -1, -1, 187, 188, -1, -1, -1, 192, + -1, -1, 195, 196, -1, 198, 199, 200, 201, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, 219, 220, 221, -1, + 223, -1, -1, -1, -1, -1, -1, 230, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, -1, -1, -1, 249, 250, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 268, -1, -1, -1, -1, + -1, -1, 275, 276, -1, 278, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 300, 301, 302, + -1, -1, -1, -1, -1, 308, 309, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, 768, 769, -1, -1, 3, + -1, 774, -1, -1, 8, 9, 779, -1, -1, -1, + 783, 784, -1, -1, 787, 19, 20, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 57, 58, 59, 60, -1, -1, -1, + -1, -1, -1, -1, 68, 69, -1, 71, -1, -1, + -1, -1, -1, -1, 78, 79, -1, -1, 82, 83, + 84, 85, -1, 87, 88, -1, 90, 91, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, 120, 121, 122, -1, + 124, -1, -1, -1, -1, -1, -1, -1, 132, 133, + 134, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, -1, -1, -1, -1, 150, -1, -1, 153, + -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 180, 181, -1, 183, + -1, -1, -1, 187, 188, -1, -1, -1, 192, -1, + -1, 195, 196, -1, 198, 199, 200, 201, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, 219, 220, 221, -1, 223, + -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, -1, -1, -1, 249, 250, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, 275, 276, -1, 278, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 300, 301, 302, -1, + -1, -1, -1, -1, 308, 309, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, -1, 3, -1, + 774, -1, -1, 8, 9, 779, -1, -1, -1, 783, + 784, -1, -1, 787, 19, 20, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 57, 58, 59, 60, -1, -1, -1, -1, + -1, -1, -1, 68, 69, -1, 71, -1, -1, -1, + -1, -1, -1, 78, 79, -1, -1, 82, 83, 84, + 85, -1, 87, 88, -1, 90, 91, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, 120, 121, 122, -1, 124, + -1, -1, -1, -1, -1, -1, -1, 132, 133, 134, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, 150, -1, -1, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 162, -1, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, 181, -1, 183, -1, + -1, -1, 187, 188, -1, -1, -1, 192, -1, -1, + 195, 196, -1, 198, 199, 200, 201, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, 219, 220, 221, -1, 223, -1, + -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, -1, -1, -1, 249, 250, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, + 275, 276, -1, 278, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 300, 301, 302, -1, -1, + -1, -1, -1, 308, 309, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, 768, 769, -1, -1, 3, -1, 774, + -1, -1, 8, 9, 779, -1, -1, -1, 783, 784, + -1, -1, 787, 19, 20, -1, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 57, 58, 59, 60, -1, -1, -1, -1, -1, + -1, -1, 68, 69, -1, 71, -1, -1, -1, -1, + -1, -1, 78, 79, -1, -1, 82, 83, 84, 85, + -1, 87, 88, -1, 90, 91, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, 102, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, 120, 121, 122, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 132, 133, 134, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, 150, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, -1, 162, -1, 164, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 180, 181, -1, 183, -1, -1, + -1, 187, 188, -1, -1, -1, 192, -1, -1, 195, + 196, -1, 198, 199, 200, 201, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, 219, 220, 221, -1, 223, -1, -1, + -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, -1, 249, 250, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, -1, 275, + 276, -1, 278, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 300, 301, 302, -1, -1, -1, + -1, -1, 308, 309, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, 768, 769, -1, -1, 3, -1, 774, -1, + -1, 8, 9, 779, -1, -1, -1, 783, 784, -1, + -1, 787, 19, 20, -1, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, + 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, 58, 59, 60, -1, -1, -1, -1, -1, -1, + -1, 68, 69, -1, 71, -1, -1, -1, -1, -1, + -1, 78, 79, -1, -1, 82, 83, 84, 85, -1, + 87, 88, -1, 90, 91, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, 102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, 120, 121, 122, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + -1, -1, -1, 150, -1, -1, 153, -1, -1, -1, + -1, -1, -1, -1, -1, 162, -1, 164, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 180, 181, -1, 183, -1, -1, -1, + 187, 188, -1, -1, -1, 192, -1, -1, 195, -1, + -1, 198, 199, 200, 201, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, 219, 220, 221, -1, 223, -1, -1, -1, + -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, -1, + -1, -1, 249, 250, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 268, -1, -1, -1, -1, -1, -1, 275, 276, + -1, 278, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 300, 301, 302, -1, -1, -1, -1, + -1, 308, 309, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, 768, 769, -1, -1, 3, -1, 774, -1, -1, + 8, 9, 779, -1, -1, -1, 783, 784, -1, -1, + 787, 19, 20, -1, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + 58, 59, 60, -1, -1, -1, -1, -1, -1, -1, + 68, 69, -1, 71, -1, -1, -1, -1, -1, -1, + 78, 79, -1, -1, 82, 83, 84, 85, -1, 87, + 88, -1, 90, 91, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, 102, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, 120, 121, 122, -1, 124, -1, -1, -1, + -1, -1, -1, -1, 132, 133, 134, 135, -1, -1, + -1, -1, -1, 141, -1, -1, 144, -1, -1, -1, + -1, -1, 150, -1, -1, 153, -1, -1, -1, -1, + -1, -1, -1, -1, 162, -1, 164, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 180, 181, -1, 183, -1, -1, -1, 187, + 188, -1, -1, -1, 192, -1, -1, 195, 196, -1, + 198, 199, 200, 201, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, 219, 220, 221, -1, 223, -1, -1, -1, -1, + -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, -1, -1, + -1, 249, 250, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 268, -1, -1, -1, -1, -1, -1, 275, 276, -1, + 278, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 300, 301, 302, -1, -1, -1, -1, -1, + 308, 309, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + 768, 769, -1, -1, 3, -1, 774, -1, -1, 8, + 9, 779, -1, -1, -1, 783, 784, -1, -1, 787, + 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, 58, + 59, 60, -1, -1, -1, -1, -1, -1, -1, 68, + 69, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, -1, -1, 82, 83, 84, 85, -1, 87, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, 102, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, 120, 121, 122, -1, 124, -1, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, 150, -1, -1, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 162, -1, 164, -1, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 180, 181, -1, 183, -1, -1, -1, 187, 188, + -1, -1, -1, 192, -1, -1, 195, 196, -1, 198, + 199, 200, 201, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + 219, 220, 221, -1, 223, -1, -1, -1, -1, -1, + -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, -1, -1, -1, + 249, 250, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, 275, 276, -1, 278, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 300, 301, 302, -1, -1, -1, -1, -1, 308, + 309, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, 3, -1, 774, -1, -1, 8, 9, + 779, -1, -1, -1, 783, 784, -1, -1, 787, 19, + 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, 58, 59, + 60, -1, -1, -1, -1, -1, -1, -1, 68, 69, + -1, 71, -1, -1, -1, -1, -1, -1, 78, 79, + -1, -1, 82, 83, 84, 85, -1, 87, 88, -1, + 90, 91, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + 120, 121, 122, -1, 124, -1, -1, -1, -1, -1, + -1, -1, 132, 133, 134, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + 150, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162, -1, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 181, 182, 183, -1, -1, -1, 187, 188, -1, + -1, -1, 192, -1, -1, 195, -1, -1, 198, 199, + 200, 201, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, 219, + 220, 221, -1, 223, -1, -1, -1, -1, -1, -1, + 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, -1, -1, -1, 249, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 268, -1, + -1, -1, -1, -1, -1, 275, 276, -1, 278, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 300, 301, 302, -1, -1, -1, -1, -1, 308, 309, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, 768, 769, + -1, -1, 3, -1, 774, -1, -1, 8, 9, 779, + -1, -1, -1, 783, 784, -1, -1, 787, 19, 20, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 57, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, + 71, -1, -1, -1, -1, -1, -1, 78, 79, -1, + -1, 82, 83, 84, 85, -1, 87, 88, -1, 90, + 91, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, 120, + 121, 122, -1, 124, -1, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, 150, + -1, -1, 153, -1, -1, -1, -1, -1, -1, -1, + -1, 162, -1, 164, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 181, -1, 183, -1, -1, -1, 187, 188, -1, -1, + -1, 192, -1, -1, 195, -1, -1, 198, 199, 200, + 201, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, 219, 220, + 221, -1, 223, -1, -1, -1, -1, -1, -1, 230, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, -1, -1, -1, 249, 250, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 268, -1, -1, + -1, -1, -1, -1, 275, 276, -1, 278, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 300, + 301, 302, -1, -1, -1, -1, -1, 308, 309, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, 768, 769, -1, + -1, 3, -1, 774, -1, -1, 8, 9, 779, -1, + -1, -1, 783, 784, -1, -1, 787, 19, 20, -1, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 57, 58, 59, 60, -1, + -1, -1, -1, -1, -1, -1, 68, 69, -1, 71, + -1, -1, -1, -1, -1, -1, 78, 79, -1, -1, + 82, 83, 84, 85, -1, 87, 88, -1, 90, 91, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, 120, 121, + 122, -1, 124, -1, -1, -1, -1, -1, -1, -1, + 132, 133, 134, 135, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 162, -1, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, 181, + -1, 183, -1, -1, -1, 187, 188, -1, -1, -1, + 192, -1, -1, 195, -1, -1, 198, 199, 200, 201, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, 219, 220, 221, + -1, 223, -1, -1, -1, -1, -1, -1, 230, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, -1, -1, -1, 249, 250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 268, -1, -1, -1, + -1, -1, -1, 275, 276, -1, 278, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 300, 301, + 302, -1, -1, -1, -1, -1, 308, 309, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, 768, 769, -1, -1, + 3, -1, 774, -1, -1, 8, 9, 779, -1, -1, + -1, 783, 784, -1, -1, 787, 19, 20, -1, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 57, 58, 59, 60, -1, -1, + -1, -1, -1, -1, -1, 68, 69, -1, 71, -1, + -1, -1, -1, -1, -1, 78, 79, -1, -1, 82, + 83, 84, 85, -1, 87, 88, -1, 90, 91, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, 102, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, 120, 121, 122, + -1, 124, -1, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, -1, -1, -1, -1, -1, 141, -1, + -1, 144, -1, -1, -1, -1, -1, 150, -1, -1, + 153, -1, -1, -1, -1, -1, -1, -1, -1, 162, + -1, 164, -1, 166, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 180, 181, -1, + 183, -1, -1, -1, 187, 188, -1, -1, -1, 192, + -1, -1, 195, -1, -1, 198, 199, 200, 201, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, 219, 220, 221, -1, + 223, -1, -1, -1, -1, -1, -1, 230, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, -1, -1, -1, 249, 250, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 268, -1, -1, -1, -1, + -1, -1, 275, 276, -1, 278, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 300, 301, 302, + -1, -1, -1, -1, -1, 308, 309, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, 768, 769, -1, -1, 3, + -1, 774, -1, -1, 8, 9, 779, -1, -1, -1, + 783, 784, -1, -1, 787, 19, 20, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 57, 58, 59, 60, -1, -1, -1, + -1, -1, -1, -1, 68, 69, -1, 71, -1, -1, + -1, -1, -1, -1, 78, 79, -1, -1, 82, 83, + 84, 85, -1, 87, 88, -1, 90, 91, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, 120, 121, 122, -1, + 124, -1, -1, -1, -1, -1, -1, -1, 132, 133, + 134, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, -1, -1, -1, -1, 150, -1, -1, 153, + -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 180, 181, -1, 183, + -1, -1, -1, 187, 188, -1, -1, -1, 192, -1, + -1, 195, -1, -1, 198, 199, 200, 201, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, 219, 220, 221, -1, 223, + -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, -1, -1, -1, 249, 250, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, 275, 276, -1, 278, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 300, 301, 302, -1, + -1, -1, -1, -1, 308, 309, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, -1, 3, -1, + 774, -1, -1, 8, 9, 779, -1, -1, -1, 783, + 784, -1, -1, 787, 19, 20, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 57, 58, 59, 60, -1, -1, -1, -1, + -1, -1, -1, 68, 69, -1, 71, -1, -1, -1, + -1, -1, -1, 78, 79, -1, -1, 82, 83, 84, + 85, -1, 87, 88, -1, 90, 91, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, 120, 121, 122, -1, 124, + -1, -1, -1, -1, -1, -1, -1, 132, 133, 134, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, 150, -1, -1, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 162, -1, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, 181, -1, 183, -1, + -1, -1, 187, 188, -1, -1, -1, 192, -1, -1, + 195, -1, -1, 198, 199, 200, 201, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, 219, 220, 221, -1, 223, -1, + -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, -1, -1, -1, 249, 250, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, + 275, 276, -1, 278, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 300, 301, 302, -1, -1, + -1, -1, -1, 308, 309, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, 768, 769, -1, -1, 3, -1, 774, + -1, -1, 8, 9, 779, -1, -1, -1, 783, 784, + -1, -1, 787, 19, 20, -1, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 57, 58, 59, 60, -1, -1, -1, -1, -1, + -1, -1, 68, 69, -1, 71, -1, -1, -1, -1, + -1, -1, 78, 79, -1, -1, 82, 83, 84, 85, + -1, 87, 88, -1, 90, 91, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, 102, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, 120, 121, 122, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 132, 133, 134, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, 150, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, -1, 162, -1, 164, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 180, 181, -1, 183, -1, -1, + -1, 187, 188, -1, -1, -1, 192, -1, -1, 195, + -1, -1, 198, 199, 200, 201, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, 219, 220, 221, -1, 223, -1, -1, + -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, -1, 249, 250, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, -1, 275, + 276, -1, 278, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 300, 301, 302, -1, -1, -1, + -1, -1, 308, 309, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, 768, 769, -1, -1, 3, -1, 774, -1, + -1, 8, 9, 779, -1, -1, -1, 783, 784, -1, + -1, 787, 19, 20, -1, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 58, 59, 60, -1, -1, -1, -1, -1, -1, + -1, 68, 69, -1, 71, -1, -1, -1, -1, -1, + -1, 78, 79, -1, -1, 82, 83, 84, 85, -1, + 87, 88, -1, 90, 91, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, 102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, 120, 121, 122, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + -1, -1, -1, 150, -1, -1, 153, -1, -1, -1, + -1, -1, -1, -1, -1, 162, -1, 164, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 180, 181, -1, 183, -1, -1, -1, + 187, 188, -1, -1, -1, 192, -1, -1, 195, -1, + -1, 198, 199, 200, 201, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, 219, 220, 221, -1, 223, -1, -1, -1, + -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, -1, + -1, -1, 249, 250, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 268, -1, -1, -1, -1, -1, -1, 275, 276, + -1, 278, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 300, 301, 302, -1, -1, -1, -1, + -1, 308, 309, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, 768, 769, -1, -1, 3, -1, -1, -1, -1, + 8, -1, 779, -1, -1, -1, -1, 784, -1, -1, + 787, 19, 20, -1, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, 122, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, 201, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, 3, 756, 757, + 758, 759, 8, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 787, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 3, + 756, 757, 758, 759, 8, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 19, 20, -1, -1, -1, + -1, -1, -1, -1, 780, -1, -1, -1, -1, -1, + -1, 787, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, 8, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 787, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 8, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 779, -1, -1, -1, -1, -1, -1, -1, + 787, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, 8, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 787, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 787, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 75, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 129, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, 145, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 160, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 262, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 787, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 254, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 305, -1, -1, -1, -1, -1, + -1, -1, -1, 314, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 779, -1, + -1, -1, -1, -1, -1, -1, 787, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 111, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 779, + -1, -1, -1, -1, 784, -1, -1, 787, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 779, -1, -1, -1, -1, 784, -1, -1, 787, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 779, -1, -1, -1, -1, -1, -1, -1, 787, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, 770, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 787, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 779, -1, -1, -1, -1, -1, -1, + -1, 787, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 787, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 787, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 787, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 787, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, + -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, 123, -1, -1, -1, 127, -1, -1, 130, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 157, -1, -1, -1, + -1, -1, -1, -1, 165, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 177, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, 247, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 313, -1, -1, -1, -1, 318, 319, 320, + 321, 322, -1, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + -1, 342, 343, 344, 345, 346, 347, 348, 349, -1, + 351, -1, -1, 354, 355, 356, 357, 358, -1, -1, + 361, 362, 363, 364, 365, -1, -1, -1, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, + -1, -1, -1, -1, 385, -1, 387, -1, 389, 390, + -1, 392, 393, 394, 395, 396, 397, -1, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, 413, -1, 415, 416, 417, 418, 419, 420, + 421, -1, 423, 424, 425, 426, -1, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, -1, -1, + -1, 442, -1, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, -1, -1, -1, -1, -1, + 461, 462, 463, 464, 465, 466, -1, 468, 469, -1, + 471, 472, -1, -1, 475, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, -1, 489, 490, + 491, 492, 493, 494, 495, 496, 497, -1, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, -1, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, -1, -1, 585, -1, 587, 588, -1, 590, + 591, 592, 593, -1, 595, 596, 597, 598, -1, -1, + -1, -1, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, -1, 630, + -1, 632, 633, 634, -1, 636, 637, -1, 639, 640, + 641, 642, 643, 644, -1, 646, 647, 648, 649, 650, + 651, 652, -1, 654, 655, 656, -1, 658, 659, 660, + 661, -1, 663, 664, -1, -1, 667, 668, -1, -1, + 671, 672, 673, -1, 675, -1, 677, 678, 679, 680, + -1, 682, 683, 684, 685, -1, 687, 688, -1, 690, + -1, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, -1, 713, 714, 715, 716, 717, 718, 719, 720, + 721, -1, 723, 724, -1, 726, 727, 728, 729, -1, + -1, 732, 733, -1, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, -1, + -1, 752, 753, -1, -1, 756, -1, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 782, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 85, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, -1, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 779, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, 3, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 19, 20, -1, -1, -1, -1, -1, -1, + 779, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 71, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 3, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 71, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + 3, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 19, 20, 21, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 3, 756, 757, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 3, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, 3, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 3, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 8, 9, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 19, 20, -1, -1, + -1, -1, -1, -1, -1, 28, -1, 30, -1, 32, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 251, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 8, 9, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 19, 20, + -1, -1, -1, -1, -1, -1, -1, 28, -1, 30, + -1, 32, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 251, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 8, + 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 19, 20, -1, -1, -1, -1, -1, -1, -1, 28, + -1, 30, -1, 32, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 251, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 8, 9, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 19, 20, -1, -1, -1, -1, -1, -1, + -1, 28, -1, 30, -1, 32, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, 770, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, 770, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, 770, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, 770, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, 770, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, 26, -1, -1, 770, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, 196, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, 209, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 265, -1, 267, -1, 269, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, 21, -1, -1, -1, -1, -1, -1, 769, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 42, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, 21, 763, -1, -1, -1, -1, -1, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 42, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, 763, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, -1, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + -1, 128, 129, 130, 131, 132, -1, -1, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, -1, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, -1, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + -1, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, -1, 128, 129, 130, 131, 132, -1, -1, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, -1, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, -1, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, -1, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, -1, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, -1, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, -1, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, -1, 661, 662, 663, 664, 665, + -1, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, -1, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, -1, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, -1, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, -1, 128, 129, 130, 131, 132, -1, -1, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, -1, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, -1, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, -1, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, -1, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, -1, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + -1, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, -1, 661, 662, 663, 664, + 665, -1, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, -1, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, -1, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, -1, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, -1, 128, 129, 130, 131, 132, -1, + -1, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, -1, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, -1, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, -1, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, -1, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, -1, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, -1, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, -1, 661, 662, 663, + 664, 665, -1, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, -1, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, -1, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, 21, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 47, 48, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, + -1, 84, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, + -1, -1, -1, -1, -1, -1, -1, 110, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 131, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, 145, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 173, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 232, + -1, -1, -1, 236, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 254, -1, -1, -1, 258, 259, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 289, -1, -1, -1, + -1, -1, -1, 296, 297, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 47, 48, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 80, -1, + -1, -1, 84, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, + -1, -1, -1, -1, -1, -1, -1, -1, 110, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 131, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, 145, -1, -1, -1, -1, 150, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 173, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 232, -1, -1, -1, 236, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 254, -1, -1, -1, 258, 259, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 289, -1, -1, + -1, -1, -1, -1, 296, 297, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, 24, 25, 26, -1, 28, -1, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, 23, -1, -1, 26, 27, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 31, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, 21, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 31, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 47, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 84, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 76, 77, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + -1, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + 148, -1, -1, 151, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, 212, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 31, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 258, -1, -1, -1, -1, -1, -1, -1, + -1, 267, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 128, -1, -1, -1, -1, -1, + -1, 135, 136, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 267, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 128, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 30, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, 225, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, 225, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, -1, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, -1, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, -1, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, -1, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + -1, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, -1, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, -1, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 68, -1, -1, -1, -1, -1, -1, -1, + -1, 77, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 113, 114, 115, + 116, -1, -1, -1, -1, -1, -1, 123, -1, -1, + -1, 127, -1, -1, 130, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 157, -1, -1, -1, -1, -1, -1, -1, 165, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 177, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + 246, 247, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, -1, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, -1, 342, 343, 344, 345, + 346, 347, 348, 349, -1, 351, -1, -1, 354, 355, + 356, 357, 358, -1, -1, 361, 362, 363, 364, 365, + -1, -1, -1, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, -1, -1, -1, -1, 385, + -1, 387, -1, 389, 390, -1, 392, 393, 394, 395, + 396, 397, -1, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, 413, -1, 415, + 416, 417, 418, 419, 420, 421, -1, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, -1, -1, -1, 442, -1, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + -1, -1, -1, -1, -1, 461, 462, 463, 464, 465, + 466, -1, 468, 469, -1, 471, 472, -1, -1, 475, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, -1, 489, 490, 491, 492, 493, 494, 495, + 496, 497, -1, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, -1, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, -1, -1, 585, + -1, 587, 588, -1, 590, 591, 592, 593, -1, 595, + 596, 597, 598, -1, -1, -1, -1, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, -1, 630, -1, 632, 633, 634, -1, + 636, 637, -1, 639, 640, 641, 642, 643, 644, -1, + 646, 647, 648, 649, 650, 651, 652, -1, 654, 655, + 656, -1, 658, 659, 660, 661, -1, 663, 664, -1, + -1, 667, 668, -1, -1, 671, 672, 673, -1, 675, + -1, 677, 678, 679, 680, -1, 682, 683, 684, 685, + -1, 687, 688, -1, 690, -1, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, -1, 713, 714, 715, + 716, 717, 718, 719, 720, 721, -1, 723, 724, -1, + 726, 727, 728, 729, 19, 20, 732, 733, -1, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, -1, -1, 752, 753, -1, -1, + 756, -1, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 68, -1, -1, -1, -1, -1, -1, + -1, -1, 77, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 114, + -1, 116, -1, -1, -1, -1, -1, -1, 123, -1, + -1, -1, 127, -1, -1, 130, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 157, -1, -1, -1, -1, -1, -1, -1, + 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 177, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, 246, 247, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 311, -1, 313, -1, + -1, -1, -1, 318, 319, 320, 321, 322, -1, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, -1, 342, 343, 344, + 345, 346, 347, 348, 349, -1, 351, -1, -1, 354, + 355, 356, 357, 358, -1, -1, 361, 362, 363, 364, + 365, -1, -1, -1, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, -1, -1, -1, -1, -1, -1, + 385, -1, 387, -1, 389, 390, -1, 392, 393, 394, + 395, 396, 397, -1, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, -1, 413, -1, + 415, 416, 417, 418, 419, 420, 421, -1, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, -1, -1, -1, 442, -1, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, -1, -1, -1, -1, -1, 461, 462, 463, 464, + 465, 466, -1, 468, 469, -1, 471, 472, -1, -1, + 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, -1, 489, 490, 491, 492, 493, 494, + 495, 496, 497, -1, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, -1, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, -1, -1, + 585, -1, 587, 588, -1, 590, 591, 592, 593, -1, + 595, 596, 597, 598, -1, -1, -1, -1, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, -1, 630, -1, 632, 633, 634, + -1, 636, 637, -1, 639, 640, 641, 642, 643, 644, + -1, 646, 647, 648, 649, 650, 651, 652, -1, 654, + 655, 656, -1, 658, 659, 660, 661, -1, 663, 664, + -1, -1, 667, 668, -1, -1, 671, 672, 673, -1, + 675, -1, 677, 678, 679, 680, -1, 682, 683, 684, + 685, -1, 687, 688, -1, 690, -1, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, -1, 713, 714, + 715, 716, 717, 718, 719, 720, 721, -1, 723, 724, + -1, 726, 727, 728, 729, 19, 20, 732, 733, -1, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, -1, -1, 752, 753, -1, + -1, 756, -1, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 68, -1, -1, -1, -1, -1, + -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, 123, + -1, -1, -1, 127, -1, -1, 130, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 157, -1, -1, -1, -1, -1, -1, + -1, 165, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 177, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, 246, 247, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, -1, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, -1, 342, 343, + 344, 345, 346, 347, 348, 349, -1, 351, -1, -1, + 354, 355, 356, 357, 358, -1, -1, 361, 362, 363, + 364, 365, -1, -1, -1, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, -1, -1, -1, + -1, 385, -1, 387, -1, 389, 390, -1, 392, 393, + 394, 395, 396, 397, -1, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, 413, + -1, 415, 416, 417, 418, 419, 420, 421, -1, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, -1, -1, -1, 442, -1, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, -1, -1, -1, -1, -1, 461, 462, 463, + 464, 465, 466, -1, 468, 469, -1, 471, 472, -1, + -1, 475, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, -1, 489, 490, 491, 492, 493, + 494, 495, 496, 497, -1, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, -1, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, -1, + -1, 585, -1, 587, 588, -1, 590, 591, 592, 593, + -1, 595, 596, 597, 598, -1, -1, -1, -1, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, -1, 630, -1, 632, 633, + 634, -1, 636, 637, -1, 639, 640, 641, 642, 643, + 644, -1, 646, 647, 648, 649, 650, 651, 652, -1, + 654, 655, 656, -1, 658, 659, 660, 661, -1, 663, + 664, -1, -1, 667, 668, -1, -1, 671, 672, 673, + -1, 675, -1, 677, 678, 679, 680, -1, 682, 683, + 684, 685, -1, 687, 688, -1, 690, -1, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, -1, 713, + 714, 715, 716, 717, 718, 719, 720, 721, -1, 723, + 724, -1, 726, 727, 728, 729, 19, 20, 732, 733, + -1, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, -1, -1, 752, 753, + -1, -1, 756, -1, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 68, -1, -1, -1, -1, + -1, -1, -1, -1, 77, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + 123, -1, -1, -1, 127, -1, -1, 130, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, 141, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 157, -1, -1, -1, -1, -1, + -1, -1, 165, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 177, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, 246, 247, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, + -1, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, -1, 342, + 343, 344, 345, 346, 347, 348, 349, -1, 351, -1, + -1, 354, 355, 356, 357, 358, -1, -1, 361, 362, + 363, 364, 365, -1, -1, -1, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, -1, -1, -1, + -1, -1, 385, -1, 387, -1, 389, 390, -1, 392, + 393, 394, 395, 396, 397, -1, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + 413, -1, 415, 416, 417, 418, 419, 420, 421, -1, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, -1, -1, -1, 442, + -1, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, -1, -1, -1, -1, -1, 461, 462, + 463, 464, 465, 466, -1, 468, 469, -1, 471, 472, + -1, -1, 475, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, -1, 489, 490, 491, 492, + 493, 494, 495, 496, 497, -1, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, -1, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + -1, -1, 585, -1, 587, 588, -1, 590, 591, 592, + 593, -1, 595, 596, 597, 598, -1, -1, -1, -1, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, -1, 630, -1, 632, + 633, 634, -1, 636, 637, -1, 639, 640, 641, 642, + 643, 644, -1, 646, 647, 648, 649, 650, 651, 652, + -1, 654, 655, 656, -1, 658, 659, 660, 661, -1, + 663, 664, -1, -1, 667, 668, -1, -1, 671, 672, + 673, -1, 675, -1, 677, 678, 679, 680, -1, 682, + 683, 684, 685, -1, 687, 688, -1, 690, -1, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, -1, + 713, 714, 715, 716, 717, 718, 719, 720, 721, -1, + 723, 724, -1, 726, 727, 728, 729, 19, 20, 732, + 733, -1, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, -1, -1, 752, + 753, -1, -1, 756, -1, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 68, -1, -1, -1, + -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, 123, -1, -1, -1, 127, -1, -1, 130, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 157, -1, -1, -1, -1, + -1, -1, -1, 165, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 177, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, 246, 247, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 313, -1, -1, -1, -1, 318, 319, 320, 321, + 322, -1, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, -1, + 342, 343, 344, 345, 346, 347, 348, 349, -1, 351, + -1, -1, 354, 355, 356, 357, 358, -1, -1, 361, + 362, 363, 364, 365, -1, -1, -1, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, -1, -1, -1, + -1, -1, -1, 385, -1, 387, -1, 389, 390, -1, + 392, 393, 394, 395, 396, 397, -1, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, 413, -1, 415, 416, 417, 418, 419, 420, 421, + -1, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, -1, -1, -1, + 442, -1, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, -1, -1, -1, -1, -1, 461, + 462, 463, 464, 465, 466, -1, 468, 469, -1, 471, + 472, -1, -1, 475, -1, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, -1, 489, 490, 491, + 492, 493, 494, 495, 496, 497, -1, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, -1, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, -1, -1, 585, -1, 587, 588, -1, 590, 591, + 592, 593, -1, 595, 596, 597, 598, -1, -1, -1, + -1, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, -1, 630, -1, + 632, 633, 634, -1, 636, 637, -1, 639, 640, 641, + 642, 643, 644, -1, 646, 647, 648, 649, 650, 651, + 652, -1, 654, 655, 656, -1, 658, 659, 660, 661, + -1, 663, 664, -1, -1, 667, 668, -1, -1, 671, + 672, 673, -1, 675, -1, 677, 678, 679, 680, -1, + 682, 683, 684, 685, -1, 687, 688, -1, 690, -1, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + -1, 713, 714, 715, 716, 717, 718, 719, 720, 721, + -1, 723, 724, -1, 726, 727, 728, 729, 19, 20, + 732, 733, -1, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, -1, -1, + 752, 753, -1, -1, 756, -1, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, + -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, 123, -1, -1, -1, 127, -1, -1, 130, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 157, -1, -1, -1, + -1, -1, -1, -1, 165, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 177, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, 247, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 313, -1, -1, -1, -1, 318, 319, 320, + 321, 322, -1, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + -1, 342, 343, 344, 345, 346, 347, 348, 349, -1, + 351, -1, -1, 354, 355, 356, 357, 358, -1, -1, + 361, 362, 363, 364, 365, -1, -1, -1, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, + -1, -1, -1, -1, 385, -1, 387, -1, 389, 390, + -1, 392, 393, 394, 395, 396, 397, -1, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, 413, -1, 415, 416, 417, 418, 419, 420, + 421, -1, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, -1, -1, + -1, 442, -1, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, -1, -1, -1, -1, -1, + 461, 462, 463, 464, 465, 466, -1, 468, 469, -1, + 471, 472, -1, -1, 475, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, -1, 489, 490, + 491, 492, 493, 494, 495, 496, 497, -1, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, -1, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, -1, -1, 585, -1, 587, 588, -1, 590, + 591, 592, 593, -1, 595, 596, 597, 598, -1, -1, + -1, -1, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, -1, 630, + -1, 632, 633, 634, -1, 636, 637, -1, 639, 640, + 641, 642, 643, 644, -1, 646, 647, 648, 649, 650, + 651, 652, -1, 654, 655, 656, -1, 658, 659, 660, + 661, -1, 663, 664, -1, -1, 667, 668, -1, -1, + 671, 672, 673, -1, 675, -1, 677, 678, 679, 680, + -1, 682, 683, 684, 685, -1, 687, 688, -1, 690, + -1, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, -1, 713, 714, 715, 716, 717, 718, 719, 720, + 721, -1, 723, 724, -1, 726, 727, 728, 729, 19, + 20, 732, 733, -1, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, -1, + -1, 752, 753, -1, -1, 756, -1, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 68, -1, + -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, 123, -1, -1, -1, 127, -1, -1, + 130, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 157, -1, -1, + -1, -1, -1, -1, -1, 165, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 177, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, 246, 247, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 313, -1, -1, -1, -1, 318, 319, + 320, 321, 322, -1, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, -1, 342, 343, 344, 345, 346, 347, 348, 349, + -1, 351, -1, -1, 354, 355, 356, 357, 358, -1, + -1, 361, 362, 363, 364, 365, -1, -1, -1, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, + -1, -1, -1, -1, -1, 385, -1, 387, -1, 389, + 390, -1, 392, 393, 394, 395, 396, 397, -1, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, 413, -1, 415, 416, 417, 418, 419, + 420, 421, -1, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, -1, + -1, -1, 442, -1, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, -1, -1, -1, -1, + -1, 461, 462, 463, 464, 465, 466, -1, 468, 469, + -1, 471, 472, -1, -1, 475, -1, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, -1, 489, + 490, 491, 492, 493, 494, 495, 496, 497, -1, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, -1, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, -1, -1, 585, -1, 587, 588, -1, + 590, 591, 592, 593, -1, 595, 596, 597, 598, -1, + -1, -1, -1, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, -1, + 630, -1, 632, 633, 634, -1, 636, 637, -1, 639, + 640, 641, 642, 643, 644, -1, 646, 647, 648, 649, + 650, 651, 652, -1, 654, 655, 656, -1, 658, 659, + 660, 661, -1, 663, 664, -1, -1, 667, 668, -1, + -1, 671, 672, 673, -1, 675, -1, 677, 678, 679, + 680, -1, 682, 683, 684, 685, -1, 687, 688, -1, + 690, -1, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, -1, 713, 714, 715, 716, 717, 718, 719, + 720, 721, -1, 723, 724, -1, 726, 727, 728, 729, + 19, 20, 732, 733, -1, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + -1, -1, 752, 753, -1, -1, 756, -1, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, + -1, -1, -1, -1, -1, -1, -1, -1, 77, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, 123, -1, -1, -1, 127, -1, + -1, 130, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 157, -1, + -1, -1, -1, -1, -1, -1, 165, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 177, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, 246, 247, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, -1, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, + 349, -1, 351, -1, -1, 354, 355, 356, 357, 358, + -1, -1, 361, 362, 363, 364, 365, -1, -1, -1, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, -1, -1, -1, -1, 385, -1, 387, -1, + 389, 390, -1, 392, 393, 394, 395, 396, 397, -1, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, 413, -1, 415, 416, 417, 418, + 419, 420, 421, -1, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + -1, -1, -1, 442, -1, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, -1, -1, -1, + -1, -1, 461, 462, 463, 464, 465, 466, -1, 468, + 469, -1, 471, 472, -1, -1, 475, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, -1, + 489, 490, 491, 492, 493, 494, 495, 496, 497, -1, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, -1, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, -1, -1, 585, -1, 587, 588, + -1, 590, 591, 592, 593, -1, 595, 596, 597, 598, + -1, -1, -1, -1, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + -1, 630, -1, 632, 633, 634, -1, 636, 637, -1, + 639, 640, 641, 642, 643, 644, -1, 646, 647, 648, + 649, 650, 651, 652, -1, 654, 655, 656, -1, 658, + 659, 660, 661, -1, 663, 664, -1, -1, 667, 668, + -1, -1, 671, 672, 673, -1, 675, -1, 677, 678, + 679, 680, -1, 682, 683, 684, 685, -1, 687, 688, + -1, 690, -1, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, -1, 713, 714, 715, 716, 717, 718, + 719, 720, 721, -1, 723, 724, -1, 726, 727, 728, + 729, 19, 20, 732, 733, -1, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, -1, -1, 752, 753, -1, -1, 756, -1, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 68, -1, -1, -1, -1, -1, -1, -1, -1, 77, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, 123, -1, -1, -1, 127, + -1, -1, 130, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, 141, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 157, + -1, -1, -1, -1, -1, -1, -1, 165, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 177, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, 246, 247, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 313, -1, -1, -1, -1, + 318, 319, 320, 321, 322, -1, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, -1, 342, 343, 344, 345, 346, 347, + 348, 349, -1, 351, -1, -1, 354, 355, 356, 357, + 358, -1, -1, 361, 362, 363, 364, 365, -1, -1, + -1, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, -1, -1, -1, -1, 385, -1, 387, + -1, 389, 390, -1, 392, 393, 394, 395, 396, 397, + -1, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, 413, -1, 415, 416, 417, + 418, 419, 420, 421, -1, 423, 424, 425, 426, -1, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, -1, -1, -1, 442, -1, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, + -1, -1, -1, 461, 462, 463, 464, 465, 466, -1, + 468, 469, -1, 471, 472, -1, -1, 475, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + -1, 489, 490, 491, 492, 493, 494, 495, 496, 497, + -1, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + -1, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, -1, -1, 585, -1, 587, + 588, -1, 590, 591, 592, 593, -1, 595, 596, 597, + 598, -1, -1, -1, -1, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, -1, 630, -1, 632, 633, 634, -1, 636, 637, + -1, 639, 640, 641, 642, 643, 644, -1, 646, 647, + 648, 649, 650, 651, 652, -1, 654, 655, 656, -1, + 658, 659, 660, 661, -1, 663, 664, -1, -1, 667, + 668, -1, -1, 671, 672, 673, -1, 675, -1, 677, + 678, 679, 680, -1, 682, 683, 684, 685, -1, 687, + 688, -1, 690, -1, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, -1, 713, 714, 715, 716, 717, + 718, 719, 720, 721, -1, 723, 724, -1, 726, 727, + 728, 729, 19, 20, 732, 733, -1, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, -1, -1, 752, 753, -1, -1, 756, -1, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 68, -1, -1, -1, -1, -1, -1, -1, -1, + 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, 123, -1, -1, -1, + 127, -1, -1, 130, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 157, -1, -1, -1, -1, -1, -1, -1, 165, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 177, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, 246, + 247, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 313, -1, -1, -1, + -1, 318, 319, 320, 321, 322, -1, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, -1, 342, 343, 344, 345, 346, + 347, 348, 349, -1, 351, -1, -1, 354, 355, 356, + 357, 358, -1, -1, 361, 362, 363, 364, 365, -1, + -1, -1, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, -1, -1, -1, -1, -1, -1, 385, -1, + 387, -1, 389, 390, -1, 392, 393, 394, 395, 396, + 397, -1, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, -1, 413, -1, 415, 416, + 417, 418, 419, 420, 421, -1, 423, 424, 425, 426, + -1, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, -1, -1, -1, 442, -1, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, + -1, -1, -1, -1, 461, 462, 463, 464, 465, 466, + -1, 468, 469, -1, 471, 472, -1, -1, 475, -1, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, -1, 489, 490, 491, 492, 493, 494, 495, 496, + 497, -1, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, -1, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, -1, -1, 585, -1, + 587, 588, -1, 590, 591, 592, 593, -1, 595, 596, + 597, 598, -1, -1, -1, -1, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, -1, 630, -1, 632, 633, 634, -1, 636, + 637, -1, 639, 640, 641, 642, 643, 644, -1, 646, + 647, 648, 649, 650, 651, 652, -1, 654, 655, 656, + -1, 658, 659, 660, 661, -1, 663, 664, -1, -1, + 667, 668, -1, -1, 671, 672, 673, -1, 675, -1, + 677, 678, 679, 680, -1, 682, 683, 684, 685, -1, + 687, 688, -1, 690, -1, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, -1, 713, 714, 715, 716, + 717, 718, 719, 720, 721, -1, 723, 724, -1, 726, + 727, 728, 729, 19, 20, 732, 733, -1, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, -1, -1, 752, 753, -1, -1, 756, + -1, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 68, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 127, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 177, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + 246, 247, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, -1, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, -1, 342, 343, 344, 345, + 346, 347, 348, 349, -1, 351, -1, -1, 354, 355, + 356, 357, 358, -1, -1, 361, 362, 363, 364, 365, + -1, -1, -1, 369, 370, 371, 372, 373, -1, 375, + 376, 377, 378, -1, -1, -1, -1, -1, -1, 385, + -1, 387, -1, 389, 390, -1, 392, 393, 394, 395, + 396, 397, -1, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, 413, -1, 415, + 416, 417, 418, 419, 420, 421, -1, 423, 424, 425, + 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, -1, -1, -1, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + -1, -1, -1, -1, -1, 461, 462, 463, 464, 465, + 466, -1, 468, 469, -1, 471, 472, -1, -1, 475, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, -1, 489, 490, 491, 492, 493, 494, 495, + 496, 497, -1, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, -1, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, -1, -1, -1, 585, + -1, 587, 588, -1, 590, 591, 592, 593, -1, 595, + 596, 597, 598, -1, -1, -1, -1, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, -1, 630, -1, 632, 633, 634, -1, + 636, 637, -1, 639, 640, 641, 642, 643, 644, -1, + 646, 647, 648, 649, 650, 651, 652, -1, 654, 655, + 656, -1, 658, 659, 660, 661, -1, 663, 664, 19, + 20, 667, 668, -1, -1, 671, 672, 673, -1, 675, + -1, 677, 678, 679, 680, -1, 682, 683, 684, 685, + -1, 687, 688, -1, 690, -1, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, -1, 713, 714, 715, + 716, 717, 718, 719, 720, 721, -1, 723, 724, -1, + 726, 727, 728, 729, -1, -1, 732, 733, 88, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, -1, -1, 752, 753, -1, -1, + 756, -1, 758, 759, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 311, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, -1, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, -1, 342, 343, 344, 345, 346, 347, 348, 349, + -1, -1, -1, -1, 354, 355, 356, 357, 358, -1, + -1, 361, 362, 363, 364, 365, -1, -1, -1, 369, + 370, 371, 372, 373, -1, 375, 376, 377, 378, -1, + -1, -1, -1, -1, -1, 385, -1, 387, -1, 389, + 390, -1, 392, 393, 394, 395, 396, 397, -1, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, 413, -1, 415, 416, 417, 418, 419, + 420, 421, -1, 423, 424, 425, 426, -1, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, -1, + -1, -1, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, -1, -1, -1, -1, + -1, 461, 462, 463, 464, 465, 466, -1, 468, 469, + -1, 471, 472, -1, -1, 475, -1, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, -1, 489, + 490, 491, 492, 493, 494, 495, 496, 497, -1, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, -1, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, -1, -1, -1, 585, -1, 587, 588, -1, + 590, 591, 592, 593, -1, 595, 596, 597, 598, -1, + -1, -1, -1, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, -1, + 630, -1, 632, 633, 634, -1, 636, 637, -1, 639, + 640, 641, 642, 643, 644, -1, 646, 647, 648, 649, + 650, 651, 652, -1, 654, 655, 656, -1, 658, 659, + 660, 661, -1, 663, 664, 19, 20, 667, 668, -1, + -1, 671, 672, 673, -1, 675, -1, 677, 678, 679, + 680, -1, 682, 683, 684, 685, -1, 687, 688, -1, + 690, -1, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, -1, 713, 714, 715, 716, 717, 718, 719, + 720, 721, -1, 723, 724, -1, 726, 727, 728, 729, + -1, -1, 732, 733, 88, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + -1, -1, 752, 753, -1, -1, 756, -1, 758, 759, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 311, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, -1, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, -1, 342, 343, + 344, 345, 346, 347, 348, 349, -1, -1, -1, -1, + 354, 355, 356, 357, 358, -1, -1, 361, 362, 363, + 364, 365, -1, -1, -1, 369, 370, 371, 372, 373, + -1, 375, 376, 377, 378, -1, -1, -1, -1, -1, + -1, 385, -1, 387, -1, 389, 390, -1, 392, 393, + 394, 395, 396, 397, -1, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, 413, + -1, 415, 416, 417, 418, 419, 420, 421, -1, 423, + 424, 425, 426, -1, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, -1, -1, -1, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, -1, -1, -1, -1, -1, 461, 462, 463, + 464, 465, 466, -1, 468, 469, -1, 471, 472, -1, + -1, 475, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, -1, 489, 490, 491, 492, 493, + 494, 495, 496, 497, -1, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, -1, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, -1, -1, + -1, 585, -1, 587, 588, -1, 590, 591, 592, 593, + -1, 595, 596, 597, 598, -1, -1, -1, -1, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, -1, 630, -1, 632, 633, + 634, -1, 636, 637, -1, 639, 640, 641, 642, 643, + 644, -1, 646, 647, 648, 649, 650, 651, 652, -1, + 654, 655, 656, -1, 658, 659, 660, 661, -1, 663, + 664, 19, 20, 667, 668, -1, -1, 671, 672, 673, + -1, 675, -1, 677, 678, 679, 680, -1, 682, 683, + 684, 685, -1, 687, 688, -1, 690, -1, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, -1, 713, + 714, 715, 716, 717, 718, 719, 720, 721, -1, 723, + 724, -1, 726, 727, 728, 729, -1, -1, 732, 733, + 88, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, -1, -1, 752, 753, + -1, -1, 756, -1, 758, 759, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, -1, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, -1, 342, 343, 344, 345, 346, 347, + 348, 349, -1, -1, -1, -1, 354, 355, 356, 357, + 358, -1, -1, 361, 362, 363, 364, 365, -1, -1, + -1, 369, 370, 371, 372, 373, -1, 375, 376, 377, + 378, -1, -1, -1, -1, -1, -1, 385, -1, 387, + -1, 389, 390, -1, 392, 393, 394, 395, 396, 397, + -1, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, 413, -1, 415, 416, 417, + 418, 419, 420, 421, -1, 423, 424, 425, 426, -1, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, -1, -1, -1, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, + -1, -1, -1, 461, 462, 463, 464, 465, 466, -1, + 468, 469, -1, 471, 472, -1, -1, 475, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + -1, 489, 490, 491, 492, 493, 494, 495, 496, 497, + -1, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + -1, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, -1, -1, -1, 585, -1, 587, + 588, -1, 590, 591, 592, 593, -1, 595, 596, 597, + 598, -1, -1, -1, -1, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, -1, 630, -1, 632, 633, 634, -1, 636, 637, + -1, 639, 640, 641, 642, 643, 644, -1, 646, 647, + 648, 649, 650, 651, 652, -1, 654, 655, 656, -1, + 658, 659, 660, 661, -1, 663, 664, -1, -1, 667, + 668, -1, -1, 671, 672, 673, -1, 675, -1, 677, + 678, 679, 680, -1, 682, 683, 684, 685, -1, 687, + 688, -1, 690, -1, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, -1, 713, 714, 715, 716, 717, + 718, 719, 720, 721, -1, 723, 724, -1, 726, 727, + 728, 729, -1, -1, 732, 733, -1, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 19, 20, 752, 753, -1, -1, 756, -1, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, -1, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, -1, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + -1, 128, 129, 130, 131, 132, -1, -1, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, -1, -1, -1, + 177, 178, 179, 180, 181, 182, 183, -1, -1, -1, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, -1, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, -1, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, -1, 259, 260, -1, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, -1, -1, -1, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, -1, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, -1, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, -1, 355, -1, + -1, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, -1, -1, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, -1, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, -1, 456, + 457, 458, -1, 460, 461, 462, -1, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, -1, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, -1, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, -1, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, -1, -1, -1, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, -1, -1, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, -1, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, -1, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, -1, 711, 712, -1, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, -1, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, -1, 751, 752, 753, 754, -1, 756, + 757, 758 +}; + +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ +static const yytype_int16 yystos[] = +{ + 0, 5, 7, 48, 49, 66, 68, 70, 72, 80, + 101, 103, 104, 110, 127, 131, 141, 150, 161, 171, + 173, 177, 204, 216, 217, 227, 228, 239, 240, 241, + 243, 248, 254, 258, 259, 260, 294, 296, 298, 305, + 313, 314, 328, 350, 351, 353, 360, 368, 388, 412, + 422, 441, 456, 467, 470, 473, 488, 602, 631, 635, + 645, 653, 665, 686, 689, 722, 731, 757, 779, 790, + 793, 794, 795, 796, 797, 799, 805, 807, 822, 869, + 908, 909, 916, 917, 930, 965, 990, 1008, 1070, 1123, + 1224, 1277, 1280, 1290, 1295, 1301, 1314, 1317, 1323, 1326, + 1331, 1338, 1350, 1353, 1356, 1357, 1359, 1362, 1363, 1365, + 1366, 1369, 1370, 1373, 1610, 1612, 1625, 1628, 1666, 1675, + 1693, 1701, 1715, 1719, 1720, 1724, 1725, 1735, 1742, 1750, + 1752, 1758, 1761, 1762, 1794, 1849, 1890, 1897, 1899, 1908, + 1911, 1947, 1949, 1954, 1955, 1956, 1957, 1982, 1991, 1992, + 1993, 1995, 2023, 2024, 2034, 2039, 88, 226, 338, 413, + 463, 658, 662, 735, 1225, 1961, 1962, 1963, 1964, 197, + 460, 506, 1325, 1722, 19, 20, 88, 116, 135, 144, + 188, 195, 207, 218, 279, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 756, + 757, 758, 759, 1816, 1818, 1827, 1834, 1838, 1839, 1840, + 1841, 1842, 1843, 1844, 1845, 1846, 1847, 2001, 966, 528, + 1318, 208, 1676, 88, 145, 226, 289, 436, 463, 644, + 662, 708, 735, 743, 1624, 993, 860, 931, 1626, 1753, + 145, 408, 758, 1767, 281, 704, 1893, 991, 1325, 1124, + 1009, 57, 528, 1707, 258, 267, 905, 910, 912, 1827, + 653, 735, 1893, 995, 910, 911, 860, 1360, 1850, 1702, + 910, 1898, 1667, 1827, 1358, 992, 235, 1796, 1629, 173, + 294, 684, 1736, 40, 196, 1406, 1948, 3, 31, 1821, + 145, 1893, 753, 1951, 1611, 482, 1827, 1325, 403, 918, + 1900, 806, 598, 676, 1827, 1325, 1743, 1951, 1827, 1759, + 47, 669, 717, 47, 669, 1694, 598, 676, 351, 352, + 388, 427, 602, 619, 645, 686, 1985, 1359, 1366, 1369, + 0, 7, 791, 602, 88, 129, 145, 262, 293, 644, + 735, 839, 1202, 1203, 1624, 1961, 1962, 1963, 1964, 128, + 154, 1376, 1377, 1606, 1354, 1351, 119, 152, 292, 1368, + 1958, 1367, 1958, 448, 460, 591, 787, 1721, 1722, 1813, + 1827, 1363, 1365, 386, 1244, 1827, 863, 1827, 763, 763, + 863, 141, 1623, 21, 1821, 1827, 1829, 1623, 1269, 1270, + 268, 1394, 1965, 1966, 1961, 763, 1893, 1350, 1353, 1625, + 1628, 1666, 1675, 1718, 787, 870, 311, 946, 947, 967, + 970, 973, 818, 819, 1821, 743, 1315, 1893, 328, 143, + 178, 475, 614, 1678, 1691, 1692, 1623, 1614, 1623, 1623, + 1623, 1623, 1623, 1623, 1623, 1623, 658, 1893, 978, 1827, + 2005, 47, 48, 80, 84, 101, 110, 131, 145, 150, + 173, 232, 236, 254, 258, 259, 289, 296, 297, 353, + 393, 436, 441, 452, 453, 607, 611, 617, 628, 634, + 665, 669, 698, 1829, 1912, 1916, 1917, 1918, 1920, 1922, + 1923, 1924, 1925, 946, 961, 1631, 471, 675, 1754, 154, + 1763, 1891, 77, 123, 130, 144, 157, 165, 246, 247, + 321, 351, 374, 444, 463, 582, 887, 932, 933, 934, + 935, 937, 940, 943, 944, 945, 955, 956, 957, 958, + 959, 980, 983, 1818, 1828, 1841, 1842, 1843, 1847, 2002, + 2010, 2011, 2012, 2032, 2033, 2034, 2035, 2037, 1893, 3, + 8, 9, 19, 20, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 40, 57, 58, 59, 60, + 68, 69, 71, 78, 79, 82, 83, 84, 85, 87, + 90, 91, 99, 102, 120, 121, 122, 124, 132, 133, + 134, 141, 150, 153, 162, 164, 166, 180, 181, 183, + 187, 192, 196, 198, 199, 200, 201, 219, 220, 221, + 223, 230, 241, 249, 250, 268, 275, 276, 278, 279, + 290, 300, 301, 302, 308, 309, 327, 328, 329, 330, + 334, 341, 349, 366, 379, 381, 382, 383, 398, 410, + 411, 466, 478, 500, 501, 546, 552, 561, 562, 585, + 593, 605, 649, 656, 663, 694, 713, 714, 715, 716, + 721, 722, 735, 737, 749, 751, 759, 768, 769, 774, + 779, 783, 784, 787, 1369, 1375, 1400, 1401, 1402, 1403, + 1407, 1418, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1432, + 1433, 1434, 1442, 1448, 1449, 1450, 1451, 1452, 1454, 1457, + 1786, 1789, 1791, 1792, 1793, 1810, 1817, 1819, 1820, 1827, + 1834, 1845, 1846, 65, 1010, 510, 250, 362, 370, 385, + 395, 396, 397, 405, 543, 555, 655, 693, 707, 913, + 915, 737, 906, 912, 1827, 860, 1623, 887, 981, 912, + 47, 333, 611, 1909, 1910, 1918, 1920, 47, 106, 264, + 266, 277, 293, 474, 679, 680, 681, 682, 1379, 1386, + 1387, 1960, 3, 71, 99, 144, 321, 366, 463, 468, + 506, 556, 577, 593, 644, 661, 687, 717, 750, 1167, + 1816, 1825, 1836, 1838, 1839, 1840, 1842, 1843, 1844, 1847, + 1851, 1861, 1872, 2001, 47, 49, 79, 80, 89, 145, + 159, 214, 226, 281, 324, 344, 353, 366, 377, 400, + 430, 433, 435, 462, 463, 468, 469, 485, 506, 528, + 582, 597, 606, 609, 610, 624, 661, 669, 690, 747, + 1167, 1201, 1703, 1707, 1708, 1710, 1719, 1818, 1862, 912, + 1893, 178, 1674, 779, 1645, 1654, 946, 2007, 1795, 1631, + 1737, 1827, 343, 1951, 1829, 1332, 1291, 50, 1952, 1400, + 1473, 800, 299, 802, 1726, 417, 1813, 1815, 1827, 1901, + 1829, 141, 1069, 1821, 128, 1296, 528, 613, 669, 1744, + 1745, 287, 1952, 746, 1760, 670, 818, 232, 314, 1281, + 1282, 1283, 670, 818, 281, 1696, 1623, 1623, 23, 26, + 27, 31, 1787, 1788, 1822, 1984, 1984, 1984, 460, 1983, + 1984, 1984, 780, 780, 786, 1827, 1069, 1069, 145, 1069, + 1069, 662, 844, 145, 145, 281, 658, 226, 289, 436, + 1965, 337, 861, 861, 1961, 111, 135, 779, 784, 1375, + 1378, 1478, 1481, 1493, 1496, 1497, 1498, 1509, 1510, 1511, + 1512, 1514, 1515, 1516, 1813, 211, 423, 1601, 1602, 1607, + 312, 1539, 1376, 123, 127, 168, 173, 206, 577, 1388, + 1564, 1569, 1570, 1579, 1580, 1584, 226, 1583, 1596, 1606, + 47, 106, 1959, 1959, 1959, 1579, 1581, 1369, 1372, 1373, + 1580, 1582, 1371, 47, 1827, 1717, 127, 1716, 787, 1355, + 1352, 42, 763, 1648, 1649, 1227, 734, 1229, 787, 542, + 709, 727, 85, 1829, 1830, 1831, 1916, 1230, 120, 1235, + 1234, 860, 281, 143, 581, 1271, 1272, 1273, 657, 436, + 743, 1965, 1829, 1302, 1827, 779, 873, 946, 968, 1400, + 114, 975, 973, 287, 1316, 1617, 1618, 1813, 128, 1679, + 128, 1679, 1680, 1681, 1688, 1689, 1827, 1691, 1827, 141, + 1622, 863, 863, 863, 1827, 860, 1829, 860, 1615, 1623, + 1623, 994, 151, 979, 606, 1921, 647, 647, 705, 708, + 735, 743, 779, 1399, 475, 584, 704, 580, 735, 89, + 743, 333, 551, 633, 333, 333, 203, 333, 371, 528, + 669, 551, 287, 203, 782, 779, 283, 427, 178, 414, + 474, 1633, 1635, 393, 613, 1755, 1756, 360, 178, 392, + 1769, 1813, 1894, 1895, 311, 1828, 128, 136, 561, 1827, + 1828, 1828, 1828, 2038, 1827, 311, 1828, 1827, 427, 2033, + 1995, 1996, 946, 960, 1827, 788, 127, 177, 241, 313, + 351, 786, 1324, 1458, 19, 20, 30, 1817, 1834, 31, + 1788, 153, 768, 769, 1425, 779, 779, 779, 311, 1400, + 1476, 1477, 779, 779, 779, 779, 779, 1399, 1399, 1399, + 779, 1398, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 779, 779, 779, 779, 1400, 779, 779, 779, 8, + 779, 1474, 1475, 1810, 1817, 779, 779, 779, 779, 1400, + 1398, 779, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 15, 779, 779, 779, 779, 1399, 1398, 1398, 779, + 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 779, 779, 779, 31, 779, 779, 779, 779, 779, + 779, 779, 779, 737, 779, 779, 779, 737, 779, 779, + 779, 779, 31, 779, 779, 779, 31, 779, 779, 779, + 779, 779, 779, 779, 779, 153, 1425, 153, 1425, 1425, + 1125, 1369, 1400, 1794, 1827, 1817, 33, 41, 50, 208, + 315, 1404, 1405, 35, 36, 37, 39, 156, 763, 764, + 765, 1408, 55, 151, 167, 238, 677, 1406, 14, 43, + 44, 107, 192, 766, 767, 768, 769, 770, 771, 772, + 773, 1425, 73, 38, 213, 213, 751, 1822, 787, 779, + 15, 1011, 54, 287, 782, 763, 1822, 1328, 1830, 1832, + 1327, 733, 1921, 584, 203, 128, 203, 1361, 1387, 3, + 1829, 258, 644, 787, 57, 99, 1168, 1169, 1648, 1829, + 127, 1648, 1648, 1917, 99, 1817, 1855, 1864, 1852, 57, + 99, 1171, 1172, 1829, 787, 1648, 1853, 782, 670, 1722, + 779, 88, 214, 226, 281, 289, 324, 436, 463, 658, + 735, 743, 167, 312, 1714, 63, 688, 376, 688, 688, + 318, 688, 435, 688, 1714, 47, 1082, 1829, 1568, 1569, + 1574, 128, 151, 1709, 1711, 376, 688, 127, 688, 704, + 676, 47, 355, 399, 401, 491, 541, 588, 678, 700, + 1697, 1698, 1699, 818, 477, 818, 1574, 1714, 1711, 510, + 429, 378, 608, 704, 720, 1722, 1393, 688, 740, 143, + 1268, 1655, 782, 422, 1797, 1798, 1805, 1827, 1634, 1635, + 1813, 2040, 782, 1333, 1334, 1335, 1336, 1813, 1617, 363, + 568, 239, 568, 1953, 782, 1400, 803, 57, 270, 416, + 430, 432, 464, 477, 510, 528, 606, 613, 623, 637, + 669, 672, 688, 719, 1727, 1732, 1733, 1818, 1893, 3, + 74, 919, 920, 921, 922, 1817, 582, 232, 374, 1406, + 1827, 798, 743, 1293, 1893, 1747, 360, 1746, 782, 653, + 1827, 1953, 127, 1284, 1285, 1284, 580, 755, 394, 782, + 1284, 1284, 1618, 1827, 1821, 782, 579, 1987, 699, 1988, + 763, 158, 639, 1986, 7, 792, 1827, 826, 1069, 860, + 860, 1069, 830, 832, 1069, 1069, 1069, 837, 838, 743, + 463, 463, 1965, 779, 1478, 1498, 1510, 1511, 1512, 1513, + 1514, 1827, 10, 1384, 81, 147, 158, 166, 193, 249, + 277, 1505, 1506, 782, 217, 1507, 1508, 31, 1823, 1823, + 3, 1603, 1604, 1605, 1827, 1829, 1540, 136, 1543, 1539, + 454, 561, 1571, 296, 8, 28, 30, 32, 251, 1575, + 1576, 1789, 1817, 151, 65, 1576, 1568, 1388, 1827, 1388, + 1389, 1389, 1372, 1718, 393, 1723, 1787, 1827, 1827, 1580, + 1583, 1821, 99, 386, 1066, 1067, 1079, 1080, 1175, 408, + 864, 1827, 1399, 3, 864, 1813, 583, 1830, 1831, 1832, + 1931, 1935, 1623, 1273, 413, 489, 863, 1813, 743, 1303, + 1304, 1618, 787, 871, 874, 875, 1400, 974, 311, 969, + 971, 887, 1998, 427, 808, 1617, 127, 364, 448, 450, + 540, 614, 782, 1319, 1320, 1321, 1813, 54, 1677, 1620, + 1621, 1814, 1827, 127, 1382, 1383, 1539, 782, 1682, 787, + 1690, 120, 1827, 787, 1915, 1918, 1832, 1930, 1617, 1616, + 1613, 422, 2009, 643, 977, 704, 780, 333, 1832, 333, + 333, 1931, 214, 226, 281, 463, 862, 1919, 353, 393, + 436, 441, 452, 453, 607, 617, 628, 634, 665, 669, + 698, 1923, 1925, 1803, 1804, 1817, 962, 141, 1268, 479, + 735, 1400, 1757, 1757, 1339, 506, 1768, 53, 763, 1535, + 1536, 1537, 572, 746, 782, 1892, 946, 311, 1827, 561, + 128, 154, 1994, 2028, 946, 311, 779, 954, 177, 786, + 936, 782, 986, 984, 989, 985, 2036, 1617, 3, 1459, + 1829, 787, 779, 47, 1467, 1538, 1467, 1467, 1400, 1477, + 114, 311, 427, 1400, 1473, 1400, 106, 1467, 1538, 780, + 24, 25, 26, 28, 30, 32, 780, 1588, 1592, 1593, + 1400, 1400, 1810, 780, 1364, 1365, 1374, 1794, 92, 93, + 94, 95, 138, 139, 140, 189, 190, 253, 316, 411, + 478, 544, 546, 552, 612, 656, 748, 759, 1532, 1533, + 1400, 106, 1460, 1460, 1447, 1400, 1400, 1400, 1532, 1400, + 1400, 1400, 1817, 1475, 336, 782, 787, 106, 1467, 1400, + 106, 1467, 1400, 1400, 1400, 1400, 1400, 780, 1403, 780, + 1400, 1400, 780, 648, 1467, 1467, 106, 1467, 780, 1588, + 1467, 1467, 780, 1400, 1400, 1429, 1430, 1431, 64, 163, + 288, 1400, 1419, 1420, 1421, 1400, 1400, 106, 1467, 1400, + 1400, 1400, 1415, 1416, 1400, 1400, 1472, 1473, 1400, 1400, + 409, 410, 713, 716, 1534, 1400, 1400, 1473, 1813, 1400, + 1400, 127, 1813, 1472, 1400, 127, 1400, 1400, 1813, 1400, + 1400, 1533, 1533, 1400, 1419, 1400, 780, 8, 787, 1811, + 1827, 1400, 1472, 1400, 1400, 1400, 780, 782, 1365, 1400, + 787, 1400, 1400, 1400, 1402, 122, 201, 290, 732, 1406, + 47, 340, 1402, 1409, 1402, 779, 1375, 1402, 1402, 167, + 55, 151, 167, 238, 1403, 1403, 1403, 1403, 1403, 1403, + 1403, 153, 1403, 153, 1403, 1403, 1403, 1403, 1403, 1173, + 1829, 1425, 779, 1456, 1549, 1827, 779, 136, 328, 329, + 330, 1817, 1435, 461, 493, 567, 648, 1417, 169, 229, + 505, 703, 1012, 1016, 1751, 1821, 915, 410, 713, 716, + 914, 1457, 1791, 1810, 782, 287, 1329, 1330, 1813, 946, + 782, 127, 1832, 1831, 1932, 862, 1919, 770, 1391, 1392, + 1394, 468, 506, 661, 1863, 1648, 1918, 1827, 73, 1400, + 1882, 1881, 1880, 787, 787, 1648, 782, 1854, 232, 492, + 1883, 1884, 1885, 1886, 1827, 1873, 99, 717, 1817, 1856, + 1868, 1858, 1859, 1861, 1872, 688, 127, 770, 1069, 63, + 863, 863, 1813, 863, 318, 863, 863, 863, 1813, 1832, + 1813, 1393, 1393, 376, 688, 1714, 863, 1714, 1709, 376, + 688, 1714, 151, 1712, 510, 553, 688, 1706, 1706, 1714, + 1827, 863, 1714, 1831, 1709, 1714, 1821, 490, 701, 451, + 127, 1700, 782, 435, 688, 1813, 1711, 1709, 1709, 127, + 1714, 1714, 1714, 1481, 1665, 1813, 1394, 1657, 1659, 779, + 1652, 2008, 782, 779, 1801, 154, 1636, 2028, 3, 151, + 782, 217, 1344, 1346, 1347, 448, 614, 1292, 363, 239, + 1400, 801, 99, 143, 804, 1400, 1660, 1661, 510, 510, + 510, 510, 360, 510, 818, 510, 782, 1393, 1728, 1829, + 914, 924, 782, 763, 1536, 1902, 120, 676, 1400, 1294, + 1617, 287, 1749, 818, 1745, 1827, 47, 1279, 627, 683, + 1286, 1287, 127, 820, 821, 673, 1283, 820, 1892, 1787, + 596, 1989, 1829, 834, 1827, 828, 1915, 1931, 1829, 1069, + 1069, 823, 1813, 2025, 1394, 1974, 848, 1394, 1069, 1069, + 1069, 743, 1494, 782, 780, 780, 780, 780, 780, 782, + 780, 1478, 47, 53, 55, 128, 1385, 1537, 158, 158, + 210, 1517, 166, 249, 1505, 1517, 1478, 1496, 779, 1384, + 1608, 1829, 782, 787, 1400, 65, 137, 1541, 1543, 251, + 649, 1572, 1576, 572, 668, 746, 1390, 1817, 439, 251, + 577, 782, 787, 664, 1565, 649, 1572, 1597, 1400, 1228, + 1649, 1067, 73, 1167, 418, 191, 231, 268, 386, 398, + 498, 568, 866, 868, 1632, 1829, 1632, 1236, 779, 480, + 242, 782, 1939, 1813, 1233, 1232, 1813, 782, 595, 1305, + 1827, 873, 780, 782, 283, 946, 971, 68, 108, 142, + 179, 481, 511, 512, 514, 515, 516, 517, 518, 520, + 521, 522, 523, 524, 525, 526, 527, 529, 530, 531, + 532, 625, 626, 809, 810, 817, 127, 1322, 734, 1618, + 1320, 1507, 703, 782, 1684, 787, 1690, 222, 1563, 1564, + 1689, 128, 770, 1827, 203, 1827, 782, 782, 67, 244, + 1274, 1617, 1617, 887, 779, 948, 951, 287, 314, 1914, + 63, 770, 1813, 1827, 1929, 1929, 780, 782, 887, 1997, + 1636, 1400, 1832, 1340, 1341, 1342, 1343, 1813, 146, 144, + 321, 463, 1818, 1824, 1833, 1838, 1839, 1840, 1841, 1842, + 1843, 1844, 1847, 2001, 178, 232, 755, 1896, 26, 769, + 1585, 1587, 1895, 941, 946, 154, 649, 1827, 97, 886, + 2029, 938, 946, 948, 949, 953, 1827, 978, 980, 981, + 2007, 2028, 1892, 1863, 42, 1817, 1400, 780, 1468, 780, + 780, 283, 427, 1400, 1400, 53, 299, 780, 299, 782, + 1443, 780, 770, 780, 782, 782, 780, 780, 1365, 128, + 780, 1445, 1446, 1400, 782, 782, 782, 769, 780, 782, + 780, 782, 782, 780, 779, 1810, 1817, 1467, 780, 780, + 1467, 780, 782, 782, 780, 780, 780, 151, 782, 782, + 780, 780, 1467, 780, 780, 780, 780, 782, 128, 782, + 780, 128, 1400, 128, 1400, 128, 1400, 128, 780, 782, + 780, 1467, 780, 780, 782, 782, 780, 782, 782, 782, + 780, 780, 780, 782, 780, 780, 782, 780, 780, 780, + 1813, 780, 780, 780, 1813, 782, 780, 782, 782, 780, + 782, 782, 782, 780, 780, 782, 1817, 1827, 780, 787, + 53, 504, 782, 1190, 780, 780, 1532, 1532, 1473, 780, + 785, 1817, 122, 201, 290, 732, 779, 50, 1400, 434, + 1402, 1402, 779, 1375, 1402, 1402, 1400, 1400, 1550, 217, + 1552, 779, 779, 779, 779, 779, 787, 1394, 1439, 1440, + 1441, 378, 779, 1021, 1022, 1014, 1021, 1015, 591, 1024, + 160, 472, 1400, 763, 1832, 1832, 782, 1892, 427, 131, + 1918, 128, 782, 1929, 1929, 782, 1400, 1808, 1817, 787, + 787, 787, 99, 144, 321, 463, 577, 750, 1818, 1821, + 1826, 1835, 1838, 1839, 1840, 1841, 1843, 1844, 1847, 2001, + 1876, 127, 1648, 99, 1173, 1174, 1832, 31, 578, 593, + 1888, 47, 57, 99, 203, 1400, 1889, 1827, 1827, 1865, + 1864, 127, 580, 755, 504, 782, 782, 1648, 1889, 787, + 1857, 787, 1648, 782, 782, 1860, 1400, 780, 1827, 863, + 863, 1821, 1400, 863, 1714, 1714, 863, 1714, 1821, 128, + 1713, 860, 1714, 613, 1574, 1699, 1712, 820, 1709, 1813, + 1714, 1714, 1400, 258, 1507, 1661, 780, 782, 1653, 887, + 1798, 1802, 1804, 53, 1637, 1638, 886, 1829, 99, 1337, + 1827, 1335, 1813, 1007, 1346, 145, 160, 1199, 1348, 802, + 782, 100, 1738, 818, 1733, 1617, 1734, 922, 925, 926, + 921, 573, 574, 650, 923, 454, 561, 1827, 1903, 1904, + 1821, 1617, 448, 614, 736, 1297, 1298, 1299, 1587, 47, + 1748, 670, 782, 365, 1278, 1695, 782, 127, 1990, 1065, + 1066, 299, 723, 1211, 1827, 314, 1913, 1939, 845, 1827, + 1827, 1813, 825, 863, 2020, 1069, 1069, 1813, 863, 1827, + 863, 1069, 1400, 1478, 1478, 785, 576, 713, 717, 1380, + 1381, 1427, 1381, 158, 1517, 1517, 1509, 158, 203, 299, + 1531, 1827, 1536, 1167, 1170, 1604, 1827, 1400, 1544, 1809, + 1542, 750, 1546, 1541, 314, 580, 1573, 1572, 507, 1587, + 1576, 1577, 439, 1576, 1576, 1817, 549, 1566, 1809, 123, + 779, 1065, 1821, 1649, 1649, 557, 268, 268, 657, 1821, + 268, 268, 268, 182, 360, 406, 484, 547, 563, 564, + 568, 569, 570, 636, 686, 841, 842, 88, 476, 586, + 593, 599, 674, 735, 846, 847, 65, 314, 742, 1933, + 270, 369, 494, 566, 695, 756, 1927, 1928, 1935, 314, + 1942, 1892, 203, 856, 1241, 779, 1967, 1231, 1304, 127, + 872, 1400, 1998, 972, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, 763, 782, + 820, 734, 1381, 1621, 1827, 299, 1827, 576, 168, 1578, + 1481, 787, 1690, 1813, 1918, 1832, 1892, 427, 898, 899, + 952, 34, 1931, 333, 787, 787, 287, 287, 1803, 963, + 1637, 782, 1344, 1346, 1823, 755, 506, 392, 24, 25, + 28, 30, 32, 942, 154, 76, 77, 144, 443, 444, + 463, 750, 892, 893, 895, 901, 928, 929, 1818, 1838, + 1839, 1840, 1841, 1842, 1843, 1844, 1847, 2001, 2003, 2014, + 2030, 427, 2033, 786, 939, 950, 780, 782, 987, 976, + 982, 1828, 982, 982, 886, 1826, 1400, 782, 1400, 1400, + 283, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 57, 58, 59, 60, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 87, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, + 132, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 177, + 178, 179, 180, 181, 182, 183, 187, 189, 190, 191, + 192, 193, 194, 196, 197, 198, 199, 200, 201, 203, + 204, 205, 206, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 259, 260, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 280, 281, 282, 283, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 328, 329, 330, 409, 410, 559, + 577, 666, 716, 739, 1131, 1469, 1470, 1471, 1818, 1837, + 1838, 1839, 1840, 1841, 1842, 1847, 1848, 1999, 2000, 2001, + 1168, 1168, 1469, 1473, 780, 153, 153, 1400, 1473, 1473, + 782, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1403, 787, + 780, 780, 1400, 1400, 1400, 1400, 1400, 780, 1400, 1400, + 1400, 1400, 128, 1400, 128, 1400, 128, 1400, 153, 1400, + 780, 1416, 1400, 1415, 1473, 1400, 1400, 1400, 1473, 28, + 768, 1585, 1589, 153, 1400, 1400, 1400, 1400, 1400, 787, + 787, 1827, 57, 71, 1185, 1186, 1187, 1188, 1189, 1588, + 1587, 780, 769, 769, 1374, 1402, 780, 782, 1402, 50, + 1400, 434, 1532, 1532, 1551, 1827, 65, 780, 1453, 1472, + 1400, 1431, 1472, 1400, 1421, 1472, 1472, 1817, 1400, 780, + 782, 779, 1030, 1403, 1022, 168, 1060, 1061, 1588, 697, + 1025, 338, 1017, 1013, 914, 287, 1330, 287, 241, 584, + 1930, 1831, 128, 128, 1392, 1395, 1395, 787, 787, 787, + 1648, 1400, 1832, 1875, 1648, 779, 779, 1648, 1648, 1889, + 793, 232, 632, 659, 1887, 1885, 1884, 1874, 1827, 1883, + 1827, 1869, 1858, 1859, 1868, 433, 747, 1585, 1590, 1704, + 30, 1713, 1539, 1709, 1670, 1671, 1811, 1382, 1395, 1394, + 1656, 1658, 1661, 427, 780, 779, 1630, 1619, 1813, 427, + 1345, 779, 1661, 763, 820, 127, 314, 1729, 1730, 763, + 782, 36, 37, 454, 499, 561, 604, 763, 764, 765, + 1905, 1907, 1539, 127, 128, 1300, 1298, 820, 1287, 1821, + 733, 1288, 1994, 2004, 1587, 545, 358, 472, 652, 1217, + 1217, 203, 1211, 333, 1942, 126, 203, 203, 824, 840, + 841, 2021, 1975, 863, 835, 2027, 641, 2026, 1813, 782, + 1381, 31, 1403, 50, 287, 1478, 1509, 158, 158, 1478, + 1509, 1499, 1500, 780, 782, 1526, 1527, 1169, 1609, 16, + 17, 782, 1545, 51, 104, 1567, 1400, 1456, 1547, 1548, + 1546, 712, 1573, 1577, 1390, 782, 1567, 1571, 1394, 1598, + 1599, 1600, 1174, 1169, 408, 408, 413, 489, 1649, 1649, + 65, 1649, 1651, 1649, 182, 547, 314, 1649, 1650, 1650, + 842, 1237, 1821, 1821, 1821, 1821, 1587, 1821, 1821, 780, + 782, 31, 593, 1829, 1936, 1937, 31, 31, 31, 50, + 1926, 533, 534, 537, 538, 539, 1940, 1941, 331, 593, + 1240, 1226, 390, 654, 240, 1242, 1827, 1968, 53, 1967, + 47, 378, 1306, 873, 283, 779, 779, 1587, 779, 1587, + 1587, 1821, 1821, 1590, 1821, 1587, 1821, 1821, 1821, 1821, + 1821, 1821, 1821, 1587, 1821, 404, 568, 671, 1792, 122, + 290, 1587, 1595, 1821, 1587, 810, 787, 1481, 1690, 1393, + 251, 1576, 245, 1686, 1539, 1892, 1274, 127, 900, 780, + 1400, 951, 314, 1944, 584, 770, 770, 1931, 1931, 113, + 114, 115, 964, 1627, 1342, 1813, 1346, 143, 1349, 1764, + 56, 57, 61, 62, 71, 96, 109, 125, 153, 155, + 174, 175, 176, 184, 185, 186, 202, 234, 258, 261, + 284, 285, 286, 306, 307, 354, 356, 357, 373, 409, + 410, 431, 455, 496, 558, 559, 574, 575, 616, 649, + 710, 713, 716, 723, 739, 759, 1129, 1131, 1132, 1133, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, + 470, 74, 86, 782, 786, 1400, 949, 2009, 427, 787, + 1400, 1400, 779, 1150, 1151, 1153, 1153, 779, 1146, 1147, + 1151, 779, 1147, 1155, 95, 155, 1151, 1150, 1152, 1154, + 1153, 155, 1154, 1151, 780, 780, 780, 780, 1444, 1400, + 1400, 780, 206, 1462, 1462, 1400, 782, 782, 780, 782, + 780, 780, 780, 151, 1436, 1437, 1817, 780, 780, 780, + 780, 780, 782, 127, 782, 1400, 1400, 1400, 1400, 780, + 780, 53, 1410, 780, 53, 780, 780, 780, 28, 30, + 30, 780, 782, 1400, 780, 780, 782, 782, 780, 1817, + 1827, 787, 779, 1180, 1180, 51, 104, 643, 768, 1182, + 1183, 1184, 782, 782, 1400, 1400, 780, 1473, 1402, 780, + 782, 1402, 1552, 1544, 206, 1455, 780, 780, 780, 780, + 780, 780, 779, 1395, 1441, 1018, 1019, 1020, 1827, 780, + 1590, 153, 65, 779, 1032, 763, 779, 1022, 1832, 1813, + 128, 1932, 1932, 53, 1396, 1821, 1827, 770, 1817, 1827, + 1827, 1877, 1889, 1888, 31, 31, 1867, 1866, 387, 726, + 232, 1889, 1648, 1648, 1889, 24, 25, 28, 30, 32, + 1574, 1705, 1714, 782, 1668, 1648, 1536, 1661, 780, 782, + 313, 1364, 11, 12, 258, 1002, 1364, 1639, 1641, 1644, + 1507, 779, 225, 1528, 1529, 1530, 1827, 779, 1731, 232, + 250, 362, 370, 385, 395, 396, 397, 405, 543, 555, + 640, 655, 693, 707, 927, 926, 1906, 1574, 734, 554, + 513, 817, 1289, 1813, 203, 1831, 1240, 408, 1813, 1813, + 11, 13, 18, 145, 167, 215, 272, 273, 274, 292, + 346, 348, 368, 386, 393, 408, 415, 430, 487, 497, + 535, 548, 587, 593, 651, 658, 690, 705, 706, 718, + 998, 1000, 1071, 1073, 1074, 1076, 1078, 1079, 1080, 1087, + 1818, 1071, 779, 883, 863, 849, 1967, 779, 885, 96, + 155, 234, 692, 1085, 885, 836, 1495, 1381, 1381, 203, + 1502, 1509, 1509, 203, 1504, 1400, 779, 1007, 1827, 1524, + 1525, 378, 1771, 1809, 53, 782, 1809, 1572, 1576, 1400, + 780, 782, 1589, 1589, 1589, 1589, 1589, 1589, 1632, 847, + 31, 53, 299, 1934, 1938, 208, 1927, 1587, 1587, 1587, + 1792, 768, 1585, 1586, 1940, 173, 294, 1238, 446, 46, + 48, 49, 70, 72, 78, 110, 173, 204, 206, 217, + 240, 338, 375, 419, 420, 426, 438, 459, 483, 550, + 618, 629, 630, 631, 722, 1005, 1072, 1074, 1245, 1250, + 1252, 1255, 1261, 1262, 1263, 1265, 1266, 1560, 1406, 1950, + 342, 437, 850, 287, 419, 426, 852, 780, 782, 1969, + 1970, 53, 47, 779, 1307, 1998, 813, 814, 1587, 815, + 816, 1587, 811, 812, 1587, 1827, 1539, 1827, 439, 251, + 1687, 1683, 1350, 1794, 131, 1939, 1939, 961, 1997, 961, + 1639, 1349, 502, 143, 328, 1770, 1153, 1153, 391, 1151, + 1159, 1161, 1146, 224, 1146, 1159, 57, 71, 73, 306, + 341, 359, 730, 1134, 1139, 1141, 1161, 1167, 1176, 1178, + 1134, 1159, 1134, 1146, 779, 1159, 1134, 1153, 1153, 1134, + 1153, 779, 1146, 1159, 71, 307, 307, 310, 1146, 1153, + 723, 779, 891, 1153, 1153, 1153, 576, 1153, 1153, 894, + 1146, 310, 1153, 1153, 1153, 1153, 1153, 1155, 127, 127, + 2031, 1827, 988, 976, 1827, 24, 28, 30, 32, 1177, + 1178, 30, 30, 1152, 1177, 1177, 780, 1532, 1532, 65, + 256, 1461, 168, 1464, 1465, 780, 1400, 1400, 1473, 193, + 357, 780, 314, 1438, 1400, 1400, 1400, 1532, 96, 109, + 125, 155, 234, 295, 409, 410, 558, 559, 716, 1139, + 1140, 1411, 1412, 1413, 1414, 1469, 1595, 1532, 1400, 1400, + 1827, 1588, 780, 1190, 1185, 1183, 1185, 1186, 1587, 780, + 1473, 206, 1553, 65, 780, 1472, 1396, 780, 782, 347, + 1063, 1400, 1016, 217, 1033, 1034, 1035, 1588, 1018, 1932, + 1821, 1827, 787, 1648, 1648, 1889, 780, 780, 1889, 1889, + 1871, 1870, 1574, 1671, 1539, 99, 1660, 1526, 1395, 1661, + 780, 1642, 1643, 1806, 1807, 1811, 1827, 1794, 1640, 1686, + 1644, 47, 1251, 1259, 1260, 1827, 780, 782, 1590, 1739, + 1740, 447, 173, 779, 763, 782, 827, 1813, 754, 831, + 833, 75, 594, 787, 1088, 1089, 1090, 1091, 1099, 1100, + 1105, 1106, 1107, 1199, 1202, 1203, 1812, 1827, 167, 741, + 418, 1813, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, + 1649, 1649, 418, 1649, 1649, 1649, 1649, 1649, 1649, 1649, + 1649, 1649, 1649, 421, 541, 1827, 1649, 1649, 1003, 1004, + 1005, 782, 1073, 999, 1648, 884, 865, 54, 335, 996, + 203, 53, 876, 877, 641, 676, 641, 1967, 22, 29, + 31, 1479, 1501, 299, 1503, 299, 1531, 143, 298, 459, + 1519, 1520, 1523, 117, 118, 205, 282, 1772, 1773, 170, + 1774, 1567, 1549, 1548, 1567, 1573, 1572, 1395, 1600, 593, + 1821, 1936, 30, 30, 593, 99, 153, 560, 1239, 75, + 217, 384, 594, 702, 1091, 1099, 1100, 1267, 1199, 1267, + 217, 1267, 217, 217, 281, 287, 75, 126, 217, 594, + 702, 1104, 1199, 1267, 1649, 217, 65, 1007, 53, 287, + 384, 763, 1199, 1276, 1649, 217, 159, 705, 159, 217, + 705, 1267, 217, 592, 217, 217, 217, 1072, 782, 1004, + 1250, 779, 1090, 603, 1400, 1400, 203, 856, 863, 203, + 386, 857, 1827, 1632, 1364, 1969, 1308, 485, 780, 782, + 780, 782, 780, 782, 1685, 128, 439, 1391, 1632, 584, + 314, 1943, 1943, 203, 1662, 154, 1159, 1158, 1648, 1159, + 295, 317, 666, 1148, 1149, 1149, 1176, 99, 1173, 1159, + 1134, 1177, 1168, 57, 73, 391, 1162, 1149, 1223, 1787, + 1159, 1223, 1149, 310, 1149, 1159, 576, 889, 890, 1827, + 2006, 99, 1994, 2013, 1134, 888, 928, 1134, 1149, 2013, + 237, 1145, 1177, 57, 1179, 1134, 1159, 1149, 1149, 896, + 904, 905, 1587, 779, 897, 982, 780, 780, 780, 780, + 782, 780, 780, 1463, 1809, 1787, 1464, 1466, 1575, 780, + 780, 782, 780, 498, 549, 613, 780, 780, 1146, 155, + 1154, 71, 1154, 1177, 780, 780, 782, 780, 780, 780, + 1181, 780, 782, 780, 65, 229, 251, 1554, 1555, 1809, + 780, 1020, 1532, 160, 472, 780, 782, 1036, 780, 770, + 1879, 1878, 1889, 1889, 820, 1563, 406, 1799, 780, 782, + 787, 1365, 1646, 1647, 1811, 1632, 780, 782, 1529, 780, + 782, 50, 1741, 1658, 1821, 817, 779, 829, 1829, 779, + 779, 1222, 1812, 10, 127, 1101, 1827, 780, 782, 72, + 126, 225, 293, 1103, 1198, 1105, 1069, 1199, 1200, 1200, + 1108, 787, 1813, 1649, 99, 1587, 1594, 99, 1587, 99, + 1587, 99, 1587, 1075, 1590, 1587, 1587, 1821, 1821, 1649, + 1587, 1829, 454, 499, 568, 1084, 1587, 1590, 1590, 99, + 1587, 1821, 99, 389, 391, 425, 455, 588, 622, 1083, + 1594, 1587, 1594, 1001, 1770, 1073, 1071, 26, 28, 30, + 32, 99, 1591, 1592, 1821, 1827, 148, 151, 212, 879, + 880, 881, 882, 1827, 2015, 2016, 2017, 866, 867, 1950, + 2022, 101, 150, 296, 997, 654, 1969, 780, 878, 2016, + 1980, 1981, 1821, 1980, 53, 31, 378, 1482, 1400, 779, + 1400, 779, 780, 1199, 1199, 1520, 65, 65, 117, 65, + 1773, 271, 282, 1775, 1776, 1573, 779, 446, 30, 331, + 141, 1069, 141, 1068, 741, 1068, 1622, 1622, 1325, 1622, + 1251, 1260, 1813, 1167, 1622, 160, 1623, 10, 1622, 741, + 225, 1622, 1622, 99, 1827, 1325, 1561, 1562, 1811, 1006, + 1622, 1622, 1813, 99, 1827, 1325, 1260, 1622, 1325, 1325, + 1325, 1251, 46, 78, 110, 1263, 1086, 1088, 335, 454, + 1275, 1532, 669, 1821, 422, 1243, 314, 1971, 1632, 1311, + 1827, 47, 779, 1309, 814, 816, 812, 1632, 1403, 131, + 1940, 1945, 1946, 424, 1686, 281, 1827, 317, 295, 99, + 1173, 1158, 780, 782, 780, 888, 780, 782, 1129, 1400, + 2013, 787, 763, 1179, 209, 265, 269, 902, 903, 904, + 907, 1406, 1827, 878, 127, 30, 782, 1567, 780, 1400, + 549, 445, 1590, 780, 1587, 1566, 780, 55, 403, 410, + 713, 716, 725, 1556, 1557, 1791, 1567, 685, 1062, 1017, + 779, 1023, 1035, 1037, 1827, 1889, 1889, 1578, 1800, 1806, + 770, 1827, 780, 782, 1648, 1260, 1740, 419, 780, 1219, + 1221, 1827, 779, 583, 1219, 1219, 779, 1827, 1089, 779, + 160, 160, 1200, 1069, 236, 1192, 1222, 1827, 1069, 1069, + 144, 354, 356, 357, 373, 409, 410, 431, 455, 496, + 558, 559, 574, 575, 616, 660, 710, 713, 716, 739, + 759, 928, 1109, 1130, 1132, 1818, 1838, 1839, 1840, 1841, + 1842, 1847, 2001, 1827, 780, 1821, 779, 1821, 53, 1064, + 1003, 780, 782, 879, 649, 723, 1129, 105, 2033, 203, + 850, 782, 865, 2018, 1129, 2018, 1969, 779, 780, 1531, + 1531, 127, 1518, 1518, 1787, 1787, 65, 1787, 65, 65, + 1776, 31, 1239, 411, 1238, 1406, 1325, 1406, 1101, 1827, + 1812, 1251, 1812, 1247, 287, 1249, 1169, 1812, 1622, 1259, + 127, 160, 1812, 1812, 1251, 782, 1567, 1010, 1827, 1812, + 1588, 314, 1107, 1251, 1256, 1251, 780, 1827, 851, 858, + 859, 72, 361, 506, 780, 782, 1310, 287, 584, 1946, + 1663, 1632, 1813, 1177, 1787, 1177, 2013, 889, 1827, 30, + 782, 2033, 461, 780, 899, 780, 1809, 780, 780, 780, + 725, 1557, 1558, 1791, 649, 601, 440, 1559, 601, 1791, + 1063, 779, 1030, 1026, 99, 303, 304, 403, 475, 1038, + 1669, 1804, 787, 1647, 1661, 367, 780, 782, 1567, 779, + 1219, 779, 780, 780, 1827, 779, 1400, 1069, 1222, 1827, + 1813, 299, 1210, 723, 1222, 1222, 1111, 787, 1102, 1103, + 1110, 787, 1734, 1002, 1001, 2016, 723, 891, 576, 6, + 843, 1394, 855, 856, 2016, 2019, 195, 1483, 1484, 1827, + 1536, 780, 780, 136, 158, 206, 1522, 1521, 1787, 1787, + 1787, 780, 120, 1253, 120, 144, 196, 1218, 110, 258, + 1107, 1319, 281, 287, 73, 1812, 1827, 1274, 1246, 1562, + 287, 287, 281, 1275, 1257, 1259, 1248, 685, 853, 2033, + 584, 72, 72, 1827, 225, 1312, 1313, 1827, 1403, 160, + 1507, 787, 903, 1567, 458, 50, 458, 136, 403, 568, + 712, 1028, 1029, 1827, 780, 696, 1031, 1040, 711, 145, + 386, 393, 408, 535, 548, 565, 705, 1054, 1055, 1056, + 1059, 1076, 1708, 1632, 244, 770, 1892, 1221, 30, 782, + 1220, 846, 1892, 1892, 782, 1827, 780, 1222, 1210, 723, + 779, 1193, 1217, 1092, 1217, 1094, 1095, 18, 225, 293, + 386, 495, 752, 1076, 1112, 1113, 1122, 1164, 1165, 1166, + 1191, 1406, 1132, 73, 99, 201, 203, 346, 465, 660, + 1116, 1118, 1156, 1157, 1165, 1827, 780, 1077, 1078, 576, + 1827, 1976, 852, 2032, 218, 780, 782, 1485, 65, 65, + 779, 779, 1812, 591, 779, 1254, 144, 99, 99, 1275, + 1813, 217, 1174, 1325, 1827, 1812, 1813, 1258, 1297, 1400, + 428, 854, 843, 584, 584, 780, 782, 296, 1765, 1827, + 1558, 649, 209, 323, 780, 782, 1588, 779, 1042, 1044, + 1039, 418, 1649, 1649, 418, 1649, 1649, 1649, 1649, 779, + 1049, 1056, 430, 299, 386, 497, 723, 744, 1076, 1204, + 1207, 1212, 1213, 1214, 1218, 1567, 780, 1827, 780, 780, + 314, 1205, 1209, 1213, 1216, 1206, 1208, 1213, 1215, 1827, + 782, 1098, 1096, 1217, 1194, 1827, 180, 1195, 779, 1093, + 779, 779, 160, 1821, 702, 1165, 741, 160, 201, 1173, + 19, 20, 768, 769, 779, 1126, 1127, 1128, 1375, 1422, + 1790, 296, 339, 99, 53, 391, 1157, 1163, 1827, 787, + 1813, 857, 843, 1479, 1484, 127, 1133, 1135, 1136, 1137, + 1487, 1488, 1528, 1530, 1103, 1588, 1033, 1128, 1007, 1035, + 1007, 154, 1400, 1313, 1664, 1170, 1027, 1029, 779, 1043, + 1044, 1045, 182, 1041, 1044, 1649, 1821, 1821, 1649, 1591, + 1591, 1588, 1829, 697, 1050, 1051, 1649, 1217, 1821, 1649, + 1217, 1264, 1265, 1266, 1214, 752, 1892, 589, 1264, 1216, + 1264, 1215, 780, 1827, 779, 779, 1097, 780, 782, 462, + 590, 667, 203, 1196, 1219, 779, 1219, 1219, 426, 1160, + 1792, 1792, 1125, 198, 737, 649, 1126, 1158, 1156, 787, + 1827, 127, 422, 1486, 207, 120, 218, 780, 780, 780, + 779, 1672, 1673, 1811, 1766, 1031, 780, 782, 182, 1047, + 1048, 1403, 1821, 1821, 1052, 780, 782, 1081, 1829, 1587, + 1266, 1265, 585, 1204, 1818, 780, 1219, 1219, 779, 1827, + 101, 296, 780, 1219, 780, 780, 780, 779, 1397, 427, + 686, 1117, 1827, 787, 1394, 858, 1482, 218, 1479, 1033, + 782, 1648, 251, 1777, 1044, 782, 1046, 1053, 1829, 1051, + 1264, 780, 1220, 1219, 67, 244, 258, 568, 1197, 1197, + 1204, 780, 1205, 1206, 780, 1588, 1114, 1115, 1164, 1114, + 595, 691, 745, 1119, 1827, 1977, 1479, 99, 201, 432, + 1489, 1490, 1491, 1492, 780, 1673, 1661, 480, 1771, 1048, + 780, 1057, 1058, 1059, 1192, 780, 1220, 99, 201, 332, + 203, 203, 1204, 780, 1164, 1120, 1121, 1122, 112, 24, + 25, 28, 30, 1479, 1480, 203, 1490, 1492, 1490, 1491, + 65, 1774, 1059, 1204, 780, 296, 101, 1122, 649, 116, + 432, 203, 203, 1787, 143, 1778, 1204, 1197, 1197, 1978, + 30, 779, 1780, 457, 600, 1972, 1973, 170, 251, 1779, + 3, 780, 1781, 1782, 1811, 258, 1783, 1829, 1979, 1829, + 780, 782, 1784, 1785, 1811, 1632, 2033, 1782, 782, 1648, + 843, 1785, 1394, 1661, 1395 +}; + +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ +static const yytype_int16 yyr1[] = +{ + 0, 789, 790, 791, 790, 790, 792, 792, 793, 793, + 793, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 795, 796, 796, 798, 797, 799, 800, 801, 799, + 802, 803, 802, 804, 804, 806, 805, 808, 807, 809, + 809, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 811, 811, 811, 812, 813, 813, 813, 814, 815, + 815, 815, 816, 817, 817, 817, 817, 817, 817, 817, + 817, 818, 818, 819, 820, 820, 821, 823, 824, 822, + 825, 822, 826, 827, 822, 828, 829, 822, 830, 831, + 822, 832, 833, 822, 834, 822, 835, 822, 836, 822, + 837, 822, 838, 822, 822, 822, 839, 822, 822, 840, + 840, 841, 841, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 843, 843, 845, + 844, 846, 846, 847, 847, 847, 847, 847, 847, 847, + 849, 848, 851, 850, 850, 852, 852, 852, 852, 853, + 853, 854, 854, 855, 855, 856, 857, 857, 859, 858, + 860, 861, 861, 862, 862, 862, 862, 863, 863, 864, + 864, 865, 865, 866, 866, 866, 866, 866, 866, 866, + 867, 867, 868, 868, 870, 869, 871, 869, 872, 869, + 873, 873, 874, 874, 875, 875, 876, 877, 876, 878, + 878, 879, 880, 880, 881, 881, 882, 882, 882, 884, + 883, 885, 886, 886, 887, 887, 888, 888, 888, 889, + 890, 890, 891, 892, 894, 893, 893, 893, 896, 895, + 897, 897, 898, 900, 899, 901, 901, 901, 901, 902, + 902, 903, 904, 904, 905, 906, 906, 907, 907, 907, + 907, 907, 907, 908, 908, 909, 910, 910, 911, 911, + 912, 912, 913, 913, 914, 914, 914, 915, 915, 915, + 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, + 916, 917, 918, 918, 919, 919, 920, 920, 921, 922, + 922, 923, 923, 923, 924, 925, 925, 926, 927, 927, + 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, + 927, 927, 928, 928, 929, 929, 931, 930, 933, 932, + 934, 934, 936, 935, 935, 937, 937, 938, 937, 939, + 937, 940, 940, 941, 940, 942, 940, 943, 944, 945, + 947, 946, 948, 950, 949, 952, 951, 953, 953, 954, + 954, 955, 955, 955, 956, 957, 957, 957, 958, 958, + 959, 960, 960, 962, 963, 961, 964, 964, 964, 964, + 966, 965, 968, 967, 967, 969, 969, 970, 970, 972, + 971, 974, 973, 975, 975, 976, 976, 977, 977, 978, + 979, 979, 979, 980, 981, 982, 984, 983, 985, 983, + 986, 987, 988, 983, 989, 983, 991, 990, 992, 990, + 993, 994, 990, 995, 990, 996, 996, 997, 997, 997, + 999, 998, 998, 998, 1000, 1000, 1001, 1001, 1002, 1002, + 1003, 1004, 1004, 1006, 1005, 1007, 1009, 1008, 1011, 1010, + 1012, 1013, 1012, 1012, 1012, 1014, 1012, 1012, 1015, 1012, + 1016, 1016, 1017, 1017, 1018, 1018, 1019, 1019, 1020, 1021, + 1022, 1023, 1024, 1024, 1025, 1026, 1025, 1027, 1025, 1028, + 1028, 1029, 1030, 1031, 1031, 1032, 1032, 1033, 1033, 1034, + 1034, 1036, 1035, 1037, 1038, 1039, 1038, 1040, 1038, 1038, + 1038, 1038, 1041, 1041, 1042, 1042, 1043, 1043, 1045, 1046, + 1044, 1047, 1047, 1048, 1048, 1049, 1049, 1050, 1050, 1052, + 1051, 1053, 1054, 1054, 1055, 1055, 1056, 1056, 1057, 1057, + 1058, 1058, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, + 1059, 1060, 1061, 1060, 1060, 1062, 1062, 1063, 1063, 1064, + 1064, 1065, 1065, 1066, 1066, 1067, 1067, 1067, 1068, 1068, + 1069, 1069, 1070, 1070, 1071, 1071, 1072, 1072, 1073, 1073, + 1073, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, + 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, + 1074, 1075, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, + 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1076, 1076, 1076, + 1076, 1077, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1083, + 1083, 1083, 1083, 1083, 1083, 1084, 1084, 1084, 1085, 1085, + 1085, 1085, 1086, 1087, 1088, 1088, 1089, 1089, 1089, 1089, + 1089, 1090, 1090, 1092, 1091, 1093, 1091, 1094, 1091, 1095, + 1091, 1096, 1091, 1097, 1091, 1098, 1091, 1099, 1100, 1101, + 1102, 1102, 1103, 1104, 1104, 1105, 1105, 1106, 1108, 1107, + 1110, 1109, 1111, 1109, 1112, 1112, 1113, 1113, 1114, 1114, + 1115, 1115, 1116, 1116, 1116, 1116, 1117, 1116, 1116, 1116, + 1118, 1118, 1119, 1119, 1119, 1119, 1120, 1120, 1121, 1121, + 1122, 1122, 1122, 1122, 1124, 1123, 1125, 1125, 1126, 1126, + 1127, 1127, 1128, 1128, 1129, 1130, 1130, 1131, 1131, 1131, + 1132, 1132, 1132, 1132, 1132, 1132, 1133, 1133, 1133, 1133, + 1133, 1133, 1133, 1133, 1133, 1133, 1134, 1134, 1134, 1134, + 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1136, 1136, + 1136, 1136, 1136, 1137, 1137, 1137, 1137, 1137, 1137, 1137, + 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1138, 1138, + 1139, 1140, 1140, 1141, 1141, 1142, 1142, 1142, 1142, 1142, + 1143, 1143, 1143, 1143, 1143, 1144, 1144, 1144, 1145, 1145, + 1146, 1146, 1146, 1147, 1148, 1148, 1148, 1148, 1148, 1148, + 1149, 1150, 1150, 1150, 1150, 1151, 1152, 1153, 1153, 1154, + 1154, 1155, 1155, 1156, 1156, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, 1158, 1158, 1159, 1159, 1160, 1160, 1161, 1162, + 1163, 1164, 1164, 1164, 1165, 1165, 1165, 1166, 1166, 1167, + 1167, 1168, 1168, 1169, 1169, 1170, 1170, 1171, 1171, 1172, + 1172, 1173, 1174, 1174, 1175, 1175, 1176, 1176, 1176, 1177, + 1177, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1179, 1179, 1181, 1180, 1182, 1182, 1183, 1184, 1184, 1184, + 1184, 1185, 1186, 1187, 1187, 1188, 1189, 1189, 1190, 1190, + 1191, 1191, 1192, 1193, 1193, 1194, 1194, 1195, 1195, 1195, + 1195, 1196, 1196, 1196, 1196, 1196, 1197, 1197, 1197, 1197, + 1197, 1198, 1198, 1199, 1199, 1200, 1200, 1201, 1201, 1201, + 1202, 1203, 1204, 1204, 1205, 1205, 1206, 1206, 1207, 1207, + 1208, 1208, 1209, 1209, 1210, 1210, 1211, 1211, 1211, 1212, + 1212, 1213, 1213, 1213, 1213, 1213, 1214, 1214, 1215, 1216, + 1216, 1217, 1217, 1217, 1218, 1218, 1219, 1219, 1220, 1220, + 1221, 1221, 1222, 1222, 1223, 1223, 1225, 1226, 1224, 1227, + 1224, 1228, 1224, 1224, 1229, 1224, 1230, 1224, 1231, 1224, + 1232, 1224, 1233, 1224, 1234, 1224, 1224, 1235, 1236, 1237, + 1224, 1238, 1238, 1239, 1239, 1239, 1239, 1240, 1240, 1240, + 1240, 1240, 1241, 1241, 1241, 1241, 1242, 1242, 1243, 1243, + 1244, 1244, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, + 1245, 1245, 1246, 1245, 1245, 1247, 1245, 1248, 1245, 1245, + 1245, 1245, 1245, 1245, 1249, 1245, 1250, 1251, 1251, 1253, + 1252, 1254, 1254, 1254, 1256, 1255, 1257, 1258, 1257, 1259, + 1259, 1260, 1261, 1261, 1262, 1263, 1263, 1263, 1263, 1263, + 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, + 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, + 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1264, 1264, + 1264, 1264, 1264, 1265, 1265, 1266, 1266, 1267, 1267, 1268, + 1268, 1270, 1269, 1271, 1271, 1272, 1272, 1273, 1273, 1274, + 1274, 1274, 1275, 1275, 1275, 1276, 1276, 1276, 1276, 1278, + 1277, 1279, 1277, 1277, 1277, 1280, 1281, 1281, 1282, 1282, + 1283, 1283, 1283, 1285, 1284, 1286, 1286, 1287, 1287, 1287, + 1288, 1288, 1288, 1289, 1289, 1291, 1290, 1292, 1292, 1292, + 1293, 1294, 1293, 1296, 1295, 1297, 1297, 1298, 1298, 1299, + 1299, 1299, 1300, 1300, 1300, 1302, 1301, 1303, 1303, 1304, + 1305, 1305, 1306, 1306, 1307, 1308, 1307, 1309, 1310, 1309, + 1311, 1311, 1311, 1312, 1312, 1312, 1313, 1313, 1314, 1314, + 1315, 1316, 1315, 1318, 1317, 1319, 1319, 1320, 1320, 1321, + 1321, 1321, 1321, 1321, 1321, 1322, 1322, 1324, 1323, 1325, + 1325, 1325, 1327, 1326, 1326, 1328, 1328, 1329, 1329, 1330, + 1332, 1331, 1333, 1333, 1334, 1334, 1335, 1336, 1337, 1337, + 1339, 1338, 1340, 1340, 1341, 1341, 1342, 1343, 1345, 1344, + 1347, 1346, 1348, 1348, 1349, 1349, 1351, 1350, 1352, 1350, + 1354, 1353, 1355, 1353, 1356, 1356, 1358, 1357, 1360, 1361, + 1359, 1362, 1363, 1364, 1364, 1365, 1365, 1367, 1366, 1368, + 1366, 1369, 1369, 1370, 1371, 1370, 1370, 1372, 1372, 1373, + 1374, 1375, 1375, 1376, 1376, 1377, 1378, 1378, 1379, 1379, + 1380, 1380, 1380, 1381, 1381, 1381, 1382, 1383, 1383, 1384, + 1384, 1385, 1385, 1385, 1385, 1386, 1386, 1387, 1387, 1387, + 1388, 1388, 1389, 1389, 1390, 1390, 1390, 1390, 1391, 1391, + 1391, 1392, 1392, 1393, 1394, 1395, 1396, 1396, 1396, 1396, + 1396, 1397, 1397, 1397, 1398, 1398, 1398, 1399, 1399, 1400, + 1400, 1400, 1400, 1400, 1401, 1401, 1401, 1401, 1401, 1401, + 1401, 1401, 1401, 1401, 1401, 1401, 1402, 1402, 1402, 1402, + 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, + 1402, 1402, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, + 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, + 1403, 1404, 1404, 1405, 1405, 1406, 1406, 1407, 1407, 1408, + 1408, 1408, 1408, 1408, 1408, 1409, 1409, 1410, 1410, 1411, + 1411, 1411, 1412, 1412, 1412, 1412, 1412, 1412, 1413, 1413, + 1413, 1414, 1414, 1415, 1416, 1416, 1417, 1417, 1417, 1417, + 1418, 1419, 1419, 1420, 1421, 1421, 1421, 1421, 1421, 1421, + 1421, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1423, 1423, 1423, 1423, 1424, 1424, 1425, 1425, 1425, 1425, + 1425, 1425, 1426, 1426, 1427, 1427, 1428, 1428, 1428, 1428, + 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, + 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1429, 1429, 1430, + 1430, 1431, 1431, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1433, + 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, + 1433, 1433, 1433, 1435, 1434, 1434, 1434, 1434, 1434, 1434, + 1434, 1434, 1434, 1434, 1434, 1436, 1436, 1437, 1437, 1438, + 1438, 1439, 1439, 1440, 1440, 1441, 1442, 1442, 1442, 1442, + 1442, 1442, 1442, 1443, 1444, 1442, 1442, 1442, 1442, 1442, + 1442, 1442, 1442, 1442, 1442, 1442, 1445, 1442, 1446, 1442, + 1447, 1442, 1448, 1448, 1449, 1449, 1449, 1450, 1450, 1450, + 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, + 1451, 1453, 1452, 1452, 1454, 1454, 1455, 1456, 1458, 1457, + 1459, 1459, 1459, 1459, 1460, 1460, 1461, 1461, 1462, 1462, + 1463, 1463, 1464, 1464, 1465, 1466, 1468, 1467, 1469, 1469, + 1469, 1469, 1469, 1469, 1469, 1469, 1470, 1470, 1470, 1470, + 1470, 1470, 1470, 1470, 1471, 1471, 1471, 1471, 1472, 1472, + 1473, 1473, 1474, 1474, 1475, 1475, 1476, 1476, 1477, 1477, + 1478, 1478, 1479, 1479, 1479, 1480, 1480, 1480, 1480, 1480, + 1481, 1482, 1483, 1483, 1485, 1484, 1486, 1484, 1487, 1487, + 1487, 1488, 1488, 1488, 1488, 1489, 1489, 1489, 1489, 1489, + 1490, 1490, 1490, 1491, 1492, 1494, 1495, 1493, 1496, 1496, + 1497, 1497, 1498, 1499, 1498, 1500, 1498, 1498, 1501, 1498, + 1502, 1498, 1498, 1503, 1498, 1504, 1498, 1498, 1505, 1505, + 1505, 1506, 1506, 1507, 1507, 1508, 1509, 1509, 1509, 1509, + 1509, 1510, 1510, 1511, 1511, 1512, 1512, 1513, 1513, 1514, + 1514, 1515, 1516, 1517, 1517, 1518, 1518, 1518, 1518, 1519, + 1519, 1521, 1520, 1522, 1520, 1523, 1523, 1524, 1525, 1524, + 1527, 1526, 1528, 1528, 1529, 1529, 1530, 1530, 1531, 1531, + 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, + 1532, 1532, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1534, 1534, 1534, 1534, 1535, 1535, 1535, 1536, 1536, + 1537, 1538, 1538, 1539, 1540, 1539, 1541, 1542, 1541, 1543, + 1543, 1544, 1544, 1545, 1545, 1545, 1546, 1546, 1547, 1547, + 1548, 1550, 1549, 1551, 1551, 1552, 1552, 1553, 1553, 1554, + 1554, 1555, 1555, 1556, 1556, 1557, 1557, 1557, 1558, 1558, + 1558, 1559, 1559, 1559, 1559, 1559, 1559, 1560, 1561, 1561, + 1562, 1563, 1563, 1565, 1564, 1566, 1566, 1567, 1567, 1567, + 1568, 1568, 1569, 1569, 1569, 1569, 1570, 1570, 1570, 1570, + 1570, 1571, 1571, 1572, 1572, 1573, 1573, 1574, 1575, 1575, + 1575, 1576, 1576, 1576, 1576, 1576, 1576, 1577, 1578, 1578, + 1578, 1578, 1579, 1579, 1579, 1580, 1580, 1581, 1582, 1583, + 1583, 1583, 1584, 1584, 1585, 1585, 1586, 1586, 1587, 1587, + 1587, 1587, 1587, 1587, 1588, 1588, 1588, 1588, 1588, 1589, + 1589, 1589, 1589, 1590, 1590, 1590, 1590, 1590, 1591, 1591, + 1591, 1591, 1591, 1592, 1593, 1593, 1594, 1594, 1595, 1595, + 1595, 1597, 1596, 1598, 1598, 1599, 1599, 1600, 1602, 1601, + 1603, 1603, 1604, 1605, 1605, 1605, 1606, 1608, 1609, 1607, + 1607, 1607, 1611, 1610, 1613, 1612, 1614, 1612, 1612, 1612, + 1612, 1615, 1612, 1612, 1612, 1612, 1616, 1612, 1612, 1617, + 1617, 1618, 1619, 1620, 1620, 1621, 1622, 1622, 1623, 1623, + 1624, 1624, 1626, 1627, 1625, 1629, 1630, 1628, 1631, 1632, + 1633, 1633, 1633, 1634, 1634, 1635, 1635, 1636, 1636, 1638, + 1637, 1639, 1639, 1640, 1639, 1641, 1642, 1642, 1643, 1643, + 1644, 1645, 1645, 1646, 1646, 1647, 1648, 1648, 1649, 1649, + 1650, 1650, 1651, 1651, 1653, 1652, 1655, 1654, 1656, 1656, + 1657, 1657, 1658, 1658, 1659, 1659, 1660, 1660, 1661, 1661, + 1662, 1663, 1664, 1662, 1665, 1665, 1667, 1668, 1669, 1666, + 1670, 1670, 1671, 1671, 1672, 1672, 1673, 1674, 1674, 1676, + 1675, 1677, 1677, 1678, 1678, 1679, 1680, 1681, 1682, 1683, + 1681, 1684, 1685, 1681, 1686, 1687, 1686, 1688, 1688, 1689, + 1689, 1690, 1690, 1691, 1691, 1692, 1692, 1692, 1694, 1695, + 1693, 1696, 1696, 1697, 1697, 1698, 1698, 1699, 1699, 1699, + 1699, 1699, 1699, 1699, 1699, 1699, 1700, 1700, 1702, 1701, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1704, 1703, 1705, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1706, 1706, 1706, + 1707, 1707, 1708, 1708, 1709, 1709, 1710, 1710, 1711, 1711, + 1712, 1712, 1713, 1713, 1714, 1714, 1714, 1716, 1715, 1717, + 1715, 1718, 1718, 1718, 1718, 1718, 1718, 1719, 1719, 1720, + 1721, 1721, 1721, 1721, 1722, 1722, 1723, 1723, 1723, 1724, + 1726, 1725, 1728, 1727, 1727, 1729, 1729, 1730, 1731, 1730, + 1732, 1732, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1734, 1734, 1735, 1736, 1737, 1736, 1736, 1738, 1738, 1739, + 1739, 1739, 1740, 1741, 1741, 1743, 1742, 1744, 1744, 1746, + 1745, 1747, 1745, 1745, 1748, 1748, 1749, 1749, 1750, 1751, + 1750, 1753, 1752, 1754, 1754, 1754, 1755, 1755, 1755, 1756, + 1756, 1757, 1757, 1759, 1758, 1760, 1760, 1761, 1763, 1764, + 1765, 1766, 1762, 1767, 1767, 1768, 1768, 1769, 1769, 1769, + 1770, 1770, 1770, 1771, 1771, 1772, 1772, 1773, 1773, 1773, + 1773, 1774, 1774, 1775, 1775, 1776, 1776, 1777, 1777, 1778, + 1778, 1779, 1779, 1780, 1780, 1780, 1781, 1781, 1782, 1782, + 1783, 1783, 1784, 1784, 1785, 1786, 1786, 1786, 1786, 1787, + 1787, 1788, 1788, 1788, 1789, 1789, 1789, 1790, 1790, 1791, + 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1792, + 1792, 1792, 1792, 1792, 1793, 1793, 1793, 1795, 1794, 1796, + 1796, 1797, 1797, 1798, 1799, 1800, 1799, 1801, 1801, 1802, + 1803, 1804, 1804, 1805, 1806, 1806, 1807, 1807, 1808, 1808, + 1809, 1810, 1810, 1810, 1810, 1810, 1811, 1811, 1811, 1811, + 1811, 1812, 1812, 1812, 1812, 1813, 1813, 1813, 1814, 1814, + 1815, 1816, 1816, 1817, 1817, 1817, 1818, 1819, 1819, 1819, + 1819, 1820, 1821, 1822, 1823, 1824, 1824, 1825, 1825, 1826, + 1826, 1826, 1827, 1827, 1828, 1828, 1829, 1829, 1829, 1830, + 1830, 1830, 1831, 1831, 1832, 1833, 1833, 1833, 1833, 1833, + 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1834, 1834, 1834, + 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, + 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, + 1835, 1835, 1835, 1836, 1836, 1836, 1836, 1836, 1836, 1836, + 1836, 1836, 1836, 1836, 1836, 1836, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1838, 1838, 1838, 1838, 1838, 1838, + 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, + 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, + 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, + 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, + 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1839, 1839, 1839, + 1839, 1839, 1839, 1840, 1840, 1840, 1840, 1840, 1840, 1840, + 1840, 1840, 1840, 1841, 1841, 1841, 1842, 1842, 1842, 1843, + 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, + 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, + 1843, 1843, 1843, 1843, 1843, 1844, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1846, 1846, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1850, 1849, 1851, 1851, 1852, 1851, 1853, 1851, + 1854, 1851, 1855, 1855, 1856, 1856, 1857, 1856, 1858, 1858, + 1860, 1859, 1859, 1861, 1861, 1861, 1862, 1862, 1862, 1862, + 1863, 1863, 1863, 1863, 1865, 1864, 1866, 1864, 1867, 1864, + 1869, 1868, 1870, 1868, 1871, 1868, 1873, 1872, 1874, 1872, + 1875, 1872, 1876, 1872, 1877, 1872, 1878, 1872, 1879, 1872, + 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1880, 1872, 1881, + 1872, 1882, 1872, 1883, 1883, 1883, 1883, 1884, 1885, 1886, + 1886, 1887, 1887, 1887, 1887, 1888, 1888, 1888, 1889, 1889, + 1889, 1889, 1889, 1891, 1890, 1892, 1892, 1892, 1893, 1893, + 1894, 1894, 1895, 1896, 1896, 1896, 1896, 1896, 1898, 1897, + 1900, 1899, 1901, 1901, 1902, 1901, 1903, 1903, 1904, 1904, + 1905, 1905, 1905, 1905, 1906, 1905, 1907, 1907, 1907, 1907, + 1907, 1908, 1909, 1909, 1909, 1909, 1909, 1910, 1910, 1911, + 1912, 1912, 1912, 1912, 1913, 1913, 1914, 1914, 1915, 1915, + 1916, 1917, 1918, 1918, 1919, 1919, 1920, 1920, 1921, 1921, + 1922, 1922, 1922, 1922, 1923, 1924, 1924, 1924, 1924, 1925, + 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, + 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, + 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, + 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, + 1925, 1926, 1926, 1927, 1927, 1928, 1928, 1928, 1929, 1929, + 1929, 1929, 1930, 1930, 1931, 1931, 1932, 1932, 1933, 1933, + 1934, 1934, 1935, 1935, 1935, 1935, 1936, 1936, 1937, 1938, + 1938, 1938, 1939, 1939, 1939, 1939, 1939, 1940, 1940, 1940, + 1940, 1940, 1941, 1941, 1942, 1942, 1943, 1943, 1944, 1944, + 1945, 1945, 1946, 1946, 1948, 1947, 1949, 1950, 1950, 1951, + 1951, 1952, 1952, 1952, 1953, 1953, 1953, 1954, 1955, 1955, + 1955, 1956, 1957, 1958, 1958, 1958, 1959, 1959, 1959, 1960, + 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1961, 1961, + 1962, 1963, 1964, 1964, 1964, 1965, 1965, 1966, 1966, 1967, + 1967, 1968, 1968, 1970, 1969, 1971, 1971, 1971, 1971, 1972, + 1972, 1973, 1973, 1975, 1976, 1977, 1978, 1979, 1974, 1981, + 1980, 1982, 1982, 1982, 1982, 1982, 1982, 1983, 1983, 1984, + 1984, 1984, 1985, 1985, 1985, 1986, 1986, 1986, 1987, 1987, + 1988, 1989, 1988, 1990, 1990, 1991, 1991, 1992, 1992, 1993, + 1994, 1995, 1996, 1997, 1998, 1999, 1999, 1999, 2000, 2000, + 2001, 2001, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2003, + 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, + 2003, 2004, 2005, 2006, 2008, 2007, 2009, 2010, 2011, 2012, + 2013, 2013, 2014, 2014, 2015, 2015, 2016, 2016, 2016, 2017, + 2017, 2017, 2017, 2019, 2018, 2021, 2022, 2020, 2023, 2023, + 2023, 2025, 2024, 2026, 2024, 2027, 2024, 2024, 2028, 2028, + 2029, 2030, 2030, 2030, 2031, 2030, 2032, 2032, 2032, 2032, + 2032, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2034, + 2034, 2034, 2034, 2036, 2035, 2038, 2037, 2040, 2039 +}; + +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 1, 0, 4, 2, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 0, 5, 3, 0, 0, 6, + 0, 0, 3, 1, 3, 0, 3, 0, 7, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, + 1, 0, 1, 3, 1, 0, 1, 3, 1, 0, + 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 1, 1, 0, 1, 3, 0, 0, 8, + 0, 8, 0, 0, 15, 0, 0, 17, 0, 0, + 15, 0, 0, 15, 0, 6, 0, 10, 0, 11, + 0, 5, 0, 5, 8, 6, 0, 3, 1, 0, + 1, 1, 2, 3, 2, 1, 3, 2, 1, 3, + 3, 3, 1, 1, 1, 1, 3, 0, 1, 0, + 12, 1, 3, 2, 2, 2, 2, 2, 2, 2, + 0, 12, 0, 6, 2, 0, 1, 3, 1, 0, + 2, 0, 2, 0, 1, 4, 0, 2, 0, 3, + 0, 0, 1, 1, 1, 1, 2, 3, 1, 0, + 2, 0, 2, 2, 2, 2, 2, 3, 3, 1, + 1, 2, 3, 3, 0, 4, 0, 6, 0, 8, + 0, 3, 0, 1, 3, 1, 0, 0, 2, 3, + 1, 1, 0, 1, 3, 1, 1, 1, 1, 0, + 4, 3, 0, 3, 2, 3, 1, 3, 5, 2, + 1, 3, 3, 1, 0, 4, 4, 1, 0, 6, + 0, 3, 0, 0, 3, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 3, 0, 1, 1, 1, 1, + 2, 1, 1, 2, 3, 3, 1, 1, 0, 1, + 0, 2, 3, 5, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 4, 0, 1, 1, 3, 1, 3, 3, 1, + 2, 1, 1, 1, 1, 1, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 0, 5, 0, 2, + 1, 1, 0, 3, 1, 1, 2, 0, 4, 0, + 5, 1, 2, 0, 4, 0, 5, 2, 2, 2, + 0, 2, 0, 0, 3, 0, 3, 1, 3, 0, + 3, 1, 1, 1, 3, 3, 4, 5, 2, 4, + 2, 1, 3, 0, 0, 6, 0, 2, 2, 2, + 0, 6, 0, 3, 1, 1, 2, 1, 2, 0, + 5, 0, 5, 0, 2, 0, 1, 0, 1, 2, + 5, 3, 5, 3, 5, 1, 0, 5, 0, 5, + 0, 0, 0, 8, 0, 5, 0, 3, 0, 3, + 0, 0, 5, 0, 3, 1, 1, 1, 1, 1, + 0, 5, 3, 1, 2, 4, 0, 4, 1, 4, + 1, 0, 1, 0, 4, 0, 0, 3, 0, 6, + 6, 0, 4, 2, 2, 0, 3, 2, 0, 3, + 0, 1, 0, 3, 0, 1, 1, 3, 1, 4, + 3, 3, 0, 2, 0, 0, 7, 0, 10, 1, + 3, 1, 1, 0, 2, 0, 3, 1, 3, 0, + 1, 0, 6, 1, 0, 0, 4, 0, 3, 1, + 1, 1, 1, 1, 1, 3, 1, 3, 0, 0, + 5, 1, 3, 1, 1, 0, 3, 1, 3, 0, + 4, 1, 0, 1, 2, 1, 1, 1, 0, 1, + 2, 1, 3, 4, 3, 3, 3, 3, 4, 4, + 3, 0, 0, 6, 3, 0, 2, 0, 1, 0, + 1, 0, 1, 1, 2, 1, 1, 3, 0, 3, + 0, 3, 1, 3, 0, 1, 1, 2, 1, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 6, 1, 1, 3, 4, 4, 2, 2, + 2, 3, 3, 3, 1, 3, 1, 3, 3, 3, + 3, 0, 1, 2, 4, 4, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, + 2, 1, 3, 0, 9, 0, 10, 0, 9, 0, + 9, 0, 11, 0, 12, 0, 10, 2, 7, 7, + 0, 1, 4, 0, 1, 0, 1, 2, 0, 4, + 0, 3, 0, 3, 0, 1, 2, 1, 0, 1, + 2, 1, 0, 1, 2, 3, 0, 6, 5, 5, + 0, 2, 0, 1, 1, 1, 0, 1, 2, 1, + 1, 2, 2, 1, 0, 3, 1, 3, 3, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 3, 3, 3, 2, + 1, 1, 3, 3, 3, 3, 0, 1, 2, 2, + 3, 3, 2, 3, 3, 4, 3, 3, 3, 1, + 2, 2, 2, 2, 3, 3, 2, 2, 2, 3, + 3, 2, 3, 2, 2, 2, 2, 2, 5, 5, + 1, 1, 2, 2, 1, 2, 1, 2, 3, 2, + 1, 1, 1, 1, 1, 1, 1, 2, 0, 3, + 0, 1, 1, 5, 0, 1, 1, 1, 2, 2, + 1, 3, 3, 3, 3, 1, 1, 0, 1, 0, + 1, 0, 1, 2, 1, 1, 2, 4, 1, 3, + 2, 1, 0, 2, 0, 1, 0, 1, 2, 2, + 2, 3, 2, 1, 1, 1, 2, 1, 2, 2, + 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 2, 1, 1, 0, + 1, 1, 1, 2, 1, 2, 3, 3, 2, 2, + 0, 1, 0, 4, 1, 1, 1, 0, 1, 2, + 1, 1, 2, 1, 3, 3, 1, 1, 0, 2, + 0, 1, 5, 0, 3, 3, 1, 0, 2, 2, + 2, 0, 3, 3, 6, 6, 1, 1, 2, 2, + 2, 2, 2, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 1, 1, 2, + 1, 2, 1, 2, 0, 2, 0, 2, 2, 2, + 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 2, 4, 2, 0, 4, + 1, 4, 0, 1, 1, 3, 0, 0, 9, 0, + 5, 0, 7, 7, 0, 6, 0, 6, 0, 11, + 0, 10, 0, 11, 0, 8, 8, 0, 0, 0, + 9, 1, 1, 0, 1, 1, 3, 0, 2, 3, + 5, 5, 0, 3, 1, 4, 0, 3, 0, 2, + 0, 1, 0, 2, 2, 2, 2, 1, 1, 1, + 4, 4, 0, 6, 4, 0, 5, 0, 6, 4, + 3, 1, 7, 7, 0, 7, 2, 1, 1, 0, + 6, 0, 3, 2, 0, 5, 0, 0, 6, 1, + 3, 1, 1, 3, 3, 3, 2, 2, 4, 4, + 2, 7, 6, 5, 5, 4, 5, 4, 4, 2, + 2, 7, 5, 6, 3, 6, 6, 4, 6, 1, + 1, 1, 1, 1, 3, 3, 3, 5, 0, 1, + 1, 2, 2, 3, 3, 3, 3, 0, 1, 0, + 1, 0, 2, 0, 1, 2, 1, 1, 1, 0, + 1, 1, 0, 2, 1, 0, 1, 1, 1, 0, + 7, 0, 5, 5, 4, 3, 0, 1, 1, 3, + 3, 2, 2, 0, 2, 1, 3, 0, 1, 1, + 0, 2, 4, 1, 3, 0, 5, 0, 1, 1, + 3, 0, 4, 0, 4, 0, 1, 1, 2, 1, + 1, 1, 0, 2, 2, 0, 5, 1, 3, 2, + 0, 3, 1, 4, 1, 0, 4, 1, 0, 4, + 0, 1, 3, 0, 1, 3, 1, 1, 2, 6, + 3, 0, 4, 0, 3, 0, 1, 1, 2, 1, + 1, 1, 1, 1, 2, 0, 2, 0, 6, 0, + 1, 1, 0, 5, 4, 3, 5, 1, 3, 4, + 0, 6, 1, 1, 1, 3, 2, 3, 1, 1, + 0, 6, 1, 1, 1, 3, 3, 4, 0, 6, + 0, 2, 0, 4, 0, 2, 0, 3, 0, 4, + 0, 3, 0, 4, 1, 1, 0, 3, 0, 0, + 5, 6, 7, 1, 2, 1, 1, 0, 3, 0, + 3, 3, 3, 1, 0, 4, 3, 1, 1, 1, + 1, 1, 4, 0, 1, 2, 1, 1, 0, 1, + 0, 1, 1, 2, 1, 2, 9, 0, 1, 0, + 2, 3, 1, 4, 4, 2, 1, 1, 1, 1, + 3, 5, 0, 1, 0, 2, 1, 2, 3, 1, + 1, 3, 4, 0, 0, 0, 0, 2, 2, 1, + 1, 0, 2, 3, 0, 2, 3, 0, 2, 3, + 3, 3, 2, 1, 3, 4, 3, 4, 3, 4, + 3, 4, 3, 3, 6, 1, 3, 4, 5, 7, + 6, 8, 5, 6, 4, 3, 5, 4, 6, 3, + 4, 1, 3, 3, 3, 3, 3, 3, 3, 5, + 5, 5, 6, 6, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, + 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, + 2, 2, 1, 4, 1, 3, 1, 1, 1, 1, + 3, 1, 1, 1, 4, 4, 4, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 6, 4, 4, 7, 6, 3, 4, 6, + 6, 4, 4, 4, 4, 4, 4, 6, 8, 10, + 1, 1, 3, 1, 1, 3, 1, 2, 2, 2, + 2, 2, 1, 3, 4, 6, 4, 6, 2, 2, + 4, 4, 4, 10, 6, 8, 6, 4, 4, 6, + 4, 3, 4, 1, 4, 3, 4, 1, 1, 5, + 3, 5, 3, 6, 8, 2, 2, 8, 8, 6, + 6, 2, 6, 3, 6, 8, 4, 3, 4, 8, + 8, 4, 2, 2, 2, 6, 6, 4, 8, 4, + 4, 8, 4, 6, 6, 4, 6, 8, 6, 5, + 8, 7, 10, 0, 5, 4, 4, 4, 6, 8, + 6, 6, 6, 6, 6, 2, 3, 0, 4, 0, + 3, 0, 1, 1, 3, 4, 4, 5, 4, 4, + 4, 5, 4, 0, 0, 7, 4, 5, 4, 5, + 4, 4, 4, 4, 4, 5, 0, 9, 0, 8, + 0, 7, 3, 3, 1, 1, 1, 3, 3, 3, + 3, 3, 4, 4, 4, 6, 4, 6, 4, 6, + 5, 0, 7, 4, 4, 4, 4, 1, 0, 3, + 3, 1, 3, 5, 0, 1, 0, 2, 0, 3, + 4, 2, 0, 1, 2, 1, 0, 3, 2, 3, + 3, 3, 2, 1, 1, 1, 1, 1, 2, 1, + 2, 2, 1, 2, 1, 2, 2, 3, 0, 1, + 1, 3, 1, 3, 1, 3, 4, 5, 1, 3, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 4, 1, 3, 0, 3, 0, 5, 2, 4, + 4, 1, 1, 1, 1, 0, 1, 2, 1, 2, + 1, 1, 2, 3, 3, 0, 0, 10, 1, 4, + 1, 3, 3, 0, 6, 0, 8, 4, 0, 8, + 0, 10, 6, 0, 8, 0, 10, 6, 1, 2, + 1, 1, 2, 0, 1, 5, 1, 1, 1, 1, + 1, 1, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 5, 3, 0, 1, 0, 2, 3, 3, 1, + 1, 0, 7, 0, 7, 1, 2, 0, 0, 2, + 0, 2, 0, 1, 1, 1, 1, 3, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, + 2, 0, 1, 0, 0, 3, 0, 0, 3, 0, + 4, 4, 2, 0, 1, 1, 0, 2, 3, 1, + 3, 0, 7, 0, 1, 0, 3, 0, 3, 0, + 3, 1, 1, 1, 4, 2, 2, 2, 1, 2, + 2, 0, 3, 2, 2, 3, 3, 3, 3, 1, + 2, 0, 1, 0, 4, 4, 2, 0, 1, 1, + 0, 1, 2, 5, 4, 1, 4, 7, 5, 8, + 3, 1, 1, 1, 1, 1, 2, 1, 1, 3, + 3, 1, 3, 1, 1, 1, 1, 1, 0, 2, + 3, 4, 1, 2, 1, 0, 1, 1, 1, 0, + 2, 2, 2, 1, 0, 1, 2, 2, 2, 1, + 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, + 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 6, 0, 1, 3, 1, 3, 0, 2, + 3, 1, 1, 2, 1, 3, 2, 0, 0, 7, + 2, 1, 0, 3, 0, 8, 0, 8, 4, 5, + 5, 0, 6, 4, 4, 4, 0, 6, 1, 1, + 3, 1, 2, 1, 3, 1, 0, 2, 0, 2, + 0, 1, 0, 0, 12, 0, 0, 10, 0, 0, + 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, + 2, 1, 2, 0, 3, 3, 0, 1, 3, 1, + 1, 3, 1, 3, 1, 3, 1, 1, 0, 1, + 1, 1, 1, 1, 0, 4, 0, 4, 0, 1, + 0, 1, 3, 1, 5, 3, 1, 1, 1, 1, + 0, 0, 0, 7, 5, 1, 0, 0, 0, 13, + 3, 1, 3, 3, 3, 1, 3, 0, 1, 0, + 3, 0, 3, 2, 3, 3, 2, 5, 0, 0, + 7, 0, 0, 8, 0, 0, 3, 1, 3, 2, + 4, 0, 2, 0, 2, 1, 1, 1, 0, 0, + 7, 0, 1, 0, 1, 1, 3, 1, 1, 2, + 2, 2, 1, 1, 1, 1, 0, 3, 0, 3, + 2, 4, 4, 3, 4, 4, 1, 3, 3, 3, + 3, 6, 2, 2, 0, 6, 0, 8, 5, 2, + 1, 1, 1, 5, 5, 2, 2, 1, 4, 3, + 2, 3, 2, 2, 1, 4, 4, 3, 3, 3, + 2, 2, 3, 4, 3, 3, 3, 3, 4, 4, + 3, 2, 3, 3, 3, 3, 3, 4, 4, 3, + 3, 4, 4, 3, 4, 4, 3, 1, 1, 1, + 1, 1, 0, 1, 0, 2, 0, 1, 1, 1, + 0, 2, 0, 2, 0, 3, 3, 0, 4, 0, + 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 2, 1, 1, 0, 3, 0, 1, 1, 5, + 0, 4, 0, 4, 1, 0, 1, 4, 0, 3, + 3, 1, 2, 2, 2, 2, 3, 4, 2, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, + 0, 1, 2, 2, 0, 3, 1, 0, 5, 0, + 1, 3, 1, 0, 3, 0, 3, 3, 1, 0, + 5, 0, 3, 2, 0, 1, 0, 2, 5, 0, + 6, 0, 4, 0, 1, 1, 2, 2, 3, 0, + 1, 1, 2, 0, 3, 0, 4, 2, 0, 0, + 0, 0, 23, 1, 1, 0, 1, 0, 1, 1, + 0, 1, 1, 0, 2, 2, 1, 3, 4, 3, + 3, 0, 2, 2, 1, 3, 3, 0, 4, 0, + 3, 1, 1, 0, 3, 2, 3, 1, 1, 2, + 0, 2, 3, 1, 5, 1, 1, 2, 2, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 2, 2, 2, 0, 4, 0, + 1, 1, 3, 7, 0, 0, 4, 0, 3, 1, + 1, 1, 3, 1, 1, 1, 3, 5, 3, 5, + 1, 1, 3, 4, 5, 4, 1, 3, 4, 4, + 5, 1, 5, 3, 2, 1, 3, 2, 2, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 3, 1, 3, 0, 3, 0, 3, + 0, 5, 1, 3, 1, 3, 0, 3, 1, 3, + 0, 3, 1, 1, 1, 1, 0, 1, 1, 1, + 0, 2, 2, 2, 0, 4, 0, 6, 0, 6, + 0, 4, 0, 6, 0, 6, 0, 4, 0, 6, + 0, 6, 0, 5, 0, 7, 0, 9, 0, 9, + 2, 3, 2, 4, 3, 5, 2, 0, 4, 0, + 4, 0, 6, 1, 1, 3, 3, 1, 3, 2, + 2, 2, 2, 2, 1, 1, 4, 4, 1, 1, + 1, 1, 1, 0, 5, 0, 2, 1, 1, 1, + 1, 3, 3, 1, 1, 2, 2, 2, 0, 3, + 0, 3, 3, 2, 0, 6, 1, 2, 1, 1, + 1, 1, 1, 1, 0, 5, 1, 1, 1, 1, + 1, 3, 6, 6, 7, 5, 3, 4, 1, 3, + 8, 8, 6, 4, 0, 3, 0, 3, 1, 3, + 2, 1, 1, 1, 0, 1, 1, 2, 0, 1, + 1, 1, 3, 3, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 1, 3, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, + 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, + 2, 0, 1, 3, 1, 2, 2, 2, 1, 3, + 3, 1, 1, 3, 1, 3, 1, 3, 1, 1, + 1, 1, 4, 5, 4, 1, 3, 1, 2, 0, + 2, 5, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 0, 2, 0, 2, 0, 3, + 2, 1, 2, 1, 0, 3, 1, 0, 1, 0, + 1, 0, 3, 2, 0, 1, 2, 4, 4, 5, + 4, 2, 3, 2, 2, 2, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 3, 3, 3, 3, 0, 1, 3, 3, 0, + 3, 1, 3, 0, 3, 0, 3, 4, 4, 1, + 1, 0, 2, 0, 0, 0, 0, 0, 20, 0, + 2, 4, 4, 3, 4, 3, 3, 0, 3, 1, + 3, 5, 1, 1, 1, 0, 1, 1, 0, 2, + 0, 0, 3, 0, 2, 6, 3, 4, 4, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 6, 4, 2, 1, 1, + 1, 2, 5, 6, 2, 1, 2, 3, 1, 6, + 8, 5, 7, 0, 4, 0, 0, 7, 6, 4, + 4, 0, 6, 0, 11, 0, 11, 10, 1, 3, + 2, 1, 4, 1, 0, 6, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 7, 0, 5, 0, 7 +}; + + +enum { YYENOMEM = -2 }; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (thd, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use YYerror or YYUNDEF. */ +#define YYERRCODE YYUNDEF + + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value, thd); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, THD *thd) +{ + FILE *yyoutput = yyo; + YY_USE (yyoutput); + YY_USE (thd); + if (!yyvaluep) + return; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ + +static void +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, THD *thd) +{ + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); + + yy_symbol_value_print (yyo, yykind, yyvaluep, thd); + YYFPRINTF (yyo, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, + int yyrule, THD *thd) +{ + int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)], thd); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule, thd); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + + + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep, THD *thd) +{ + YY_USE (yyvaluep); + YY_USE (thd); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + switch (yykind) + { + case YYSYMBOL_expr_lex: /* expr_lex */ +#line 1551 "/home/buildbot/git/mkdist/sql/yy_mariadb.yy" +{ + /* + In case of a syntax/oom error let's free the sp_expr_lex + instance, but only if it has not been linked to any structures + such as sp_instr_jump_if_not::m_lex_keeper yet, e.g.: + IF f1() THEN1 + i.e. THEN1 came instead of the expected THEN causing a syntax error. + */ + if (!((*yyvaluep).expr_lex)->sp_lex_in_use) + delete ((*yyvaluep).expr_lex); +} +#line 29430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case YYSYMBOL_cursor_actual_parameters: /* cursor_actual_parameters */ +#line 1610 "/home/buildbot/git/mkdist/sql/yy_mariadb.yy" +{ + if (((*yyvaluep).sp_assignment_lex_list)) + { + sp_assignment_lex *elem; + List_iterator li(*((*yyvaluep).sp_assignment_lex_list)); + while ((elem= li++)) + { + if (!elem->sp_lex_in_use) + delete elem; + } + } +} +#line 29447 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case YYSYMBOL_opt_parenthesized_cursor_actual_parameters: /* opt_parenthesized_cursor_actual_parameters */ +#line 1610 "/home/buildbot/git/mkdist/sql/yy_mariadb.yy" +{ + if (((*yyvaluep).sp_assignment_lex_list)) + { + sp_assignment_lex *elem; + List_iterator li(*((*yyvaluep).sp_assignment_lex_list)); + while ((elem= li++)) + { + if (!elem->sp_lex_in_use) + delete elem; + } + } +} +#line 29464 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + default: + break; + } + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + + + + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (THD *thd) +{ +/* Lookahead token kind. */ +int yychar; + + +/* The semantic value of the lookahead symbol. */ +/* Default value used for initialization, for pacifying older GCCs + or non-GCC compilers. */ +YY_INITIAL_VALUE (static YYSTYPE yyval_default;) +YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); + + /* Number of syntax errors so far. */ + int yynerrs = 0; + + yy_state_fast_t yystate = 0; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus = 0; + + /* Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; + + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; + + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; + + int yyn; + /* The return value of yyparse. */ + int yyresult; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yychar = YYEMPTY; /* Cause a token to be read. */ + + goto yysetstate; + + +/*------------------------------------------------------------. +| yynewstate -- push a new state, which is found in yystate. | +`------------------------------------------------------------*/ +yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); + + if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + YYNOMEM; +#else + { + /* Get the current used size of the three stacks, in elements. */ + YYPTRDIFF_T yysize = yyssp - yyss + 1; + +# if defined yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; + } +# else /* defined YYSTACK_RELOCATE */ + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + YYNOMEM; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + YYNOMEM; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ + + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (&yylval, thd); + } + + if (yychar <= YYEOF) + { + yychar = YYEOF; + yytoken = YYSYMBOL_YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else if (yychar == YYerror) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = YYUNDEF; + yytoken = YYSYMBOL_YYerror; + goto yyerrlab1; + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + /* Discard the shifted token. */ + yychar = YYEMPTY; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: /* query: END_OF_INPUT */ +#line 1976 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!thd->bootstrap && + (!(thd->lex->lex_options & OPTION_LEX_FOUND_COMMENT))) + my_yyabort_error((ER_EMPTY_QUERY, MYF(0))); + + thd->lex->sql_command= SQLCOM_EMPTY_QUERY; + YYLIP->found_semicolon= NULL; + } +#line 29747 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3: /* $@1: %empty */ +#line 1985 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_input_stream *lip = YYLIP; + + if ((thd->client_capabilities & CLIENT_MULTI_QUERIES) && + lip->multi_statements && + ! lip->eof()) + { + /* + We found a well formed query, and multi queries are allowed: + - force the parser to stop after the ';' + - mark the start of the next query for the next invocation + of the parser. + */ + lip->next_state= MY_LEX_END; + lip->found_semicolon= lip->get_ptr(); + } + else + { + /* Single query, terminated. */ + lip->found_semicolon= NULL; + } + } +#line 29774 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 5: /* query: directly_executable_statement END_OF_INPUT */ +#line 2010 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Single query, not terminated. */ + YYLIP->found_semicolon= NULL; + } +#line 29783 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 71: /* deallocate: deallocate_or_drop PREPARE_SYM ident */ +#line 2093 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_deallocate_prepare((yyvsp[0].ident_sys)); + } +#line 29791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 74: /* $@2: %empty */ +#line 2105 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "PREPARE..FROM"; } +#line 29797 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 75: /* prepare: PREPARE_SYM ident FROM $@2 expr */ +#line 2107 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->clause_that_disallows_subselect= NULL; + if (Lex->stmt_prepare((yyvsp[-3].ident_sys), (yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 29807 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 76: /* execute: EXECUTE_SYM ident execute_using */ +#line 2116 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_execute((yyvsp[-1].ident_sys), (yyvsp[0].item_list))) + MYSQL_YYABORT; + } +#line 29816 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 77: /* $@3: %empty */ +#line 2121 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "EXECUTE IMMEDIATE"; } +#line 29822 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 78: /* $@4: %empty */ +#line 2123 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= NULL; } +#line 29828 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 79: /* execute: EXECUTE_SYM IMMEDIATE_SYM $@3 expr $@4 execute_using */ +#line 2125 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_execute_immediate((yyvsp[-2].item), (yyvsp[0].item_list))) + MYSQL_YYABORT; + } +#line 29837 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 80: /* execute_using: %empty */ +#line 2132 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 29843 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 81: /* $@5: %empty */ +#line 2134 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "EXECUTE..USING"; } +#line 29849 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 82: /* execute_using: USING $@5 execute_params */ +#line 2136 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= (yyvsp[0].item_list); + Lex->clause_that_disallows_subselect= NULL; + } +#line 29858 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 83: /* execute_params: expr_or_ignore_or_default */ +#line 2144 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_list)= List::make(thd->mem_root, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 29867 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 84: /* execute_params: execute_params ',' expr_or_ignore_or_default */ +#line 2149 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.item_list)= (yyvsp[-2].item_list))->push_back((yyvsp[0].item), thd->mem_root)) + MYSQL_YYABORT; + } +#line 29876 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 85: /* $@6: %empty */ +#line 2160 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HELP")); + } +#line 29885 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 86: /* help: HELP_SYM $@6 ident_or_text */ +#line 2165 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_HELP; + lex->help_arg= (yyvsp[0].lex_str).str; + } +#line 29895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 87: /* $@7: %empty */ +#line 2176 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_CHANGE_MASTER; + } +#line 29903 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 88: /* change: CHANGE MASTER_SYM optional_connection_name TO_SYM $@7 master_defs optional_for_channel */ +#line 2181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 29909 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 91: /* master_def: MASTER_HOST_SYM '=' TEXT_STRING_sys */ +#line 2191 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.host = (yyvsp[0].lex_str).str; + } +#line 29917 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 92: /* master_def: MASTER_USER_SYM '=' TEXT_STRING_sys */ +#line 2195 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.user = (yyvsp[0].lex_str).str; + } +#line 29925 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 93: /* master_def: MASTER_PASSWORD_SYM '=' TEXT_STRING_sys */ +#line 2199 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.password = (yyvsp[0].lex_str).str; + } +#line 29933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 94: /* master_def: MASTER_PORT_SYM '=' ulong_num */ +#line 2203 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.port = (yyvsp[0].ulong_num); + } +#line 29941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 95: /* master_def: MASTER_CONNECT_RETRY_SYM '=' ulong_num */ +#line 2207 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.connect_retry = (yyvsp[0].ulong_num); + } +#line 29949 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 96: /* master_def: MASTER_DELAY_SYM '=' ulong_num */ +#line 2211 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].ulong_num) > MASTER_DELAY_MAX) + { + my_error(ER_MASTER_DELAY_VALUE_OUT_OF_RANGE, MYF(0), + (ulong) (yyvsp[0].ulong_num), (ulong) MASTER_DELAY_MAX); + } + else + Lex->mi.sql_delay = (yyvsp[0].ulong_num); + } +#line 29963 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 97: /* master_def: MASTER_SSL_SYM '=' ulong_num */ +#line 2221 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl= (yyvsp[0].ulong_num) ? + LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; + } +#line 29972 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 98: /* master_def: MASTER_SSL_CA_SYM '=' TEXT_STRING_sys */ +#line 2226 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_ca= (yyvsp[0].lex_str).str; + } +#line 29980 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 99: /* master_def: MASTER_SSL_CAPATH_SYM '=' TEXT_STRING_sys */ +#line 2230 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_capath= (yyvsp[0].lex_str).str; + } +#line 29988 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 100: /* master_def: MASTER_SSL_CERT_SYM '=' TEXT_STRING_sys */ +#line 2234 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_cert= (yyvsp[0].lex_str).str; + } +#line 29996 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 101: /* master_def: MASTER_SSL_CIPHER_SYM '=' TEXT_STRING_sys */ +#line 2238 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_cipher= (yyvsp[0].lex_str).str; + } +#line 30004 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 102: /* master_def: MASTER_SSL_KEY_SYM '=' TEXT_STRING_sys */ +#line 2242 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_key= (yyvsp[0].lex_str).str; + } +#line 30012 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 103: /* master_def: MASTER_SSL_VERIFY_SERVER_CERT_SYM '=' ulong_num */ +#line 2246 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_verify_server_cert= (yyvsp[0].ulong_num) ? + LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; + } +#line 30021 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 104: /* master_def: MASTER_SSL_CRL_SYM '=' TEXT_STRING_sys */ +#line 2251 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_crl= (yyvsp[0].lex_str).str; + } +#line 30029 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 105: /* master_def: MASTER_SSL_CRLPATH_SYM '=' TEXT_STRING_sys */ +#line 2255 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_crlpath= (yyvsp[0].lex_str).str; + } +#line 30037 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 106: /* master_def: MASTER_HEARTBEAT_PERIOD_SYM '=' NUM_literal */ +#line 2260 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.heartbeat_period= (float) (yyvsp[0].item_num)->val_real(); + if (unlikely(Lex->mi.heartbeat_period > + SLAVE_MAX_HEARTBEAT_PERIOD) || + unlikely(Lex->mi.heartbeat_period < 0.0)) + my_yyabort_error((ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, MYF(0), + SLAVE_MAX_HEARTBEAT_PERIOD)); + + if (unlikely(Lex->mi.heartbeat_period > slave_net_timeout)) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX, + ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX)); + } + if (unlikely(Lex->mi.heartbeat_period < 0.001)) + { + if (unlikely(Lex->mi.heartbeat_period != 0.0)) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN, + ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN)); + Lex->mi.heartbeat_period= 0.0; + } + Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_DISABLE; + } + Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 30069 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 107: /* master_def: IGNORE_SERVER_IDS_SYM '=' '(' ignore_server_id_list ')' */ +#line 2288 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_ignore_server_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 30077 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 108: /* master_def: DO_DOMAIN_IDS_SYM '=' '(' do_domain_id_list ')' */ +#line 2292 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_do_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 30085 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 109: /* master_def: IGNORE_DOMAIN_IDS_SYM '=' '(' ignore_domain_id_list ')' */ +#line 2296 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_ignore_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 30093 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 114: /* ignore_server_id: ulong_num */ +#line 2311 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_ignore_server_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 30101 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 118: /* do_domain_id: ulong_num */ +#line 2324 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_do_domain_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 30109 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 122: /* ignore_domain_id: ulong_num */ +#line 2337 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_ignore_domain_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 30117 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 123: /* master_file_def: MASTER_LOG_FILE_SYM '=' TEXT_STRING_sys */ +#line 2344 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.log_file_name = (yyvsp[0].lex_str).str; + } +#line 30125 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 124: /* master_file_def: MASTER_LOG_POS_SYM '=' ulonglong_num */ +#line 2348 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + If the user specified a value < BIN_LOG_HEADER_SIZE, adjust it + instead of causing subsequent errors. + We need to do it in this file, because only there we know that + MASTER_LOG_POS has been explicitly specified. On the contrary + in change_master() (sql_repl.cc) we cannot distinguish between 0 + (MASTER_LOG_POS explicitly specified as 0) and 0 (unspecified), + whereas we want to distinguish (specified 0 means "read the binlog + from 0" (4 in fact), unspecified means "don't change the position + (keep the preceding value)"). + */ + Lex->mi.pos= MY_MAX(BIN_LOG_HEADER_SIZE, (yyvsp[0].ulonglong_number)); + } +#line 30144 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 125: /* master_file_def: RELAY_LOG_FILE_SYM '=' TEXT_STRING_sys */ +#line 2363 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.relay_log_name = (yyvsp[0].lex_str).str; + } +#line 30152 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 126: /* master_file_def: RELAY_LOG_POS_SYM '=' ulong_num */ +#line 2367 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.relay_log_pos = (yyvsp[0].ulong_num); + /* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */ + Lex->mi.relay_log_pos= MY_MAX(BIN_LOG_HEADER_SIZE, Lex->mi.relay_log_pos); + } +#line 30162 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 127: /* master_file_def: MASTER_USE_GTID_SYM '=' CURRENT_POS_SYM */ +#line 2373 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_CURRENT_POS; + } +#line 30172 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 128: /* master_file_def: MASTER_USE_GTID_SYM '=' SLAVE_POS_SYM */ +#line 2379 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_SLAVE_POS; + } +#line 30182 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 129: /* master_file_def: MASTER_USE_GTID_SYM '=' NO_SYM */ +#line 2385 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_NO; + } +#line 30192 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 130: /* master_file_def: MASTER_DEMOTE_TO_SLAVE_SYM '=' bool */ +#line 2391 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.is_demotion_opt= (bool) (yyvsp[0].ulong_num); + } +#line 30200 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 131: /* optional_connection_name: %empty */ +#line 2398 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->mi.connection_name= null_clex_str; + } +#line 30209 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 133: /* connection_name: TEXT_STRING_sys */ +#line 2407 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.connection_name= (yyvsp[0].lex_str); +#ifdef HAVE_REPLICATION + if (unlikely(check_master_connection_name(&(yyvsp[0].lex_str)))) + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); +#endif + } +#line 30221 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 134: /* optional_for_channel: %empty */ +#line 2418 "/home/buildbot/git/sql/sql_yacc.yy" + { + /*do nothing */ + } +#line 30229 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 136: /* for_channel: FOR_SYM CHANNEL_SYM TEXT_STRING_sys */ +#line 2427 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->mi.connection_name.str != NULL) + { + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)")); + } + else + { + Lex->mi.connection_name= (yyvsp[0].lex_str); +#ifdef HAVE_REPLICATION + if (unlikely(check_master_connection_name(&(yyvsp[0].lex_str)))) + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); +#endif + } + + } +#line 30249 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 137: /* $@8: %empty */ +#line 2448 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_table())) + MYSQL_YYABORT; + lex->create_info.init(); + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->current_select->parsing_place= BEFORE_OPT_LIST; + if (lex->set_command_with_check(SQLCOM_CREATE_TABLE, (yyvsp[-2].num), (yyvsp[-3].object_ddl_options) | (yyvsp[0].object_ddl_options))) + MYSQL_YYABORT; + } +#line 30265 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 138: /* $@9: %empty */ +#line 2460 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING, + TL_WRITE, MDL_SHARED_UPGRADABLE)) + MYSQL_YYABORT; + lex->alter_info.reset(); + /* + For CREATE TABLE we should not open the table even if it exists. + If the table exists, we should either not create it or replace it + */ + lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; + lex->name= null_clex_str; + lex->create_last_non_select_table= lex->last_table(); + lex->inc_select_stack_outer_barrier(); + } +#line 30286 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 139: /* create: create_or_replace opt_temporary TABLE_SYM opt_if_not_exists $@8 table_ident $@9 create_body */ +#line 2477 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + create_table_set_open_action_and_adjust_tables(lex); + Lex->pop_select(); //main select + } +#line 30296 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 140: /* $@10: %empty */ +#line 2483 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (lex->main_select_push()) + MYSQL_YYABORT; + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_sequence())) + MYSQL_YYABORT; + lex->create_info.init(); + if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_SEQUENCE, (yyvsp[-3].num), + (yyvsp[-4].object_ddl_options) | (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING, + TL_WRITE, MDL_EXCLUSIVE)) + MYSQL_YYABORT; + + /* + For CREATE TABLE, an non-existing table is not an error. + Instruct open_tables() to just take an MDL lock if the + table does not exist. + */ + lex->alter_info.reset(); + lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; + lex->name= null_clex_str; + lex->create_last_non_select_table= lex->last_table(); + if (unlikely(!(lex->create_info.seq_create_info= + new (thd->mem_root) sequence_definition()))) + MYSQL_YYABORT; + } +#line 30330 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 141: /* create: create_or_replace opt_temporary SEQUENCE_SYM opt_if_not_exists table_ident $@10 opt_sequence opt_create_table_options */ +#line 2513 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + + if (unlikely(lex->create_info.seq_create_info->check_and_adjust(1))) + { + my_error(ER_SEQUENCE_INVALID_DATA, MYF(0), + lex->first_select_lex()->table_list.first->db.str, + lex->first_select_lex()->table_list.first-> + table_name.str); + MYSQL_YYABORT; + } + + /* No fields specified, generate them */ + if (unlikely(prepare_sequence_fields(thd, + &lex->alter_info.create_list))) + MYSQL_YYABORT; + + /* CREATE SEQUENCE always creates a sequence */ + Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE; + Lex->create_info.sequence= 1; + + create_table_set_open_action_and_adjust_tables(lex); + Lex->pop_select(); //main select + } +#line 30359 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 142: /* $@11: %empty */ +#line 2538 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 30368 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 143: /* $@12: %empty */ +#line 2545 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index(Key::MULTIPLE, &(yyvsp[-3].ident_sys), (yyvsp[-2].key_alg), (yyvsp[-7].object_ddl_options) | (yyvsp[-5].object_ddl_options))) + MYSQL_YYABORT; + } +#line 30379 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 144: /* create: create_or_replace INDEX_SYM opt_if_not_exists $@11 ident opt_key_algorithm_clause ON table_ident $@12 '(' key_list ')' opt_lock_wait_timeout normal_key_options opt_index_lock_algorithm */ +#line 2553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30387 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 145: /* $@13: %empty */ +#line 2557 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 30396 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 146: /* $@14: %empty */ +#line 2564 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index(Key::UNIQUE, &(yyvsp[-3].ident_sys), (yyvsp[-2].key_alg), (yyvsp[-8].object_ddl_options) | (yyvsp[-5].object_ddl_options))) + MYSQL_YYABORT; + } +#line 30407 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 147: /* create: create_or_replace UNIQUE_SYM INDEX_SYM opt_if_not_exists $@13 ident opt_key_algorithm_clause ON table_ident $@14 '(' key_list opt_without_overlaps ')' opt_lock_wait_timeout normal_key_options opt_index_lock_algorithm */ +#line 2573 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 148: /* $@15: %empty */ +#line 2577 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 30424 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 149: /* $@16: %empty */ +#line 2583 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index((yyvsp[-6].key_type), &(yyvsp[-2].ident_sys), HA_KEY_ALG_UNDEF, (yyvsp[-7].object_ddl_options) | (yyvsp[-3].object_ddl_options))) + MYSQL_YYABORT; + } +#line 30435 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 150: /* create: create_or_replace fulltext INDEX_SYM $@15 opt_if_not_exists ident ON table_ident $@16 '(' key_list ')' opt_lock_wait_timeout fulltext_key_options opt_index_lock_algorithm */ +#line 2591 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30443 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 151: /* $@17: %empty */ +#line 2595 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 30452 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 152: /* $@18: %empty */ +#line 2601 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index((yyvsp[-6].key_type), &(yyvsp[-2].ident_sys), HA_KEY_ALG_UNDEF, (yyvsp[-7].object_ddl_options) | (yyvsp[-3].object_ddl_options))) + MYSQL_YYABORT; + } +#line 30463 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 153: /* create: create_or_replace spatial INDEX_SYM $@17 opt_if_not_exists ident ON table_ident $@18 '(' key_list ')' opt_lock_wait_timeout spatial_key_options opt_index_lock_algorithm */ +#line 2609 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30471 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 154: /* $@19: %empty */ +#line 2613 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + } +#line 30479 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 155: /* create: create_or_replace DATABASE opt_if_not_exists ident $@19 opt_create_database_options */ +#line 2617 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_DB, 0, + (yyvsp[-5].object_ddl_options) | (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + lex->name= (yyvsp[-2].ident_sys); + } +#line 30491 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 156: /* $@20: %empty */ +#line 2626 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->inc_select_stack_outer_barrier(); + if (Lex->add_create_view(thd, (yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), + DTYPE_ALGORITHM_UNDEFINED, (yyvsp[-3].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 30504 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 157: /* create: create_or_replace definer_opt opt_view_suid VIEW_SYM opt_if_not_exists table_ident $@20 view_list_opt AS view_select */ +#line 2635 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30512 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 158: /* $@21: %empty */ +#line 2640 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_view(thd, (yyvsp[-6].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-5].num), (yyvsp[-3].view_suid), (yyvsp[0].table)))) + MYSQL_YYABORT; + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->inc_select_stack_outer_barrier(); + } +#line 30524 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 159: /* create: create_or_replace view_algorithm definer_opt opt_view_suid VIEW_SYM opt_if_not_exists table_ident $@21 view_list_opt AS view_select */ +#line 2648 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30532 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 160: /* $@22: %empty */ +#line 2652 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + } +#line 30542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 161: /* create: create_or_replace definer_opt TRIGGER_SYM $@22 trigger_tail */ +#line 2658 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30550 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 162: /* $@23: %empty */ +#line 2662 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + } +#line 30560 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 163: /* create: create_or_replace definer_opt EVENT_SYM $@23 event_tail */ +#line 2668 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30568 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 164: /* create: create_or_replace USER_SYM opt_if_not_exists clear_privileges grant_list opt_require_clause opt_resource_options opt_account_locking_and_opt_password_expiration */ +#line 2673 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_command_with_check(SQLCOM_CREATE_USER, + (yyvsp[-7].object_ddl_options) | (yyvsp[-5].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 30578 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 165: /* create: create_or_replace ROLE_SYM opt_if_not_exists clear_privileges role_list opt_with_admin */ +#line 2680 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_command_with_check(SQLCOM_CREATE_ROLE, + (yyvsp[-5].object_ddl_options) | (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 30588 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 166: /* $@24: %empty */ +#line 2685 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->set_command(SQLCOM_CREATE_SERVER, (yyvsp[0].object_ddl_options)); } +#line 30594 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 167: /* create: create_or_replace $@24 server_def */ +#line 2687 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 30600 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 169: /* opt_sequence: %empty */ +#line 2692 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 30606 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 173: /* sequence_def: MINVALUE_SYM opt_equal longlong_num */ +#line 2703 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.seq_create_info->min_value= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 30615 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 174: /* sequence_def: NO_SYM MINVALUE_SYM */ +#line 2708 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 30625 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 175: /* sequence_def: NOMINVALUE_SYM */ +#line 2714 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 30635 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 176: /* sequence_def: MAXVALUE_SYM opt_equal longlong_num */ +#line 2720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->max_value= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 30647 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 177: /* sequence_def: NO_SYM MAXVALUE_SYM */ +#line 2728 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 30657 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 178: /* sequence_def: NOMAXVALUE_SYM */ +#line 2734 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 30667 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 179: /* sequence_def: START_SYM opt_with longlong_num */ +#line 2740 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_start)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "START")); + Lex->create_info.seq_create_info->start= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_start; + } +#line 30679 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 180: /* sequence_def: INCREMENT_SYM opt_by longlong_num */ +#line 2748 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_increment)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "INCREMENT")); + Lex->create_info.seq_create_info->increment= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment; + } +#line 30691 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 181: /* sequence_def: CACHE_SYM opt_equal longlong_num */ +#line 2756 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); + Lex->create_info.seq_create_info->cache= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; + } +#line 30703 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 182: /* sequence_def: NOCACHE_SYM */ +#line 2764 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); + Lex->create_info.seq_create_info->cache= 0; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; + } +#line 30715 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 183: /* sequence_def: CYCLE_SYM */ +#line 2772 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); + Lex->create_info.seq_create_info->cycle= 1; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; + } +#line 30727 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 184: /* sequence_def: NOCYCLE_SYM */ +#line 2780 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); + Lex->create_info.seq_create_info->cycle= 0; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; + } +#line 30739 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 185: /* sequence_def: RESTART_SYM */ +#line 2788 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) + { + thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); + MYSQL_YYABORT; + } + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart; + } +#line 30755 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 186: /* sequence_def: RESTART_SYM opt_with longlong_num */ +#line 2800 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) + { + thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); + MYSQL_YYABORT; + } + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); + Lex->create_info.seq_create_info->restart= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value; + } +#line 30772 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 187: /* force_lookahead: %empty */ +#line 2815 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30778 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 188: /* force_lookahead: FORCE_LOOKAHEAD */ +#line 2815 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30784 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 189: /* $@25: %empty */ +#line 2819 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_options_with_check((yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + Lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 30794 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 190: /* server_def: SERVER_SYM opt_if_not_exists ident_or_text $@25 FOREIGN DATA_SYM WRAPPER_SYM ident_or_text OPTIONS_SYM '(' server_options_list ')' */ +#line 2826 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->server_options.scheme= (yyvsp[-4].lex_str); } +#line 30800 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 193: /* server_option: USER_SYM TEXT_STRING_sys */ +#line 2836 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.username.str == 0); + Lex->server_options.username= (yyvsp[0].lex_str); + } +#line 30809 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 194: /* server_option: HOST_SYM TEXT_STRING_sys */ +#line 2841 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.host.str == 0); + Lex->server_options.host= (yyvsp[0].lex_str); + } +#line 30818 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 195: /* server_option: DATABASE TEXT_STRING_sys */ +#line 2846 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.db.str == 0); + Lex->server_options.db= (yyvsp[0].lex_str); + } +#line 30827 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 196: /* server_option: OWNER_SYM TEXT_STRING_sys */ +#line 2851 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.owner.str == 0); + Lex->server_options.owner= (yyvsp[0].lex_str); + } +#line 30836 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 197: /* server_option: PASSWORD_SYM TEXT_STRING_sys */ +#line 2856 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.password.str == 0); + Lex->server_options.password= (yyvsp[0].lex_str); + } +#line 30845 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 198: /* server_option: SOCKET_SYM TEXT_STRING_sys */ +#line 2861 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.socket.str == 0); + Lex->server_options.socket= (yyvsp[0].lex_str); + } +#line 30854 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 199: /* server_option: PORT_SYM ulong_num */ +#line 2866 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->server_options.port= (yyvsp[0].ulong_num); + } +#line 30862 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 200: /* $@26: %empty */ +#line 2873 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->stmt_definition_begin= (yyvsp[-2].simple_string); + if (unlikely(lex->add_create_options_with_check((yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + if (unlikely(!(lex->event_parse_data= + Event_parse_data::new_instance(thd)))) + MYSQL_YYABORT; + lex->event_parse_data->identifier= (yyvsp[0].spname); + lex->event_parse_data->on_completion= + Event_parse_data::ON_COMPLETION_DROP; + + lex->sql_command= SQLCOM_CREATE_EVENT; + /* We need that for disallowing subqueries */ + } +#line 30883 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 201: /* event_tail: remember_name opt_if_not_exists sp_name $@26 ON SCHEDULE_SYM ev_schedule_time opt_ev_on_completion opt_ev_status opt_ev_comment DO_SYM ev_sql_stmt */ +#line 2894 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + sql_command is set here because some rules in ev_sql_stmt + can overwrite it + */ + Lex->sql_command= SQLCOM_CREATE_EVENT; + } +#line 30895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 202: /* $@27: %empty */ +#line 2905 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_expression= (yyvsp[-1].item); + Lex->event_parse_data->interval= (yyvsp[0].interval); + } +#line 30904 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 204: /* ev_schedule_time: AT_SYM expr */ +#line 2912 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_execute_at= (yyvsp[0].item); + } +#line 30912 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 205: /* opt_ev_status: %empty */ +#line 2918 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30918 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 206: /* opt_ev_status: ENABLE_SYM */ +#line 2920 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::ENABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30928 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 207: /* opt_ev_status: DISABLE_SYM ON SLAVE */ +#line 2926 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::SLAVESIDE_DISABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30938 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 208: /* opt_ev_status: DISABLE_SYM */ +#line 2932 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::DISABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30948 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 209: /* ev_starts: %empty */ +#line 2941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_now_local(thd, 0); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + Lex->event_parse_data->item_starts= item; + } +#line 30959 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 210: /* ev_starts: STARTS_SYM expr */ +#line 2948 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_starts= (yyvsp[0].item); + } +#line 30967 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 212: /* ev_ends: ENDS_SYM expr */ +#line 2956 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_ends= (yyvsp[0].item); + } +#line 30975 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 213: /* opt_ev_on_completion: %empty */ +#line 2962 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30981 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 215: /* ev_on_completion: ON COMPLETION_SYM opt_not PRESERVE_SYM */ +#line 2968 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->on_completion= (yyvsp[-1].num) + ? Event_parse_data::ON_COMPLETION_DROP + : Event_parse_data::ON_COMPLETION_PRESERVE; + (yyval.num)= 1; + } +#line 30992 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 216: /* opt_ev_comment: %empty */ +#line 2977 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30998 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 217: /* opt_ev_comment: COMMENT_SYM TEXT_STRING_sys */ +#line 2979 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->comment= Lex->event_parse_data->comment= (yyvsp[0].lex_str); + (yyval.num)= 1; + } +#line 31007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 218: /* $@28: %empty */ +#line 2986 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + /* + This stops the following : + - CREATE EVENT ... DO CREATE EVENT ...; + - ALTER EVENT ... DO CREATE EVENT ...; + - CREATE EVENT ... DO ALTER EVENT DO ....; + - CREATE PROCEDURE ... BEGIN CREATE EVENT ... END| + This allows: + - CREATE EVENT ... DO DROP EVENT yyy; + - CREATE EVENT ... DO ALTER EVENT yyy; + (the nested ALTER EVENT can have anything but DO clause) + - ALTER EVENT ... DO ALTER EVENT yyy; + (the nested ALTER EVENT can have anything but DO clause) + - ALTER EVENT ... DO DROP EVENT yyy; + - CREATE PROCEDURE ... BEGIN ALTER EVENT ... END| + (the nested ALTER EVENT can have anything but DO clause) + - CREATE PROCEDURE ... BEGIN DROP EVENT ... END| + */ + if (unlikely(lex->sphead)) + my_yyabort_error((ER_EVENT_RECURSION_FORBIDDEN, MYF(0))); + + if (unlikely(!lex->make_sp_head(thd, + lex->event_parse_data->identifier, + &sp_handler_procedure, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + + lex->sphead->set_body_start(thd, lip->get_cpp_ptr()); + } +#line 31044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 219: /* ev_sql_stmt: $@28 sp_proc_stmt force_lookahead */ +#line 3019 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* return back to the original memory root ASAP */ + if (Lex->sp_body_finalize_event(thd)) + MYSQL_YYABORT; + } +#line 31054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 220: /* clear_privileges: %empty */ +#line 3028 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->users_list.empty(); + lex->first_select_lex()->db= null_clex_str; + lex->account_options.reset(); + } +#line 31065 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 221: /* opt_aggregate: %empty */ +#line 3037 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_aggregate_type)= NOT_AGGREGATE; } +#line 31071 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 222: /* opt_aggregate: AGGREGATE_SYM */ +#line 3038 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_aggregate_type)= GROUP_AGGREGATE; } +#line 31077 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 223: /* sp_handler: FUNCTION_SYM */ +#line 3043 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_function; } +#line 31083 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 224: /* sp_handler: PROCEDURE_SYM */ +#line 3044 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_procedure; } +#line 31089 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 225: /* sp_handler: PACKAGE_ORACLE_SYM */ +#line 3045 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_package_spec; } +#line 31095 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 226: /* sp_handler: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM */ +#line 3046 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_package_body; } +#line 31101 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 227: /* sp_name: ident '.' ident */ +#line 3052 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spname)= Lex->make_sp_name(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31110 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 228: /* sp_name: ident */ +#line 3057 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spname)= Lex->make_sp_name(thd, &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 229: /* sp_a_chistics: %empty */ +#line 3064 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31125 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 230: /* sp_a_chistics: sp_a_chistics sp_chistic */ +#line 3065 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31131 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 231: /* sp_c_chistics: %empty */ +#line 3069 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31137 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 232: /* sp_c_chistics: sp_c_chistics sp_c_chistic */ +#line 3070 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31143 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 233: /* sp_chistic: COMMENT_SYM TEXT_STRING_sys */ +#line 3076 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.comment= (yyvsp[0].lex_str); } +#line 31149 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 234: /* sp_chistic: LANGUAGE_SYM SQL_SYM */ +#line 3078 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Just parse it, we only have one language for now. */ } +#line 31155 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 235: /* sp_chistic: NO_SYM SQL_SYM */ +#line 3080 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_NO_SQL; } +#line 31161 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 236: /* sp_chistic: CONTAINS_SYM SQL_SYM */ +#line 3082 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_CONTAINS_SQL; } +#line 31167 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 237: /* sp_chistic: READS_SYM SQL_SYM DATA_SYM */ +#line 3084 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_READS_SQL_DATA; } +#line 31173 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 238: /* sp_chistic: MODIFIES_SYM SQL_SYM DATA_SYM */ +#line 3086 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_MODIFIES_SQL_DATA; } +#line 31179 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 239: /* sp_chistic: sp_suid */ +#line 3088 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.suid= (yyvsp[0].sp_suid); } +#line 31185 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 240: /* sp_c_chistic: sp_chistic */ +#line 3093 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 31191 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 241: /* sp_c_chistic: opt_not DETERMINISTIC_SYM */ +#line 3094 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.detistic= ! (yyvsp[-1].num); } +#line 31197 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 242: /* sp_suid: SQL_SYM SECURITY_SYM DEFINER_SYM */ +#line 3098 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_suid)= SP_IS_SUID; } +#line 31203 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 243: /* sp_suid: SQL_SYM SECURITY_SYM INVOKER_SYM */ +#line 3099 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_suid)= SP_IS_NOT_SUID; } +#line 31209 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 244: /* $@29: %empty */ +#line 3104 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 245: /* call: CALL_SYM ident $@29 opt_sp_cparam_list */ +#line 3109 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 31227 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 246: /* $@30: %empty */ +#line 3114 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31236 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 247: /* call: CALL_SYM ident '.' ident $@30 opt_sp_cparam_list */ +#line 3119 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 31245 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 248: /* $@31: %empty */ +#line 3124 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31254 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 249: /* call: CALL_SYM ident '.' ident '.' ident $@31 opt_sp_cparam_list */ +#line 3129 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 31263 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 254: /* sp_cparams: sp_cparams ',' expr */ +#line 3148 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_back((yyvsp[0].item), thd->mem_root); + } +#line 31271 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 255: /* sp_cparams: expr */ +#line 3152 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_back((yyvsp[0].item), thd->mem_root); + } +#line 31279 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 256: /* sp_fdparam_list: %empty */ +#line 3160 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start(); + Lex->sphead->m_param_end= Lex->sphead->m_param_begin; + } +#line 31288 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 257: /* $@32: %empty */ +#line 3165 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start(); + } +#line 31296 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 258: /* sp_fdparam_list: $@32 sp_fdparams */ +#line 3169 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); + } +#line 31304 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 261: /* sp_param_name: ident */ +#line 3181 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spvar)= Lex->sp_param_init(&(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31313 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 266: /* sp_parameter_type: IN_SYM */ +#line 3199 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_IN; } +#line 31319 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 267: /* sp_parameter_type: OUT_SYM */ +#line 3200 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_OUT; } +#line 31325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 268: /* sp_parameter_type: INOUT_SYM */ +#line 3201 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_INOUT; } +#line 31331 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 269: /* $@33: %empty */ +#line 3206 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start() + 1; + } +#line 31339 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 270: /* sp_parenthesized_pdparam_list: '(' $@33 sp_pdparam_list ')' */ +#line 3211 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); + } +#line 31347 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 272: /* sp_proc_stmts: %empty */ +#line 3221 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31353 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 274: /* sp_proc_stmts1: sp_proc_stmt ';' */ +#line 3226 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31359 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 276: /* optionally_qualified_column_ident: sp_decl_ident */ +#line 3233 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(&(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31369 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 277: /* optionally_qualified_column_ident: sp_decl_ident '.' ident */ +#line 3239 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(&(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31379 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 278: /* optionally_qualified_column_ident: sp_decl_ident '.' ident '.' ident */ +#line 3245 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31389 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 279: /* row_field_definition: row_field_name field_type */ +#line 3255 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_ROUTINE_LOCAL); + } +#line 31398 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 280: /* row_field_definition_list: row_field_definition */ +#line 3263 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spvar_definition_list)= Row_definition_list::make(thd->mem_root, (yyvsp[0].spvar_definition)))) + MYSQL_YYABORT; + } +#line 31407 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 281: /* row_field_definition_list: row_field_definition_list ',' row_field_definition */ +#line 3268 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.spvar_definition_list)= (yyvsp[-2].spvar_definition_list))->append_uniq(thd->mem_root, (yyvsp[0].spvar_definition))) + MYSQL_YYABORT; + } +#line 31416 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 282: /* row_type_body: '(' row_field_definition_list ')' */ +#line 3275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_definition_list)= (yyvsp[-1].spvar_definition_list); } +#line 31422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 283: /* sp_decl_idents_init_vars: sp_decl_idents */ +#line 3280 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_variable_declarations_init(thd, (yyvsp[0].num)); + } +#line 31430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 284: /* $@34: %empty */ +#line 3288 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_ROUTINE_LOCAL); + } +#line 31439 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 285: /* sp_decl_variable_list: sp_decl_idents_init_vars field_type $@34 sp_opt_default */ +#line 3293 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_finalize(thd, (yyvsp[-3].num), + &Lex->last_field[0], + (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-3].num)); + } +#line 31451 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 286: /* sp_decl_variable_list: sp_decl_idents_init_vars ROW_SYM row_type_body sp_opt_default */ +#line 3303 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_row_finalize(thd, (yyvsp[-3].num), (yyvsp[-1].spvar_definition_list), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-3].num)); + } +#line 31461 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 288: /* $@35: %empty */ +#line 3313 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_init(thd, (yyvsp[-2].num)))) + MYSQL_YYABORT; + } +#line 31470 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 289: /* sp_decl_handler: sp_handler_type HANDLER_SYM FOR_SYM $@35 sp_hcond_list sp_proc_stmt */ +#line 3318 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_finalize(thd, (yyvsp[-5].num)))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).curs= 0; + (yyval.spblock).hndlrs= 1; + } +#line 31481 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 292: /* sp_cursor_stmt_lex: %empty */ +#line 3333 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->lex->sphead); + if (unlikely(!((yyval.sp_cursor_stmt)= new (thd->mem_root) + sp_lex_cursor(thd, thd->lex)))) + MYSQL_YYABORT; + } +#line 31492 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 293: /* $@36: %empty */ +#line 3343 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->free_list == NULL); + Lex->sphead->reset_lex(thd, (yyvsp[0].sp_cursor_stmt)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 31503 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 294: /* sp_cursor_stmt: sp_cursor_stmt_lex $@36 select */ +#line 3350 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex == (yyvsp[-2].sp_cursor_stmt)); + Lex->pop_select(); //main select + if (unlikely((yyvsp[-2].sp_cursor_stmt)->stmt_finalize(thd)) || + unlikely((yyvsp[-2].sp_cursor_stmt)->sphead->restore_lex(thd))) + MYSQL_YYABORT; + (yyval.sp_cursor_stmt)= (yyvsp[-2].sp_cursor_stmt); + } +#line 31516 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 295: /* sp_handler_type: EXIT_MARIADB_SYM */ +#line 3361 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::EXIT; } +#line 31522 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 296: /* sp_handler_type: CONTINUE_MARIADB_SYM */ +#line 3362 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::CONTINUE; } +#line 31528 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 297: /* sp_handler_type: EXIT_ORACLE_SYM */ +#line 3363 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::EXIT; } +#line 31534 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 298: /* sp_handler_type: CONTINUE_ORACLE_SYM */ +#line 3364 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::CONTINUE; } +#line 31540 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 299: /* sp_hcond_list: sp_hcond_element */ +#line 3370 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 31546 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 300: /* sp_hcond_list: sp_hcond_list ',' sp_hcond_element */ +#line 3372 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)+= 1; } +#line 31552 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 301: /* sp_hcond_element: sp_hcond */ +#line 3377 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *ctx= lex->spcont->parent_context(); + + if (unlikely(ctx->check_duplicate_handler((yyvsp[0].spcondvalue)))) + my_yyabort_error((ER_SP_DUP_HANDLER, MYF(0))); + + sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction(); + i->add_condition((yyvsp[0].spcondvalue)); + } +#line 31568 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 302: /* sp_cond: ulong_num */ +#line 3392 "/home/buildbot/git/sql/sql_yacc.yy" + { /* mysql errno */ + if (unlikely((yyvsp[0].ulong_num) == 0)) + my_yyabort_error((ER_WRONG_VALUE, MYF(0), "CONDITION", "0")); + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value((yyvsp[0].ulong_num)); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31580 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 304: /* sqlstate: SQLSTATE_SYM opt_value TEXT_STRING_literal */ +#line 3404 "/home/buildbot/git/sql/sql_yacc.yy" + { /* SQLSTATE */ + + /* + An error is triggered: + - if the specified string is not a valid SQLSTATE, + - or if it represents the completion condition -- it is not + allowed to SIGNAL, or declare a handler for the completion + condition. + */ + if (unlikely(!is_sqlstate_valid(&(yyvsp[0].lex_str)) || + is_sqlstate_completion((yyvsp[0].lex_str).str))) + my_yyabort_error((ER_SP_BAD_SQLSTATE, MYF(0), (yyvsp[0].lex_str).str)); + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value((yyvsp[0].lex_str).str); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31601 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 305: /* opt_value: %empty */ +#line 3423 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31607 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 306: /* opt_value: VALUE_SYM */ +#line 3424 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31613 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 307: /* sp_hcond: sp_cond */ +#line 3429 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= (yyvsp[0].spcondvalue); + } +#line 31621 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 308: /* sp_hcond: ident */ +#line 3433 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= Lex->spcont->find_declared_or_predefined_condition(thd, &(yyvsp[0].ident_sys)); + if (unlikely((yyval.spcondvalue) == NULL)) + my_yyabort_error((ER_SP_COND_MISMATCH, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 31631 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 309: /* sp_hcond: SQLWARNING_SYM */ +#line 3439 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::WARNING); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31641 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 310: /* sp_hcond: not FOUND_SYM */ +#line 3445 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::NOT_FOUND); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31651 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 311: /* sp_hcond: SQLEXCEPTION_SYM */ +#line 3451 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31661 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 312: /* sp_hcond: OTHERS_ORACLE_SYM */ +#line 3457 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31671 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 313: /* raise_stmt_oracle: RAISE_ORACLE_SYM opt_set_signal_information */ +#line 3467 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_resignal_statement(thd, NULL))) + MYSQL_YYABORT; + } +#line 31680 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 314: /* raise_stmt_oracle: RAISE_ORACLE_SYM signal_value opt_set_signal_information */ +#line 3472 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_signal_statement(thd, (yyvsp[-1].spcondvalue)))) + MYSQL_YYABORT; + } +#line 31689 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 315: /* signal_stmt: SIGNAL_SYM signal_value opt_set_signal_information */ +#line 3480 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_signal_statement(thd, (yyvsp[-1].spcondvalue))) + MYSQL_YYABORT; + } +#line 31698 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 316: /* signal_value: ident */ +#line 3488 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spcondvalue)= Lex->stmt_signal_value((yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31707 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 317: /* signal_value: sqlstate */ +#line 3493 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } +#line 31713 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 318: /* opt_signal_value: %empty */ +#line 3498 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= NULL; } +#line 31719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 319: /* opt_signal_value: signal_value */ +#line 3500 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } +#line 31725 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 320: /* opt_set_signal_information: %empty */ +#line 3505 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->m_parser_state->m_yacc.m_set_signal_info.clear(); + } +#line 31733 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 322: /* signal_information_item_list: signal_condition_information_item_name '=' signal_allowed_expr */ +#line 3513 "/home/buildbot/git/sql/sql_yacc.yy" + { + Set_signal_information *info; + info= &thd->m_parser_state->m_yacc.m_set_signal_info; + int index= (int) (yyvsp[-2].diag_condition_item_name); + info->clear(); + info->m_item[index]= (yyvsp[0].item); + } +#line 31745 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 323: /* signal_information_item_list: signal_information_item_list ',' signal_condition_information_item_name '=' signal_allowed_expr */ +#line 3522 "/home/buildbot/git/sql/sql_yacc.yy" + { + Set_signal_information *info; + info= &thd->m_parser_state->m_yacc.m_set_signal_info; + int index= (int) (yyvsp[-2].diag_condition_item_name); + if (unlikely(info->m_item[index] != NULL)) + my_yyabort_error((ER_DUP_SIGNAL_SET, MYF(0), + Diag_condition_item_names[index].str)); + info->m_item[index]= (yyvsp[0].item); + } +#line 31759 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 324: /* signal_allowed_expr: literal */ +#line 3538 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 31765 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 325: /* signal_allowed_expr: variable */ +#line 3540 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].item)->type() == Item::FUNC_ITEM) + { + Item_func *item= (Item_func*) (yyvsp[0].item); + if (unlikely(item->functype() == Item_func::SUSERVAR_FUNC)) + { + /* + Don't allow the following syntax: + SIGNAL/RESIGNAL ... + SET = @foo := expr + */ + thd->parse_error(); + MYSQL_YYABORT; + } + } + (yyval.item)= (yyvsp[0].item); + } +#line 31787 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 326: /* signal_allowed_expr: simple_ident */ +#line 3558 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 31793 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 327: /* signal_condition_information_item_name: CLASS_ORIGIN_SYM */ +#line 3564 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CLASS_ORIGIN; } +#line 31799 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 328: /* signal_condition_information_item_name: SUBCLASS_ORIGIN_SYM */ +#line 3566 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_SUBCLASS_ORIGIN; } +#line 31805 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 329: /* signal_condition_information_item_name: CONSTRAINT_CATALOG_SYM */ +#line 3568 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_CATALOG; } +#line 31811 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 330: /* signal_condition_information_item_name: CONSTRAINT_SCHEMA_SYM */ +#line 3570 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_SCHEMA; } +#line 31817 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 331: /* signal_condition_information_item_name: CONSTRAINT_NAME_SYM */ +#line 3572 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_NAME; } +#line 31823 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 332: /* signal_condition_information_item_name: CATALOG_NAME_SYM */ +#line 3574 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CATALOG_NAME; } +#line 31829 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 333: /* signal_condition_information_item_name: SCHEMA_NAME_SYM */ +#line 3576 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_SCHEMA_NAME; } +#line 31835 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 334: /* signal_condition_information_item_name: TABLE_NAME_SYM */ +#line 3578 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_TABLE_NAME; } +#line 31841 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 335: /* signal_condition_information_item_name: COLUMN_NAME_SYM */ +#line 3580 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_COLUMN_NAME; } +#line 31847 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 336: /* signal_condition_information_item_name: CURSOR_NAME_SYM */ +#line 3582 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CURSOR_NAME; } +#line 31853 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 337: /* signal_condition_information_item_name: MESSAGE_TEXT_SYM */ +#line 3584 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_MESSAGE_TEXT; } +#line 31859 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 338: /* signal_condition_information_item_name: MYSQL_ERRNO_SYM */ +#line 3586 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_MYSQL_ERRNO; } +#line 31865 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 339: /* signal_condition_information_item_name: ROW_NUMBER_SYM */ +#line 3588 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_ROW_NUMBER; } +#line 31871 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 340: /* resignal_stmt: RESIGNAL_SYM opt_signal_value opt_set_signal_information */ +#line 3593 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_resignal_statement(thd, (yyvsp[-1].spcondvalue)))) + MYSQL_YYABORT; + } +#line 31880 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 341: /* get_diagnostics: GET_SYM which_area DIAGNOSTICS_SYM diagnostics_information */ +#line 3601 "/home/buildbot/git/sql/sql_yacc.yy" + { + Diagnostics_information *info= (yyvsp[0].diag_info); + + info->set_which_da((yyvsp[-2].diag_area)); + + Lex->sql_command= SQLCOM_GET_DIAGNOSTICS; + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_get_diagnostics(info); + + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 31896 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 342: /* which_area: %empty */ +#line 3616 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_area)= Diagnostics_information::CURRENT_AREA; } +#line 31902 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 343: /* which_area: CURRENT_SYM */ +#line 3618 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_area)= Diagnostics_information::CURRENT_AREA; } +#line 31908 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 344: /* diagnostics_information: statement_information */ +#line 3623 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.diag_info)= new (thd->mem_root) Statement_information((yyvsp[0].stmt_info_list)); + if (unlikely((yyval.diag_info) == NULL)) + MYSQL_YYABORT; + } +#line 31918 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 345: /* diagnostics_information: CONDITION_SYM condition_number condition_information */ +#line 3629 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.diag_info)= new (thd->mem_root) Condition_information((yyvsp[-1].item), (yyvsp[0].cond_info_list)); + if (unlikely((yyval.diag_info) == NULL)) + MYSQL_YYABORT; + } +#line 31928 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 346: /* statement_information: statement_information_item */ +#line 3638 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.stmt_info_list)= new (thd->mem_root) List; + if (unlikely((yyval.stmt_info_list) == NULL) || + unlikely((yyval.stmt_info_list)->push_back((yyvsp[0].stmt_info_item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 31939 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 347: /* statement_information: statement_information ',' statement_information_item */ +#line 3645 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].stmt_info_list)->push_back((yyvsp[0].stmt_info_item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.stmt_info_list)= (yyvsp[-2].stmt_info_list); + } +#line 31949 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 348: /* statement_information_item: simple_target_specification '=' statement_information_item_name */ +#line 3654 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.stmt_info_item)= new (thd->mem_root) Statement_information_item((yyvsp[0].stmt_info_item_name), (yyvsp[-2].item)); + if (unlikely((yyval.stmt_info_item) == NULL)) + MYSQL_YYABORT; + } +#line 31959 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 349: /* simple_target_specification: ident_cli */ +#line 3663 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= thd->lex->create_item_for_sp_var(&(yyvsp[0].ident_cli), NULL)))) + MYSQL_YYABORT; + } +#line 31968 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 350: /* simple_target_specification: '@' ident_or_text */ +#line 3668 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= new (thd->mem_root) Item_func_get_user_var(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 31983 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 351: /* statement_information_item_name: NUMBER_MARIADB_SYM */ +#line 3682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::NUMBER; } +#line 31989 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 352: /* statement_information_item_name: NUMBER_ORACLE_SYM */ +#line 3684 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::NUMBER; } +#line 31995 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 353: /* statement_information_item_name: ROW_COUNT_SYM */ +#line 3686 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::ROW_COUNT; } +#line 32001 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 354: /* condition_number: signal_allowed_expr */ +#line 3695 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 32007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 355: /* condition_information: condition_information_item */ +#line 3700 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.cond_info_list)= new (thd->mem_root) List; + if (unlikely((yyval.cond_info_list) == NULL) || + unlikely((yyval.cond_info_list)->push_back((yyvsp[0].cond_info_item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 32018 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 356: /* condition_information: condition_information ',' condition_information_item */ +#line 3707 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].cond_info_list)->push_back((yyvsp[0].cond_info_item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.cond_info_list)= (yyvsp[-2].cond_info_list); + } +#line 32028 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 357: /* condition_information_item: simple_target_specification '=' condition_information_item_name */ +#line 3716 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.cond_info_item)= new (thd->mem_root) Condition_information_item((yyvsp[0].cond_info_item_name), (yyvsp[-2].item)); + if (unlikely((yyval.cond_info_item) == NULL)) + MYSQL_YYABORT; + } +#line 32038 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 358: /* condition_information_item_name: CLASS_ORIGIN_SYM */ +#line 3725 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CLASS_ORIGIN; } +#line 32044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 359: /* condition_information_item_name: SUBCLASS_ORIGIN_SYM */ +#line 3727 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::SUBCLASS_ORIGIN; } +#line 32050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 360: /* condition_information_item_name: CONSTRAINT_CATALOG_SYM */ +#line 3729 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_CATALOG; } +#line 32056 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 361: /* condition_information_item_name: CONSTRAINT_SCHEMA_SYM */ +#line 3731 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_SCHEMA; } +#line 32062 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 362: /* condition_information_item_name: CONSTRAINT_NAME_SYM */ +#line 3733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_NAME; } +#line 32068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 363: /* condition_information_item_name: CATALOG_NAME_SYM */ +#line 3735 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CATALOG_NAME; } +#line 32074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 364: /* condition_information_item_name: SCHEMA_NAME_SYM */ +#line 3737 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::SCHEMA_NAME; } +#line 32080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 365: /* condition_information_item_name: TABLE_NAME_SYM */ +#line 3739 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::TABLE_NAME; } +#line 32086 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 366: /* condition_information_item_name: COLUMN_NAME_SYM */ +#line 3741 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::COLUMN_NAME; } +#line 32092 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 367: /* condition_information_item_name: CURSOR_NAME_SYM */ +#line 3743 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CURSOR_NAME; } +#line 32098 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 368: /* condition_information_item_name: MESSAGE_TEXT_SYM */ +#line 3745 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::MESSAGE_TEXT; } +#line 32104 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 369: /* condition_information_item_name: MYSQL_ERRNO_SYM */ +#line 3747 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::MYSQL_ERRNO; } +#line 32110 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 370: /* condition_information_item_name: RETURNED_SQLSTATE_SYM */ +#line 3749 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::RETURNED_SQLSTATE; } +#line 32116 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 371: /* condition_information_item_name: ROW_NUMBER_SYM */ +#line 3751 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::ROW_NUMBER; } +#line 32122 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 373: /* sp_decl_ident: keyword_sp_decl */ +#line 3757 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_ident_cli(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 32131 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 374: /* sp_decl_idents: sp_decl_ident */ +#line 3765 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* NOTE: field definition is filled in sp_decl section. */ + + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + + if (unlikely(spc->find_variable(&(yyvsp[0].ident_sys), TRUE))) + my_yyabort_error((ER_SP_DUP_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + spc->add_variable(thd, &(yyvsp[0].ident_sys)); + (yyval.num)= 1; + } +#line 32147 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 375: /* sp_decl_idents: sp_decl_idents ',' ident */ +#line 3777 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* NOTE: field definition is filled in sp_decl section. */ + + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + + if (unlikely(spc->find_variable(&(yyvsp[0].ident_sys), TRUE))) + my_yyabort_error((ER_SP_DUP_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + spc->add_variable(thd, &(yyvsp[0].ident_sys)); + (yyval.num)= (yyvsp[-2].num) + 1; + } +#line 32163 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 376: /* $@37: %empty */ +#line 3792 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sphead->new_cont_backpatch(NULL); + } +#line 32173 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 377: /* sp_proc_stmt_if: IF_SYM $@37 sp_if END IF_SYM */ +#line 3798 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sphead->do_cont_backpatch(); } +#line 32179 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 378: /* $@38: %empty */ +#line 3802 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + lex->sphead->reset_lex(thd); + /* + We should not push main select here, it will be done or not + done by the statement, we just provide only a new LEX for the + statement here as if it is start of parsing a new statement. + */ + lex->sphead->m_tmp_query= lip->get_tok_start(); + } +#line 32196 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 379: /* sp_proc_stmt_statement: $@38 sp_statement */ +#line 3815 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->sp_proc_stmt_statement_finalize(thd, yychar == YYEMPTY) || + Lex->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 32206 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 382: /* $@39: %empty */ +#line 3830 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_head *sp= (yyvsp[0].expr_lex)->sphead; + if (unlikely(sp->m_handler->add_instr_freturn(thd, sp, (yyvsp[0].expr_lex)->spcont, + (yyvsp[0].expr_lex)->get_item(), (yyvsp[0].expr_lex)))) + MYSQL_YYABORT; + } +#line 32217 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 383: /* sp_proc_stmt_return: RETURN_ALLMODES_SYM expr_lex $@39 */ +#line 3836 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 32223 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 384: /* sp_proc_stmt_return: RETURN_ORACLE_SYM */ +#line 3838 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + if (unlikely(sp->m_handler->add_instr_preturn(thd, sp, + lex->spcont))) + MYSQL_YYABORT; + } +#line 32235 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 385: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM */ +#line 3849 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_exit_statement(thd, NULL))) + MYSQL_YYABORT; + } +#line 32244 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 386: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM label_ident */ +#line 3854 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_exit_statement(thd, &(yyvsp[0].ident_sys), NULL))) + MYSQL_YYABORT; + } +#line 32253 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 387: /* $@40: %empty */ +#line 3859 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_exit_statement(thd, (yyvsp[0].expr_lex)->get_item()))) + MYSQL_YYABORT; + } +#line 32262 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 388: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM WHEN_SYM expr_lex $@40 */ +#line 3863 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 32268 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 389: /* $@41: %empty */ +#line 3865 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_exit_statement(thd, &(yyvsp[-2].ident_sys), (yyvsp[0].expr_lex)->get_item()))) + MYSQL_YYABORT; + } +#line 32277 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 390: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM label_ident WHEN_SYM expr_lex $@41 */ +#line 3869 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 32283 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 391: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM */ +#line 3874 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_continue_statement(thd))) + MYSQL_YYABORT; + } +#line 32292 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 392: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM label_ident */ +#line 3879 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_continue_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 32301 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 393: /* $@42: %empty */ +#line 3884 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_continue_when_statement(thd))) + MYSQL_YYABORT; + } +#line 32310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 394: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM WHEN_SYM expr_lex $@42 */ +#line 3888 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 32316 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 395: /* $@43: %empty */ +#line 3890 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_continue_when_statement(thd, &(yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 32325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 396: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM label_ident WHEN_SYM expr_lex $@43 */ +#line 3894 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 32331 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 397: /* sp_proc_stmt_leave: LEAVE_SYM label_ident */ +#line 3900 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_leave_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 32340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 398: /* sp_proc_stmt_iterate: ITERATE_SYM label_ident */ +#line 3908 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_iterate_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 32349 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 399: /* sp_proc_stmt_goto_oracle: GOTO_ORACLE_SYM label_ident */ +#line 3916 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_goto_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 32358 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 400: /* @44: %empty */ +#line 3924 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->sphead); + if (unlikely(!((yyval.expr_lex)= new (thd->mem_root) + sp_expr_lex(thd, thd->lex)))) + MYSQL_YYABORT; + Lex->sphead->reset_lex(thd, (yyval.expr_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 32372 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 401: /* expr_lex: @44 expr */ +#line 3934 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.expr_lex)= (yyvsp[-1].expr_lex); + (yyval.expr_lex)->set_item((yyvsp[0].item)); + Lex->pop_select(); //min select + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + if ((yyval.expr_lex)->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 32386 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 402: /* assignment_source_lex: %empty */ +#line 3947 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->sphead); + if (unlikely(!((yyval.assignment_lex)= new (thd->mem_root) + sp_assignment_lex(thd, thd->lex)))) + MYSQL_YYABORT; + } +#line 32397 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 403: /* $@45: %empty */ +#line 3957 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->free_list == NULL); + Lex->sphead->reset_lex(thd, (yyvsp[0].assignment_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 32408 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 404: /* assignment_source_expr: assignment_source_lex $@45 expr */ +#line 3964 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].assignment_lex) == thd->lex); + (yyval.assignment_lex)= (yyvsp[-2].assignment_lex); + (yyval.assignment_lex)->set_item_and_free_list((yyvsp[0].item), thd->free_list); + thd->free_list= NULL; + Lex->pop_select(); //min select + if ((yyval.assignment_lex)->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 32422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 405: /* $@46: %empty */ +#line 3977 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->reset_lex(thd, (yyvsp[0].assignment_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + Lex->current_select->parsing_place= FOR_LOOP_BOUND; + } +#line 32433 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 406: /* for_loop_bound_expr: assignment_source_lex $@46 expr */ +#line 3984 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].assignment_lex) == thd->lex); + (yyval.assignment_lex)= (yyvsp[-2].assignment_lex); + (yyval.assignment_lex)->set_item_and_free_list((yyvsp[0].item), NULL); + Lex->pop_select(); //main select + if (unlikely((yyval.assignment_lex)->sphead->restore_lex(thd))) + MYSQL_YYABORT; + Lex->current_select->parsing_place= NO_MATTER; + } +#line 32447 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 407: /* cursor_actual_parameters: assignment_source_expr */ +#line 3997 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.sp_assignment_lex_list)= new (thd->mem_root) List))) + MYSQL_YYABORT; + (yyval.sp_assignment_lex_list)->push_back((yyvsp[0].assignment_lex), thd->mem_root); + } +#line 32457 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 408: /* cursor_actual_parameters: cursor_actual_parameters ',' assignment_source_expr */ +#line 4003 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.sp_assignment_lex_list)= (yyvsp[-2].sp_assignment_lex_list); + (yyval.sp_assignment_lex_list)->push_back((yyvsp[0].assignment_lex), thd->mem_root); + } +#line 32466 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 409: /* opt_parenthesized_cursor_actual_parameters: %empty */ +#line 4010 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_assignment_lex_list)= NULL; } +#line 32472 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 410: /* opt_parenthesized_cursor_actual_parameters: '(' cursor_actual_parameters ')' */ +#line 4011 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_assignment_lex_list)= (yyvsp[-1].sp_assignment_lex_list); } +#line 32478 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 414: /* sp_proc_stmt_open: OPEN_SYM ident opt_parenthesized_cursor_actual_parameters */ +#line 4022 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_open_cursor(thd, &(yyvsp[-1].ident_sys), (yyvsp[0].sp_assignment_lex_list)))) + MYSQL_YYABORT; + } +#line 32487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 415: /* sp_proc_stmt_fetch_head: FETCH_SYM ident INTO */ +#line 4030 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 32496 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 416: /* sp_proc_stmt_fetch_head: FETCH_SYM FROM ident INTO */ +#line 4035 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 32505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 417: /* sp_proc_stmt_fetch_head: FETCH_SYM NEXT_SYM FROM ident INTO */ +#line 4040 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 32514 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 418: /* sp_proc_stmt_fetch: sp_proc_stmt_fetch_head sp_fetch_list */ +#line 4047 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32520 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 419: /* sp_proc_stmt_fetch: FETCH_SYM GROUP_SYM NEXT_SYM ROW_SYM */ +#line 4049 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_agg_cfetch())) + MYSQL_YYABORT; + } +#line 32529 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 420: /* sp_proc_stmt_close: CLOSE_SYM ident */ +#line 4057 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint offset; + sp_instr_cclose *i; + + if (unlikely(!lex->spcont->find_cursor(&(yyvsp[0].ident_sys), &offset, false))) + my_yyabort_error((ER_SP_CURSOR_MISMATCH, MYF(0), (yyvsp[0].ident_sys).str)); + i= new (thd->mem_root) + sp_instr_cclose(sp->instructions(), lex->spcont, offset); + if (unlikely(i == NULL) || + unlikely(sp->add_instr(i))) + MYSQL_YYABORT; + } +#line 32548 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 421: /* sp_fetch_list: ident */ +#line 4075 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *spc= lex->spcont; + sp_variable *spv= likely(spc != NULL) + ? spc->find_variable(&(yyvsp[0].ident_sys), false) + : NULL; + + if (unlikely(!spv)) + my_yyabort_error((ER_SP_UNDECLARED_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + + /* An SP local variable */ + sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); + i->add_to_varlist(spv); + } +#line 32568 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 422: /* sp_fetch_list: sp_fetch_list ',' ident */ +#line 4091 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *spc= lex->spcont; + sp_variable *spv= likely(spc != NULL) + ? spc->find_variable(&(yyvsp[0].ident_sys), false) + : NULL; + + if (unlikely(!spv)) + my_yyabort_error((ER_SP_UNDECLARED_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + + /* An SP local variable */ + sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); + i->add_to_varlist(spv); + } +#line 32588 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 423: /* $@47: %empty */ +#line 4110 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-1].expr_lex)->sp_if_expr(thd))) + MYSQL_YYABORT; + } +#line 32597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 424: /* $@48: %empty */ +#line 4115 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-3].expr_lex)->sp_if_after_statements(thd))) + MYSQL_YYABORT; + } +#line 32606 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 425: /* sp_if: expr_lex THEN_SYM $@47 sp_if_then_statements $@48 sp_elseifs */ +#line 4120 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sphead->backpatch(lex->spcont->pop_label()); + } +#line 32616 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 430: /* $@49: %empty */ +#line 4136 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + + /** + An example of the CASE statement in use is +
+            CREATE PROCEDURE proc_19194_simple(i int)
+            BEGIN
+              DECLARE str CHAR(10);
+
+              CASE i
+                WHEN 1 THEN SET str="1";
+                WHEN 2 THEN SET str="2";
+                WHEN 3 THEN SET str="3";
+                ELSE SET str="unknown";
+              END CASE;
+
+              SELECT str;
+            END
+            
+ The actions are used to generate the following code: +
+            SHOW PROCEDURE CODE proc_19194_simple;
+            Pos     Instruction
+            0       set str@1 NULL
+            1       set_case_expr (12) 0 i@0
+            2       jump_if_not 5(12) (case_expr@0 = 1)
+            3       set str@1 _latin1'1'
+            4       jump 12
+            5       jump_if_not 8(12) (case_expr@0 = 2)
+            6       set str@1 _latin1'2'
+            7       jump 12
+            8       jump_if_not 11(12) (case_expr@0 = 3)
+            9       set str@1 _latin1'3'
+            10      jump 12
+            11      set str@1 _latin1'unknown'
+            12      stmt 0 "SELECT str"
+            
+ */ + + Lex->sphead->new_cont_backpatch(NULL); + + /* + BACKPATCH: Creating target label for the jump to after END CASE + (instruction 12 in the example) + */ + Lex->spcont->push_label(thd, &empty_clex_str, Lex->sphead->instructions()); + } +#line 32670 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 431: /* case_stmt_specification: CASE_SYM $@49 case_stmt_body else_clause_opt END CASE_SYM */ +#line 4189 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + BACKPATCH: Resolving forward jump from + "case_stmt_action_then" to after END CASE + (jump from instruction 4 to 12, 7 to 12 ... in the example) + */ + Lex->sphead->backpatch(Lex->spcont->pop_label()); + + if ((yyvsp[-3].num)) + Lex->spcont->pop_case_expr_id(); + + Lex->sphead->do_cont_backpatch(); + } +#line 32688 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 432: /* $@50: %empty */ +#line 4206 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_expr())) + MYSQL_YYABORT; + } +#line 32697 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 433: /* case_stmt_body: expr_lex $@50 simple_when_clause_list */ +#line 4211 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 32703 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 434: /* case_stmt_body: searched_when_clause_list */ +#line 4213 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 32709 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 439: /* $@51: %empty */ +#line 4228 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Simple case: = */ + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_when(true))) + MYSQL_YYABORT; + } +#line 32719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 440: /* simple_when_clause: WHEN_SYM expr_lex $@51 THEN_SYM sp_case_then_statements */ +#line 4235 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->case_stmt_action_then())) + MYSQL_YYABORT; + } +#line 32728 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 441: /* $@52: %empty */ +#line 4243 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_when(false))) + MYSQL_YYABORT; + } +#line 32737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 442: /* searched_when_clause: WHEN_SYM expr_lex $@52 THEN_SYM sp_case_then_statements */ +#line 4249 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->case_stmt_action_then())) + MYSQL_YYABORT; + } +#line 32746 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 443: /* else_clause_opt: %empty */ +#line 4257 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint ip= sp->instructions(); + sp_instr_error *i= new (thd->mem_root) + sp_instr_error(ip, lex->spcont, ER_SP_CASE_NOT_FOUND); + if (unlikely(i == NULL) || + unlikely(sp->add_instr(i))) + MYSQL_YYABORT; + } +#line 32761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 445: /* sp_opt_label: %empty */ +#line 4271 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 32767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 446: /* sp_opt_label: label_ident */ +#line 4272 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 32773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 447: /* opt_sp_for_loop_direction: %empty */ +#line 4277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 32779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 448: /* opt_sp_for_loop_direction: REVERSE_SYM */ +#line 4278 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= -1; } +#line 32785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 449: /* sp_for_loop_index_and_bounds: ident_for_loop_index sp_for_loop_bounds */ +#line 4283 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_declarations(thd, &(yyval.for_loop), &(yyvsp[-1].ident_sys), (yyvsp[0].for_loop_bounds)))) + MYSQL_YYABORT; + } +#line 32794 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 450: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction for_loop_bound_expr DOT_DOT_SYM for_loop_bound_expr */ +#line 4292 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.for_loop_bounds)= Lex_for_loop_bounds_intrange((yyvsp[-3].num), (yyvsp[-2].assignment_lex), (yyvsp[0].assignment_lex)); + } +#line 32802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 451: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction for_loop_bound_expr */ +#line 4296 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.for_loop_bounds).m_direction= (yyvsp[-1].num); + (yyval.for_loop_bounds).m_index= (yyvsp[0].assignment_lex); + (yyval.for_loop_bounds).m_target_bound= NULL; + (yyval.for_loop_bounds).m_implicit_cursor= false; + } +#line 32813 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 452: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction '(' sp_cursor_stmt ')' */ +#line 4303 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_implicit_cursor_statement(thd, &(yyval.for_loop_bounds), + (yyvsp[-1].sp_cursor_stmt)))) + MYSQL_YYABORT; + } +#line 32823 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 453: /* loop_body: sp_proc_stmts1 END LOOP_SYM */ +#line 4312 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + uint ip= lex->sphead->instructions(); + sp_label *lab= lex->spcont->last_label(); /* Jumping back */ + sp_instr_jump *i= new (thd->mem_root) + sp_instr_jump(ip, lex->spcont, lab->ip); + if (unlikely(i == NULL) || + unlikely(lex->sphead->add_instr(i))) + MYSQL_YYABORT; + } +#line 32838 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 454: /* repeat_body: sp_proc_stmts1 UNTIL_SYM expr_lex END REPEAT_SYM */ +#line 4326 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-2].expr_lex)->sp_repeat_loop_finalize(thd)) + MYSQL_YYABORT; + } +#line 32847 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 455: /* pop_sp_loop_label: sp_opt_label */ +#line 4334 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_pop_loop_label(thd, &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 32856 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 456: /* $@53: %empty */ +#line 4342 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32865 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 457: /* sp_labeled_control: sp_control_label LOOP_SYM $@53 loop_body pop_sp_loop_label */ +#line 4347 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32871 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 458: /* $@54: %empty */ +#line 4349 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32880 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 459: /* sp_labeled_control: sp_control_label WHILE_SYM $@54 while_body pop_sp_loop_label */ +#line 4354 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32886 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 460: /* $@55: %empty */ +#line 4356 "/home/buildbot/git/sql/sql_yacc.yy" + { + // See "The FOR LOOP statement" comments in sql_lex.cc + Lex->sp_block_init(thd); // The outer DECLARE..BEGIN..END block + } +#line 32895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 461: /* $@56: %empty */ +#line 4361 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-3].lex_str)))) // The inner WHILE block + MYSQL_YYABORT; + if (unlikely(Lex->sp_for_loop_condition_test(thd, (yyvsp[0].for_loop)))) + MYSQL_YYABORT; + } +#line 32906 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 462: /* $@57: %empty */ +#line 4368 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + } +#line 32915 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 463: /* sp_labeled_control: sp_control_label FOR_SYM $@55 sp_for_loop_index_and_bounds $@56 for_loop_statements $@57 pop_sp_loop_label */ +#line 4373 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_outer_block_finalize(thd, (yyvsp[-4].for_loop)))) + MYSQL_YYABORT; + } +#line 32924 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 464: /* $@58: %empty */ +#line 4378 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 465: /* sp_labeled_control: sp_control_label REPEAT_SYM $@58 repeat_body pop_sp_loop_label */ +#line 4383 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32939 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 466: /* $@59: %empty */ +#line 4388 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 32948 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 467: /* sp_unlabeled_control: LOOP_SYM $@59 loop_body */ +#line 4393 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 32956 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 468: /* $@60: %empty */ +#line 4397 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 32965 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 469: /* sp_unlabeled_control: WHILE_SYM $@60 while_body */ +#line 4402 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 32973 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 470: /* $@61: %empty */ +#line 4406 "/home/buildbot/git/sql/sql_yacc.yy" + { + // See "The FOR LOOP statement" comments in sql_lex.cc + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sp_block_init(thd); // The outer DECLARE..BEGIN..END block + } +#line 32984 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 471: /* $@62: %empty */ +#line 4413 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) // The inner WHILE block + MYSQL_YYABORT; + if (unlikely(Lex->sp_for_loop_condition_test(thd, (yyvsp[0].for_loop)))) + MYSQL_YYABORT; + } +#line 32995 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 472: /* sp_unlabeled_control: FOR_SYM $@61 sp_for_loop_index_and_bounds $@62 for_loop_statements */ +#line 4420 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + Lex->sp_pop_loop_empty_label(thd); // The inner WHILE block + if (unlikely(Lex->sp_for_loop_outer_block_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + } +#line 33007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 473: /* $@63: %empty */ +#line 4428 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 33016 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 474: /* sp_unlabeled_control: REPEAT_SYM $@63 repeat_body */ +#line 4433 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 33024 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 475: /* trg_action_time: BEFORE_SYM */ +#line 4440 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.action_time= TRG_ACTION_BEFORE; } +#line 33030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 476: /* trg_action_time: AFTER_SYM */ +#line 4442 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.action_time= TRG_ACTION_AFTER; } +#line 33036 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 477: /* trg_event: INSERT */ +#line 4447 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_INSERT; } +#line 33042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 478: /* trg_event: UPDATE_SYM */ +#line 4449 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_UPDATE; } +#line 33048 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 479: /* trg_event: DELETE_SYM */ +#line 4451 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_DELETE; } +#line 33054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 480: /* $@64: %empty */ +#line 4456 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.option_list= NULL; } +#line 33060 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 481: /* create_body: create_field_list_parens $@64 opt_create_table_options opt_create_partitioning opt_create_select */ +#line 4457 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33066 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 482: /* create_body: opt_create_table_options opt_create_partitioning opt_create_select */ +#line 4458 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33072 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 483: /* create_body: create_like */ +#line 4460 "/home/buildbot/git/sql/sql_yacc.yy" + { + + Lex->create_info.add(DDL_options_st::OPT_LIKE); + TABLE_LIST *src_table= Lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, 0, TL_READ, MDL_SHARED_READ); + if (unlikely(! src_table)) + MYSQL_YYABORT; + /* CREATE TABLE ... LIKE is not allowed for views. */ + src_table->required_type= TABLE_TYPE_NORMAL; + } +#line 33087 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 484: /* create_like: LIKE table_ident */ +#line 4473 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table)= (yyvsp[0].table); } +#line 33093 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 485: /* create_like: LEFT_PAREN_LIKE LIKE table_ident ')' */ +#line 4474 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table)= (yyvsp[-1].table); } +#line 33099 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 486: /* opt_create_select: %empty */ +#line 4478 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33105 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 487: /* opt_create_select: opt_duplicate opt_as create_select_query_expression opt_versioning_option */ +#line 4481 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.add(DDL_options_st::OPT_CREATE_SELECT); + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 33115 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 488: /* create_select_query_expression: query_expression */ +#line 4490 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_insert_select((yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 33124 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 489: /* create_select_query_expression: LEFT_PAREN_WITH with_clause query_expression_no_with_clause ')' */ +#line 4495 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *first_select= (yyvsp[-1].select_lex_unit)->first_select(); + (yyvsp[-1].select_lex_unit)->set_with_clause((yyvsp[-2].with_clause)); + (yyvsp[-2].with_clause)->attach_to(first_select); + if (Lex->parsed_insert_select(first_select)) + MYSQL_YYABORT; + } +#line 33136 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 490: /* opt_create_partitioning: opt_partitioning */ +#line 4506 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Remove all tables used in PARTITION clause from the global table + list. Partitioning with subqueries is not allowed anyway. + */ + TABLE_LIST *last_non_sel_table= Lex->create_last_non_select_table; + last_non_sel_table->next_global= 0; + Lex->query_tables_last= &last_non_sel_table->next_global; + } +#line 33150 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 491: /* opt_partitioning: %empty */ +#line 4542 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33156 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 493: /* $@65: %empty */ +#line 4548 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + if (lex->sql_command == SQLCOM_ALTER_TABLE) + { + lex->alter_info.partition_flags|= ALTER_PARTITION_INFO; + } + } +#line 33171 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 495: /* have_partitioning: %empty */ +#line 4563 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + LEX_CSTRING partition_name={STRING_WITH_LEN("partition")}; + if (unlikely(!plugin_is_ready(&partition_name, MYSQL_STORAGE_ENGINE_PLUGIN))) + my_yyabort_error((ER_OPTION_PREVENTS_STATEMENT, MYF(0), + "--skip-partition")); +#else + my_yyabort_error((ER_FEATURE_DISABLED, MYF(0), "partitioning", + "--with-plugin-partition")); +#endif + } +#line 33187 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 496: /* $@66: %empty */ +#line 4578 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->part_info)) + { + thd->parse_error(ER_PARTITION_ENTRY_ERROR); + MYSQL_YYABORT; + } + if (Lex->main_select_push()) + MYSQL_YYABORT; + /* + We enter here when opening the frm file to translate + partition info string into part_info data structure. + */ + } +#line 33205 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 497: /* partition_entry: PARTITION_SYM $@66 partition */ +#line 4592 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 33213 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 498: /* $@67: %empty */ +#line 4599 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->safe_to_cache_query= 1; } +#line 33219 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 500: /* part_type_def: opt_linear KEY_SYM opt_key_algo '(' part_field_list ')' */ +#line 4605 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->list_of_part_fields= TRUE; + part_info->column_list= FALSE; + part_info->part_type= HASH_PARTITION; + } +#line 33230 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 501: /* $@68: %empty */ +#line 4612 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= HASH_PARTITION; } +#line 33236 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 502: /* part_type_def: opt_linear HASH_SYM $@68 part_func */ +#line 4613 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33242 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 503: /* part_type_def: RANGE_SYM part_func */ +#line 4615 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= RANGE_PARTITION; } +#line 33248 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 504: /* part_type_def: RANGE_SYM part_column_list */ +#line 4617 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= RANGE_PARTITION; } +#line 33254 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 505: /* $@69: %empty */ +#line 4619 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_PART_FUNC; + } +#line 33262 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 506: /* part_type_def: LIST_SYM $@69 part_func */ +#line 4623 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->part_info->part_type= LIST_PARTITION; + Select->parsing_place= NO_MATTER; + } +#line 33271 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 507: /* part_type_def: LIST_SYM part_column_list */ +#line 4628 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= LIST_PARTITION; } +#line 33277 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 508: /* $@70: %empty */ +#line 4630 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->part_info->vers_init_info(thd))) + MYSQL_YYABORT; + } +#line 33286 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 510: /* opt_linear: %empty */ +#line 4638 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33292 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 511: /* opt_linear: LINEAR_SYM */ +#line 4640 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->linear_hash_ind= TRUE;} +#line 33298 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 512: /* opt_key_algo: %empty */ +#line 4645 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_NONE;} +#line 33304 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 513: /* opt_key_algo: ALGORITHM_SYM '=' real_ulong_num */ +#line 4647 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch ((yyvsp[0].ulong_num)) { + case 1: + Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_51; + break; + case 2: + Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_55; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 33322 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 514: /* part_field_list: %empty */ +#line 4663 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33328 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 515: /* part_field_list: part_field_item_list */ +#line 4664 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 516: /* part_field_item_list: part_field_item */ +#line 4668 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 517: /* part_field_item_list: part_field_item_list ',' part_field_item */ +#line 4669 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33346 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 518: /* part_field_item: ident */ +#line 4674 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->num_columns++; + if (unlikely(part_info->part_field_list.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + if (unlikely(part_info->num_columns > MAX_REF_PARTS)) + my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), + "list of partition fields")); + } +#line 33361 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 519: /* part_column_list: COLUMNS '(' part_field_list ')' */ +#line 4688 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->column_list= TRUE; + part_info->list_of_part_fields= TRUE; + } +#line 33371 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 520: /* part_func: '(' part_func_expr ')' */ +#line 4698 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->set_part_expr(thd, (yyvsp[-1].item), FALSE))) + MYSQL_YYABORT; + part_info->num_columns= 1; + part_info->column_list= FALSE; + } +#line 33383 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 521: /* sub_part_func: '(' part_func_expr ')' */ +#line 4709 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->part_info->set_part_expr(thd, (yyvsp[-1].item), TRUE))) + MYSQL_YYABORT; + } +#line 33392 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 522: /* opt_num_parts: %empty */ +#line 4717 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33398 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 523: /* opt_num_parts: PARTITIONS_SYM real_ulong_num */ +#line 4719 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint num_parts= (yyvsp[0].ulong_num); + partition_info *part_info= Lex->part_info; + if (unlikely(num_parts == 0)) + my_yyabort_error((ER_NO_PARTS_ERROR, MYF(0), "partitions")); + + part_info->num_parts= num_parts; + part_info->use_default_num_partitions= FALSE; + } +#line 33412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 524: /* opt_sub_part: %empty */ +#line 4731 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33418 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 525: /* $@71: %empty */ +#line 4733 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->subpart_type= HASH_PARTITION; } +#line 33424 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 526: /* opt_sub_part: SUBPARTITION_SYM BY opt_linear HASH_SYM sub_part_func $@71 opt_num_subparts */ +#line 4734 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 527: /* $@72: %empty */ +#line 4737 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->subpart_type= HASH_PARTITION; + part_info->list_of_subpart_fields= TRUE; + } +#line 33440 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 528: /* opt_sub_part: SUBPARTITION_SYM BY opt_linear KEY_SYM opt_key_algo '(' sub_part_field_list ')' $@72 opt_num_subparts */ +#line 4742 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33446 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 529: /* sub_part_field_list: sub_part_field_item */ +#line 4746 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33452 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 530: /* sub_part_field_list: sub_part_field_list ',' sub_part_field_item */ +#line 4747 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33458 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 531: /* sub_part_field_item: ident */ +#line 4752 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->subpart_field_list.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + + if (unlikely(part_info->subpart_field_list.elements > MAX_REF_PARTS)) + my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), + "list of subpartition fields")); + } +#line 33473 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 532: /* part_func_expr: bit_expr */ +#line 4766 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->safe_to_cache_query)) + { + thd->parse_error(ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR); + MYSQL_YYABORT; + } + (yyval.item)=(yyvsp[0].item); + } +#line 33486 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 533: /* opt_num_subparts: %empty */ +#line 4777 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33492 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 534: /* opt_num_subparts: SUBPARTITIONS_SYM real_ulong_num */ +#line 4779 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint num_parts= (yyvsp[0].ulong_num); + LEX *lex= Lex; + if (unlikely(num_parts == 0)) + my_yyabort_error((ER_NO_PARTS_ERROR, MYF(0), "subpartitions")); + lex->part_info->num_subparts= num_parts; + lex->part_info->use_default_num_subpartitions= FALSE; + } +#line 33505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 535: /* part_defs: %empty */ +#line 4791 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->part_type == RANGE_PARTITION)) + my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), + "RANGE")); + if (unlikely(part_info->part_type == LIST_PARTITION)) + my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), + "LIST")); + } +#line 33519 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 536: /* part_defs: '(' part_def_list ')' */ +#line 4801 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + uint count_curr_parts= part_info->partitions.elements; + if (part_info->num_parts != 0) + { + if (unlikely(part_info->num_parts != + count_curr_parts)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_PART_ERROR); + MYSQL_YYABORT; + } + } + else if (count_curr_parts > 0) + { + part_info->num_parts= count_curr_parts; + } + part_info->count_curr_subparts= 0; + } +#line 33542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 537: /* part_def_list: part_definition */ +#line 4822 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33548 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 538: /* part_def_list: part_def_list ',' part_definition */ +#line 4823 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33554 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 541: /* $@73: %empty */ +#line 4833 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *p_elem= new (thd->mem_root) partition_element(); + + if (unlikely(!p_elem) || + unlikely(part_info->partitions.push_back(p_elem, thd->mem_root))) + MYSQL_YYABORT; + + p_elem->part_state= PART_NORMAL; + p_elem->id= part_info->partitions.elements - 1; + part_info->curr_part_elem= p_elem; + part_info->current_partition= p_elem; + part_info->use_default_partitions= FALSE; + part_info->use_default_num_partitions= FALSE; + } +#line 33574 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 542: /* part_definition: opt_partition $@73 part_name opt_part_values opt_part_options opt_sub_partition */ +#line 4852 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33580 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 543: /* part_name: ident */ +#line 4857 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *p_elem= part_info->curr_part_elem; + if (unlikely(check_ident_length(&(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + p_elem->partition_name= (yyvsp[0].ident_sys).str; + } +#line 33592 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 544: /* opt_part_values: %empty */ +#line 4868 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->error_if_requires_values())) + MYSQL_YYABORT; + if (unlikely(part_info->part_type == VERSIONING_PARTITION)) + my_yyabort_error((ER_VERS_WRONG_PARTS, MYF(0), + lex->create_last_non_select_table-> + table_name.str)); + } + else + part_info->part_type= HASH_PARTITION; + } +#line 33612 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 545: /* $@74: %empty */ +#line 4884 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != RANGE_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "RANGE", "LESS THAN")); + } + else + part_info->part_type= RANGE_PARTITION; + } +#line 33629 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 546: /* opt_part_values: VALUES_LESS_SYM THAN_SYM $@74 part_func_max */ +#line 4896 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33635 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 547: /* $@75: %empty */ +#line 4898 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != LIST_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "LIST", "IN")); + } + else + part_info->part_type= LIST_PARTITION; + } +#line 33652 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 548: /* opt_part_values: VALUES_IN_SYM $@75 part_values_in */ +#line 4910 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33658 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 549: /* opt_part_values: CURRENT_SYM */ +#line 4912 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (Lex->part_values_current(thd)) + MYSQL_YYABORT; +#endif + } +#line 33669 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 550: /* opt_part_values: HISTORY_SYM */ +#line 4919 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (Lex->part_values_history(thd)) + MYSQL_YYABORT; +#endif + } +#line 33680 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 551: /* opt_part_values: DEFAULT */ +#line 4926 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != LIST_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "LIST", "DEFAULT")); + } + else + part_info->part_type= LIST_PARTITION; + if (unlikely(part_info->init_column_part(thd))) + MYSQL_YYABORT; + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 33701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 552: /* part_func_max: MAXVALUE_SYM */ +#line 4946 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + + if (unlikely(part_info->num_columns && + part_info->num_columns != 1U)) + { + part_info->print_debug("Kilroy II", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + else + part_info->num_columns= 1U; + if (unlikely(part_info->init_column_part(thd))) + MYSQL_YYABORT; + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 33723 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 553: /* part_func_max: part_value_item */ +#line 4963 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33729 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 554: /* part_values_in: part_value_item */ +#line 4968 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + part_info->print_debug("part_values_in: part_value_item", NULL); + + if (part_info->num_columns != 1U) + { + if (unlikely(!lex->is_partition_management() || + part_info->num_columns == 0 || + part_info->num_columns > MAX_REF_PARTS)) + { + part_info->print_debug("Kilroy III", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + /* + Reorganize the current large array into a list of small + arrays with one entry in each array. This can happen + in the first partition of an ALTER TABLE statement where + we ADD or REORGANIZE partitions. Also can only happen + for LIST partitions. + */ + if (unlikely(part_info->reorganize_into_single_field_col_val(thd))) + MYSQL_YYABORT; + } + } +#line 33760 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 555: /* part_values_in: '(' part_value_list ')' */ +#line 4995 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->num_columns < 2U)) + { + thd->parse_error(ER_ROW_SINGLE_PARTITION_FIELD_ERROR); + MYSQL_YYABORT; + } + } +#line 33773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 556: /* part_value_list: part_value_item */ +#line 5006 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 557: /* part_value_list: part_value_list ',' part_value_item */ +#line 5007 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 558: /* $@76: %empty */ +#line 5012 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->print_debug("( part_value_item", NULL); + /* Initialisation code needed for each list of value expressions */ + if (unlikely(!(part_info->part_type == LIST_PARTITION && + part_info->num_columns == 1U) && + part_info->init_column_part(thd))) + MYSQL_YYABORT; + } +#line 33799 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 559: /* $@77: %empty */ +#line 5021 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33805 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 560: /* part_value_item: '(' $@76 part_value_item_list $@77 ')' */ +#line 5023 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->print_debug(") part_value_item", NULL); + if (part_info->num_columns == 0) + part_info->num_columns= part_info->curr_list_object; + if (unlikely(part_info->num_columns != part_info->curr_list_object)) + { + /* + All value items lists must be of equal length, in some cases + which is covered by the above if-statement we don't know yet + how many columns is in the partition so the assignment above + ensures that we only report errors when we know we have an + error. + */ + part_info->print_debug("Kilroy I", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + part_info->curr_list_object= 0; + } +#line 33830 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 561: /* part_value_item_list: part_value_expr_item */ +#line 5046 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33836 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 562: /* part_value_item_list: part_value_item_list ',' part_value_expr_item */ +#line 5047 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33842 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 563: /* part_value_expr_item: MAXVALUE_SYM */ +#line 5052 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->part_type == LIST_PARTITION)) + { + thd->parse_error(ER_MAXVALUE_IN_VALUES_IN); + MYSQL_YYABORT; + } + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 33857 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 564: /* part_value_expr_item: bit_expr */ +#line 5063 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + Item *part_expr= (yyvsp[0].item); + + if (unlikely(!lex->safe_to_cache_query)) + { + thd->parse_error(ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR); + MYSQL_YYABORT; + } + if (unlikely(part_info->add_column_list_value(thd, part_expr))) + MYSQL_YYABORT; + } +#line 33875 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 565: /* opt_sub_partition: %empty */ +#line 5081 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->num_subparts != 0 && + !part_info->use_default_subpartitions)) + { + /* + We come here when we have defined subpartitions on the first + partition but not on all the subsequent partitions. + */ + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + } +#line 33893 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 566: /* opt_sub_partition: '(' sub_part_list ')' */ +#line 5095 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (part_info->num_subparts != 0) + { + if (unlikely(part_info->num_subparts != + part_info->count_curr_subparts)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + } + else if (part_info->count_curr_subparts > 0) + { + if (unlikely(part_info->partitions.elements > 1)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + part_info->num_subparts= part_info->count_curr_subparts; + } + part_info->count_curr_subparts= 0; + } +#line 33920 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 567: /* sub_part_list: sub_part_definition */ +#line 5120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33926 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 568: /* sub_part_list: sub_part_list ',' sub_part_definition */ +#line 5121 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33932 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 569: /* $@78: %empty */ +#line 5126 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *curr_part= part_info->current_partition; + partition_element *sub_p_elem= new (thd->mem_root) + partition_element(curr_part); + if (unlikely(part_info->use_default_subpartitions && + part_info->partitions.elements >= 2)) + { + /* + create table t1 (a int) + partition by list (a) subpartition by hash (a) + (partition p0 values in (1), + partition p1 values in (2) subpartition sp11); + causes use to arrive since we are on the second + partition, but still use_default_subpartitions + is set. When we come here we're processing at least + the second partition (the current partition processed + have already been put into the partitions list. + */ + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + if (unlikely(!sub_p_elem) || + unlikely(curr_part->subpartitions.push_back(sub_p_elem, thd->mem_root))) + MYSQL_YYABORT; + + sub_p_elem->id= curr_part->subpartitions.elements - 1; + part_info->curr_part_elem= sub_p_elem; + part_info->use_default_subpartitions= FALSE; + part_info->use_default_num_subpartitions= FALSE; + part_info->count_curr_subparts++; + } +#line 33969 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 570: /* sub_part_definition: SUBPARTITION_SYM $@78 sub_name opt_subpart_options */ +#line 5158 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33975 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 571: /* sub_name: ident_or_text */ +#line 5163 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(check_ident_length(&(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + Lex->part_info->curr_part_elem->partition_name= (yyvsp[0].lex_str).str; + } +#line 33985 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 572: /* opt_part_options: %empty */ +#line 5171 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33991 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 573: /* opt_part_options: part_option_list */ +#line 5172 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33997 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 574: /* part_option_list: part_option_list part_option */ +#line 5176 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34003 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 575: /* part_option_list: part_option */ +#line 5177 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34009 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 576: /* part_option: server_part_option */ +#line 5181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34015 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 577: /* part_option: engine_defined_option */ +#line 5183 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->part_info->curr_part_elem->option_list, + &Lex->option_list_last); + } +#line 34024 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 578: /* opt_subpart_options: %empty */ +#line 5190 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 579: /* opt_subpart_options: subpart_option_list */ +#line 5191 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34036 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 580: /* subpart_option_list: subpart_option_list server_part_option */ +#line 5195 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 581: /* subpart_option_list: server_part_option */ +#line 5196 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34048 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 582: /* server_part_option: TABLESPACE opt_equal ident_or_text */ +#line 5201 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Compatibility with MySQL */ } +#line 34054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 583: /* server_part_option: opt_storage ENGINE_SYM opt_equal storage_engines */ +#line 5203 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->curr_part_elem->engine_type= (yyvsp[0].db_type); + part_info->default_engine_type= (yyvsp[0].db_type); + } +#line 34064 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 584: /* server_part_option: CONNECTION_SYM opt_equal TEXT_STRING_sys */ +#line 5209 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info->curr_part_elem->connect_string.str= (yyvsp[0].lex_str).str; + lex->part_info->curr_part_elem->connect_string.length= (yyvsp[0].lex_str).length; + } +#line 34074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 585: /* server_part_option: NODEGROUP_SYM opt_equal real_ulong_num */ +#line 5215 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->nodegroup_id= (uint16) (yyvsp[0].ulong_num); } +#line 34080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 586: /* server_part_option: MAX_ROWS opt_equal real_ulonglong_num */ +#line 5217 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_max_rows= (ha_rows) (yyvsp[0].ulonglong_number); } +#line 34086 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 587: /* server_part_option: MIN_ROWS opt_equal real_ulonglong_num */ +#line 5219 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_min_rows= (ha_rows) (yyvsp[0].ulonglong_number); } +#line 34092 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 588: /* server_part_option: DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5221 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->data_file_name= (yyvsp[0].lex_str).str; } +#line 34098 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 589: /* server_part_option: INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5223 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->index_file_name= (yyvsp[0].lex_str).str; } +#line 34104 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 590: /* server_part_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5225 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_comment= (yyvsp[0].lex_str).str; } +#line 34110 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 591: /* opt_versioning_rotation: %empty */ +#line 5229 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34116 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 592: /* $@79: %empty */ +#line 5230 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "INTERVAL"; } +#line 34122 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 593: /* opt_versioning_rotation: $@79 INTERVAL_SYM expr interval opt_versioning_interval_start opt_vers_auto_part */ +#line 5232 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + const char *table_name= Lex->create_last_non_select_table->table_name.str; + if (unlikely(part_info->vers_set_interval(thd, (yyvsp[-3].item), (yyvsp[-2].interval), (yyvsp[-1].item), (yyvsp[0].num), + table_name))) + MYSQL_YYABORT; + } +#line 34134 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 594: /* opt_versioning_rotation: LIMIT ulonglong_num opt_vers_auto_part */ +#line 5240 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + const char *table_name= Lex->create_last_non_select_table->table_name.str; + if (unlikely(part_info->vers_set_limit((yyvsp[-1].ulonglong_number), (yyvsp[0].num), table_name))) + MYSQL_YYABORT; + } +#line 34145 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 595: /* opt_versioning_interval_start: %empty */ +#line 5251 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= NULL; + } +#line 34153 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 596: /* opt_versioning_interval_start: STARTS_SYM literal */ +#line 5255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 34161 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 597: /* opt_vers_auto_part: %empty */ +#line 5262 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 0; + } +#line 34169 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 598: /* opt_vers_auto_part: AUTO_SYM */ +#line 5266 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 1; + } +#line 34177 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 599: /* opt_as: %empty */ +#line 5275 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34183 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 600: /* opt_as: AS */ +#line 5276 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34189 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 601: /* opt_create_database_options: %empty */ +#line 5280 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34195 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 602: /* opt_create_database_options: create_database_options */ +#line 5281 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34201 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 603: /* create_database_options: create_database_option */ +#line 5285 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34207 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 604: /* create_database_options: create_database_options create_database_option */ +#line 5286 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34213 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 605: /* create_database_option: default_collation */ +#line 5290 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34219 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 606: /* create_database_option: default_charset */ +#line 5291 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34225 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 607: /* create_database_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5293 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.schema_comment= thd->make_clex_string((yyvsp[0].lex_str)); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 34234 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 608: /* opt_if_not_exists_table_element: %empty */ +#line 5301 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= FALSE; + } +#line 34242 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 609: /* opt_if_not_exists_table_element: IF_SYM not EXISTS */ +#line 5305 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= TRUE; + } +#line 34250 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 610: /* opt_if_not_exists: %empty */ +#line 5312 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).init(); + } +#line 34258 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 611: /* opt_if_not_exists: IF_SYM not EXISTS */ +#line 5316 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_IF_NOT_EXISTS); + } +#line 34266 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 612: /* create_or_replace: CREATE */ +#line 5323 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).init(); + } +#line 34274 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 613: /* create_or_replace: CREATE OR_SYM REPLACE */ +#line 5327 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_OR_REPLACE); + } +#line 34282 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 621: /* create_table_option: ENGINE_SYM opt_equal ident_or_text */ +#line 5350 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!lex->m_sql_cmd) + { + DBUG_ASSERT(lex->sql_command == SQLCOM_ALTER_TABLE); + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table())) + MYSQL_YYABORT; + } + Storage_engine_name *opt= + lex->m_sql_cmd->option_storage_engine_name(); + DBUG_ASSERT(opt); // Expect a proper Sql_cmd + *opt= Storage_engine_name((yyvsp[0].lex_str)); + lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; + } +#line 34301 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 622: /* create_table_option: MAX_ROWS opt_equal ulonglong_num */ +#line 5365 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.max_rows= (yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS; + } +#line 34310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 623: /* create_table_option: MIN_ROWS opt_equal ulonglong_num */ +#line 5370 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.min_rows= (yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS; + } +#line 34319 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 624: /* create_table_option: AVG_ROW_LENGTH opt_equal ulong_num */ +#line 5375 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.avg_row_length=(yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH; + } +#line 34328 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 625: /* create_table_option: PASSWORD_SYM opt_equal TEXT_STRING_sys */ +#line 5380 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.password=(yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_PASSWORD; + } +#line 34337 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 626: /* create_table_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5385 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.comment=(yyvsp[0].lex_str); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 34346 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 627: /* create_table_option: AUTO_INC opt_equal ulonglong_num */ +#line 5390 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.auto_increment_value=(yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_AUTO; + } +#line 34355 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 628: /* create_table_option: PACK_KEYS_SYM opt_equal ulong_num */ +#line 5395 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.table_options|= HA_OPTION_NO_PACK_KEYS; + break; + case 1: + Lex->create_info.table_options|= HA_OPTION_PACK_KEYS; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; + } +#line 34374 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 629: /* create_table_option: PACK_KEYS_SYM opt_equal DEFAULT */ +#line 5410 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options&= + ~(HA_OPTION_PACK_KEYS | HA_OPTION_NO_PACK_KEYS); + Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; + } +#line 34384 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 630: /* create_table_option: STATS_AUTO_RECALC_SYM opt_equal ulong_num */ +#line 5416 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_OFF; + break; + case 1: + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_ON; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; + } +#line 34403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 631: /* create_table_option: STATS_AUTO_RECALC_SYM opt_equal DEFAULT */ +#line 5431 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_DEFAULT; + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; + } +#line 34412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 632: /* create_table_option: STATS_PERSISTENT_SYM opt_equal ulong_num */ +#line 5436 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.table_options|= HA_OPTION_NO_STATS_PERSISTENT; + break; + case 1: + Lex->create_info.table_options|= HA_OPTION_STATS_PERSISTENT; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; + } +#line 34431 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 633: /* create_table_option: STATS_PERSISTENT_SYM opt_equal DEFAULT */ +#line 5451 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options&= + ~(HA_OPTION_STATS_PERSISTENT | HA_OPTION_NO_STATS_PERSISTENT); + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; + } +#line 34441 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 634: /* create_table_option: STATS_SAMPLE_PAGES_SYM opt_equal ulong_num */ +#line 5457 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* From user point of view STATS_SAMPLE_PAGES can be specified as + STATS_SAMPLE_PAGES=N (where 0 0xffff)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.stats_sample_pages=(yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; + } +#line 34463 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 635: /* create_table_option: STATS_SAMPLE_PAGES_SYM opt_equal DEFAULT */ +#line 5475 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.stats_sample_pages=0; + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; + } +#line 34472 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 636: /* create_table_option: CHECKSUM_SYM opt_equal ulong_num */ +#line 5480 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; + Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; + } +#line 34481 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 637: /* create_table_option: TABLE_CHECKSUM_SYM opt_equal ulong_num */ +#line 5485 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; + Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; + } +#line 34490 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 638: /* create_table_option: PAGE_CHECKSUM_SYM opt_equal choice */ +#line 5490 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_PAGE_CHECKSUM; + Lex->create_info.page_checksum= (yyvsp[0].choice); + } +#line 34499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 639: /* create_table_option: DELAY_KEY_WRITE_SYM opt_equal ulong_num */ +#line 5495 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE; + Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE; + } +#line 34508 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 640: /* create_table_option: ROW_FORMAT_SYM opt_equal row_types */ +#line 5500 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.row_type= (yyvsp[0].row_type); + Lex->create_info.used_fields|= HA_CREATE_USED_ROW_FORMAT; + } +#line 34517 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 641: /* $@80: %empty */ +#line 5505 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->first_select_lex()->table_list.save_and_clear(&Lex->save_list); + } +#line 34525 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 642: /* create_table_option: UNION_SYM opt_equal $@80 '(' opt_table_list ')' */ +#line 5509 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Move the union list to the merge_list and exclude its tables + from the global list. + */ + LEX *lex=Lex; + lex->create_info.merge_list= lex->first_select_lex()->table_list.first; + lex->first_select_lex()->table_list= lex->save_list; + /* + When excluding union list from the global list we assume that + elements of the former immediately follow elements which represent + table being created/altered and parent tables. + */ + TABLE_LIST *last_non_sel_table= lex->create_last_non_select_table; + DBUG_ASSERT(last_non_sel_table->next_global == + lex->create_info.merge_list); + last_non_sel_table->next_global= 0; + Lex->query_tables_last= &last_non_sel_table->next_global; + + lex->create_info.used_fields|= HA_CREATE_USED_UNION; + } +#line 34551 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 645: /* create_table_option: INSERT_METHOD opt_equal merge_insert_types */ +#line 5533 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.merge_insert_method= (yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD; + } +#line 34560 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 646: /* create_table_option: DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5538 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.data_file_name= (yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_DATADIR; + } +#line 34569 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 647: /* create_table_option: INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5543 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.index_file_name= (yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_INDEXDIR; + } +#line 34578 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 648: /* create_table_option: TABLESPACE ident */ +#line 5548 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Compatiblity with MySQL */ } +#line 34584 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 649: /* create_table_option: STORAGE_SYM DISK_SYM */ +#line 5550 "/home/buildbot/git/sql/sql_yacc.yy" + {Lex->create_info.storage_media= HA_SM_DISK;} +#line 34590 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 650: /* create_table_option: STORAGE_SYM MEMORY_SYM */ +#line 5552 "/home/buildbot/git/sql/sql_yacc.yy" + {Lex->create_info.storage_media= HA_SM_MEMORY;} +#line 34596 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 651: /* create_table_option: CONNECTION_SYM opt_equal TEXT_STRING_sys */ +#line 5554 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.connect_string.str= (yyvsp[0].lex_str).str; + Lex->create_info.connect_string.length= (yyvsp[0].lex_str).length; + Lex->create_info.used_fields|= HA_CREATE_USED_CONNECTION; + } +#line 34606 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 652: /* create_table_option: KEY_BLOCK_SIZE opt_equal ulong_num */ +#line 5560 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE; + Lex->create_info.key_block_size= (yyvsp[0].ulong_num); + } +#line 34615 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 653: /* create_table_option: TRANSACTIONAL_SYM opt_equal choice */ +#line 5565 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_TRANSACTIONAL; + Lex->create_info.transactional= (yyvsp[0].choice); + } +#line 34624 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 654: /* create_table_option: engine_defined_option */ +#line 5570 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->create_info.option_list, &Lex->option_list_last); + } +#line 34632 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 655: /* create_table_option: SEQUENCE_SYM opt_equal choice */ +#line 5574 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE; + Lex->create_info.sequence= ((yyvsp[0].choice) == HA_CHOICE_YES); + } +#line 34641 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 657: /* engine_defined_option: IDENT_sys equal TEXT_STRING_sys */ +#line 5583 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].lex_str).length > ENGINE_OPTION_MAX_LENGTH)) + my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].lex_str), true); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 34652 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 658: /* engine_defined_option: IDENT_sys equal ident */ +#line 5590 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].ident_sys).length > ENGINE_OPTION_MAX_LENGTH)) + my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].ident_sys), false); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 34663 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 659: /* engine_defined_option: IDENT_sys equal real_ulonglong_num */ +#line 5597 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].ulonglong_number), thd->mem_root); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 34672 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 660: /* engine_defined_option: IDENT_sys equal DEFAULT */ +#line 5602 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys)); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 34681 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 663: /* versioning_option: WITH_SYSTEM_SYM VERSIONING_SYM */ +#line 5615 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) + { + if (!DBUG_IF("sysvers_force")) + { + my_error(ER_VERS_NOT_SUPPORTED, MYF(0), "CREATE TEMPORARY TABLE"); + MYSQL_YYABORT; + } + } + else + { + Lex->alter_info.flags|= ALTER_ADD_SYSTEM_VERSIONING; + Lex->create_info.options|= HA_VERSIONED_TABLE; + } + } +#line 34701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 664: /* default_charset: opt_default charset opt_equal charset_name_or_default */ +#line 5634 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.add_table_option_default_charset((yyvsp[0].charset)))) + MYSQL_YYABORT; + } +#line 34710 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 665: /* default_collation: opt_default COLLATE_SYM opt_equal collation_name_or_default */ +#line 5642 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_specification_st *cinfo= &Lex->create_info; + if (unlikely(cinfo->add_table_option_default_collation((yyvsp[0].Lex_extended_collation)))) + MYSQL_YYABORT; + } +#line 34720 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 666: /* storage_engines: ident_or_text */ +#line 5651 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Storage_engine_name((yyvsp[0].lex_str)). + resolve_storage_engine_with_error(thd, &(yyval.db_type), + thd->lex->create_info.tmp_table())) + MYSQL_YYABORT; + } +#line 34731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 667: /* known_storage_engines: ident_or_text */ +#line 5661 "/home/buildbot/git/sql/sql_yacc.yy" + { + plugin_ref plugin; + if (likely((plugin= ha_resolve_by_name(thd, &(yyvsp[0].lex_str), false)))) + (yyval.db_type)= plugin_hton(plugin); + else + my_yyabort_error((ER_UNKNOWN_STORAGE_ENGINE, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 34743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 668: /* row_types: DEFAULT */ +#line 5671 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_DEFAULT; } +#line 34749 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 669: /* row_types: FIXED_SYM */ +#line 5672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_FIXED; } +#line 34755 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 670: /* row_types: DYNAMIC_SYM */ +#line 5673 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_DYNAMIC; } +#line 34761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 671: /* row_types: COMPRESSED_SYM */ +#line 5674 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_COMPRESSED; } +#line 34767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 672: /* row_types: REDUNDANT_SYM */ +#line 5675 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_REDUNDANT; } +#line 34773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 673: /* row_types: COMPACT_SYM */ +#line 5676 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_COMPACT; } +#line 34779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 674: /* row_types: PAGE_SYM */ +#line 5677 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_PAGE; } +#line 34785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 675: /* merge_insert_types: NO_SYM */ +#line 5681 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_DISABLED; } +#line 34791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 676: /* merge_insert_types: FIRST_SYM */ +#line 5682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_TO_FIRST; } +#line 34797 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 677: /* merge_insert_types: LAST_SYM */ +#line 5683 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_TO_LAST; } +#line 34803 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 678: /* udf_type: STRING_SYM */ +#line 5687 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) STRING_RESULT; } +#line 34809 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 679: /* udf_type: REAL */ +#line 5688 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) REAL_RESULT; } +#line 34815 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 680: /* udf_type: DECIMAL_SYM */ +#line 5689 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) DECIMAL_RESULT; } +#line 34821 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 681: /* udf_type: INT_SYM */ +#line 5690 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) INT_RESULT; } +#line 34827 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 682: /* create_field_list: field_list */ +#line 5696 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + } +#line 34835 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 683: /* create_field_list_parens: LEFT_PAREN_ALT field_list ')' */ +#line 5703 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + } +#line 34843 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 686: /* field_list_item: column_def */ +#line 5714 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34849 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 690: /* field_list_item: PERIOD_SYM period_for_application_time */ +#line 5718 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34855 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 691: /* column_def: field_spec */ +#line 5723 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.create_field)= (yyvsp[0].create_field); } +#line 34861 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 692: /* column_def: field_spec opt_constraint references */ +#line 5725 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_column_foreign_key(&((yyvsp[-2].create_field)->field_name), &(yyvsp[-1].lex_str), + (yyvsp[0].table), DDL_options()))) + MYSQL_YYABORT; + (yyval.create_field)= (yyvsp[-2].create_field); + } +#line 34872 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 693: /* $@81: %empty */ +#line 5735 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key(Key::MULTIPLE, &(yyvsp[-1].lex_str), (yyvsp[0].key_alg), (yyvsp[-2].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34882 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 694: /* key_def: key_or_index opt_if_not_exists opt_ident opt_USING_key_algorithm $@81 '(' key_list ')' normal_key_options */ +#line 5740 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34888 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 695: /* $@82: %empty */ +#line 5742 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key(Key::MULTIPLE, &(yyvsp[-2].ident_sys), (yyvsp[0].key_alg), (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34898 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 696: /* key_def: key_or_index opt_if_not_exists ident TYPE_SYM btree_or_rtree $@82 '(' key_list ')' normal_key_options */ +#line 5747 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34904 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 697: /* $@83: %empty */ +#line 5749 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), &(yyvsp[0].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34914 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 698: /* key_def: fulltext opt_key_or_index opt_if_not_exists opt_ident $@83 '(' key_list ')' fulltext_key_options */ +#line 5754 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34920 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 699: /* $@84: %empty */ +#line 5756 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), &(yyvsp[0].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34930 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 700: /* key_def: spatial opt_key_or_index opt_if_not_exists opt_ident $@84 '(' key_list ')' spatial_key_options */ +#line 5761 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34936 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 701: /* $@85: %empty */ +#line 5765 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), (yyvsp[-1].lex_str).str ? &(yyvsp[-1].lex_str) : &(yyvsp[-4].lex_str), (yyvsp[0].key_alg), (yyvsp[-2].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34946 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 702: /* key_def: opt_constraint constraint_key_type opt_if_not_exists opt_ident opt_USING_key_algorithm $@85 '(' key_list opt_without_overlaps ')' normal_key_options */ +#line 5770 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34952 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 703: /* $@86: %empty */ +#line 5773 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-4].key_type), (yyvsp[-2].ident_sys).str ? &(yyvsp[-2].ident_sys) : &(yyvsp[-5].lex_str), (yyvsp[0].key_alg), (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34962 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 704: /* key_def: opt_constraint constraint_key_type opt_if_not_exists ident TYPE_SYM btree_or_rtree $@86 '(' key_list opt_without_overlaps ')' normal_key_options */ +#line 5778 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34968 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 705: /* $@87: %empty */ +#line 5780 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->check_add_key((yyvsp[-1].object_ddl_options))) || + unlikely(!(Lex->last_key= (new (thd->mem_root) + Key(Key::MULTIPLE, + (yyvsp[-4].lex_str).str ? &(yyvsp[-4].lex_str) : &(yyvsp[0].lex_str), + HA_KEY_ALG_UNDEF, true, (yyvsp[-1].object_ddl_options)))))) + MYSQL_YYABORT; + Lex->option_list= NULL; + } +#line 34982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 706: /* key_def: opt_constraint FOREIGN KEY_SYM opt_if_not_exists opt_ident $@87 '(' key_list ')' references */ +#line 5790 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_table_foreign_key((yyvsp[-5].lex_str).str ? &(yyvsp[-5].lex_str) : &(yyvsp[-9].lex_str), + (yyvsp[-9].lex_str).str ? &(yyvsp[-9].lex_str) : &(yyvsp[-5].lex_str), (yyvsp[0].table), (yyvsp[-6].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34992 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 707: /* constraint_def: opt_constraint check_constraint */ +#line 5799 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->add_constraint((yyvsp[-1].lex_str), (yyvsp[0].virtual_column), FALSE); + } +#line 35000 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 708: /* period_for_system_time: PERIOD_SYM FOR_SYSTEM_TIME_SYM '(' ident ',' ident ')' */ +#line 5807 "/home/buildbot/git/sql/sql_yacc.yy" + { + Vers_parse_info &info= Lex->vers_get_info(); + info.set_period((yyvsp[-3].ident_sys), (yyvsp[-1].ident_sys)); + } +#line 35009 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 709: /* period_for_application_time: FOR_SYM ident '(' ident ',' ident ')' */ +#line 5815 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_period((yyvsp[-5].ident_sys), (yyvsp[-3].ident_sys), (yyvsp[-1].ident_sys))) + MYSQL_YYABORT; + } +#line 35018 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 710: /* opt_check_constraint: %empty */ +#line 5822 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.virtual_column)= (Virtual_column_info*) 0; } +#line 35024 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 711: /* opt_check_constraint: check_constraint */ +#line 5823 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.virtual_column)= (yyvsp[0].virtual_column);} +#line 35030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 712: /* check_constraint: CHECK_SYM '(' expr ')' */ +#line 5828 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= add_virtual_expression(thd, (yyvsp[-1].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 35041 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 713: /* opt_constraint_no_id: %empty */ +#line 5837 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35047 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 714: /* opt_constraint_no_id: CONSTRAINT */ +#line 5838 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35053 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 715: /* opt_constraint: %empty */ +#line 5842 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 35059 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 716: /* opt_constraint: constraint */ +#line 5843 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 35065 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 717: /* constraint: CONSTRAINT opt_ident */ +#line 5847 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 35071 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 718: /* @88: %empty */ +#line 5852 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Create_field *f= new (thd->mem_root) Create_field(); + + if (unlikely(check_string_char_length(&(yyvsp[0].lex_str), 0, NAME_CHAR_LEN, + system_charset_info, 1))) + my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), (yyvsp[0].lex_str).str)); + + if (unlikely(!f)) + MYSQL_YYABORT; + + lex->init_last_field(f, &(yyvsp[0].lex_str)); + (yyval.create_field)= f; + lex->parsing_options.lookup_keywords_after_qualifier= true; + } +#line 35091 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 719: /* field_spec: field_ident @88 field_type_or_serial opt_check_constraint */ +#line 5868 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->parsing_options.lookup_keywords_after_qualifier= false; + (yyval.create_field)= (yyvsp[-2].create_field); + + (yyval.create_field)->check_constraint= (yyvsp[0].virtual_column); + + if (unlikely((yyval.create_field)->check(thd))) + MYSQL_YYABORT; + + lex->alter_info.create_list.push_back((yyval.create_field), thd->mem_root); + + (yyval.create_field)->create_if_not_exists= Lex->check_exists; + if ((yyval.create_field)->flags & PRI_KEY_FLAG) + lex->add_key_to_list(&(yyvsp[-3].lex_str), Key::PRIMARY, lex->check_exists); + else if ((yyval.create_field)->flags & UNIQUE_KEY_FLAG) + lex->add_key_to_list(&(yyvsp[-3].lex_str), Key::UNIQUE, lex->check_exists); + } +#line 35114 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 720: /* $@89: %empty */ +#line 5890 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + } +#line 35123 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 721: /* field_type_or_serial: qualified_field_type $@89 field_def */ +#line 5895 "/home/buildbot/git/sql/sql_yacc.yy" + { + auto tmp= (yyvsp[-2].Lex_field_type).charset_collation_attrs(); + if (tmp.merge_column_charset_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + Lex->last_field->set_charset_collation_attrs(tmp); + } +#line 35134 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 722: /* $@90: %empty */ +#line 5902 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_handler(&type_handler_ulonglong); + Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG + | UNSIGNED_FLAG | UNIQUE_KEY_FLAG; + Lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 35145 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 724: /* opt_serial_attribute: %empty */ +#line 5912 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 725: /* opt_serial_attribute: opt_serial_attribute_list */ +#line 5913 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35157 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 726: /* opt_serial_attribute_list: opt_serial_attribute_list serial_attribute */ +#line 5917 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35163 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 728: /* opt_asrow_attribute: %empty */ +#line 5922 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35169 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 729: /* opt_asrow_attribute: opt_asrow_attribute_list */ +#line 5923 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35175 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 730: /* opt_asrow_attribute_list: opt_asrow_attribute_list asrow_attribute */ +#line 5927 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35181 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 732: /* field_def: %empty */ +#line 5932 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 35187 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 734: /* field_def: attribute_list compressed_deprecated_column_attribute */ +#line 5934 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs); } +#line 35193 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 735: /* field_def: attribute_list compressed_deprecated_column_attribute attribute_list */ +#line 5936 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-2].Lex_exact_charset_extended_collation_attrs)).merge_column_collate_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + } +#line 35202 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 736: /* $@91: %empty */ +#line 5941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info= (yyvsp[0].virtual_column); + } +#line 35210 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 737: /* field_def: opt_generated_always AS virtual_column_func $@91 vcol_opt_specifier vcol_opt_attribute */ +#line 5945 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 738: /* field_def: opt_generated_always AS ROW_SYM START_SYM opt_asrow_attribute */ +#line 5949 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->last_field_generated_always_as_row_start()) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35228 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 739: /* field_def: opt_generated_always AS ROW_SYM END opt_asrow_attribute */ +#line 5955 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->last_field_generated_always_as_row_end()) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35238 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 740: /* opt_generated_always: %empty */ +#line 5963 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35244 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 741: /* opt_generated_always: GENERATED_SYM ALWAYS_SYM */ +#line 5964 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35250 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 742: /* vcol_opt_specifier: %empty */ +#line 5969 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); + } +#line 35258 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 743: /* vcol_opt_specifier: VIRTUAL_SYM */ +#line 5973 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); + } +#line 35266 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 744: /* vcol_opt_specifier: PERSISTENT_SYM */ +#line 5977 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); + } +#line 35274 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 745: /* vcol_opt_specifier: STORED_SYM */ +#line 5981 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); + } +#line 35282 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 746: /* vcol_opt_attribute: %empty */ +#line 5987 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35288 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 747: /* vcol_opt_attribute: vcol_opt_attribute_list */ +#line 5988 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35294 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 748: /* vcol_opt_attribute_list: vcol_opt_attribute_list vcol_attribute */ +#line 5992 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35300 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 750: /* vcol_attribute: UNIQUE_SYM */ +#line 5998 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 35310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 751: /* vcol_attribute: UNIQUE_SYM KEY_SYM */ +#line 6004 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 35320 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 752: /* vcol_attribute: COMMENT_SYM TEXT_STRING_sys */ +#line 6009 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->comment= (yyvsp[0].lex_str); } +#line 35326 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 753: /* vcol_attribute: INVISIBLE_SYM */ +#line 6011 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->invisible= INVISIBLE_USER; + } +#line 35334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 754: /* $@92: %empty */ +#line 6018 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + "PARSE_VCOL_EXPR" can only be used by the SQL server + when reading a '*.frm' file. + Prevent the end user from invoking this command. + */ + MYSQL_YYABORT_UNLESS(Lex->parse_vcol_expr); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 35349 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 755: /* parse_vcol_expr: PARSE_VCOL_EXPR_SYM $@92 expr */ +#line 6029 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= add_virtual_expression(thd, (yyvsp[0].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + Lex->last_field->vcol_info= v; + Lex->pop_select(); //main select + } +#line 35361 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 757: /* parenthesized_expr: expr ',' expr_list */ +#line 6041 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_row(thd, *(yyvsp[0].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 35372 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 758: /* virtual_column_func: '(' parenthesized_expr ')' */ +#line 6051 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= + add_virtual_expression(thd, (yyvsp[-1].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 35384 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 759: /* virtual_column_func: subquery */ +#line 6059 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item; + if (!(item= new (thd->mem_root) Item_singlerow_subselect(thd, (yyvsp[0].select_lex)))) + MYSQL_YYABORT; + Virtual_column_info *v= add_virtual_expression(thd, item); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 35398 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 763: /* column_default_expr: expr_or_literal */ +#line 6075 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.virtual_column)= add_virtual_expression(thd, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 35407 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 764: /* field_type: field_type_all */ +#line 6082 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->map_data_type(Lex_ident_sys(), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type))); + } +#line 35415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 765: /* qualified_field_type: field_type_all */ +#line 6089 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->map_data_type(Lex_ident_sys(), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type))); + } +#line 35423 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 766: /* qualified_field_type: sp_decl_ident '.' field_type_all */ +#line 6093 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->map_data_type((yyvsp[-2].ident_sys), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 35432 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 767: /* udt_name: IDENT_sys */ +#line 6100 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 35438 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 768: /* udt_name: reserved_keyword_udt */ +#line 6101 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].kwd); } +#line 35444 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 769: /* udt_name: non_reserved_keyword_udt */ +#line 6102 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].kwd); } +#line 35450 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 775: /* field_type_all: udt_name float_options srid_option */ +#line 6112 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_field_type_udt(&(yyval.Lex_field_type), (yyvsp[-2].lex_str), (yyvsp[-1].Lex_length_and_dec))) + MYSQL_YYABORT; + } +#line 35459 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 776: /* field_type_numeric: int_type opt_field_length last_field_options */ +#line 6120 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length_flags((yyvsp[-2].type_handler), (yyvsp[-1].Lex_length_and_dec), (uint32) (yyvsp[0].ulong_num)); + } +#line 35467 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 777: /* field_type_numeric: real_type opt_precision last_field_options */ +#line 6123 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set((yyvsp[-2].type_handler), (yyvsp[-1].Lex_length_and_dec)); } +#line 35473 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 778: /* field_type_numeric: FLOAT_SYM float_options last_field_options */ +#line 6125 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_float, (yyvsp[-1].Lex_length_and_dec)); + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length() && !(yyvsp[-1].Lex_length_and_dec).has_explicit_dec()) + { + if (unlikely((yyvsp[-1].Lex_length_and_dec).length() > PRECISION_FOR_DOUBLE)) + my_yyabort_error((ER_WRONG_FIELD_SPEC, MYF(0), + Lex->last_field->field_name.str)); + if ((yyvsp[-1].Lex_length_and_dec).length() > PRECISION_FOR_FLOAT) + (yyval.Lex_field_type).set(&type_handler_double); + else + (yyval.Lex_field_type).set(&type_handler_float); + } + } +#line 35491 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 779: /* field_type_numeric: BIT_SYM opt_field_length */ +#line 6139 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_bit, (yyvsp[0].Lex_length_and_dec)); + } +#line 35499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 780: /* field_type_numeric: BOOL_SYM */ +#line 6143 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length(&type_handler_stiny, 1); + } +#line 35507 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 781: /* field_type_numeric: BOOLEAN_SYM */ +#line 6147 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length(&type_handler_stiny, 1); + } +#line 35515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 782: /* field_type_numeric: DECIMAL_SYM float_options last_field_options */ +#line 6151 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 35521 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 783: /* field_type_numeric: NUMBER_ORACLE_SYM float_options last_field_options */ +#line 6153 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length()) + (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec)); + else + (yyval.Lex_field_type).set(&type_handler_double); + } +#line 35532 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 784: /* field_type_numeric: NUMERIC_SYM float_options last_field_options */ +#line 6160 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 35538 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 785: /* field_type_numeric: FIXED_SYM float_options last_field_options */ +#line 6162 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 35544 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 786: /* opt_binary_and_compression: %empty */ +#line 6167 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 35550 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 787: /* opt_binary_and_compression: binary */ +#line 6168 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[0].Lex_exact_charset_extended_collation_attrs); } +#line 35556 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 788: /* opt_binary_and_compression: binary compressed_deprecated_data_type_attribute */ +#line 6169 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs); } +#line 35562 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 789: /* opt_binary_and_compression: compressed opt_binary */ +#line 6170 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[0].Lex_exact_charset_extended_collation_attrs); } +#line 35568 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 790: /* field_type_string: char opt_field_length opt_binary */ +#line 6175 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 35576 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 791: /* field_type_string: nchar opt_field_length opt_bin_mod */ +#line 6179 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[-1].Lex_length_and_dec), + Lex_exact_charset_extended_collation_attrs::national((yyvsp[0].num))); + } +#line 35585 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 792: /* field_type_string: BINARY opt_field_length */ +#line 6184 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[0].Lex_length_and_dec), &my_charset_bin); + } +#line 35593 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 793: /* field_type_string: varchar opt_field_length opt_binary_and_compression */ +#line 6188 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 35601 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 794: /* field_type_string: VARCHAR2_ORACLE_SYM opt_field_length opt_binary_and_compression */ +#line 6192 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 35609 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 795: /* field_type_string: nvarchar opt_field_length opt_compressed opt_bin_mod */ +#line 6196 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-2].Lex_length_and_dec), + Lex_exact_charset_extended_collation_attrs::national((yyvsp[0].num))); + } +#line 35618 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 796: /* field_type_string: VARBINARY opt_field_length opt_compressed */ +#line 6201 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 35626 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 797: /* field_type_string: RAW_ORACLE_SYM opt_field_length opt_compressed */ +#line 6205 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 35634 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 798: /* field_type_temporal: YEAR_SYM opt_field_length last_field_options */ +#line 6212 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length()) + { + if ((yyvsp[-1].Lex_length_and_dec).length() != 4) + { + char buff[sizeof("YEAR()") + MY_INT64_NUM_DECIMAL_DIGITS + 1]; + my_snprintf(buff, sizeof(buff), "YEAR(%u)", (uint) (yyvsp[-1].Lex_length_and_dec).length()); + push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, + ER_WARN_DEPRECATED_SYNTAX, + ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), + buff, "YEAR(4)"); + } + } + (yyval.Lex_field_type).set(&type_handler_year, (yyvsp[-1].Lex_length_and_dec)); + } +#line 35654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 799: /* field_type_temporal: DATE_SYM */ +#line 6227 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdate); } +#line 35660 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 800: /* field_type_temporal: TIME_SYM opt_field_length */ +#line 6229 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(opt_mysql56_temporal_format ? + static_cast(&type_handler_time2) : + static_cast(&type_handler_time), + (yyvsp[0].Lex_length_and_dec)); + } +#line 35671 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 801: /* field_type_temporal: TIMESTAMP opt_field_length */ +#line 6236 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(opt_mysql56_temporal_format ? + static_cast(&type_handler_timestamp2): + static_cast(&type_handler_timestamp), + (yyvsp[0].Lex_length_and_dec)); + } +#line 35682 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 802: /* field_type_temporal: DATETIME opt_field_length */ +#line 6243 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(thd->type_handler_for_datetime(), (yyvsp[0].Lex_length_and_dec)); + } +#line 35690 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 803: /* field_type_lob: TINYBLOB opt_compressed */ +#line 6251 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_tiny_blob, &my_charset_bin); + } +#line 35698 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 804: /* field_type_lob: BLOB_MARIADB_SYM opt_field_length opt_compressed */ +#line 6255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 35706 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 805: /* field_type_lob: BLOB_ORACLE_SYM field_length opt_compressed */ +#line 6259 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 35714 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 806: /* field_type_lob: BLOB_ORACLE_SYM opt_compressed */ +#line 6263 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob, &my_charset_bin); + } +#line 35722 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 807: /* field_type_lob: MEDIUMBLOB opt_compressed */ +#line 6267 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_medium_blob, &my_charset_bin); + } +#line 35730 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 808: /* field_type_lob: LONGBLOB opt_compressed */ +#line 6271 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob, &my_charset_bin); + } +#line 35738 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 809: /* field_type_lob: LONG_SYM VARBINARY opt_compressed */ +#line 6275 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_medium_blob, &my_charset_bin); + } +#line 35746 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 810: /* field_type_lob: LONG_SYM varchar opt_binary_and_compression */ +#line 6279 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35752 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 811: /* field_type_lob: TINYTEXT opt_binary_and_compression */ +#line 6281 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_tiny_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35758 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 812: /* field_type_lob: TEXT_SYM opt_field_length opt_binary_and_compression */ +#line 6283 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35764 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 813: /* field_type_lob: MEDIUMTEXT opt_binary_and_compression */ +#line 6285 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35770 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 814: /* field_type_lob: LONGTEXT opt_binary_and_compression */ +#line 6287 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_long_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35776 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 815: /* field_type_lob: CLOB_ORACLE_SYM opt_binary_and_compression */ +#line 6289 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_long_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35782 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 816: /* field_type_lob: LONG_SYM opt_binary_and_compression */ +#line 6291 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35788 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 817: /* field_type_lob: JSON_SYM opt_compressed */ +#line 6293 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob_json, &my_charset_utf8mb4_bin); + } +#line 35796 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 818: /* field_type_misc: ENUM '(' string_list ')' opt_binary */ +#line 6300 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_enum, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 819: /* field_type_misc: SET '(' string_list ')' opt_binary */ +#line 6302 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_set, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35808 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 820: /* char: CHAR_SYM */ +#line 6306 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35814 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 821: /* nchar: NCHAR_SYM */ +#line 6310 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35820 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 822: /* nchar: NATIONAL_SYM CHAR_SYM */ +#line 6311 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35826 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 823: /* varchar: char VARYING */ +#line 6315 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35832 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 824: /* varchar: VARCHAR */ +#line 6316 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35838 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 825: /* nvarchar: NATIONAL_SYM VARCHAR */ +#line 6320 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35844 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 826: /* nvarchar: NVARCHAR_SYM */ +#line 6321 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35850 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 827: /* nvarchar: NCHAR_SYM VARCHAR */ +#line 6322 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35856 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 828: /* nvarchar: NATIONAL_SYM CHAR_SYM VARYING */ +#line 6323 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35862 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 829: /* nvarchar: NCHAR_SYM VARYING */ +#line 6324 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35868 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 830: /* int_type: INT_SYM */ +#line 6328 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_slong; } +#line 35874 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 831: /* int_type: TINYINT */ +#line 6329 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_stiny; } +#line 35880 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 832: /* int_type: SMALLINT */ +#line 6330 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_sshort; } +#line 35886 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 833: /* int_type: MEDIUMINT */ +#line 6331 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_sint24; } +#line 35892 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 834: /* int_type: BIGINT */ +#line 6332 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_slonglong; } +#line 35898 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 835: /* real_type: REAL */ +#line 6337 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.type_handler)= thd->variables.sql_mode & MODE_REAL_AS_FLOAT ? + static_cast(&type_handler_float) : + static_cast(&type_handler_double); + } +#line 35908 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 836: /* real_type: DOUBLE_SYM */ +#line 6342 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_double; } +#line 35914 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 837: /* real_type: DOUBLE_SYM PRECISION */ +#line 6343 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_double; } +#line 35920 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 838: /* srid_option: %empty */ +#line 6348 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->srid= 0; } +#line 35926 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 839: /* srid_option: REF_SYSTEM_ID_SYM '=' NUM */ +#line 6351 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->srid=atoi((yyvsp[0].lex_str).str); + } +#line 35934 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 840: /* float_options: %empty */ +#line 6357 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 35940 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 843: /* precision: '(' NUM ',' NUM ')' */ +#line 6363 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set((yyvsp[-3].lex_str).str, (yyvsp[-1].lex_str).str); } +#line 35946 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 844: /* field_options: %empty */ +#line 6367 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35952 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 845: /* field_options: SIGNED_SYM */ +#line 6368 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35958 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 846: /* field_options: UNSIGNED */ +#line 6369 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG; } +#line 35964 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 847: /* field_options: ZEROFILL */ +#line 6370 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35970 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 848: /* field_options: UNSIGNED ZEROFILL */ +#line 6371 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35976 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 849: /* field_options: ZEROFILL UNSIGNED */ +#line 6372 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 850: /* last_field_options: field_options */ +#line 6376 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->flags|= ((yyval.ulong_num)= (yyvsp[0].ulong_num)); } +#line 35988 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 851: /* field_length_str: '(' LONG_NUM ')' */ +#line 6380 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 35994 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 852: /* field_length_str: '(' ULONGLONG_NUM ')' */ +#line 6381 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 36000 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 853: /* field_length_str: '(' DECIMAL_NUM ')' */ +#line 6382 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 36006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 854: /* field_length_str: '(' NUM ')' */ +#line 6383 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 36012 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 855: /* field_length: field_length_str */ +#line 6386 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set((yyvsp[0].const_simple_string), NULL); } +#line 36018 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 856: /* field_scale: field_length_str */ +#line 6390 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set(NULL, (yyvsp[0].const_simple_string)); } +#line 36024 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 857: /* opt_field_length: %empty */ +#line 6395 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); /* use default length */ } +#line 36030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 859: /* opt_field_scale: %empty */ +#line 6400 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 36036 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 861: /* opt_precision: %empty */ +#line 6405 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 36042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 862: /* opt_precision: precision */ +#line 6406 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec)= (yyvsp[0].Lex_length_and_dec); } +#line 36048 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 863: /* attribute_list: attribute_list attribute */ +#line 6412 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs)).merge_column_collate_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + } +#line 36057 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 865: /* attribute: NULL_SYM */ +#line 6421 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->flags&= ~NOT_NULL_FLAG; + Lex->last_field->explicitly_nullable= true; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 36067 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 866: /* attribute: DEFAULT column_default_expr */ +#line 6427 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->default_value= (yyvsp[0].virtual_column); + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 36076 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 867: /* attribute: ON UPDATE_SYM NOW_SYM opt_default_time_precision */ +#line 6432 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + Lex->last_field->on_update= item; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 36088 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 868: /* attribute: AUTO_INC */ +#line 6439 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 36094 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 869: /* attribute: SERIAL_SYM DEFAULT VALUE_SYM */ +#line 6441 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 36105 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 870: /* attribute: COLLATE_SYM collation_name */ +#line 6448 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 36113 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 871: /* attribute: serial_attribute */ +#line 6451 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 36119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 872: /* opt_compression_method: %empty */ +#line 6455 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= NULL; } +#line 36125 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 873: /* opt_compression_method: equal ident */ +#line 6456 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[0].ident_sys).str; } +#line 36131 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 874: /* opt_compressed: %empty */ +#line 6460 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36137 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 875: /* opt_compressed: compressed */ +#line 6461 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 36143 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 876: /* opt_enable: %empty */ +#line 6465 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36149 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 877: /* opt_enable: ENABLE_SYM */ +#line 6466 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 36155 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 878: /* compressed: COMPRESSED_SYM opt_compression_method */ +#line 6471 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field->set_compressed((yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 36164 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 879: /* compressed_deprecated_data_type_attribute: COMPRESSED_SYM opt_compression_method */ +#line 6479 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field->set_compressed_deprecated(thd, (yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 36173 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 880: /* compressed_deprecated_column_attribute: COMPRESSED_SYM opt_compression_method */ +#line 6487 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field-> + set_compressed_deprecated_column_attribute(thd, (yyvsp[-1].kwd).pos(), (yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 36183 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 881: /* asrow_attribute: not NULL_SYM opt_enable */ +#line 6496 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->flags|= NOT_NULL_FLAG; + } +#line 36191 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 882: /* asrow_attribute: opt_primary KEY_SYM */ +#line 6500 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= PRI_KEY_FLAG | NOT_NULL_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 36201 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 885: /* serial_attribute: engine_defined_option */ +#line 6511 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->last_field->option_list, &Lex->option_list_last); + } +#line 36209 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 886: /* serial_attribute: with_or_without_system VERSIONING_SYM */ +#line 6515 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->versioning= (yyvsp[-1].vers_column_versioning); + Lex->create_info.options|= HA_VERSIONED_TABLE; + if (Lex->alter_info.flags & ALTER_DROP_SYSTEM_VERSIONING) + { + my_yyabort_error((ER_VERS_NOT_VERSIONED, MYF(0), + Lex->create_last_non_select_table->table_name.str)); + } + } +#line 36223 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 887: /* with_or_without_system: WITH_SYSTEM_SYM */ +#line 6528 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_COLUMN_UNVERSIONED; + Lex->create_info.vers_info.versioned_fields= true; + (yyval.vers_column_versioning)= Column_definition::WITH_VERSIONING; + } +#line 36233 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 888: /* with_or_without_system: WITHOUT SYSTEM */ +#line 6534 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_COLUMN_UNVERSIONED; + Lex->create_info.vers_info.unversioned_fields= true; + (yyval.vers_column_versioning)= Column_definition::WITHOUT_VERSIONING; + } +#line 36243 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 889: /* charset: CHAR_SYM SET */ +#line 6543 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.kwd)= (yyvsp[-1].kwd); } +#line 36249 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 890: /* charset: CHARSET */ +#line 6544 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.kwd)= (yyvsp[0].kwd); } +#line 36255 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 891: /* charset_name: ident_or_text */ +#line 6549 "/home/buildbot/git/sql/sql_yacc.yy" + { + myf utf8_flag= thd->get_utf8_flag(); + if (unlikely(!((yyval.charset)=get_charset_by_csname((yyvsp[0].lex_str).str, MY_CS_PRIMARY, + MYF(utf8_flag))))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 36266 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 892: /* charset_name: BINARY */ +#line 6555 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_bin; } +#line 36272 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 893: /* charset_name_or_default: charset_name */ +#line 6559 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=(yyvsp[0].charset); } +#line 36278 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 894: /* charset_name_or_default: DEFAULT */ +#line 6560 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=NULL; } +#line 36284 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 895: /* opt_load_data_charset: %empty */ +#line 6564 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= NULL; } +#line 36290 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 896: /* opt_load_data_charset: charset charset_name_or_default */ +#line 6565 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= (yyvsp[0].charset); } +#line 36296 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 897: /* old_or_new_charset_name: ident_or_text */ +#line 6570 "/home/buildbot/git/sql/sql_yacc.yy" + { + myf utf8_flag= thd->get_utf8_flag(); + if (unlikely(!((yyval.charset)=get_charset_by_csname((yyvsp[0].lex_str).str, + MY_CS_PRIMARY, + MYF(utf8_flag))) && + !((yyval.charset)=get_old_charset_by_name((yyvsp[0].lex_str).str)))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 36309 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 898: /* old_or_new_charset_name: BINARY */ +#line 6578 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_bin; } +#line 36315 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 899: /* old_or_new_charset_name_or_default: old_or_new_charset_name */ +#line 6582 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=(yyvsp[0].charset); } +#line 36321 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 900: /* old_or_new_charset_name_or_default: DEFAULT */ +#line 6583 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=NULL; } +#line 36327 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 901: /* collation_name: ident_or_text */ +#line 6588 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_extended_collation).set_by_name((yyvsp[0].lex_str).str, thd->get_utf8_flag())) + MYSQL_YYABORT; + } +#line 36336 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 902: /* collation_name_or_default: collation_name */ +#line 6595 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_extended_collation)=(yyvsp[0].Lex_extended_collation); } +#line 36342 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 903: /* collation_name_or_default: DEFAULT */ +#line 6596 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_extended_collation).set_collate_default(); } +#line 36348 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 904: /* opt_default: %empty */ +#line 6600 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36354 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 905: /* opt_default: DEFAULT */ +#line 6601 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36360 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 906: /* charset_or_alias: charset charset_name */ +#line 6605 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= (yyvsp[0].charset); } +#line 36366 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 907: /* charset_or_alias: ASCII_SYM */ +#line 6606 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_latin1; } +#line 36372 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 908: /* charset_or_alias: UNICODE_SYM */ +#line 6608 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.charset)= get_charset_by_csname("ucs2", MY_CS_PRIMARY,MYF(0))))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), "ucs2")); + } +#line 36381 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 909: /* opt_binary: %empty */ +#line 6615 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 36387 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 911: /* binary: BYTE_SYM */ +#line 6621 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset(Lex_exact_charset(&my_charset_bin)); + } +#line 36395 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 912: /* binary: charset_or_alias */ +#line 6625 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset(Lex_exact_charset((yyvsp[0].charset))); + } +#line 36403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 913: /* binary: charset_or_alias BINARY */ +#line 6629 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_binary(Lex_exact_charset((yyvsp[-1].charset)))) + MYSQL_YYABORT; + } +#line 36412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 914: /* binary: BINARY */ +#line 6633 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).set_contextually_typed_binary_style(); } +#line 36418 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 915: /* binary: BINARY charset_or_alias */ +#line 6635 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_binary(Lex_exact_charset((yyvsp[0].charset)))) + MYSQL_YYABORT; + } +#line 36427 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 916: /* binary: charset_or_alias COLLATE_SYM DEFAULT */ +#line 6640 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_default(Lex_exact_charset((yyvsp[-2].charset))); + } +#line 36435 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 917: /* binary: charset_or_alias COLLATE_SYM collation_name */ +#line 6644 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].Lex_extended_collation).merge_exact_charset(Lex_exact_charset((yyvsp[-2].charset)))) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 36445 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 918: /* binary: COLLATE_SYM collation_name */ +#line 6650 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 36453 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 919: /* binary: COLLATE_SYM DEFAULT */ +#line 6654 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_collate_default(); + } +#line 36461 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 920: /* opt_bin_mod: %empty */ +#line 6660 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 36467 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 921: /* opt_bin_mod: BINARY */ +#line 6661 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 36473 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 922: /* $@93: %empty */ +#line 6666 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].ulong_num) == 0)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 36485 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 923: /* ws_nweights: '(' real_ulong_num $@93 ')' */ +#line 6674 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[-2].ulong_num); } +#line 36491 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 924: /* ws_level_flag_desc: ASC */ +#line 6678 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 36497 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 925: /* ws_level_flag_desc: DESC */ +#line 6679 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1 << MY_STRXFRM_DESC_SHIFT; } +#line 36503 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 926: /* ws_level_flag_reverse: REVERSE_SYM */ +#line 6683 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1 << MY_STRXFRM_REVERSE_SHIFT; } +#line 36509 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 927: /* ws_level_flags: %empty */ +#line 6686 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 36515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 928: /* ws_level_flags: ws_level_flag_desc */ +#line 6687 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 36521 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 929: /* ws_level_flags: ws_level_flag_desc ws_level_flag_reverse */ +#line 6688 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[-1].ulong_num) | (yyvsp[0].ulong_num); } +#line 36527 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 930: /* ws_level_flags: ws_level_flag_reverse */ +#line 6689 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num) ; } +#line 36533 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 931: /* ws_level_number: real_ulong_num */ +#line 6694 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ulong_num)= (yyvsp[0].ulong_num) < 1 ? 1 : ((yyvsp[0].ulong_num) > MY_STRXFRM_NLEVELS ? MY_STRXFRM_NLEVELS : (yyvsp[0].ulong_num)); + (yyval.ulong_num)--; + } +#line 36542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 932: /* ws_level_list_item: ws_level_number ws_level_flags */ +#line 6702 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ulong_num)= (1 | (yyvsp[0].ulong_num)) << (yyvsp[-1].ulong_num); + } +#line 36550 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 933: /* ws_level_list: ws_level_list_item */ +#line 6708 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 36556 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 934: /* ws_level_list: ws_level_list ',' ws_level_list_item */ +#line 6709 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)|= (yyvsp[0].ulong_num); } +#line 36562 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 935: /* ws_level_range: ws_level_number '-' ws_level_number */ +#line 6714 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint start= (yyvsp[-2].ulong_num); + uint end= (yyvsp[0].ulong_num); + for ((yyval.ulong_num)= 0; start <= end; start++) + (yyval.ulong_num)|= (1 << start); + } +#line 36573 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 936: /* ws_level_list_or_range: ws_level_list */ +#line 6723 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 36579 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 937: /* ws_level_list_or_range: ws_level_range */ +#line 6724 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 36585 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 938: /* opt_ws_levels: %empty */ +#line 6728 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 36591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 939: /* opt_ws_levels: LEVEL_SYM ws_level_list_or_range */ +#line 6729 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 36597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 942: /* references: REFERENCES table_ident opt_ref_list opt_match_clause opt_on_update_delete */ +#line 6743 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)=(yyvsp[-3].table); + } +#line 36605 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 943: /* opt_ref_list: %empty */ +#line 6750 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ref_list.empty(); } +#line 36611 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 945: /* ref_list: ref_list ',' ident */ +#line 6756 "/home/buildbot/git/sql/sql_yacc.yy" + { + Key_part_spec *key= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely(key == NULL)) + MYSQL_YYABORT; + Lex->ref_list.push_back(key, thd->mem_root); + } +#line 36622 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 946: /* ref_list: ident */ +#line 6763 "/home/buildbot/git/sql/sql_yacc.yy" + { + Key_part_spec *key= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely(key == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->ref_list.empty(); + lex->ref_list.push_back(key, thd->mem_root); + } +#line 36635 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 947: /* opt_match_clause: %empty */ +#line 6775 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_UNDEF; } +#line 36641 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 948: /* opt_match_clause: MATCH FULL */ +#line 6777 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_FULL; } +#line 36647 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 949: /* opt_match_clause: MATCH PARTIAL */ +#line 6779 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_PARTIAL; } +#line 36653 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 950: /* opt_match_clause: MATCH SIMPLE_SYM */ +#line 6781 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_SIMPLE; } +#line 36659 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 951: /* opt_on_update_delete: %empty */ +#line 6786 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= FK_OPTION_UNDEF; + lex->fk_delete_opt= FK_OPTION_UNDEF; + } +#line 36669 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 952: /* opt_on_update_delete: ON UPDATE_SYM delete_option */ +#line 6792 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[0].m_fk_option); + lex->fk_delete_opt= FK_OPTION_UNDEF; + } +#line 36679 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 953: /* opt_on_update_delete: ON DELETE_SYM delete_option */ +#line 6798 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= FK_OPTION_UNDEF; + lex->fk_delete_opt= (yyvsp[0].m_fk_option); + } +#line 36689 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 954: /* opt_on_update_delete: ON UPDATE_SYM delete_option ON DELETE_SYM delete_option */ +#line 6805 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[-3].m_fk_option); + lex->fk_delete_opt= (yyvsp[0].m_fk_option); + } +#line 36699 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 955: /* opt_on_update_delete: ON DELETE_SYM delete_option ON UPDATE_SYM delete_option */ +#line 6812 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[0].m_fk_option); + lex->fk_delete_opt= (yyvsp[-3].m_fk_option); + } +#line 36709 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 956: /* delete_option: RESTRICT */ +#line 6820 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_RESTRICT; } +#line 36715 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 957: /* delete_option: CASCADE */ +#line 6821 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_CASCADE; } +#line 36721 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 958: /* delete_option: SET NULL_SYM */ +#line 6822 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_SET_NULL; } +#line 36727 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 959: /* delete_option: NO_SYM ACTION */ +#line 6823 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_NO_ACTION; } +#line 36733 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 960: /* delete_option: SET DEFAULT */ +#line 6824 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_SET_DEFAULT; } +#line 36739 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 961: /* constraint_key_type: PRIMARY_SYM KEY_SYM */ +#line 6828 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::PRIMARY; } +#line 36745 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 962: /* constraint_key_type: UNIQUE_SYM opt_key_or_index */ +#line 6829 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::UNIQUE; } +#line 36751 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 963: /* key_or_index: KEY_SYM */ +#line 6833 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36757 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 964: /* key_or_index: INDEX_SYM */ +#line 6834 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36763 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 965: /* opt_key_or_index: %empty */ +#line 6838 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36769 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 967: /* keys_or_index: KEYS */ +#line 6843 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36775 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 968: /* keys_or_index: INDEX_SYM */ +#line 6844 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36781 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 969: /* keys_or_index: INDEXES */ +#line 6845 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36787 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 970: /* fulltext: FULLTEXT_SYM */ +#line 6849 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::FULLTEXT;} +#line 36793 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 971: /* spatial: SPATIAL_SYM */ +#line 6854 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef HAVE_SPATIAL + (yyval.key_type)= Key::SPATIAL; +#else + my_yyabort_error((ER_FEATURE_DISABLED, MYF(0), sym_group_geom.name, + sym_group_geom.needed_define)); +#endif + } +#line 36806 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 972: /* normal_key_options: %empty */ +#line 6865 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36812 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 973: /* normal_key_options: normal_key_opts */ +#line 6866 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36818 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 974: /* fulltext_key_options: %empty */ +#line 6870 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36824 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 975: /* fulltext_key_options: fulltext_key_opts */ +#line 6871 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36830 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 976: /* spatial_key_options: %empty */ +#line 6875 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36836 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 977: /* spatial_key_options: spatial_key_opts */ +#line 6876 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36842 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 984: /* opt_USING_key_algorithm: %empty */ +#line 6895 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_UNDEF; } +#line 36848 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 985: /* opt_USING_key_algorithm: USING btree_or_rtree */ +#line 6896 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36854 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 986: /* opt_key_algorithm_clause: %empty */ +#line 6901 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_UNDEF; } +#line 36860 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 987: /* opt_key_algorithm_clause: USING btree_or_rtree */ +#line 6902 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36866 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 988: /* opt_key_algorithm_clause: TYPE_SYM btree_or_rtree */ +#line 6903 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36872 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 989: /* key_using_alg: USING btree_or_rtree */ +#line 6908 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.algorithm= (yyvsp[0].key_alg); } +#line 36878 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 990: /* key_using_alg: TYPE_SYM btree_or_rtree */ +#line 6910 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.algorithm= (yyvsp[0].key_alg); } +#line 36884 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 991: /* all_key_opt: KEY_BLOCK_SIZE opt_equal ulong_num */ +#line 6915 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->key_create_info.block_size= (yyvsp[0].ulong_num); + Lex->last_key->key_create_info.flags|= HA_USES_BLOCK_SIZE; + } +#line 36893 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 992: /* all_key_opt: COMMENT_SYM TEXT_STRING_sys */ +#line 6920 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.comment= (yyvsp[0].lex_str); } +#line 36899 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 993: /* all_key_opt: VISIBLE_SYM */ +#line 6922 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* This is mainly for MySQL 8.0 compatibility */ + } +#line 36907 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 994: /* all_key_opt: ignorability */ +#line 6926 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->key_create_info.is_ignored= (yyvsp[0].num); + } +#line 36915 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 995: /* all_key_opt: engine_defined_option */ +#line 6930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->option_list, &Lex->option_list_last); + } +#line 36923 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1000: /* fulltext_key_opt: WITH PARSER_SYM IDENT_sys */ +#line 6947 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (likely(plugin_is_ready(&(yyvsp[0].ident_sys), MYSQL_FTPARSER_PLUGIN))) + Lex->last_key->key_create_info.parser_name= (yyvsp[0].ident_sys); + else + my_yyabort_error((ER_FUNCTION_NOT_DEFINED, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 36934 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1001: /* btree_or_rtree: BTREE_SYM */ +#line 6956 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_BTREE; } +#line 36940 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1002: /* btree_or_rtree: RTREE_SYM */ +#line 6957 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_RTREE; } +#line 36946 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1003: /* btree_or_rtree: HASH_SYM */ +#line 6958 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_HASH; } +#line 36952 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1004: /* ignorability: IGNORED_SYM */ +#line 6962 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 36958 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1005: /* ignorability: NOT_SYM IGNORED_SYM */ +#line 6963 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 36964 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1006: /* key_list: key_list ',' key_part order_dir */ +#line 6968 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].key_part)->asc= (yyvsp[0].num); + Lex->last_key->columns.push_back((yyvsp[-1].key_part), thd->mem_root); + } +#line 36973 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1007: /* key_list: key_part order_dir */ +#line 6973 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].key_part)->asc= (yyvsp[0].num); + Lex->last_key->columns.push_back((yyvsp[-1].key_part), thd->mem_root); + } +#line 36982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1008: /* opt_without_overlaps: %empty */ +#line 6980 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36988 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1009: /* opt_without_overlaps: ',' ident WITHOUT OVERLAPS_SYM */ +#line 6982 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->without_overlaps= true; + Lex->last_key->period= (yyvsp[-2].ident_sys); + } +#line 36997 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1010: /* key_part: ident */ +#line 6990 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.key_part)= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.key_part) == NULL)) + MYSQL_YYABORT; + } +#line 37007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1011: /* key_part: ident '(' NUM ')' */ +#line 6996 "/home/buildbot/git/sql/sql_yacc.yy" + { + int key_part_len= atoi((yyvsp[-1].lex_str).str); + if (unlikely(!key_part_len)) + my_yyabort_error((ER_KEY_PART_0, MYF(0), (yyvsp[-3].ident_sys).str)); + (yyval.key_part)= new (thd->mem_root) Key_part_spec(&(yyvsp[-3].ident_sys), (uint) key_part_len); + if (unlikely((yyval.key_part) == NULL)) + MYSQL_YYABORT; + } +#line 37020 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1012: /* opt_ident: %empty */ +#line 7007 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 37026 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1013: /* opt_ident: field_ident */ +#line 7008 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 37032 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1014: /* string_list: text_string */ +#line 7013 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->interval_list.push_back((yyvsp[0].string), thd->mem_root); } +#line 37038 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1015: /* string_list: string_list ',' text_string */ +#line 7015 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->interval_list.push_back((yyvsp[0].string), thd->mem_root); } +#line 37044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1016: /* $@94: %empty */ +#line 7024 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->name= null_clex_str; + Lex->table_type= TABLE_TYPE_UNKNOWN; + Lex->sql_command= SQLCOM_ALTER_TABLE; + Lex->duplicates= DUP_ERROR; + Lex->first_select_lex()->order_list.empty(); + Lex->create_info.init(); + Lex->create_info.row_type= ROW_TYPE_NOT_USED; + Lex->alter_info.reset(); + Lex->no_write_to_binlog= 0; + Lex->create_info.storage_media= HA_SM_DEFAULT; + if (Lex->main_select_push()) + MYSQL_YYABORT; + DBUG_ASSERT(!Lex->m_sql_cmd); + } +#line 37064 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1017: /* $@95: %empty */ +#line 7040 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + if (!Lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + TL_READ_NO_INSERT, MDL_SHARED_UPGRADABLE)) + MYSQL_YYABORT; + Lex->first_select_lex()->db= + (Lex->first_select_lex()->table_list.first)->db; + Lex->create_last_non_select_table= Lex->last_table(); + Lex->mark_first_table_as_inserting(); + } +#line 37080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1018: /* alter: ALTER $@94 alter_options TABLE_SYM opt_if_exists table_ident opt_lock_wait_timeout $@95 alter_commands */ +#line 7052 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (likely(!Lex->m_sql_cmd)) + { + /* Create a generic ALTER TABLE statment. */ + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } + Lex->pop_select(); //main select + } +#line 37095 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1019: /* $@96: %empty */ +#line 7063 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 37105 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1020: /* alter: ALTER DATABASE ident_or_empty $@96 create_database_options */ +#line 7069 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name= (yyvsp[-2].ident_sys); + if (lex->name.str == NULL && + unlikely(lex->copy_db_to(&lex->name))) + MYSQL_YYABORT; + Lex->pop_select(); //main select + } +#line 37119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1021: /* $@97: %empty */ +#line 7079 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + Lex->create_info.schema_comment= thd->make_clex_string((yyvsp[0].lex_str)); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 37129 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1022: /* alter: ALTER DATABASE COMMENT_SYM opt_equal TEXT_STRING_sys $@97 opt_create_database_options */ +#line 7085 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name= Lex_ident_sys(); + if (lex->name.str == NULL && + unlikely(lex->copy_db_to(&lex->name))) + MYSQL_YYABORT; + } +#line 37142 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1023: /* alter: ALTER DATABASE ident UPGRADE_SYM DATA_SYM DIRECTORY_SYM NAME_SYM */ +#line 7094 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "DATABASE")); + lex->sql_command= SQLCOM_ALTER_DB_UPGRADE; + lex->name= (yyvsp[-4].ident_sys); + } +#line 37154 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1024: /* $@98: %empty */ +#line 7102 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_procedure_start((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 37163 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1025: /* alter: ALTER PROCEDURE_SYM sp_name $@98 sp_a_chistics stmt_end */ +#line 7107 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37169 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1026: /* $@99: %empty */ +#line 7109 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_function_start((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 37178 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1027: /* alter: ALTER FUNCTION_SYM sp_name $@99 sp_a_chistics stmt_end */ +#line 7114 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37184 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1028: /* $@100: %empty */ +#line 7116 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + if (Lex->add_alter_view(thd, (yyvsp[-4].num), (yyvsp[-2].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 37195 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1029: /* alter: ALTER view_algorithm definer_opt opt_view_suid VIEW_SYM table_ident $@100 view_list_opt AS view_select stmt_end */ +#line 7122 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37201 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1030: /* $@101: %empty */ +#line 7129 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + if (Lex->add_alter_view(thd, VIEW_ALGORITHM_INHERIT, (yyvsp[-2].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 37212 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1031: /* alter: ALTER definer_opt opt_view_suid VIEW_SYM table_ident $@101 view_list_opt AS view_select stmt_end */ +#line 7135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1032: /* $@102: %empty */ +#line 7137 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + /* + It is safe to use Lex->spname because + ALTER EVENT xxx RENATE TO yyy DO ALTER EVENT RENAME TO + is not allowed. Lex->spname is used in the case of RENAME TO + If it had to be supported spname had to be added to + Event_parse_data. + */ + + if (unlikely(!(Lex->event_parse_data= Event_parse_data::new_instance(thd)))) + MYSQL_YYABORT; + Lex->event_parse_data->identifier= (yyvsp[0].spname); + + Lex->sql_command= SQLCOM_ALTER_EVENT; + Lex->stmt_definition_begin= (yyvsp[-2].simple_string); + } +#line 37241 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1033: /* alter: ALTER definer_opt remember_name EVENT_SYM sp_name $@102 ev_alter_on_schedule_completion opt_ev_rename_to opt_ev_status opt_ev_comment opt_ev_sql_stmt */ +#line 7160 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyvsp[-4].num) || (yyvsp[-3].num) || (yyvsp[-2].num) || (yyvsp[-1].num) || (yyvsp[0].num)))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + /* + sql_command is set here because some rules in ev_sql_stmt + can overwrite it + */ + Lex->sql_command= SQLCOM_ALTER_EVENT; + Lex->stmt_definition_end= (char*)YYLIP->get_cpp_ptr(); + + Lex->pop_select(); //main select + } +#line 37261 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1034: /* $@103: %empty */ +#line 7176 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_ALTER_SERVER; + lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 37271 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1035: /* alter: ALTER SERVER_SYM ident_or_text $@103 OPTIONS_SYM '(' server_options_list ')' */ +#line 7180 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 37277 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1036: /* alter: ALTER USER_SYM opt_if_exists clear_privileges grant_list opt_require_clause opt_resource_options opt_account_locking_and_opt_password_expiration */ +#line 7184 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.set((yyvsp[-5].object_ddl_options)); + Lex->sql_command= SQLCOM_ALTER_USER; + } +#line 37286 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1037: /* $@104: %empty */ +#line 7189 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_ALTER_SEQUENCE; + DBUG_ASSERT(!lex->m_sql_cmd); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 37298 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1038: /* $@105: %empty */ +#line 7197 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!(lex->create_info.seq_create_info= new (thd->mem_root) + sequence_definition()) || + !lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_SEQUENCE, + TL_WRITE, MDL_EXCLUSIVE)) + MYSQL_YYABORT; + } +#line 37312 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1039: /* $@106: %empty */ +#line 7207 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Create a generic ALTER SEQUENCE statment. */ + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_sequence((yyvsp[-4].object_ddl_options)); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37323 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1040: /* alter: ALTER SEQUENCE_SYM opt_if_exists $@104 table_ident $@105 sequence_defs $@106 stmt_end */ +#line 7212 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37329 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1041: /* account_locking_option: LOCK_SYM */ +#line 7217 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.account_locked= ACCOUNTLOCK_LOCKED; + } +#line 37337 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1042: /* account_locking_option: UNLOCK_SYM */ +#line 7221 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.account_locked= ACCOUNTLOCK_UNLOCKED; + } +#line 37345 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1043: /* opt_password_expire_option: %empty */ +#line 7228 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_NOW; + } +#line 37353 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1044: /* opt_password_expire_option: NEVER_SYM */ +#line 7232 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_NEVER; + } +#line 37361 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1045: /* opt_password_expire_option: DEFAULT */ +#line 7236 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_DEFAULT; + } +#line 37369 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1046: /* opt_password_expire_option: INTERVAL_SYM NUM DAY_SYM */ +#line 7240 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_INTERVAL; + if (!(Lex->account_options.num_expiration_days= atoi((yyvsp[-1].lex_str).str))) + my_yyabort_error((ER_WRONG_VALUE, MYF(0), "DAY", (yyvsp[-1].lex_str).str)); + } +#line 37379 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1052: /* ev_alter_on_schedule_completion: %empty */ +#line 7256 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 37385 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1053: /* ev_alter_on_schedule_completion: ON SCHEDULE_SYM ev_schedule_time */ +#line 7257 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 37391 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1054: /* ev_alter_on_schedule_completion: ev_on_completion */ +#line 7258 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 37397 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1055: /* ev_alter_on_schedule_completion: ON SCHEDULE_SYM ev_schedule_time ev_on_completion */ +#line 7259 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 37403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1056: /* opt_ev_rename_to: %empty */ +#line 7263 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 37409 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1057: /* opt_ev_rename_to: RENAME TO_SYM sp_name */ +#line 7265 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Use lex's spname to hold the new name. + The original name is in the Event_parse_data object + */ + Lex->spname= (yyvsp[0].spname); + (yyval.num)= 1; + } +#line 37422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1058: /* opt_ev_sql_stmt: %empty */ +#line 7276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 37428 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1059: /* opt_ev_sql_stmt: DO_SYM ev_sql_stmt */ +#line 7277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 37434 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1060: /* ident_or_empty: %empty */ +#line 7282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys)= Lex_ident_sys(); } +#line 37440 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1063: /* alter_commands: DISCARD TABLESPACE */ +#line 7289 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_discard_import_tablespace( + Sql_cmd_discard_import_tablespace::DISCARD_TABLESPACE); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37452 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1064: /* alter_commands: IMPORT TABLESPACE */ +#line 7297 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_discard_import_tablespace( + Sql_cmd_discard_import_tablespace::IMPORT_TABLESPACE); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37464 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1070: /* alter_commands: DROP PARTITION_SYM opt_if_exists alt_part_name_list */ +#line 7319 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_DROP; + DBUG_ASSERT(!Lex->if_exists()); + Lex->create_info.add((yyvsp[-1].object_ddl_options)); + } +#line 37474 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1071: /* alter_commands: REBUILD_SYM PARTITION_SYM opt_no_write_to_binlog all_or_alt_part_name_list */ +#line 7326 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->alter_info.partition_flags|= ALTER_PARTITION_REBUILD; + lex->no_write_to_binlog= (yyvsp[-1].num); + } +#line 37484 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1072: /* $@107: %empty */ +#line 7333 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_optimize_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1074: /* alter_commands: ANALYZE_SYM PARTITION_SYM opt_no_write_to_binlog all_or_alt_part_name_list */ +#line 7346 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_analyze_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37514 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1075: /* $@108: %empty */ +#line 7357 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_check_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37528 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1077: /* $@109: %empty */ +#line 7369 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_repair_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37543 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1079: /* alter_commands: COALESCE PARTITION_SYM opt_no_write_to_binlog real_ulong_num */ +#line 7381 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->alter_info.partition_flags|= ALTER_PARTITION_COALESCE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->alter_info.num_parts= (yyvsp[0].ulong_num); + } +#line 37554 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1080: /* alter_commands: TRUNCATE_SYM PARTITION_SYM all_or_alt_part_name_list */ +#line 7388 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_truncate_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37568 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1082: /* alter_commands: EXCHANGE_SYM PARTITION_SYM alt_part_name_item WITH TABLE_SYM table_ident have_partitioning */ +#line 7400 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_table_exchange_partition((yyvsp[-1].table))) + MYSQL_YYABORT; + } +#line 37577 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1083: /* alter_commands: CONVERT_SYM PARTITION_SYM alt_part_name_item TO_SYM TABLE_SYM table_ident have_partitioning */ +#line 7406 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (Lex->stmt_alter_table((yyvsp[-1].table))) + MYSQL_YYABORT; + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + lex->alter_info.partition_flags|= ALTER_PARTITION_CONVERT_OUT; + } +#line 37591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1084: /* $@110: %empty */ +#line 7416 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), nullptr, 0, + TL_READ_NO_INSERT, + MDL_SHARED_NO_WRITE)) + MYSQL_YYABORT; + + /* + This will appear as (new_db, new_name) in alter_ctx. + new_db will be IX-locked and new_name X-locked. + */ + lex->first_select_lex()->db= (yyvsp[0].table)->db; + lex->name= (yyvsp[0].table)->table; + if (lex->first_select_lex()->db.str == NULL && + lex->copy_db_to(&lex->first_select_lex()->db)) + MYSQL_YYABORT; + + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->part_info->num_parts= 1; + /* + OR-ed with ALTER_PARTITION_ADD because too many checks of + ALTER_PARTITION_ADD required. + */ + lex->alter_info.partition_flags|= ALTER_PARTITION_ADD | + ALTER_PARTITION_CONVERT_IN; + } +#line 37625 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1085: /* alter_commands: CONVERT_SYM TABLE_SYM table_ident $@110 TO_SYM PARTITION_SYM part_definition */ +#line 7446 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37636 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1086: /* remove_partitioning: REMOVE_SYM PARTITIONING_SYM */ +#line 7456 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_REMOVE; + } +#line 37644 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1087: /* all_or_alt_part_name_list: ALL */ +#line 7463 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_ALL; + } +#line 37652 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1089: /* $@111: %empty */ +#line 7472 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->alter_info.partition_flags|= ALTER_PARTITION_ADD; + DBUG_ASSERT(!Lex->create_info.if_not_exists()); + lex->create_info.set((yyvsp[-1].object_ddl_options)); + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 37668 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1090: /* add_partition_rule: ADD PARTITION_SYM opt_if_not_exists opt_no_write_to_binlog $@111 add_part_extra */ +#line 7484 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37674 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1092: /* add_part_extra: '(' part_def_list ')' */ +#line 7490 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info->num_parts= lex->part_info->partitions.elements; + } +#line 37683 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1093: /* add_part_extra: PARTITIONS_SYM real_ulong_num */ +#line 7495 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->part_info->num_parts= (yyvsp[0].ulong_num); + } +#line 37691 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1094: /* $@112: %empty */ +#line 7502 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 37704 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1096: /* reorg_parts_rule: %empty */ +#line 7515 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_TABLE_REORG; + } +#line 37712 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1097: /* $@113: %empty */ +#line 7519 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_REORGANIZE; + } +#line 37720 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1098: /* reorg_parts_rule: alt_part_name_list $@113 INTO '(' part_def_list ')' */ +#line 7523 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->num_parts= part_info->partitions.elements; + } +#line 37729 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1099: /* alt_part_name_list: alt_part_name_item */ +#line 7530 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37735 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1100: /* alt_part_name_list: alt_part_name_list ',' alt_part_name_item */ +#line 7531 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37741 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1101: /* alt_part_name_item: ident */ +#line 7536 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.partition_names.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 37751 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1105: /* alter_list_item: add_column column_def opt_place */ +#line 7558 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->create_last_non_select_table= lex->last_table(); + lex->alter_info.flags|= ALTER_PARSER_ADD_COLUMN; + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37762 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1106: /* alter_list_item: ADD key_def */ +#line 7565 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + Lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 37771 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1107: /* alter_list_item: ADD period_for_system_time */ +#line 7570 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_PERIOD; + } +#line 37779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1108: /* alter_list_item: ADD PERIOD_SYM opt_if_not_exists_table_element period_for_application_time */ +#line 7575 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_period_info &period= Lex->create_info.period_info; + period.create_if_not_exists= Lex->check_exists; + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + } +#line 37789 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1109: /* alter_list_item: add_column '(' create_field_list ')' */ +#line 7581 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_PARSER_ADD_COLUMN; + if (!lex->alter_info.key_list.is_empty()) + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 37800 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1110: /* alter_list_item: ADD constraint_def */ +#line 7588 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + } +#line 37808 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1111: /* alter_list_item: ADD CONSTRAINT IF_SYM not EXISTS field_ident check_constraint */ +#line 7592 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + Lex->add_constraint((yyvsp[-1].lex_str), (yyvsp[0].virtual_column), TRUE); + } +#line 37817 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1112: /* alter_list_item: CHANGE opt_column opt_if_exists_table_element field_ident field_spec opt_place */ +#line 7598 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_CHANGE_COLUMN | ALTER_RENAME_COLUMN; + Lex->create_last_non_select_table= Lex->last_table(); + (yyvsp[-1].create_field)->change= (yyvsp[-2].lex_str); + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37828 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1113: /* alter_list_item: MODIFY_SYM opt_column opt_if_exists_table_element field_spec opt_place */ +#line 7606 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_CHANGE_COLUMN; + Lex->create_last_non_select_table= Lex->last_table(); + (yyvsp[-1].create_field)->change= (yyvsp[-1].create_field)->field_name; + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37839 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1114: /* alter_list_item: DROP opt_column opt_if_exists_table_element field_ident opt_restrict */ +#line 7613 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::COLUMN, (yyvsp[-1].lex_str).str, (yyvsp[-2].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_PARSER_DROP_COLUMN; + } +#line 37853 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1115: /* alter_list_item: DROP CONSTRAINT opt_if_exists_table_element field_ident */ +#line 7623 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::CHECK_CONSTRAINT, + (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_CHECK_CONSTRAINT; + } +#line 37868 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1116: /* alter_list_item: DROP FOREIGN KEY_SYM opt_if_exists_table_element field_ident */ +#line 7634 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::FOREIGN_KEY, (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_FOREIGN_KEY; + } +#line 37882 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1117: /* alter_list_item: DROP opt_constraint_no_id PRIMARY_SYM KEY_SYM */ +#line 7644 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, primary_key_name.str, + FALSE)); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_INDEX; + } +#line 37897 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1118: /* alter_list_item: DROP key_or_index opt_if_exists_table_element field_ident */ +#line 7655 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_INDEX; + } +#line 37911 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1119: /* alter_list_item: DISABLE_SYM KEYS */ +#line 7665 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.keys_onoff= Alter_info::DISABLE; + lex->alter_info.flags|= ALTER_KEYS_ONOFF; + } +#line 37921 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1120: /* alter_list_item: ENABLE_SYM KEYS */ +#line 7671 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.keys_onoff= Alter_info::ENABLE; + lex->alter_info.flags|= ALTER_KEYS_ONOFF; + } +#line 37931 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1121: /* alter_list_item: ALTER opt_column opt_if_exists_table_element field_ident SET DEFAULT column_default_expr */ +#line 7677 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (check_expression((yyvsp[0].virtual_column), &(yyvsp[-3].lex_str), VCOL_DEFAULT)) + MYSQL_YYABORT; + if (unlikely(Lex->add_alter_list((yyvsp[-3].lex_str), (yyvsp[0].virtual_column), (yyvsp[-4].num)))) + MYSQL_YYABORT; + } +#line 37942 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1122: /* alter_list_item: ALTER key_or_index opt_if_exists_table_element ident ignorability */ +#line 7684 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + Alter_index_ignorability *ac= new (thd->mem_root) + Alter_index_ignorability((yyvsp[-1].ident_sys).str, (yyvsp[0].num), (yyvsp[-2].num)); + if (ac == NULL) + MYSQL_YYABORT; + lex->alter_info.alter_index_ignorability_list.push_back(ac); + lex->alter_info.flags|= ALTER_INDEX_IGNORABILITY; + } +#line 37956 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1123: /* alter_list_item: ALTER opt_column opt_if_exists_table_element field_ident DROP DEFAULT */ +#line 7694 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_alter_list((yyvsp[-2].lex_str), (Virtual_column_info*) 0, (yyvsp[-3].num)))) + MYSQL_YYABORT; + } +#line 37965 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1124: /* alter_list_item: RENAME opt_to table_ident */ +#line 7699 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_table((yyvsp[0].table))) + MYSQL_YYABORT; + Lex->alter_info.flags|= ALTER_RENAME; + } +#line 37975 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1125: /* alter_list_item: RENAME COLUMN_SYM opt_if_exists_table_element ident TO_SYM ident */ +#line 7705 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_alter_list((yyvsp[-2].ident_sys), (yyvsp[0].ident_sys), (yyvsp[-3].num)))) + MYSQL_YYABORT; + } +#line 37984 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1126: /* alter_list_item: RENAME key_or_index opt_if_exists_table_element field_ident TO_SYM field_ident */ +#line 7710 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_rename_key *ak= new (thd->mem_root) + Alter_rename_key((yyvsp[-2].lex_str), (yyvsp[0].lex_str), (yyvsp[-3].num)); + if (ak == NULL) + MYSQL_YYABORT; + lex->alter_info.alter_rename_key_list.push_back(ak); + lex->alter_info.flags|= ALTER_RENAME_INDEX; + } +#line 37998 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1127: /* alter_list_item: CONVERT_SYM TO_SYM charset charset_name_or_default */ +#line 7720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_alter_list_item_convert_to_charset((yyvsp[0].charset))) + MYSQL_YYABORT; + } +#line 38007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1128: /* alter_list_item: CONVERT_SYM TO_SYM charset charset_name_or_default COLLATE_SYM collation_name_or_default */ +#line 7726 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_alter_list_item_convert_to_charset((yyvsp[-2].charset), (yyvsp[0].Lex_extended_collation))) + MYSQL_YYABORT; + } +#line 38016 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1129: /* alter_list_item: create_table_options_space_separated */ +#line 7731 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_OPTIONS; + } +#line 38025 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1130: /* alter_list_item: FORCE_SYM */ +#line 7736 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_RECREATE; + } +#line 38033 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1131: /* alter_list_item: alter_order_clause */ +#line 7740 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_ORDER; + } +#line 38042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1134: /* alter_list_item: ADD SYSTEM VERSIONING_SYM */ +#line 7747 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_SYSTEM_VERSIONING; + Lex->create_info.options|= HA_VERSIONED_TABLE; + } +#line 38051 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1135: /* alter_list_item: DROP SYSTEM VERSIONING_SYM */ +#line 7752 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_DROP_SYSTEM_VERSIONING; + Lex->create_info.options&= ~HA_VERSIONED_TABLE; + } +#line 38060 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1136: /* alter_list_item: DROP PERIOD_SYM FOR_SYSTEM_TIME_SYM */ +#line 7757 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_DROP_PERIOD; + } +#line 38068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1137: /* alter_list_item: DROP PERIOD_SYM opt_if_exists_table_element FOR_SYM ident */ +#line 7761 "/home/buildbot/git/sql/sql_yacc.yy" + { + Alter_drop *ad= new Alter_drop(Alter_drop::PERIOD, (yyvsp[0].ident_sys).str, (yyvsp[-2].num)); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + Lex->alter_info.drop_list.push_back(ad, thd->mem_root); + Lex->alter_info.flags|= ALTER_DROP_CHECK_CONSTRAINT; + } +#line 38080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1143: /* alter_algorithm_option: ALGORITHM_SYM opt_equal DEFAULT */ +#line 7780 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.set_requested_algorithm( + Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT); + } +#line 38089 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1144: /* alter_algorithm_option: ALGORITHM_SYM opt_equal ident */ +#line 7785 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.set_requested_algorithm(&(yyvsp[0].ident_sys)))) + my_yyabort_error((ER_UNKNOWN_ALTER_ALGORITHM, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 38098 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1145: /* alter_lock_option: LOCK_SYM opt_equal DEFAULT */ +#line 7793 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.requested_lock= + Alter_info::ALTER_TABLE_LOCK_DEFAULT; + } +#line 38107 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1146: /* alter_lock_option: LOCK_SYM opt_equal ident */ +#line 7798 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.set_requested_lock(&(yyvsp[0].ident_sys)))) + my_yyabort_error((ER_UNKNOWN_ALTER_LOCK, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 38116 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1147: /* opt_column: %empty */ +#line 7805 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38122 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1148: /* opt_column: COLUMN_SYM */ +#line 7806 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38128 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1149: /* opt_ignore: %empty */ +#line 7810 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 0;} +#line 38134 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1150: /* opt_ignore: IGNORE_SYM */ +#line 7811 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1;} +#line 38140 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1151: /* $@114: %empty */ +#line 7815 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 0;} +#line 38146 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1157: /* alter_option: IGNORE_SYM */ +#line 7829 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1;} +#line 38152 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1158: /* alter_option: ONLINE_SYM */ +#line 7831 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.requested_lock= + Alter_info::ALTER_TABLE_LOCK_NONE; + } +#line 38161 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1159: /* opt_restrict: %empty */ +#line 7838 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_DEFAULT; } +#line 38167 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1160: /* opt_restrict: RESTRICT */ +#line 7839 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_RESTRICT; } +#line 38173 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1161: /* opt_restrict: CASCADE */ +#line 7840 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_CASCADE; } +#line 38179 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1162: /* opt_place: %empty */ +#line 7844 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 38185 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1163: /* opt_place: AFTER_SYM ident */ +#line 7846 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str)= (yyvsp[0].ident_sys); + Lex->alter_info.flags |= ALTER_COLUMN_ORDER; + } +#line 38194 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1164: /* opt_place: FIRST_SYM */ +#line 7851 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str).str= first_keyword; + (yyval.lex_str).length= 5; /* Length of "first" */ + Lex->alter_info.flags |= ALTER_COLUMN_ORDER; + } +#line 38204 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1165: /* opt_to: %empty */ +#line 7859 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38210 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1166: /* opt_to: TO_SYM */ +#line 7860 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38216 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1167: /* opt_to: '=' */ +#line 7861 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38222 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1168: /* opt_to: AS */ +#line 7862 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38228 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1169: /* $@115: %empty */ +#line 7867 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_START; + lex->type = 0; + /* If you change this code don't forget to update SLAVE START too */ + } +#line 38239 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1170: /* slave: START_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel $@115 slave_until */ +#line 7874 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38245 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1171: /* $@116: %empty */ +#line 7876 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_ALL_START; + lex->type = 0; + /* If you change this code don't forget to update STOP SLAVE too */ + } +#line 38256 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1172: /* slave: START_SYM ALL SLAVES slave_thread_opts $@116 */ +#line 7882 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38262 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1173: /* slave: STOP_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel */ +#line 7884 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_STOP; + lex->type = 0; + /* If you change this code don't forget to update SLAVE STOP too */ + } +#line 38273 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1174: /* slave: STOP_SYM ALL SLAVES slave_thread_opts */ +#line 7891 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_ALL_STOP; + lex->type = 0; + /* If you change this code don't forget to update SLAVE STOP too */ + } +#line 38284 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1175: /* start: START_SYM TRANSACTION_SYM opt_start_transaction_option_list */ +#line 7901 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_BEGIN; + /* READ ONLY and READ WRITE are mutually exclusive. */ + if (unlikely(((yyvsp[0].num) & MYSQL_START_TRANS_OPT_READ_WRITE) && + ((yyvsp[0].num) & MYSQL_START_TRANS_OPT_READ_ONLY))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + lex->start_transaction_opt= (yyvsp[0].num); + } +#line 38301 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1176: /* opt_start_transaction_option_list: %empty */ +#line 7917 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 0; + } +#line 38309 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1177: /* opt_start_transaction_option_list: start_transaction_option_list */ +#line 7921 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[0].num); + } +#line 38317 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1178: /* start_transaction_option_list: start_transaction_option */ +#line 7928 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[0].num); + } +#line 38325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1179: /* start_transaction_option_list: start_transaction_option_list ',' start_transaction_option */ +#line 7932 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[-2].num) | (yyvsp[0].num); + } +#line 38333 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1180: /* start_transaction_option: WITH CONSISTENT_SYM SNAPSHOT_SYM */ +#line 7939 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT; + } +#line 38341 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1181: /* start_transaction_option: READ_SYM ONLY_SYM */ +#line 7943 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_READ_ONLY; + } +#line 38349 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1182: /* start_transaction_option: READ_SYM WRITE_SYM */ +#line 7947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_READ_WRITE; + } +#line 38357 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1183: /* $@117: %empty */ +#line 7953 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt= 0; } +#line 38363 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1184: /* slave_thread_opts: $@117 slave_thread_opt_list */ +#line 7955 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38369 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1187: /* slave_thread_opt: %empty */ +#line 7964 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38375 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1188: /* slave_thread_opt: SQL_THREAD */ +#line 7965 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt|=SLAVE_SQL; } +#line 38381 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1189: /* slave_thread_opt: RELAY_THREAD */ +#line 7966 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt|=SLAVE_IO; } +#line 38387 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1190: /* slave_until: %empty */ +#line 7970 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38393 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1191: /* slave_until: UNTIL_SYM slave_until_opts */ +#line 7972 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(((lex->mi.log_file_name || lex->mi.pos) && + (lex->mi.relay_log_name || lex->mi.relay_log_pos)) || + !((lex->mi.log_file_name && lex->mi.pos) || + (lex->mi.relay_log_name && lex->mi.relay_log_pos)))) + my_yyabort_error((ER_BAD_SLAVE_UNTIL_COND, MYF(0))); + } +#line 38406 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1192: /* slave_until: UNTIL_SYM MASTER_GTID_POS_SYM '=' TEXT_STRING_sys */ +#line 7981 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.gtid_pos_str = (yyvsp[0].lex_str); + } +#line 38414 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1195: /* $@118: %empty */ +#line 7993 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_CHECKSUM; + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38425 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1196: /* checksum: CHECKSUM_SYM table_or_tables $@118 table_list opt_checksum_type */ +#line 8000 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38431 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1197: /* opt_checksum_type: %empty */ +#line 8004 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= 0; } +#line 38437 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1198: /* opt_checksum_type: QUICK */ +#line 8005 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= T_QUICK; } +#line 38443 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1199: /* opt_checksum_type: EXTENDED_SYM */ +#line 8006 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= T_EXTEND; } +#line 38449 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1201: /* $@119: %empty */ +#line 8012 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->table_type= TABLE_TYPE_VIEW; } +#line 38455 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1203: /* $@120: %empty */ +#line 8018 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_REPAIR; + lex->no_write_to_binlog= (yyvsp[0].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38469 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1204: /* repair: REPAIR opt_no_write_to_binlog $@120 repair_table_or_view */ +#line 8028 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_repair_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38481 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1205: /* opt_mi_repair_type: %empty */ +#line 8038 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags = T_MEDIUM; } +#line 38487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1206: /* opt_mi_repair_type: mi_repair_types */ +#line 8039 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38493 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1207: /* mi_repair_types: mi_repair_type */ +#line 8043 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1208: /* mi_repair_types: mi_repair_type mi_repair_types */ +#line 8044 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1209: /* mi_repair_type: QUICK */ +#line 8048 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_QUICK; } +#line 38511 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1210: /* mi_repair_type: EXTENDED_SYM */ +#line 8049 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_EXTEND; } +#line 38517 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1211: /* mi_repair_type: USE_FRM */ +#line 8050 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_USEFRM; } +#line 38523 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1212: /* opt_view_repair_type: %empty */ +#line 8054 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38529 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1213: /* opt_view_repair_type: FOR_SYM UPGRADE_SYM */ +#line 8055 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 38535 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1214: /* opt_view_repair_type: FROM MYSQL_SYM */ +#line 8056 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FROM_MYSQL; } +#line 38541 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1215: /* $@121: %empty */ +#line 8061 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_ANALYZE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38555 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1216: /* analyze: ANALYZE_SYM opt_no_write_to_binlog table_or_tables $@121 analyze_table_list */ +#line 8071 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_analyze_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38567 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1220: /* opt_persistent_stat_clause: %empty */ +#line 8091 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38573 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1221: /* opt_persistent_stat_clause: PERSISTENT_SYM FOR_SYM persistent_stat_spec */ +#line 8093 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->with_persistent_for_clause= TRUE; + } +#line 38581 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1222: /* persistent_stat_spec: ALL */ +#line 8100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38587 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1223: /* persistent_stat_spec: COLUMNS persistent_column_stat_spec INDEXES persistent_index_stat_spec */ +#line 8102 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38593 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1224: /* persistent_column_stat_spec: ALL */ +#line 8106 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38599 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1225: /* $@122: %empty */ +#line 8108 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + lex->column_list= new (thd->mem_root) List; + if (unlikely(lex->column_list == NULL)) + MYSQL_YYABORT; + } +#line 38610 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1226: /* persistent_column_stat_spec: '(' $@122 table_column_list ')' */ +#line 8116 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38616 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1227: /* persistent_index_stat_spec: ALL */ +#line 8120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38622 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1228: /* $@123: %empty */ +#line 8122 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + lex->index_list= new (thd->mem_root) List; + if (unlikely(lex->index_list == NULL)) + MYSQL_YYABORT; + } +#line 38633 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1229: /* persistent_index_stat_spec: '(' $@123 table_index_list ')' */ +#line 8130 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38639 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1230: /* table_column_list: %empty */ +#line 8135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38645 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1231: /* table_column_list: ident */ +#line 8137 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->column_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), thd->mem_root); + } +#line 38654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1232: /* table_column_list: table_column_list ',' ident */ +#line 8142 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->column_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), thd->mem_root); + } +#line 38663 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1233: /* table_index_list: %empty */ +#line 8150 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38669 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1236: /* table_index_name: ident */ +#line 8157 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->index_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), + thd->mem_root); + } +#line 38679 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1237: /* table_index_name: PRIMARY_SYM */ +#line 8164 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_STRING str= {(char*) "PRIMARY", 7}; + Lex->index_list->push_back((LEX_STRING*) + thd->memdup(&str, sizeof(LEX_STRING)), + thd->mem_root); + } +#line 38690 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1238: /* binlog_base64_event: BINLOG_SYM TEXT_STRING_sys */ +#line 8174 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; + Lex->comment= (yyvsp[0].lex_str); + Lex->ident.str= NULL; + Lex->ident.length= 0; + } +#line 38701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1239: /* binlog_base64_event: BINLOG_SYM '@' ident_or_text ',' '@' ident_or_text */ +#line 8182 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; + Lex->comment= (yyvsp[-3].lex_str); + Lex->ident= (yyvsp[0].lex_str); + } +#line 38711 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1241: /* $@124: %empty */ +#line 8192 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->table_type= TABLE_TYPE_VIEW; } +#line 38717 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1243: /* $@125: %empty */ +#line 8197 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->sql_command = SQLCOM_CHECK; + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1244: /* check: CHECK_SYM $@125 check_view_or_table */ +#line 8207 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "CHECK")); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_check_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38745 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1245: /* opt_mi_check_type: %empty */ +#line 8219 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags = T_MEDIUM; } +#line 38751 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1246: /* opt_mi_check_type: mi_check_types */ +#line 8220 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38757 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1247: /* mi_check_types: mi_check_type */ +#line 8224 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38763 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1248: /* mi_check_types: mi_check_type mi_check_types */ +#line 8225 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38769 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1249: /* mi_check_type: QUICK */ +#line 8229 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_QUICK; } +#line 38775 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1250: /* mi_check_type: FAST_SYM */ +#line 8230 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_FAST; } +#line 38781 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1251: /* mi_check_type: MEDIUM_SYM */ +#line 8231 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_MEDIUM; } +#line 38787 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1252: /* mi_check_type: EXTENDED_SYM */ +#line 8232 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_EXTEND; } +#line 38793 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1253: /* mi_check_type: CHANGED */ +#line 8233 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; } +#line 38799 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1254: /* mi_check_type: FOR_SYM UPGRADE_SYM */ +#line 8234 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 38805 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1255: /* opt_view_check_type: %empty */ +#line 8238 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38811 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1256: /* opt_view_check_type: FOR_SYM UPGRADE_SYM */ +#line 8239 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 38817 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1257: /* $@126: %empty */ +#line 8244 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_OPTIMIZE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38831 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1258: /* optimize: OPTIMIZE opt_no_write_to_binlog table_or_tables $@126 table_list opt_lock_wait_timeout */ +#line 8254 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_optimize_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38843 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1259: /* opt_no_write_to_binlog: %empty */ +#line 8264 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 38849 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1260: /* opt_no_write_to_binlog: NO_WRITE_TO_BINLOG */ +#line 8265 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 38855 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1261: /* opt_no_write_to_binlog: LOCAL_SYM */ +#line 8266 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 38861 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1262: /* $@127: %empty */ +#line 8271 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_RENAME_TABLE; + Lex->create_info.set((yyvsp[0].object_ddl_options)); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 38872 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1263: /* rename: RENAME table_or_tables opt_if_exists $@127 table_to_table_list */ +#line 8278 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 38880 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1264: /* rename: RENAME USER_SYM clear_privileges rename_list */ +#line 8282 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_RENAME_USER; + } +#line 38888 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1265: /* rename_list: user TO_SYM user */ +#line 8289 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[-2].lex_user), thd->mem_root) || + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 38898 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1266: /* rename_list: rename_list ',' user TO_SYM user */ +#line 8295 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[-2].lex_user), thd->mem_root) || + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 38908 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1269: /* table_to_table: table_ident opt_lock_wait_timeout TO_SYM table_ident */ +#line 8309 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *sl= lex->current_select; + if (unlikely(!sl->add_table_to_list(thd, (yyvsp[-3].table),NULL, + TL_OPTION_UPDATING, + TL_IGNORE, MDL_EXCLUSIVE)) || + unlikely(!sl->add_table_to_list(thd, (yyvsp[0].table), NULL, + TL_OPTION_UPDATING, + TL_IGNORE, MDL_EXCLUSIVE))) + MYSQL_YYABORT; + } +#line 38924 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1270: /* $@128: %empty */ +#line 8324 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.reset(); + } +#line 38932 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1271: /* keycache: CACHE_SYM INDEX_SYM $@128 keycache_list_or_parts IN_SYM key_cache_name */ +#line 8328 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ASSIGN_TO_KEYCACHE; + lex->ident= (yyvsp[0].lex_str); + } +#line 38942 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1276: /* assign_to_keycache: table_ident cache_keys_spec */ +#line 8347 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, 0, TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38954 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1277: /* assign_to_keycache_parts: table_ident adm_partition cache_keys_spec */ +#line 8358 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-2].table), NULL, 0, TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38966 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1278: /* key_cache_name: ident */ +#line 8368 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 38972 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1279: /* key_cache_name: DEFAULT */ +#line 8369 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str) = default_key_cache_base; } +#line 38978 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1280: /* $@129: %empty */ +#line 8374 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_PRELOAD_KEYS; + lex->alter_info.reset(); + if (lex->main_select_push()) + MYSQL_YYABORT; + } +#line 38990 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1281: /* preload: LOAD INDEX_SYM INTO CACHE_SYM $@129 preload_list_or_parts */ +#line 8382 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 38998 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1286: /* preload_keys: table_ident cache_keys_spec opt_ignore_leaves */ +#line 8399 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-2].table), NULL, (yyvsp[0].num), TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 39010 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1287: /* preload_keys_parts: table_ident adm_partition cache_keys_spec opt_ignore_leaves */ +#line 8410 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-3].table), NULL, (yyvsp[0].num), TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 39022 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1288: /* $@130: %empty */ +#line 8421 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_ADMIN; + } +#line 39030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1290: /* $@131: %empty */ +#line 8428 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->first_select_lex()->alloc_index_hints(thd); + Select->set_index_hint_type(INDEX_HINT_USE, + INDEX_HINT_MASK_ALL); + } +#line 39040 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1292: /* cache_key_list_or_empty: %empty */ +#line 8437 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 39046 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1294: /* opt_ignore_leaves: %empty */ +#line 8443 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 39052 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1295: /* opt_ignore_leaves: IGNORE_SYM LEAVES */ +#line 8444 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_OPTION_IGNORE_LEAVES; } +#line 39058 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1296: /* $@132: %empty */ +#line 8454 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex_unit)->fake_select_lex ? + (yyvsp[0].select_lex_unit)->fake_select_lex : + (yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 39069 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1297: /* select: query_expression_no_with_clause $@132 opt_procedure_or_into */ +#line 8461 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyvsp[-2].select_lex_unit)->set_with_clause(NULL); + if (Lex->select_finalize((yyvsp[-2].select_lex_unit), (yyvsp[0].select_lock))) + MYSQL_YYABORT; + } +#line 39080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1298: /* $@133: %empty */ +#line 8468 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex_unit)->fake_select_lex ? + (yyvsp[0].select_lex_unit)->fake_select_lex : + (yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 39091 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1299: /* select: with_clause query_expression_no_with_clause $@133 opt_procedure_or_into */ +#line 8475 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyvsp[-2].select_lex_unit)->set_with_clause((yyvsp[-3].with_clause)); + (yyvsp[-3].with_clause)->attach_to((yyvsp[-2].select_lex_unit)->first_select()); + if (Lex->select_finalize((yyvsp[-2].select_lex_unit), (yyvsp[0].select_lock))) + MYSQL_YYABORT; + } +#line 39103 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1300: /* $@134: %empty */ +#line 8486 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex))) + MYSQL_YYABORT; + } +#line 39112 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1301: /* select_into: select_into_query_specification $@134 opt_order_limit_lock */ +#line 8491 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX_UNIT *unit; + if (!(unit = Lex->create_unit((yyvsp[-2].select_lex)))) + MYSQL_YYABORT; + if ((yyvsp[0].order_limit_lock)) + unit= Lex->add_tail_to_query_expression_body(unit, (yyvsp[0].order_limit_lock)); + if (Lex->select_finalize(unit)) + MYSQL_YYABORT; + } +#line 39126 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1302: /* $@135: %empty */ +#line 8502 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex))) + MYSQL_YYABORT; + } +#line 39135 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1303: /* select_into: with_clause select_into_query_specification $@135 opt_order_limit_lock */ +#line 8507 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX_UNIT *unit; + if (!(unit = Lex->create_unit((yyvsp[-2].select_lex)))) + MYSQL_YYABORT; + if ((yyvsp[0].order_limit_lock)) + unit= Lex->add_tail_to_query_expression_body(unit, (yyvsp[0].order_limit_lock)); + unit->set_with_clause((yyvsp[-3].with_clause)); + (yyvsp[-3].with_clause)->attach_to((yyvsp[-2].select_lex)); + if (Lex->select_finalize(unit)) + MYSQL_YYABORT; + } +#line 39151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1304: /* simple_table: query_specification */ +#line 8521 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 39157 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1305: /* simple_table: table_value_constructor */ +#line 8522 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 39163 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1306: /* $@136: %empty */ +#line 8527 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_TVC_start()) + MYSQL_YYABORT; + } +#line 39172 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1307: /* table_value_constructor: VALUES $@136 values_list */ +#line 8532 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex)= Lex->parsed_TVC_end())) + MYSQL_YYABORT; + } +#line 39181 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1308: /* $@137: %empty */ +#line 8540 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel; + LEX *lex= Lex; + if (!(sel= lex->alloc_select(TRUE)) || lex->push_select(sel)) + MYSQL_YYABORT; + sel->init_select(); + sel->braces= FALSE; + } +#line 39194 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1309: /* $@138: %empty */ +#line 8549 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= SELECT_LIST; + } +#line 39202 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1310: /* query_specification_start: SELECT_SYM $@137 select_options $@138 select_item_list */ +#line 8553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + } +#line 39210 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1311: /* query_specification: query_specification_start opt_from_clause opt_where_clause opt_group_clause opt_having_clause opt_window_clause */ +#line 8565 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lex)= Lex->pop_select(); + } +#line 39218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1312: /* select_into_query_specification: query_specification_start into opt_from_clause opt_where_clause opt_group_clause opt_having_clause opt_window_clause */ +#line 8578 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lex)= Lex->pop_select(); + } +#line 39226 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1313: /* query_expression: query_expression_no_with_clause */ +#line 8636 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].select_lex_unit)->set_with_clause(NULL); + (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); + } +#line 39235 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1314: /* query_expression: with_clause query_expression_no_with_clause */ +#line 8642 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].select_lex_unit)->set_with_clause((yyvsp[-1].with_clause)); + (yyvsp[-1].with_clause)->attach_to((yyvsp[0].select_lex_unit)->first_select()); + (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); + } +#line 39245 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1315: /* query_expression_no_with_clause: query_expression_body_ext */ +#line 8655 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); } +#line 39251 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1316: /* query_expression_no_with_clause: query_expression_body_ext_parens */ +#line 8656 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); } +#line 39257 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1317: /* $@139: %empty */ +#line 8671 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].select_lex_unit)->first_select()->next_select()) + { + if (Lex->parsed_multi_operand_query_expression_body((yyvsp[0].select_lex_unit))) + MYSQL_YYABORT; + } + } +#line 39269 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1318: /* query_expression_body_ext: query_expression_body $@139 opt_query_expression_tail */ +#line 8679 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].order_limit_lock)) + (yyval.select_lex_unit)= (yyvsp[-2].select_lex_unit); + else + (yyval.select_lex_unit)= Lex->add_tail_to_query_expression_body((yyvsp[-2].select_lex_unit), (yyvsp[0].order_limit_lock)); + } +#line 39280 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1319: /* $@140: %empty */ +#line 8686 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->push_select(!(yyvsp[0].select_lex_unit)->first_select()->next_select() ? + (yyvsp[0].select_lex_unit)->first_select() : (yyvsp[0].select_lex_unit)->fake_select_lex); + } +#line 39289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1320: /* query_expression_body_ext: query_expression_body_ext_parens $@140 query_expression_tail */ +#line 8691 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_tail_to_query_expression_body_ext_parens((yyvsp[-2].select_lex_unit), (yyvsp[0].order_limit_lock)))) + MYSQL_YYABORT; + } +#line 39298 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1321: /* query_expression_body_ext_parens: '(' query_expression_body_ext_parens ')' */ +#line 8699 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[-1].select_lex_unit); } +#line 39304 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1322: /* query_expression_body_ext_parens: '(' query_expression_body_ext ')' */ +#line 8701 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= (yyvsp[-1].select_lex_unit)->first_select()->next_select() ? + (yyvsp[-1].select_lex_unit)->fake_select_lex : (yyvsp[-1].select_lex_unit)->first_select(); + sel->braces= true; + (yyval.select_lex_unit)= (yyvsp[-1].select_lex_unit); + } +#line 39315 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1323: /* query_expression_body: query_simple */ +#line 8716 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->push_select((yyvsp[0].select_lex)); + if (!((yyval.select_lex_unit)= Lex->create_unit((yyvsp[0].select_lex)))) + MYSQL_YYABORT; + } +#line 39325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1324: /* $@141: %empty */ +#line 8723 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[-1].select_lex_unit)->first_select()->next_select()) + { + Lex->pop_select(); + } + } +#line 39336 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1325: /* query_expression_body: query_expression_body unit_type_decl $@141 query_primary */ +#line 8730 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_primary_to_query_expression_body((yyvsp[-3].select_lex_unit), (yyvsp[0].select_lex), + (yyvsp[-2].unit_operation).unit_type, + (yyvsp[-2].unit_operation).distinct))) + MYSQL_YYABORT; + } +#line 39347 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1326: /* query_expression_body: query_expression_body_ext_parens unit_type_decl query_primary */ +#line 8739 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_primary_to_query_expression_body_ext_parens( + (yyvsp[-2].select_lex_unit), (yyvsp[0].select_lex), + (yyvsp[-1].unit_operation).unit_type, + (yyvsp[-1].unit_operation).distinct))) + MYSQL_YYABORT; + } +#line 39359 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1327: /* query_primary: query_simple */ +#line 8755 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 39365 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1328: /* query_primary: query_expression_body_ext_parens */ +#line 8757 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex_unit)->first_select(); } +#line 39371 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1329: /* query_simple: simple_table */ +#line 8766 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex);} +#line 39377 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1330: /* subselect: query_expression */ +#line 8771 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[0].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 39386 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1331: /* subquery: query_expression_body_ext_parens */ +#line 8812 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].select_lex_unit)->fake_select_lex) + (yyvsp[0].select_lex_unit)->first_select()->braces= false; + else + (yyvsp[0].select_lex_unit)->fake_select_lex->braces= false; + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[0].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 39399 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1332: /* subquery: '(' with_clause query_expression_no_with_clause ')' */ +#line 8821 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].select_lex_unit)->set_with_clause((yyvsp[-2].with_clause)); + (yyvsp[-2].with_clause)->attach_to((yyvsp[-1].select_lex_unit)->first_select()); + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[-1].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 39410 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1336: /* table_reference_list: join_table_list */ +#line 8840 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->context.table_list= + Select->context.first_name_resolution_table= + Select->table_list.first; + } +#line 39420 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1339: /* select_options: select_option_list */ +#line 8855 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((Select->options & SELECT_DISTINCT) && + (Select->options & SELECT_ALL))) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "ALL", "DISTINCT")); + } +#line 39430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1340: /* opt_history_unit: %empty */ +#line 8864 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TIMESTAMP; + } +#line 39438 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1341: /* opt_history_unit: TRANSACTION_SYM */ +#line 8868 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TRX_ID; + } +#line 39446 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1342: /* opt_history_unit: TIMESTAMP */ +#line 8872 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TIMESTAMP; + } +#line 39454 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1343: /* history_point: TIMESTAMP TEXT_STRING */ +#line 8879 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item; + if (!(item= type_handler_datetime.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true))) + MYSQL_YYABORT; + (yyval.vers_history_point)= Vers_history_point(VERS_TIMESTAMP, item); + } +#line 39467 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1344: /* history_point: function_call_keyword_timestamp */ +#line 8888 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_history_point)= Vers_history_point(VERS_TIMESTAMP, (yyvsp[0].item)); + } +#line 39475 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1345: /* history_point: opt_history_unit bit_expr */ +#line 8892 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_history_point)= Vers_history_point((yyvsp[-1].vers_range_unit), (yyvsp[0].item)); + } +#line 39483 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1346: /* for_portion_of_time_clause: FOR_SYM PORTION_SYM OF_SYM remember_tok_start ident FROM bit_expr TO_SYM bit_expr */ +#line 8900 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(0 == strcasecmp((yyvsp[-4].ident_sys).str, "SYSTEM_TIME"))) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[-5].simple_string)); + MYSQL_YYABORT; + } + Lex->period_conditions.init(SYSTEM_TIME_FROM_TO, + Vers_history_point(VERS_TIMESTAMP, (yyvsp[-2].item)), + Vers_history_point(VERS_TIMESTAMP, (yyvsp[0].item)), + (yyvsp[-4].ident_sys)); + } +#line 39499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1347: /* opt_for_portion_of_time_clause: %empty */ +#line 8915 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= false; + } +#line 39507 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1348: /* opt_for_portion_of_time_clause: for_portion_of_time_clause */ +#line 8919 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= true; + } +#line 39515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1349: /* opt_for_system_time_clause: %empty */ +#line 8926 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= false; + } +#line 39523 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1350: /* opt_for_system_time_clause: FOR_SYSTEM_TIME_SYM system_time_expr */ +#line 8930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= true; + } +#line 39531 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1351: /* system_time_expr: AS OF_SYM history_point */ +#line 8937 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_AS_OF, (yyvsp[0].vers_history_point)); + } +#line 39539 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1352: /* system_time_expr: ALL */ +#line 8941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_ALL); + } +#line 39547 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1353: /* system_time_expr: FROM history_point TO_SYM history_point */ +#line 8945 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_FROM_TO, (yyvsp[-2].vers_history_point), (yyvsp[0].vers_history_point)); + } +#line 39555 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1354: /* system_time_expr: BETWEEN_SYM history_point AND_SYM history_point */ +#line 8949 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_BETWEEN, (yyvsp[-2].vers_history_point), (yyvsp[0].vers_history_point)); + } +#line 39563 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1358: /* select_option: SQL_NO_CACHE_SYM */ +#line 8962 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Allow this flag once per query. + */ + if (Select->options & OPTION_NO_QUERY_CACHE) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SQL_NO_CACHE")); + Select->options|= OPTION_NO_QUERY_CACHE; + } +#line 39576 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1359: /* select_option: SQL_CACHE_SYM */ +#line 8971 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Allow this flag once per query. + */ + if (Select->options & OPTION_TO_QUERY_CACHE) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SQL_CACHE")); + Select->options|= OPTION_TO_QUERY_CACHE; + } +#line 39589 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1360: /* select_lock_type: FOR_SYM UPDATE_SYM opt_lock_wait_timeout_new */ +#line 8984 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + (yyval.select_lock).defined_lock= TRUE; + (yyval.select_lock).update_lock= TRUE; + } +#line 39599 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1361: /* select_lock_type: LOCK_SYM IN_SYM SHARE_SYM MODE_SYM opt_lock_wait_timeout_new */ +#line 8990 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + (yyval.select_lock).defined_lock= TRUE; + (yyval.select_lock).update_lock= FALSE; + } +#line 39609 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1362: /* opt_select_lock_type: %empty */ +#line 9000 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 39617 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1363: /* opt_select_lock_type: select_lock_type */ +#line 9004 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 39625 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1364: /* opt_lock_wait_timeout_new: %empty */ +#line 9011 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 39633 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1365: /* opt_lock_wait_timeout_new: WAIT_SYM ulong_num */ +#line 9015 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).defined_timeout= TRUE; + (yyval.select_lock).timeout= (yyvsp[0].ulong_num); + } +#line 39643 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1366: /* opt_lock_wait_timeout_new: NOWAIT_SYM */ +#line 9021 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).defined_timeout= TRUE; + (yyval.select_lock).timeout= 0; + } +#line 39653 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1367: /* opt_lock_wait_timeout_new: SKIP_SYM LOCKED_SYM */ +#line 9027 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).skip_locked= 1; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SKIP_LOCKED); + } +#line 39663 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1370: /* select_item_list: '*' */ +#line 9038 "/home/buildbot/git/sql/sql_yacc.yy" + { + bool is_parsing_returning= + thd->lex->current_select->parsing_place == + IN_RETURNING; + SELECT_LEX *correct_select= is_parsing_returning ? + thd->lex->returning() : + thd->lex->current_select; + Item *item= new (thd->mem_root) + Item_field(thd, &correct_select->context, + star_clex_str); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + if (unlikely(add_item_to_list(thd, item))) + MYSQL_YYABORT; + correct_select->with_wild++; + } +#line 39684 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1371: /* select_item: remember_name select_sublist_qualified_asterisk remember_end */ +#line 9058 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_item_to_list(thd, (yyvsp[-1].item)))) + MYSQL_YYABORT; + } +#line 39693 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1372: /* select_item: remember_name expr remember_end select_alias */ +#line 9063 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-3].simple_string) < (yyvsp[-1].simple_string)); + + if (unlikely(add_item_to_list(thd, (yyvsp[-2].item)))) + MYSQL_YYABORT; + if ((yyvsp[0].lex_str).str) + { + if (unlikely(Lex->sql_command == SQLCOM_CREATE_VIEW && + check_column_name((yyvsp[0].lex_str).str))) + my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), (yyvsp[0].lex_str).str)); + (yyvsp[-2].item)->base_flags|= item_base_t::IS_EXPLICIT_NAME; + (yyvsp[-2].item)->set_name(thd, (yyvsp[0].lex_str)); + } + else if (!(yyvsp[-2].item)->name.str || (yyvsp[-2].item)->name.str == item_empty_name) + { + (yyvsp[-2].item)->set_name(thd, (yyvsp[-3].simple_string), (uint) ((yyvsp[-1].simple_string) - (yyvsp[-3].simple_string)), thd->charset()); + } + } +#line 39716 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1373: /* remember_tok_start: %empty */ +#line 9084 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_tok_start(); + } +#line 39724 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1374: /* remember_name: %empty */ +#line 9090 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_start(); + } +#line 39732 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1375: /* remember_end: %empty */ +#line 9096 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_end_rtrim(); + } +#line 39740 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1376: /* select_alias: %empty */ +#line 9102 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=null_clex_str;} +#line 39746 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1377: /* select_alias: AS ident */ +#line 9103 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys); } +#line 39752 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1378: /* select_alias: AS TEXT_STRING_sys */ +#line 9104 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 39758 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1379: /* select_alias: ident */ +#line 9105 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys); } +#line 39764 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1380: /* select_alias: TEXT_STRING_sys */ +#line 9106 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 39770 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1381: /* opt_default_time_precision: %empty */ +#line 9110 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= NOT_FIXED_DEC; } +#line 39776 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1382: /* opt_default_time_precision: '(' ')' */ +#line 9111 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= NOT_FIXED_DEC; } +#line 39782 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1383: /* opt_default_time_precision: '(' real_ulong_num ')' */ +#line 9112 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].ulong_num); } +#line 39788 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1384: /* opt_time_precision: %empty */ +#line 9116 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 39794 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1385: /* opt_time_precision: '(' ')' */ +#line 9117 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 39800 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1386: /* opt_time_precision: '(' real_ulong_num ')' */ +#line 9118 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].ulong_num); } +#line 39806 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1387: /* optional_braces: %empty */ +#line 9122 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 39812 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1388: /* optional_braces: '(' ')' */ +#line 9123 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 39818 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1389: /* expr: expr or expr */ +#line 9129 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Design notes: + Do not use a manually maintained stack like thd->lex->xxx_list, + but use the internal bison stack ($$, $1 and $3) instead. + Using the bison stack is: + - more robust to changes in the grammar, + - guaranteed to be in sync with the parser state, + - better for performances (no memory allocation). + */ + Item_cond_or *item1; + Item_cond_or *item3; + if (is_cond_or((yyvsp[-2].item))) + { + item1= (Item_cond_or*) (yyvsp[-2].item); + if (is_cond_or((yyvsp[0].item))) + { + item3= (Item_cond_or*) (yyvsp[0].item); + /* + (X1 OR X2) OR (Y1 OR Y2) ==> OR (X1, X2, Y1, Y2) + */ + item3->add_at_head(item1->argument_list()); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* + (X1 OR X2) OR Y ==> OR (X1, X2, Y) + */ + item1->add((yyvsp[0].item), thd->mem_root); + (yyval.item) = (yyvsp[-2].item); + } + } + else if (is_cond_or((yyvsp[0].item))) + { + item3= (Item_cond_or*) (yyvsp[0].item); + /* + X OR (Y1 OR Y2) ==> OR (X, Y1, Y2) + */ + item3->add_at_head((yyvsp[-2].item), thd->mem_root); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* X OR Y */ + (yyval.item)= new (thd->mem_root) Item_cond_or(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } + } +#line 39873 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1390: /* expr: expr XOR expr */ +#line 9180 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* XOR is a proprietary extension */ + (yyval.item)= new (thd->mem_root) Item_func_xor(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39884 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1391: /* expr: expr and expr */ +#line 9187 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* See comments in rule expr: expr or expr */ + Item_cond_and *item1; + Item_cond_and *item3; + if (is_cond_and((yyvsp[-2].item))) + { + item1= (Item_cond_and*) (yyvsp[-2].item); + if (is_cond_and((yyvsp[0].item))) + { + item3= (Item_cond_and*) (yyvsp[0].item); + /* + (X1 AND X2) AND (Y1 AND Y2) ==> AND (X1, X2, Y1, Y2) + */ + item3->add_at_head(item1->argument_list()); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* + (X1 AND X2) AND Y ==> AND (X1, X2, Y) + */ + item1->add((yyvsp[0].item), thd->mem_root); + (yyval.item) = (yyvsp[-2].item); + } + } + else if (is_cond_and((yyvsp[0].item))) + { + item3= (Item_cond_and*) (yyvsp[0].item); + /* + X AND (Y1 AND Y2) ==> AND (X, Y1, Y2) + */ + item3->add_at_head((yyvsp[-2].item), thd->mem_root); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* X AND Y */ + (yyval.item)= new (thd->mem_root) Item_cond_and(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } + } +#line 39931 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1392: /* expr: NOT_SYM expr */ +#line 9230 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= negate_expression(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1394: /* boolean_test: boolean_test IS TRUE_SYM */ +#line 9240 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_istrue(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39951 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1395: /* boolean_test: boolean_test IS not TRUE_SYM */ +#line 9246 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnottrue(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39961 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1396: /* boolean_test: boolean_test IS FALSE_SYM */ +#line 9252 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isfalse(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39971 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1397: /* boolean_test: boolean_test IS not FALSE_SYM */ +#line 9258 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotfalse(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39981 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1398: /* boolean_test: boolean_test IS UNKNOWN_SYM */ +#line 9264 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnull(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39991 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1399: /* boolean_test: boolean_test IS not UNKNOWN_SYM */ +#line 9270 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotnull(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40001 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1400: /* boolean_test: boolean_test IS NULL_SYM */ +#line 9276 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnull(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40011 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1401: /* boolean_test: boolean_test IS not NULL_SYM */ +#line 9282 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotnull(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40021 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1402: /* boolean_test: boolean_test EQUAL_SYM predicate */ +#line 9288 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_equal(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40031 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1403: /* boolean_test: boolean_test comp_op predicate */ +#line 9294 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (*(yyvsp[-1].boolfunc2creator))(0)->create(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40041 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1404: /* boolean_test: boolean_test comp_op all_or_any '(' subselect ')' */ +#line 9300 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= all_any_subquery_creator(thd, (yyvsp[-5].item), (yyvsp[-4].boolfunc2creator), (yyvsp[-3].num), (yyvsp[-1].select_lex)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40051 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1406: /* predicate: predicate IN_SYM subquery */ +#line 9310 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_in_subselect(thd, (yyvsp[-2].item), (yyvsp[0].select_lex)); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 40061 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1407: /* predicate: predicate not IN_SYM subquery */ +#line 9316 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_in_subselect(thd, (yyvsp[-3].item), (yyvsp[0].select_lex)); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= negate_expression(thd, item); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 40074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1408: /* predicate: predicate IN_SYM '(' expr ')' */ +#line 9325 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= handle_sql2003_note184_exception(thd, (yyvsp[-4].item), true, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40084 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1409: /* predicate: predicate IN_SYM '(' expr ',' expr_list ')' */ +#line 9331 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-6].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_func_in(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40096 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1410: /* predicate: predicate not IN_SYM '(' expr ')' */ +#line 9339 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= handle_sql2003_note184_exception(thd, (yyvsp[-5].item), false, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40106 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1411: /* predicate: predicate not IN_SYM '(' expr ',' expr_list ')' */ +#line 9345 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-7].item), thd->mem_root); + Item_func_in *item= new (thd->mem_root) Item_func_in(thd, *(yyvsp[-1].item_list)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 40119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1412: /* predicate: predicate BETWEEN_SYM predicate AND_SYM predicate */ +#line 9354 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_between(thd, (yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40129 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1413: /* predicate: predicate not BETWEEN_SYM predicate AND_SYM predicate */ +#line 9360 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_func_between *item; + item= new (thd->mem_root) Item_func_between(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 40141 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1414: /* predicate: predicate SOUNDS_SYM LIKE predicate */ +#line 9368 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item1= new (thd->mem_root) Item_func_soundex(thd, (yyvsp[-3].item)); + Item *item4= new (thd->mem_root) Item_func_soundex(thd, (yyvsp[0].item)); + if (unlikely(item1 == NULL) || unlikely(item4 == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_eq(thd, item1, item4); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40155 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1415: /* predicate: predicate LIKE predicate */ +#line 9378 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_like(thd, (yyvsp[-2].item), (yyvsp[0].item), escape(thd), false); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 40165 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1416: /* predicate: predicate LIKE predicate ESCAPE_SYM predicate */ +#line 9384 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->escape_used= true; + (yyval.item)= new (thd->mem_root) Item_func_like(thd, (yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item), true); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 40176 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1417: /* predicate: predicate not LIKE predicate */ +#line 9391 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_like(thd, (yyvsp[-3].item), (yyvsp[0].item), escape(thd), false); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 40187 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1418: /* predicate: predicate not LIKE predicate ESCAPE_SYM predicate */ +#line 9398 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->escape_used= true; + Item *item= new (thd->mem_root) Item_func_like(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[0].item), true); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 40199 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1419: /* predicate: predicate REGEXP predicate */ +#line 9406 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_regex(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40209 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1420: /* predicate: predicate not REGEXP predicate */ +#line 9412 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_regex(thd, (yyvsp[-3].item), (yyvsp[0].item)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= negate_expression(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40222 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1422: /* bit_expr: bit_expr '|' bit_expr */ +#line 9425 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_or(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40232 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1423: /* bit_expr: bit_expr '&' bit_expr */ +#line 9431 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_and(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40242 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1424: /* bit_expr: bit_expr SHIFT_LEFT bit_expr */ +#line 9437 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_shift_left(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40252 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1425: /* bit_expr: bit_expr SHIFT_RIGHT bit_expr */ +#line 9443 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_shift_right(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40262 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1426: /* bit_expr: bit_expr ORACLE_CONCAT_SYM bit_expr */ +#line 9449 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_concat_operator_oracle(thd, + (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40273 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1427: /* bit_expr: bit_expr '+' bit_expr */ +#line 9456 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_plus(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40283 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1428: /* bit_expr: bit_expr '-' bit_expr */ +#line 9462 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_minus(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40293 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1429: /* bit_expr: bit_expr '+' INTERVAL_SYM expr interval */ +#line 9468 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40303 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1430: /* bit_expr: bit_expr '-' INTERVAL_SYM expr interval */ +#line 9474 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40313 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1431: /* bit_expr: INTERVAL_SYM expr interval '+' expr */ +#line 9481 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40323 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1432: /* bit_expr: '+' INTERVAL_SYM expr interval '+' expr */ +#line 9487 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40333 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1433: /* bit_expr: '-' INTERVAL_SYM expr interval '+' expr */ +#line 9493 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40343 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1434: /* bit_expr: bit_expr '*' bit_expr */ +#line 9499 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mul(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40353 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1435: /* bit_expr: bit_expr '/' bit_expr */ +#line 9505 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_div(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40363 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1436: /* bit_expr: bit_expr '%' bit_expr */ +#line 9511 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40373 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1437: /* bit_expr: bit_expr DIV_SYM bit_expr */ +#line 9517 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_int_div(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40383 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1438: /* bit_expr: bit_expr MOD_SYM bit_expr */ +#line 9523 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40393 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1439: /* bit_expr: bit_expr '^' bit_expr */ +#line 9529 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_xor(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1449: /* comp_op: '=' */ +#line 9558 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_eq_creator; } +#line 40409 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1450: /* comp_op: GE */ +#line 9559 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_ge_creator; } +#line 40415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1451: /* comp_op: '>' */ +#line 9560 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_gt_creator; } +#line 40421 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1452: /* comp_op: LE */ +#line 9561 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_le_creator; } +#line 40427 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1453: /* comp_op: '<' */ +#line 9562 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_lt_creator; } +#line 40433 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1454: /* comp_op: NE */ +#line 9563 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_ne_creator; } +#line 40439 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1455: /* all_or_any: ALL */ +#line 9567 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 40445 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1456: /* all_or_any: ANY_SYM */ +#line 9568 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 40451 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1457: /* opt_dyncol_type: %empty */ +#line 9573 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_dyncol_type).set(DYN_COL_NULL); /* automatic type */ + } +#line 40459 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1458: /* opt_dyncol_type: AS dyncol_type */ +#line 9576 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type)= (yyvsp[0].Lex_dyncol_type); } +#line 40465 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1462: /* numeric_dyncol_type: INT_SYM */ +#line 9586 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_INT); } +#line 40471 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1463: /* numeric_dyncol_type: UNSIGNED INT_SYM */ +#line 9587 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_UINT); } +#line 40477 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1464: /* numeric_dyncol_type: DOUBLE_SYM */ +#line 9588 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 40483 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1465: /* numeric_dyncol_type: REAL */ +#line 9589 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 40489 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1466: /* numeric_dyncol_type: FLOAT_SYM */ +#line 9590 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 40495 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1467: /* numeric_dyncol_type: DECIMAL_SYM float_options */ +#line 9591 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DECIMAL, (yyvsp[0].Lex_length_and_dec)); } +#line 40501 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1468: /* temporal_dyncol_type: DATE_SYM */ +#line 9595 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DATE); } +#line 40507 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1469: /* temporal_dyncol_type: TIME_SYM opt_field_scale */ +#line 9596 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_TIME, (yyvsp[0].Lex_length_and_dec)); } +#line 40513 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1470: /* temporal_dyncol_type: DATETIME opt_field_scale */ +#line 9597 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DATETIME, (yyvsp[0].Lex_length_and_dec)); } +#line 40519 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1471: /* string_dyncol_type: char opt_binary */ +#line 9602 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_dyncol_type).set(DYN_COL_STRING, (yyvsp[0].Lex_exact_charset_extended_collation_attrs), thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 40528 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1472: /* string_dyncol_type: nchar */ +#line 9607 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_dyncol_type).set(DYN_COL_STRING, national_charset_info); + } +#line 40536 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1473: /* dyncall_create_element: expr ',' expr opt_dyncol_type */ +#line 9614 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.dyncol_def)= (DYNCALL_CREATE_DEF *) + alloc_root(thd->mem_root, sizeof(DYNCALL_CREATE_DEF)); + if (unlikely((yyval.dyncol_def) == NULL)) + MYSQL_YYABORT; + (yyval.dyncol_def)->key= (yyvsp[-3].item); + (yyval.dyncol_def)->value= (yyvsp[-1].item); + (yyval.dyncol_def)->type= (DYNAMIC_COLUMN_TYPE)(yyvsp[0].Lex_dyncol_type).dyncol_type(); + (yyval.dyncol_def)->cs= (yyvsp[0].Lex_dyncol_type).charset_collation(); + if ((yyvsp[0].Lex_dyncol_type).has_explicit_length()) + (yyval.dyncol_def)->len= (yyvsp[0].Lex_dyncol_type).length(); + else + (yyval.dyncol_def)->len= 0; + if ((yyvsp[0].Lex_dyncol_type).has_explicit_dec()) + (yyval.dyncol_def)->frac= (yyvsp[0].Lex_dyncol_type).dec(); + else + (yyval.dyncol_def)->len= 0; + } +#line 40559 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1474: /* dyncall_create_list: dyncall_create_element */ +#line 9636 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.dyncol_def_list)= new (thd->mem_root) List; + if (unlikely((yyval.dyncol_def_list) == NULL)) + MYSQL_YYABORT; + (yyval.dyncol_def_list)->push_back((yyvsp[0].dyncol_def), thd->mem_root); + } +#line 40570 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1475: /* dyncall_create_list: dyncall_create_list ',' dyncall_create_element */ +#line 9643 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].dyncol_def_list)->push_back((yyvsp[0].dyncol_def), thd->mem_root); + (yyval.dyncol_def_list)= (yyvsp[-2].dyncol_def_list); + } +#line 40579 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1476: /* plsql_cursor_attr: ISOPEN_SYM */ +#line 9651 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_ISOPEN; } +#line 40585 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1477: /* plsql_cursor_attr: FOUND_SYM */ +#line 9652 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_FOUND; } +#line 40591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1478: /* plsql_cursor_attr: NOTFOUND_SYM */ +#line 9653 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_NOTFOUND; } +#line 40597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1479: /* plsql_cursor_attr: ROWCOUNT_SYM */ +#line 9654 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_ROWCOUNT; } +#line 40603 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1480: /* explicit_cursor_attr: ident PERCENT_ORACLE_SYM plsql_cursor_attr */ +#line 9659 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_plsql_cursor_attr(thd, &(yyvsp[-2].ident_sys), (yyvsp[0].plsql_cursor_attr))))) + MYSQL_YYABORT; + } +#line 40612 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1483: /* trim_operands_regular: expr */ +#line 9672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[0].item)); } +#line 40618 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1484: /* trim_operands_special: LEADING expr FROM expr */ +#line 9676 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_LEADING, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 40624 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1485: /* trim_operands_special: TRAILING expr FROM expr */ +#line 9677 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_TRAILING, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 40630 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1486: /* trim_operands_special: BOTH expr FROM expr */ +#line 9678 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 40636 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1487: /* trim_operands_special: LEADING FROM expr */ +#line 9679 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_LEADING, (yyvsp[0].item)); } +#line 40642 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1488: /* trim_operands_special: TRAILING FROM expr */ +#line 9680 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_TRAILING, (yyvsp[0].item)); } +#line 40648 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1489: /* trim_operands_special: BOTH FROM expr */ +#line 9681 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[0].item)); } +#line 40654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1490: /* trim_operands_special: expr FROM expr */ +#line 9682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 40660 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1497: /* column_default_non_parenthesized_expr: param_marker */ +#line 9720 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item_param); } +#line 40666 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1499: /* column_default_non_parenthesized_expr: sum_expr */ +#line 9723 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->select_stack_top || Lex->json_table) + { + my_error(ER_INVALID_GROUP_FUNC_USE, MYF(0)); + MYSQL_YYABORT; + } + } +#line 40678 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1500: /* column_default_non_parenthesized_expr: window_func_expr */ +#line 9731 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->select_stack_top) + { + my_error(ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION, MYF(0)); + MYSQL_YYABORT; + } + } +#line 40690 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1502: /* column_default_non_parenthesized_expr: ROW_SYM '(' expr ',' expr_list ')' */ +#line 9740 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_row(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1503: /* column_default_non_parenthesized_expr: EXISTS '(' subselect ')' */ +#line 9747 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_exists_subselect(thd, (yyvsp[-1].select_lex)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40711 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1504: /* column_default_non_parenthesized_expr: '{' ident expr '}' */ +#line 9753 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].item)->make_odbc_literal(thd, &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 40720 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1505: /* column_default_non_parenthesized_expr: MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')' */ +#line 9758 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-5].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + Item_func_match *i1= new (thd->mem_root) Item_func_match(thd, *(yyvsp[-5].item_list), + (yyvsp[-1].num)); + if (unlikely(i1 == NULL)) + MYSQL_YYABORT; + Select->add_ftfunc_to_list(thd, i1); + (yyval.item)= i1; + } +#line 40734 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1506: /* column_default_non_parenthesized_expr: CAST_SYM '(' expr AS cast_type ')' */ +#line 9768 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].Lex_cast_type).create_typecast_item_or_error(thd, (yyvsp[-3].item))))) + MYSQL_YYABORT; + } +#line 40743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1507: /* column_default_non_parenthesized_expr: CASE_SYM when_list_opt_else END */ +#line 9773 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= new(thd->mem_root) Item_func_case_searched(thd, *(yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 40752 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1508: /* column_default_non_parenthesized_expr: CASE_SYM expr when_list_opt_else END */ +#line 9778 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + if (unlikely(!((yyval.item)= new (thd->mem_root) Item_func_case_simple(thd, *(yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 40762 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1509: /* column_default_non_parenthesized_expr: CONVERT_SYM '(' expr ',' cast_type ')' */ +#line 9784 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].Lex_cast_type).create_typecast_item_or_error(thd, (yyvsp[-3].item))))) + MYSQL_YYABORT; + } +#line 40771 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1510: /* column_default_non_parenthesized_expr: CONVERT_SYM '(' expr USING charset_name ')' */ +#line 9789 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_conv_charset(thd, (yyvsp[-3].item), (yyvsp[-1].charset)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40781 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1511: /* column_default_non_parenthesized_expr: DEFAULT '(' simple_ident ')' */ +#line 9795 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_splocal *il= (yyvsp[-1].item)->get_item_splocal(); + if (unlikely(il)) + my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str)); + (yyval.item)= new (thd->mem_root) Item_default_value(thd, Lex->current_context(), + (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->default_used= TRUE; + } +#line 40796 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1512: /* column_default_non_parenthesized_expr: VALUE_SYM '(' simple_ident_nospvar ')' */ +#line 9806 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_insert_value(thd, Lex->current_context(), + (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40807 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1513: /* column_default_non_parenthesized_expr: NEXT_SYM VALUE_SYM FOR_SYM table_ident */ +#line 9813 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_nextval(thd, (yyvsp[0].table))))) + MYSQL_YYABORT; + } +#line 40816 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1514: /* column_default_non_parenthesized_expr: NEXTVAL_SYM '(' table_ident ')' */ +#line 9818 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_nextval(thd, (yyvsp[-1].table))))) + MYSQL_YYABORT; + } +#line 40825 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1515: /* column_default_non_parenthesized_expr: PREVIOUS_SYM VALUE_SYM FOR_SYM table_ident */ +#line 9823 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_lastval(thd, (yyvsp[0].table))))) + MYSQL_YYABORT; + } +#line 40834 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1516: /* column_default_non_parenthesized_expr: LASTVAL_SYM '(' table_ident ')' */ +#line 9828 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_lastval(thd, (yyvsp[-1].table))))) + MYSQL_YYABORT; + } +#line 40843 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1517: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ')' */ +#line 9833 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-3].table), (yyvsp[-1].longlong_number), 0, 1)))) + MYSQL_YYABORT; + } +#line 40852 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1518: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ',' bool ')' */ +#line 9838 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-5].table), (yyvsp[-3].longlong_number), 0, (yyvsp[-1].ulong_num))))) + MYSQL_YYABORT; + } +#line 40861 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1519: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ',' bool ',' ulonglong_num ')' */ +#line 9843 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-7].table), (yyvsp[-5].longlong_number), (yyvsp[-1].ulonglong_number), (yyvsp[-3].ulong_num))))) + MYSQL_YYABORT; + } +#line 40870 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1522: /* primary_expr: '(' parenthesized_expr ')' */ +#line 9852 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[-1].item); } +#line 40876 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1523: /* primary_expr: subquery */ +#line 9854 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->create_item_query_expression(thd, (yyvsp[0].select_lex)->master_unit()))) + MYSQL_YYABORT; + } +#line 40885 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1525: /* string_factor_expr: string_factor_expr COLLATE_SYM collation_name */ +#line 9863 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= new (thd->mem_root) + Item_func_set_collation(thd, (yyvsp[-2].item), (yyvsp[0].Lex_extended_collation))))) + MYSQL_YYABORT; + } +#line 40895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1527: /* simple_expr: BINARY simple_expr */ +#line 9873 "/home/buildbot/git/sql/sql_yacc.yy" + { + Type_cast_attributes at(&my_charset_bin); + if (unlikely(!((yyval.item)= type_handler_long_blob.create_typecast_item(thd, (yyvsp[0].item), at)))) + MYSQL_YYABORT; + } +#line 40905 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1528: /* simple_expr: '+' simple_expr */ +#line 9879 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 40913 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1529: /* simple_expr: '-' simple_expr */ +#line 9883 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item)->neg(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40923 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1530: /* simple_expr: '~' simple_expr */ +#line 9889 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_neg(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1531: /* simple_expr: not2 simple_expr */ +#line 9895 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= negate_expression(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40943 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1533: /* mysql_concatenation_expr: mysql_concatenation_expr MYSQL_CONCAT_SYM simple_expr */ +#line 9905 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_concat(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40953 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1534: /* function_call_keyword_timestamp: TIMESTAMP '(' expr ')' */ +#line 9914 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_datetime_typecast(thd, (yyvsp[-1].item), + AUTO_SEC_PART_DIGITS); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40964 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1535: /* function_call_keyword_timestamp: TIMESTAMP '(' expr ',' expr ')' */ +#line 9921 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_timestamp(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40974 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1536: /* function_call_keyword: CHAR_SYM '(' expr_list ')' */ +#line 9935 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_char(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40984 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1537: /* function_call_keyword: CHAR_SYM '(' expr_list USING charset_name ')' */ +#line 9941 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_char(thd, *(yyvsp[-3].item_list), (yyvsp[-1].charset)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40994 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1538: /* function_call_keyword: CURRENT_USER optional_braces */ +#line 9947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_current_user(thd, + Lex->current_context()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 41007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1539: /* function_call_keyword: CURRENT_ROLE optional_braces */ +#line 9956 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_current_role(thd, + Lex->current_context()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 41020 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1540: /* function_call_keyword: DATE_SYM '(' expr ')' */ +#line 9965 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_typecast(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1541: /* function_call_keyword: DAY_SYM '(' expr ')' */ +#line 9971 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_dayofmonth(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41040 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1542: /* function_call_keyword: HOUR_SYM '(' expr ')' */ +#line 9977 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_hour(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1543: /* function_call_keyword: INSERT '(' expr ',' expr ',' expr ',' expr ')' */ +#line 9983 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_insert(thd, (yyvsp[-7].item), (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41060 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1544: /* function_call_keyword: INTERVAL_SYM '(' expr ',' expr ')' */ +#line 9989 "/home/buildbot/git/sql/sql_yacc.yy" + { + List *list= new (thd->mem_root) List; + if (unlikely(list == NULL)) + MYSQL_YYABORT; + if (unlikely(list->push_front((yyvsp[-1].item), thd->mem_root)) || + unlikely(list->push_front((yyvsp[-3].item), thd->mem_root))) + MYSQL_YYABORT; + Item_row *item= new (thd->mem_root) Item_row(thd, *list); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_interval(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41079 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1545: /* function_call_keyword: INTERVAL_SYM '(' expr ',' expr ',' expr_list ')' */ +#line 10004 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-5].item), thd->mem_root); + Item_row *item= new (thd->mem_root) Item_row(thd, *(yyvsp[-1].item_list)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_interval(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41094 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1546: /* function_call_keyword: LEFT '(' expr ',' expr ')' */ +#line 10015 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_left(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41104 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1547: /* function_call_keyword: MINUTE_SYM '(' expr ')' */ +#line 10021 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_minute(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41114 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1548: /* function_call_keyword: MONTH_SYM '(' expr ')' */ +#line 10027 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_month(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41124 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1549: /* function_call_keyword: RIGHT '(' expr ',' expr ')' */ +#line 10033 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_right(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41134 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1550: /* function_call_keyword: SECOND_SYM '(' expr ')' */ +#line 10039 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_second(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41144 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1551: /* function_call_keyword: SQL_SYM PERCENT_ORACLE_SYM ROWCOUNT_SYM */ +#line 10045 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_oracle_sql_rowcount(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 41156 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1552: /* function_call_keyword: TIME_SYM '(' expr ')' */ +#line 10053 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_time_typecast(thd, (yyvsp[-1].item), + AUTO_SEC_PART_DIGITS); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41167 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1553: /* function_call_keyword: function_call_keyword_timestamp */ +#line 10060 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 41175 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1554: /* function_call_keyword: TRIM '(' trim_operands ')' */ +#line 10064 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_trim(thd, (yyvsp[-1].trim))))) + MYSQL_YYABORT; + } +#line 41185 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1555: /* function_call_keyword: USER_SYM '(' ')' */ +#line 10070 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_user(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query=0; + } +#line 41197 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1556: /* function_call_keyword: YEAR_SYM '(' expr ')' */ +#line 10078 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_year(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41207 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1559: /* substring_operands_regular: expr ',' expr ',' expr */ +#line 10092 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + } +#line 41215 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1560: /* substring_operands_regular: expr ',' expr */ +#line 10096 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-2].item), (yyvsp[0].item)); + } +#line 41223 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1561: /* substring_operands_special: expr FROM expr FOR_SYM expr */ +#line 10103 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + } +#line 41231 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1562: /* substring_operands_special: expr FROM expr */ +#line 10107 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-2].item), (yyvsp[0].item)); + } +#line 41239 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1563: /* function_call_nonkeyword: ADDDATE_SYM '(' expr ',' expr ')' */ +#line 10127 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-3].item), (yyvsp[-1].item), + INTERVAL_DAY, 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41250 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1564: /* function_call_nonkeyword: ADDDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10134 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41260 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1565: /* function_call_nonkeyword: CURDATE optional_braces */ +#line 10140 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curdate_local(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41271 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1566: /* function_call_nonkeyword: CURTIME opt_time_precision */ +#line 10147 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curtime_local(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41282 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1567: /* function_call_nonkeyword: DATE_ADD_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10154 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41292 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1568: /* function_call_nonkeyword: DATE_SUB_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10160 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41302 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1569: /* function_call_nonkeyword: EXTRACT_SYM '(' interval FROM expr ')' */ +#line 10166 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_extract(thd, (yyvsp[-3].interval), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41312 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1570: /* function_call_nonkeyword: GET_FORMAT '(' date_time_type ',' expr ')' */ +#line 10172 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_get_format(thd, (yyvsp[-3].date_time_type), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41322 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1571: /* function_call_nonkeyword: NOW_SYM opt_time_precision */ +#line 10178 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41333 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1572: /* function_call_nonkeyword: POSITION_SYM '(' bit_expr IN_SYM expr ')' */ +#line 10185 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_locate(thd, (yyvsp[-1].item), (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41343 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1573: /* function_call_nonkeyword: ROWNUM_SYM '(' ')' */ +#line 10196 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_rownum(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41353 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1574: /* function_call_nonkeyword: SUBDATE_SYM '(' expr ',' expr ')' */ +#line 10202 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-3].item), (yyvsp[-1].item), + INTERVAL_DAY, 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41364 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1575: /* function_call_nonkeyword: SUBDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10209 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41374 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1576: /* function_call_nonkeyword: SUBSTRING '(' substring_operands ')' */ +#line 10215 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_substr(thd, (yyvsp[-1].substring_spec))))) + MYSQL_YYABORT; + } +#line 41384 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1577: /* function_call_nonkeyword: SYSDATE '(' ')' */ +#line 10228 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_sysdate(thd, 0)))) + MYSQL_YYABORT; + } +#line 41393 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1578: /* function_call_nonkeyword: SYSDATE '(' real_ulong_num ')' */ +#line 10233 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_sysdate(thd, (uint) (yyvsp[-1].ulong_num))))) + MYSQL_YYABORT; + } +#line 41402 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1579: /* function_call_nonkeyword: TIMESTAMP_ADD '(' interval_time_stamp ',' expr ',' expr ')' */ +#line 10238 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-1].item), (yyvsp[-3].item), (yyvsp[-5].interval_time_st), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1580: /* function_call_nonkeyword: TIMESTAMP_DIFF '(' interval_time_stamp ',' expr ',' expr ')' */ +#line 10244 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_timestamp_diff(thd, (yyvsp[-3].item), (yyvsp[-1].item), (yyvsp[-5].interval_time_st)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1581: /* function_call_nonkeyword: TRIM_ORACLE '(' trim_operands ')' */ +#line 10250 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].trim).make_item_func_trim_oracle(thd)))) + MYSQL_YYABORT; + } +#line 41431 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1582: /* function_call_nonkeyword: UTC_DATE_SYM optional_braces */ +#line 10255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curdate_utc(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41442 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1583: /* function_call_nonkeyword: UTC_TIME_SYM opt_time_precision */ +#line 10262 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curtime_utc(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41453 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1584: /* function_call_nonkeyword: UTC_TIMESTAMP_SYM opt_time_precision */ +#line 10269 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_now_utc(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41464 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1585: /* function_call_nonkeyword: COLUMN_ADD_SYM '(' expr ',' dyncall_create_list ')' */ +#line 10277 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_add(thd, (yyvsp[-3].item), *(yyvsp[-1].dyncol_def_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41474 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1586: /* function_call_nonkeyword: COLUMN_DELETE_SYM '(' expr ',' expr_list ')' */ +#line 10284 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_delete(thd, (yyvsp[-3].item), *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41484 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1587: /* function_call_nonkeyword: COLUMN_CREATE_SYM '(' dyncall_create_list ')' */ +#line 10291 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_create(thd, *(yyvsp[-1].dyncol_def_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41494 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1588: /* function_call_nonkeyword: COLUMN_GET_SYM '(' expr ',' expr AS cast_type ')' */ +#line 10298 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_get(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].Lex_cast_type).type_handler(), + (yyvsp[-1].Lex_cast_type), (yyvsp[-1].Lex_cast_type).charset()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1589: /* function_call_conflict: ASCII_SYM '(' expr ')' */ +#line 10313 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_ascii(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1590: /* function_call_conflict: CHARSET '(' expr ')' */ +#line 10319 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_charset(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41525 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1591: /* function_call_conflict: IF_SYM '(' expr ',' expr ',' expr ')' */ +#line 10325 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_if(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41535 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1592: /* function_call_conflict: LAST_VALUE '(' expr ')' */ +#line 10334 "/home/buildbot/git/sql/sql_yacc.yy" + { + List *list= new (thd->mem_root) List; + if (unlikely(list == NULL)) + MYSQL_YYABORT; + list->push_back((yyvsp[-1].item), thd->mem_root); + + (yyval.item)= new (thd->mem_root) Item_func_last_value(thd, *list); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41550 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1593: /* function_call_conflict: LAST_VALUE '(' expr_list ',' expr ')' */ +#line 10345 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-3].item_list)->push_back((yyvsp[-1].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_func_last_value(thd, *(yyvsp[-3].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41561 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1594: /* function_call_conflict: MOD_SYM '(' expr ',' expr ')' */ +#line 10352 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41571 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1595: /* function_call_conflict: PASSWORD_SYM '(' expr ')' */ +#line 10358 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item* i1; + i1= new (thd->mem_root) Item_func_password(thd, (yyvsp[-1].item)); + if (unlikely(i1 == NULL)) + MYSQL_YYABORT; + (yyval.item)= i1; + } +#line 41583 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1596: /* function_call_conflict: REPEAT_SYM '(' expr ',' expr ')' */ +#line 10366 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_repeat(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41593 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1597: /* function_call_conflict: REPLACE '(' expr ',' expr ',' expr ')' */ +#line 10372 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_replace(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item))))) + MYSQL_YYABORT; + } +#line 41603 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1598: /* function_call_conflict: TRUNCATE_SYM '(' expr ',' expr ')' */ +#line 10378 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_round(thd, (yyvsp[-3].item), (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41613 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1599: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr opt_ws_levels ')' */ +#line 10384 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-2].item), 0, 0, (yyvsp[-1].ulong_num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41623 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1600: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr AS CHAR_SYM ws_nweights opt_ws_levels ')' */ +#line 10390 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) + Item_func_weight_string(thd, (yyvsp[-5].item), 0, (yyvsp[-2].ulong_num), + (yyvsp[-1].ulong_num) | MY_STRXFRM_PAD_WITH_SPACE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41635 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1601: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr AS BINARY ws_nweights ')' */ +#line 10398 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_char_typecast(thd, (yyvsp[-4].item), (yyvsp[-1].ulong_num), + &my_charset_bin); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) + Item_func_weight_string(thd, item, 0, (yyvsp[-1].ulong_num), + MY_STRXFRM_PAD_WITH_SPACE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41651 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1602: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr ',' ulong_num ',' ulong_num ',' ulong_num ')' */ +#line 10410 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-7].item), (yyvsp[-5].ulong_num), (yyvsp[-3].ulong_num), + (yyvsp[-1].ulong_num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41662 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1603: /* @142: %empty */ +#line 10429 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef HAVE_DLOPEN + udf_func *udf= 0; + LEX *lex= Lex; + if (using_udf_functions && + (udf= find_udf((yyvsp[-1].ident_sys).str, (yyvsp[-1].ident_sys).length)) && + udf->type == UDFTYPE_AGGREGATE) + { + if (unlikely(lex->current_select->inc_in_sum_expr())) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } + /* Temporary placing the result of find_udf in $3 */ + (yyval.udf)= udf; +#endif + } +#line 41685 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1604: /* function_call_generic: ident_func '(' @142 opt_udf_expr_list ')' */ +#line 10448 "/home/buildbot/git/sql/sql_yacc.yy" + { + const Type_handler *h; + Create_func *builder; + Item *item= NULL; + + if (unlikely(check_routine_name(&(yyvsp[-4].ident_sys)))) + MYSQL_YYABORT; + + /* + Implementation note: + names are resolved with the following order: + - MySQL native functions, + - User Defined Functions, + - Constructors, like POINT(1,1) + - Stored Functions (assuming the current database) + + This will be revised with WL#2128 (SQL PATH) + */ + builder= Schema::find_implied(thd)-> + find_native_function_builder(thd, (yyvsp[-4].ident_sys)); + if (builder) + { + item= builder->create_func(thd, &(yyvsp[-4].ident_sys), (yyvsp[-1].item_list)); + } + else if ((h= Type_handler::handler_by_name(thd, (yyvsp[-4].ident_sys))) && + (item= h->make_constructor_item(thd, (yyvsp[-1].item_list)))) + { + // Found a constructor with a proper argument count + } + else + { +#ifdef HAVE_DLOPEN + /* Retrieving the result of find_udf */ + udf_func *udf= (yyvsp[-2].udf); + + if (udf) + { + if (udf->type == UDFTYPE_AGGREGATE) + { + Select->in_sum_expr--; + } + + item= Create_udf_func::s_singleton.create(thd, udf, (yyvsp[-1].item_list)); + } + else +#endif + { + builder= find_qualified_function_builder(thd); + DBUG_ASSERT(builder); + item= builder->create_func(thd, &(yyvsp[-4].ident_sys), (yyvsp[-1].item_list)); + } + } + + if (unlikely(! ((yyval.item)= item))) + MYSQL_YYABORT; + } +#line 41746 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1605: /* function_call_generic: CONTAINS_SYM '(' opt_expr_list ')' */ +#line 10505 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41756 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1606: /* function_call_generic: OVERLAPS_SYM '(' opt_expr_list ')' */ +#line 10511 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41766 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1607: /* function_call_generic: WITHIN '(' opt_expr_list ')' */ +#line 10517 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41776 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1608: /* function_call_generic: ident_cli '.' ident_cli '(' opt_expr_list ')' */ +#line 10523 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_call_generic(thd, &(yyvsp[-5].ident_cli), &(yyvsp[-3].ident_cli), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1609: /* function_call_generic: ident_cli '.' ident_cli '.' ident_cli '(' opt_expr_list ')' */ +#line 10528 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_call_generic(thd, &(yyvsp[-7].ident_cli), &(yyvsp[-5].ident_cli), &(yyvsp[-3].ident_cli), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41794 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1610: /* function_call_generic: ident_cli '.' REPLACE '(' opt_expr_list ')' */ +#line 10533 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_replace(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41803 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1611: /* function_call_generic: ident_cli '.' SUBSTRING '(' opt_expr_list ')' */ +#line 10538 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_substr(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41812 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1612: /* function_call_generic: ident_cli '.' SUBSTRING '(' substring_operands_special ')' */ +#line 10543 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_substr(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].substring_spec))))) + MYSQL_YYABORT; + } +#line 41821 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1613: /* function_call_generic: ident_cli '.' TRIM '(' opt_expr_list ')' */ +#line 10548 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_trim(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41830 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1614: /* function_call_generic: ident_cli '.' TRIM '(' trim_operands_special ')' */ +#line 10553 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_trim(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].trim))))) + MYSQL_YYABORT; + } +#line 41839 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1615: /* fulltext_options: opt_natural_language_mode opt_query_expansion */ +#line 10573 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].num) | (yyvsp[0].num); } +#line 41845 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1616: /* fulltext_options: IN_SYM BOOLEAN_SYM MODE_SYM */ +#line 10575 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_BOOL; } +#line 41851 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1617: /* opt_natural_language_mode: %empty */ +#line 10579 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_NL; } +#line 41857 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1618: /* opt_natural_language_mode: IN_SYM NATURAL LANGUAGE_SYM MODE_SYM */ +#line 10580 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_NL; } +#line 41863 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1619: /* opt_query_expansion: %empty */ +#line 10584 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 41869 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1620: /* opt_query_expansion: WITH QUERY_SYM EXPANSION_SYM */ +#line 10585 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_EXPAND; } +#line 41875 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1621: /* opt_udf_expr_list: %empty */ +#line 10589 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 41881 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1622: /* opt_udf_expr_list: udf_expr_list */ +#line 10590 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list); } +#line 41887 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1623: /* udf_expr_list: udf_expr */ +#line 10595 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL)) + MYSQL_YYABORT; + (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root); + } +#line 41898 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1624: /* udf_expr_list: udf_expr_list ',' udf_expr */ +#line 10602 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 41907 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1625: /* udf_expr: remember_name expr remember_end select_alias */ +#line 10610 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Use Item::name as a storage for the attribute value of user + defined function argument. It is safe to use Item::name + because the syntax will not allow having an explicit name here. + See WL#1017 re. udf attributes. + */ + if ((yyvsp[0].lex_str).str) + { + (yyvsp[-2].item)->base_flags|= item_base_t::IS_EXPLICIT_NAME; + (yyvsp[-2].item)->set_name(thd, (yyvsp[0].lex_str)); + } + /* + A field has to have its proper name in order for name + resolution to work, something we are only guaranteed if we + parse it out. If we hijack the input stream with + remember_name we may get quoted or escaped names. + */ + else if ((yyvsp[-2].item)->type() != Item::FIELD_ITEM && + (yyvsp[-2].item)->type() != Item::REF_ITEM /* For HAVING */ ) + (yyvsp[-2].item)->set_name(thd, (yyvsp[-3].simple_string), (uint) ((yyvsp[-1].simple_string) - (yyvsp[-3].simple_string)), thd->charset()); + (yyval.item)= (yyvsp[-2].item); + } +#line 41935 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1626: /* sum_expr: AVG_SYM '(' in_sum_expr ')' */ +#line 10637 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_avg(thd, (yyvsp[-1].item), FALSE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41945 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1627: /* sum_expr: AVG_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10643 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_avg(thd, (yyvsp[-1].item), TRUE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41955 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1628: /* sum_expr: BIT_AND '(' in_sum_expr ')' */ +#line 10649 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_and(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41965 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1629: /* sum_expr: BIT_OR '(' in_sum_expr ')' */ +#line 10655 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_or(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41975 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1630: /* sum_expr: BIT_XOR '(' in_sum_expr ')' */ +#line 10661 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_xor(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41985 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1631: /* sum_expr: COUNT_SYM '(' opt_all '*' ')' */ +#line 10667 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_int(thd, (int32) 0L, 1); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41998 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1632: /* sum_expr: COUNT_SYM '(' in_sum_expr ')' */ +#line 10676 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42008 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1633: /* $@143: %empty */ +#line 10682 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 42014 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1634: /* $@144: %empty */ +#line 10684 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr--; } +#line 42020 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1635: /* sum_expr: COUNT_SYM '(' DISTINCT $@143 expr_list $@144 ')' */ +#line 10686 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, *(yyvsp[-2].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1636: /* sum_expr: MIN_SYM '(' in_sum_expr ')' */ +#line 10692 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_min(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42040 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1637: /* sum_expr: MIN_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10703 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_min(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1638: /* sum_expr: MAX_SYM '(' in_sum_expr ')' */ +#line 10709 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_max(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42060 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1639: /* sum_expr: MAX_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10715 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_max(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42070 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1640: /* sum_expr: STD_SYM '(' in_sum_expr ')' */ +#line 10721 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_std(thd, (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1641: /* sum_expr: VARIANCE_SYM '(' in_sum_expr ')' */ +#line 10727 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_variance(thd, (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42090 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1642: /* sum_expr: STDDEV_SAMP_SYM '(' in_sum_expr ')' */ +#line 10733 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_std(thd, (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42100 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1643: /* sum_expr: VAR_SAMP_SYM '(' in_sum_expr ')' */ +#line 10739 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_variance(thd, (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42110 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1644: /* sum_expr: SUM_SYM '(' in_sum_expr ')' */ +#line 10745 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_sum(thd, (yyvsp[-1].item), FALSE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42120 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1645: /* sum_expr: SUM_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10751 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_sum(thd, (yyvsp[-1].item), TRUE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42130 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1646: /* $@145: %empty */ +#line 10757 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 42136 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1647: /* sum_expr: GROUP_CONCAT_SYM '(' opt_distinct $@145 expr_list opt_gorder_clause opt_gconcat_separator opt_glimit_clause ')' */ +#line 10761 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->in_sum_expr--; + (yyval.item)= new (thd->mem_root) + Item_func_group_concat(thd, Lex->current_context(), + (yyvsp[-6].num), (yyvsp[-4].item_list), + sel->gorder_list, (yyvsp[-2].string), (yyvsp[-1].num), + sel->limit_params.select_limit, + sel->limit_params.offset_limit); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + sel->limit_params.clear(); + (yyvsp[-4].item_list)->empty(); + sel->gorder_list.empty(); + } +#line 42156 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1648: /* $@146: %empty */ +#line 10777 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 42162 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1649: /* sum_expr: JSON_ARRAYAGG_SYM '(' opt_distinct $@146 expr_list opt_gorder_clause opt_glimit_clause ')' */ +#line 10780 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + List *args= (yyvsp[-3].item_list); + sel->in_sum_expr--; + if (args && args->elements > 1) + { + /* JSON_ARRAYAGG supports only one parameter */ + my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), "JSON_ARRAYAGG"); + MYSQL_YYABORT; + } + String* s= new (thd->mem_root) String(",", 1, &my_charset_latin1); + if (unlikely(s == NULL)) + MYSQL_YYABORT; + + (yyval.item)= new (thd->mem_root) + Item_func_json_arrayagg(thd, Lex->current_context(), + (yyvsp[-5].num), args, + sel->gorder_list, s, (yyvsp[-1].num), + sel->limit_params.select_limit, + sel->limit_params.offset_limit); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + sel->limit_params.clear(); + (yyvsp[-3].item_list)->empty(); + sel->gorder_list.empty(); + } +#line 42193 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1650: /* $@147: %empty */ +#line 10807 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 42199 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1651: /* sum_expr: JSON_OBJECTAGG_SYM '(' $@147 expr ',' expr ')' */ +#line 10809 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->in_sum_expr--; + + (yyval.item)= new (thd->mem_root) Item_func_json_objectagg(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42212 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1652: /* window_func_expr: window_func OVER_SYM window_name */ +#line 10821 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-2].item), (yyvsp[0].lex_str_ptr)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 42224 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1653: /* window_func_expr: window_func OVER_SYM window_spec */ +#line 10830 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_spec(thd, lex->win_ref, + Select->group_list, + Select->order_list, + lex->win_frame))) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-2].item), + thd->lex->win_spec); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 42243 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1656: /* window_func: function_call_generic */ +#line 10852 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item* item = (Item*)(yyvsp[0].item); + /* Only UDF aggregate here possible */ + if ((item == NULL) || + (item->type() != Item::SUM_FUNC_ITEM) + || (((Item_sum *)item)->sum_func() != Item_sum::UDF_SUM_FUNC)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 42259 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1657: /* simple_window_func: ROW_NUMBER_SYM '(' ')' */ +#line 10867 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_row_number(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42269 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1658: /* simple_window_func: RANK_SYM '(' ')' */ +#line 10874 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42279 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1659: /* simple_window_func: DENSE_RANK_SYM '(' ')' */ +#line 10881 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_dense_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1660: /* simple_window_func: PERCENT_RANK_SYM '(' ')' */ +#line 10888 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percent_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42299 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1661: /* simple_window_func: CUME_DIST_SYM '(' ')' */ +#line 10895 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_cume_dist(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42309 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1662: /* simple_window_func: NTILE_SYM '(' expr ')' */ +#line 10902 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_ntile(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42319 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1663: /* simple_window_func: FIRST_VALUE_SYM '(' expr ')' */ +#line 10909 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_first_value(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42329 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1664: /* simple_window_func: LAST_VALUE '(' expr ')' */ +#line 10916 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_last_value(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42339 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1665: /* simple_window_func: NTH_VALUE_SYM '(' expr ',' expr ')' */ +#line 10923 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_nth_value(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42349 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1666: /* simple_window_func: LEAD_SYM '(' expr ')' */ +#line 10930 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* No second argument defaults to 1. */ + Item* item_offset= new (thd->mem_root) Item_uint(thd, 1); + if (unlikely(item_offset == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_lead(thd, (yyvsp[-1].item), item_offset); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42363 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1667: /* simple_window_func: LEAD_SYM '(' expr ',' expr ')' */ +#line 10941 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_lead(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42373 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1668: /* simple_window_func: LAG_SYM '(' expr ')' */ +#line 10948 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* No second argument defaults to 1. */ + Item* item_offset= new (thd->mem_root) Item_uint(thd, 1); + if (unlikely(item_offset == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_lag(thd, (yyvsp[-1].item), item_offset); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42387 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1669: /* simple_window_func: LAG_SYM '(' expr ',' expr ')' */ +#line 10959 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_lag(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42397 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1670: /* inverse_distribution_function: percentile_function OVER_SYM '(' opt_window_partition_clause ')' */ +#line 10971 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_spec(thd, lex->win_ref, + Select->group_list, + Select->order_list, + NULL))) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-4].item), + thd->lex->win_spec); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 42416 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1671: /* $@148: %empty */ +#line 10989 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->prepare_add_window_spec(thd); } +#line 42422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1672: /* percentile_function: inverse_distribution_function_def WITHIN GROUP_SYM '(' $@148 order_by_single_element_list ')' */ +#line 10991 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[-6].item); + } +#line 42430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1673: /* percentile_function: MEDIAN_SYM '(' expr ')' */ +#line 10995 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *args= new (thd->mem_root) Item_decimal(thd, "0.5", 3, + thd->charset()); + if (unlikely(args == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + Select->prepare_add_window_spec(thd); + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item),FALSE))) + MYSQL_YYABORT; + + (yyval.item)= new (thd->mem_root) Item_sum_percentile_cont(thd, args); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42448 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1674: /* inverse_distribution_function_def: PERCENTILE_CONT_SYM '(' expr ')' */ +#line 11012 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percentile_cont(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42458 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1675: /* inverse_distribution_function_def: PERCENTILE_DISC_SYM '(' expr ')' */ +#line 11018 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percentile_disc(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42468 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1676: /* order_by_single_element_list: ORDER_SYM BY order_ident order_dir */ +#line 11027 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 42477 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1677: /* window_name: ident */ +#line 11036 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str_ptr)= (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + if (unlikely((yyval.lex_str_ptr) == NULL)) + MYSQL_YYABORT; + } +#line 42487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1678: /* $@149: %empty */ +#line 11045 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(! Lex->parsing_options.allows_variable)) + my_yyabort_error((ER_VIEW_SELECT_VARIABLE, MYF(0))); + } +#line 42496 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1679: /* variable: '@' $@149 variable_aux */ +#line 11050 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 42504 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1680: /* variable_aux: ident_or_text SET_VAR expr */ +#line 11057 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_func_set_user_var *item; + if (!(yyvsp[-2].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= item= new (thd->mem_root) Item_func_set_user_var(thd, &(yyvsp[-2].lex_str), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + lex->set_var_list.push_back(item, thd->mem_root); + } +#line 42523 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1681: /* variable_aux: ident_or_text */ +#line 11072 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= new (thd->mem_root) Item_func_get_user_var(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + } +#line 42540 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1682: /* variable_aux: '@' opt_var_ident_type ident_sysvar_name */ +#line 11085 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_sysvar(thd, (yyvsp[-1].var_type), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 42549 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1683: /* variable_aux: '@' opt_var_ident_type ident_sysvar_name '.' ident */ +#line 11090 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_sysvar(thd, (yyvsp[-3].var_type), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 42558 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1684: /* opt_distinct: %empty */ +#line 11097 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 42564 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1685: /* opt_distinct: DISTINCT */ +#line 11098 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 42570 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1686: /* opt_gconcat_separator: %empty */ +#line 11103 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string)= new (thd->mem_root) String(",", 1, &my_charset_latin1); + if (unlikely((yyval.string) == NULL)) + MYSQL_YYABORT; + } +#line 42580 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1687: /* opt_gconcat_separator: SEPARATOR_SYM text_string */ +#line 11108 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string) = (yyvsp[0].string); } +#line 42586 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1690: /* gorder_list: gorder_list ',' order_ident order_dir */ +#line 11118 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_gorder_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 42595 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1691: /* gorder_list: order_ident order_dir */ +#line 11123 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_gorder_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 42604 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1692: /* opt_glimit_clause: %empty */ +#line 11130 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 42610 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1693: /* opt_glimit_clause: glimit_clause */ +#line 11131 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 42616 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1694: /* glimit_clause: LIMIT glimit_options */ +#line 11137 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 42624 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1695: /* glimit_options: limit_options */ +#line 11144 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->limit_params= (yyvsp[0].select_limit); + } +#line 42632 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1696: /* $@150: %empty */ +#line 11153 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->current_select->inc_in_sum_expr())) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 42645 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1697: /* in_sum_expr: opt_all $@150 expr */ +#line 11162 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->in_sum_expr--; + (yyval.item)= (yyvsp[0].item); + } +#line 42654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1698: /* cast_type: BINARY opt_field_length */ +#line 11170 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[0].Lex_length_and_dec), &my_charset_bin); } +#line 42660 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1699: /* cast_type: CHAR_SYM opt_field_length opt_binary */ +#line 11172 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 42670 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1700: /* cast_type: VARCHAR field_length opt_binary */ +#line 11178 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 42680 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1701: /* cast_type: VARCHAR2_ORACLE_SYM field_length opt_binary */ +#line 11184 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 42690 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1702: /* cast_type: NCHAR_SYM opt_field_length */ +#line 11190 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[0].Lex_length_and_dec), national_charset_info); + } +#line 42698 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1703: /* cast_type: cast_type_numeric */ +#line 11193 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type)= (yyvsp[0].Lex_cast_type); } +#line 42704 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1704: /* cast_type: cast_type_temporal */ +#line 11194 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type)= (yyvsp[0].Lex_cast_type); } +#line 42710 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1705: /* cast_type: udt_name */ +#line 11196 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_cast_type_udt(&(yyval.Lex_cast_type), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 42719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1706: /* cast_type_numeric: INT_SYM */ +#line 11203 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 42725 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1707: /* cast_type_numeric: SIGNED_SYM */ +#line 11204 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 42731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1708: /* cast_type_numeric: SIGNED_SYM INT_SYM */ +#line 11205 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 42737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1709: /* cast_type_numeric: UNSIGNED */ +#line 11206 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_ulonglong); } +#line 42743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1710: /* cast_type_numeric: UNSIGNED INT_SYM */ +#line 11207 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_ulonglong); } +#line 42749 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1711: /* cast_type_numeric: DECIMAL_SYM float_options */ +#line 11208 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_newdecimal, (yyvsp[0].Lex_length_and_dec)); } +#line 42755 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1712: /* cast_type_numeric: FLOAT_SYM */ +#line 11209 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_float); } +#line 42761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1713: /* cast_type_numeric: DOUBLE_SYM opt_precision */ +#line 11210 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_double, (yyvsp[0].Lex_length_and_dec)); } +#line 42767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1714: /* cast_type_temporal: DATE_SYM */ +#line 11214 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_newdate); } +#line 42773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1715: /* cast_type_temporal: TIME_SYM opt_field_scale */ +#line 11215 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_time2, (yyvsp[0].Lex_length_and_dec)); } +#line 42779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1716: /* cast_type_temporal: DATETIME opt_field_scale */ +#line 11216 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_datetime2, (yyvsp[0].Lex_length_and_dec)); } +#line 42785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1717: /* cast_type_temporal: INTERVAL_SYM DAY_SECOND_SYM field_scale */ +#line 11218 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_cast_type).set(&type_handler_interval_DDhhmmssff, (yyvsp[0].Lex_length_and_dec)); + } +#line 42793 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1718: /* opt_expr_list: %empty */ +#line 11224 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 42799 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1719: /* opt_expr_list: expr_list */ +#line 11225 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list);} +#line 42805 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1720: /* expr_list: expr */ +#line 11230 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_list)= List::make(thd->mem_root, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 42814 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1721: /* expr_list: expr_list ',' expr */ +#line 11235 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42823 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1722: /* ident_list_arg: ident_list */ +#line 11242 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list); } +#line 42829 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1723: /* ident_list_arg: '(' ident_list ')' */ +#line 11243 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[-1].item_list); } +#line 42835 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1724: /* ident_list: simple_ident */ +#line 11248 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL) || + unlikely((yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 42846 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1725: /* ident_list: ident_list ',' simple_ident */ +#line 11255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42855 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1726: /* when_list: WHEN_SYM expr THEN_SYM expr */ +#line 11263 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL)) + MYSQL_YYABORT; + if (unlikely((yyval.item_list)->push_back((yyvsp[-2].item), thd->mem_root) || + (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 42868 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1727: /* when_list: when_list WHEN_SYM expr THEN_SYM expr */ +#line 11272 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-4].item_list)->push_back((yyvsp[-2].item), thd->mem_root) || + (yyvsp[-4].item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.item_list)= (yyvsp[-4].item_list); + } +#line 42879 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1729: /* when_list_opt_else: when_list ELSE expr */ +#line 11283 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42889 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1730: /* table_ref: table_factor */ +#line 11293 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1731: /* table_ref: join_table */ +#line 11295 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->nest_last_join(thd)))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 42908 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1732: /* json_text_literal: TEXT_STRING */ +#line 11307 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42916 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1733: /* json_text_literal: NCHAR_STRING */ +#line 11311 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= national_charset_info; + } +#line 42924 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1734: /* json_text_literal: UNDERSCORE_CHARSET TEXT_STRING */ +#line 11315 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= (yyvsp[-1].charset); + (yyval.lex_string_with_metadata)= (yyvsp[0].lex_string_with_metadata); + } +#line 42933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1736: /* json_text_literal_or_num: NUM */ +#line 11324 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1737: /* json_text_literal_or_num: LONG_NUM */ +#line 11328 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42949 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1738: /* json_text_literal_or_num: DECIMAL_NUM */ +#line 11332 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42957 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1739: /* json_text_literal_or_num: FLOAT_NUM */ +#line 11336 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42965 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1740: /* join_table_list: derived_table_list */ +#line 11342 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT_UNLESS((yyval.table_list)=(yyvsp[0].table_list)); } +#line 42971 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1741: /* json_table_columns_clause: COLUMNS '(' json_table_columns_list ')' */ +#line 11347 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42977 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1743: /* json_table_columns_list: json_table_columns_list ',' json_table_column */ +#line 11353 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42983 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1744: /* $@151: %empty */ +#line 11358 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Create_field *f= new (thd->mem_root) Create_field(); + + if (unlikely(check_string_char_length(&(yyvsp[0].ident_sys), 0, NAME_CHAR_LEN, + system_charset_info, 1))) + my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), (yyvsp[0].ident_sys).str)); + + lex->json_table->m_cur_json_table_column= + new (thd->mem_root) Json_table_column(f, + lex->json_table->get_cur_nested_path()); + + if (unlikely(!f || + !lex->json_table->m_cur_json_table_column)) + MYSQL_YYABORT; + + lex->init_last_field(f, &(yyvsp[0].ident_sys)); + } +#line 43006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1745: /* json_table_column: ident $@151 json_table_column_type */ +#line 11377 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->json_table-> + m_cur_json_table_column->m_field->check(thd))) + MYSQL_YYABORT; + lex->json_table->m_columns.push_back( + lex->json_table->m_cur_json_table_column, thd->mem_root); + } +#line 43019 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1746: /* $@152: %empty */ +#line 11386 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Json_table_nested_path *np= new (thd->mem_root) + Json_table_nested_path(); + np->set_path(thd, (yyvsp[0].lex_string_with_metadata)); + lex->json_table->start_nested_path(np); + } +#line 43031 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1747: /* json_table_column: NESTED_SYM PATH_SYM json_text_literal $@152 json_table_columns_clause */ +#line 11394 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->json_table->end_nested_path(); + } +#line 43040 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1748: /* json_table_column_type: FOR_SYM ORDINALITY_SYM */ +#line 11402 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_field_type_st type; + type.set(&type_handler_slong); + Lex->last_field->set_attributes(thd, type, + COLUMN_DEFINITION_TABLE_FIELD); + Lex->json_table->m_cur_json_table_column-> + set(Json_table_column::FOR_ORDINALITY); + } +#line 43053 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1749: /* json_table_column_type: json_table_field_type PATH_SYM json_text_literal json_opt_on_empty_or_error */ +#line 11412 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[-3].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + if (Lex->json_table->m_cur_json_table_column-> + set(thd, Json_table_column::PATH, (yyvsp[-1].lex_string_with_metadata), + (yyvsp[-3].Lex_field_type).charset_collation_attrs())) + { + MYSQL_YYABORT; + } + } +#line 43068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1750: /* json_table_column_type: json_table_field_type EXISTS PATH_SYM json_text_literal */ +#line 11423 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[-3].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + if (Lex->json_table->m_cur_json_table_column-> + set(thd, Json_table_column::EXISTS_PATH, (yyvsp[0].lex_string_with_metadata), + (yyvsp[-3].Lex_field_type).charset_collation_attrs())) + MYSQL_YYABORT; + } +#line 43081 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1755: /* json_opt_on_empty_or_error: %empty */ +#line 11442 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43087 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1760: /* json_on_response: ERROR_SYM */ +#line 11451 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_ERROR; + } +#line 43095 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1761: /* json_on_response: NULL_SYM */ +#line 11455 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_NULL; + } +#line 43103 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1762: /* json_on_response: DEFAULT json_text_literal_or_num */ +#line 11459 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_DEFAULT; + (yyval.json_on_response).m_default= (yyvsp[0].lex_string_with_metadata); + Lex->json_table->m_cur_json_table_column->m_defaults_cs= + thd->variables.collation_connection; + } +#line 43114 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1763: /* json_on_error_response: json_on_response ON ERROR_SYM */ +#line 11469 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_cur_json_table_column->m_on_error= (yyvsp[-2].json_on_response); + } +#line 43122 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1764: /* json_on_empty_response: json_on_response ON EMPTY_SYM */ +#line 11476 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_cur_json_table_column->m_on_empty= (yyvsp[-2].json_on_response); + } +#line 43130 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1765: /* $@153: %empty */ +#line 11483 "/home/buildbot/git/sql/sql_yacc.yy" + { + push_table_function_arg_context(Lex, thd->mem_root); + //TODO: introduce IN_TABLE_FUNC_ARGUMENT? + Select->parsing_place= IN_ON; + } +#line 43140 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1766: /* $@154: %empty */ +#line 11489 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_function_json_table *jt= + new (thd->mem_root) Table_function_json_table((yyvsp[-1].item)); + if (unlikely(!jt)) + MYSQL_YYABORT; + /* See comment for class Table_function_json_table: */ + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->json_table= jt; + + Select->parsing_place= NO_MATTER; + jt->set_name_resolution_context(Lex->pop_context()); + } +#line 43157 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1767: /* table_function: JSON_TABLE_SYM '(' $@153 expr ',' $@154 json_text_literal json_table_columns_clause ')' opt_table_alias_clause */ +#line 11502 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + if (unlikely((yyvsp[0].lex_str_ptr) == NULL)) + { + /* Alias is not optional. */ + my_error(ER_JSON_TABLE_ALIAS_REQUIRED, MYF(0)); + MYSQL_YYABORT; + } + if (unlikely(Lex->json_table->m_nested_path.set_path(thd, (yyvsp[-3].lex_string_with_metadata)))) + MYSQL_YYABORT; + if (!((yyval.table_list)= sel->add_table_to_list(thd, + new (thd->mem_root) Table_ident(thd, &any_db, + (yyvsp[0].lex_str_ptr), TRUE), + NULL, + TL_OPTION_TABLE_FUNCTION, + YYPS->m_lock_type, + YYPS->m_mdl_type, + 0,0,0))) + MYSQL_YYABORT; + (yyval.table_list)->table_function= Lex->json_table; + Lex->json_table= 0; + status_var_increment(thd->status_var.feature_json); + } +#line 43185 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1768: /* esc_table_ref: table_ref */ +#line 11535 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)=(yyvsp[0].table_list); } +#line 43191 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1769: /* esc_table_ref: '{' ident table_ref '}' */ +#line 11536 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)=(yyvsp[-1].table_list); } +#line 43197 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1770: /* derived_table_list: esc_table_ref */ +#line 11543 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table_list)=(yyvsp[0].table_list); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 43206 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1771: /* derived_table_list: derived_table_list ',' esc_table_ref */ +#line 11548 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 43215 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1772: /* join_table: table_ref normal_join table_ref */ +#line 11562 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + if (unlikely(Select->add_cross_joined_table((yyvsp[-2].table_list), (yyvsp[0].table_list), (yyvsp[-1].num)))) + MYSQL_YYABORT; + } +#line 43225 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1773: /* $@155: %empty */ +#line 11569 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-3].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 43239 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1774: /* join_table: table_ref normal_join table_ref ON $@155 expr */ +#line 11579 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-3].table_list)->straight=(yyvsp[-4].num); + add_join_on(thd, (yyvsp[-3].table_list), (yyvsp[0].item)); + (yyvsp[-3].table_list)->on_context= Lex->pop_context(); + Select->parsing_place= NO_MATTER; + } +#line 43250 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1775: /* $@156: %empty */ +#line 11587 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + } +#line 43260 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1776: /* join_table: table_ref normal_join table_ref USING $@156 '(' using_list ')' */ +#line 11593 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-5].table_list)->straight=(yyvsp[-6].num); + add_join_natural((yyvsp[-7].table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + (yyval.table_list)=(yyvsp[-5].table_list); + } +#line 43270 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1777: /* join_table: table_ref NATURAL inner_join table_factor */ +#line 11599 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + (yyvsp[0].table_list)->straight=(yyvsp[-1].num); + add_join_natural((yyvsp[-3].table_list),(yyvsp[0].table_list),NULL,Select); + } +#line 43282 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1778: /* $@157: %empty */ +#line 11610 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-5].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 43296 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1779: /* join_table: table_ref LEFT opt_outer JOIN_SYM table_ref ON $@157 expr */ +#line 11620 "/home/buildbot/git/sql/sql_yacc.yy" + { + add_join_on(thd, (yyvsp[-3].table_list), (yyvsp[0].item)); + (yyvsp[-3].table_list)->on_context= Lex->pop_context(); + (yyvsp[-3].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[-3].table_list); + Select->parsing_place= NO_MATTER; + } +#line 43308 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1780: /* $@158: %empty */ +#line 11628 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-4].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 43318 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1781: /* join_table: table_ref LEFT opt_outer JOIN_SYM table_factor $@158 USING '(' using_list ')' */ +#line 11634 "/home/buildbot/git/sql/sql_yacc.yy" + { + add_join_natural((yyvsp[-9].table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + (yyvsp[-5].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[-5].table_list); + } +#line 43328 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1782: /* join_table: table_ref NATURAL LEFT opt_outer JOIN_SYM table_factor */ +#line 11640 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + add_join_natural((yyvsp[-5].table_list),(yyvsp[0].table_list),NULL,Select); + (yyvsp[0].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[0].table_list); + } +#line 43341 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1783: /* $@159: %empty */ +#line 11652 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-5].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 43355 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1784: /* join_table: table_ref RIGHT opt_outer JOIN_SYM table_ref ON $@159 expr */ +#line 11662 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + add_join_on(thd, (yyval.table_list), (yyvsp[0].item)); + (yyvsp[-7].table_list)->on_context= Lex->pop_context(); + Select->parsing_place= NO_MATTER; + } +#line 43368 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1785: /* $@160: %empty */ +#line 11671 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-4].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 43378 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1786: /* join_table: table_ref RIGHT opt_outer JOIN_SYM table_factor $@160 USING '(' using_list ')' */ +#line 11677 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + add_join_natural((yyval.table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + } +#line 43389 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1787: /* join_table: table_ref NATURAL RIGHT opt_outer JOIN_SYM table_factor */ +#line 11684 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + add_join_natural((yyvsp[0].table_list),(yyvsp[-5].table_list),NULL,Select); + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + } +#line 43403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1788: /* inner_join: JOIN_SYM */ +#line 11697 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 43409 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1789: /* inner_join: INNER_SYM JOIN_SYM */ +#line 11698 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 43415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1790: /* inner_join: STRAIGHT_JOIN */ +#line 11699 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 43421 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1791: /* normal_join: inner_join */ +#line 11703 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = (yyvsp[0].num); } +#line 43427 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1792: /* normal_join: CROSS JOIN_SYM */ +#line 11704 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 43433 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1793: /* opt_use_partition: %empty */ +#line 11712 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string_list)= 0;} +#line 43439 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1795: /* use_partition: PARTITION_SYM '(' using_list ')' have_partitioning */ +#line 11718 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string_list)= (yyvsp[-2].string_list); + Select->parsing_place= Select->save_parsing_place; + Select->save_parsing_place= NO_MATTER; + } +#line 43449 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1796: /* table_factor: table_primary_ident_opt_parens */ +#line 11726 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43455 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1797: /* table_factor: table_primary_derived_opt_parens */ +#line 11727 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43461 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1798: /* table_factor: join_table_parens */ +#line 11729 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].table_list)->nested_join->nest_type= 0; + (yyval.table_list)= (yyvsp[0].table_list); + } +#line 43470 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1799: /* table_factor: table_reference_list_parens */ +#line 11733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43476 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1800: /* table_factor: table_function */ +#line 11734 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43482 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1801: /* table_primary_ident_opt_parens: table_primary_ident */ +#line 11738 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43488 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1802: /* table_primary_ident_opt_parens: '(' table_primary_ident_opt_parens ')' */ +#line 11739 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 43494 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1803: /* table_primary_derived_opt_parens: table_primary_derived */ +#line 11743 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43500 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1804: /* table_primary_derived_opt_parens: '(' table_primary_derived_opt_parens ')' */ +#line 11744 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 43506 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1805: /* table_reference_list_parens: '(' table_reference_list_parens ')' */ +#line 11748 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 43512 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1806: /* table_reference_list_parens: '(' nested_table_reference_list ')' */ +#line 11750 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->end_nested_join(thd))) + MYSQL_YYABORT; + } +#line 43521 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1807: /* nested_table_reference_list: table_ref ',' table_ref */ +#line 11758 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Select->init_nested_join(thd)) + MYSQL_YYABORT; + Select->add_joined_table((yyvsp[-2].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + (yyval.table_list)= (yyvsp[-2].table_list)->embedding; + } +#line 43533 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1808: /* nested_table_reference_list: nested_table_reference_list ',' table_ref */ +#line 11766 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->add_joined_table((yyvsp[0].table_list)); + (yyval.table_list)= (yyvsp[-2].table_list); + } +#line 43542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1809: /* join_table_parens: '(' join_table_parens ')' */ +#line 11773 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 43548 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1810: /* join_table_parens: '(' join_table ')' */ +#line 11775 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!((yyval.table_list)= lex->current_select->nest_last_join(thd))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 43561 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1811: /* table_primary_ident: table_ident opt_use_partition opt_for_system_time_clause opt_table_alias_clause opt_key_definition */ +#line 11789 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->add_table_to_list(thd, (yyvsp[-4].table), (yyvsp[-1].lex_str_ptr), + 0, + YYPS->m_lock_type, + YYPS->m_mdl_type, + Select->pop_index_hints(), + (yyvsp[-3].string_list)))) + MYSQL_YYABORT; + if ((yyvsp[-2].num)) + (yyval.table_list)->vers_conditions= Lex->vers_conditions; + } +#line 43577 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1812: /* table_primary_derived: subquery opt_for_system_time_clause table_alias_clause */ +#line 11805 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Lex->parsed_derived_table((yyvsp[-2].select_lex)->master_unit(), (yyvsp[-1].num), (yyvsp[0].lex_str_ptr)))) + MYSQL_YYABORT; + } +#line 43586 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1813: /* opt_outer: %empty */ +#line 11822 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43592 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1814: /* opt_outer: OUTER */ +#line 11823 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43598 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1815: /* index_hint_clause: %empty */ +#line 11828 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (thd->variables.old_behavior & OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN) ? + INDEX_HINT_MASK_JOIN : INDEX_HINT_MASK_ALL; + } +#line 43607 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1816: /* index_hint_clause: FOR_SYM JOIN_SYM */ +#line 11832 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_JOIN; } +#line 43613 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1817: /* index_hint_clause: FOR_SYM ORDER_SYM BY */ +#line 11833 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_ORDER; } +#line 43619 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1818: /* index_hint_clause: FOR_SYM GROUP_SYM BY */ +#line 11834 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_GROUP; } +#line 43625 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1819: /* index_hint_type: FORCE_SYM */ +#line 11838 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.index_hint)= INDEX_HINT_FORCE; } +#line 43631 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1820: /* index_hint_type: IGNORE_SYM */ +#line 11839 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.index_hint)= INDEX_HINT_IGNORE; } +#line 43637 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1821: /* $@161: %empty */ +#line 11844 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_index_hint_type((yyvsp[-2].index_hint), (yyvsp[0].num)); + } +#line 43645 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1823: /* $@162: %empty */ +#line 11849 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_index_hint_type(INDEX_HINT_USE, (yyvsp[0].num)); + } +#line 43653 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1828: /* $@163: %empty */ +#line 11862 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->alloc_index_hints(thd); } +#line 43659 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1830: /* $@164: %empty */ +#line 11866 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->clear_index_hints(); } +#line 43665 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1832: /* opt_key_usage_list: %empty */ +#line 11871 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, NULL, 0); } +#line 43671 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1833: /* opt_key_usage_list: key_usage_list */ +#line 11872 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43677 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1834: /* key_usage_element: ident */ +#line 11877 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, (yyvsp[0].ident_sys).str, (yyvsp[0].ident_sys).length); } +#line 43683 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1835: /* key_usage_element: PRIMARY_SYM */ +#line 11879 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, "PRIMARY", 7); } +#line 43689 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1838: /* using_list: ident */ +#line 11889 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.string_list)= new (thd->mem_root) List))) + MYSQL_YYABORT; + String *s= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(unlikely(s == NULL))) + MYSQL_YYABORT; + (yyval.string_list)->push_back(s, thd->mem_root); + } +#line 43704 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1839: /* using_list: using_list ',' ident */ +#line 11900 "/home/buildbot/git/sql/sql_yacc.yy" + { + String *s= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(unlikely(s == NULL))) + MYSQL_YYABORT; + if (unlikely((yyvsp[-2].string_list)->push_back(s, thd->mem_root))) + MYSQL_YYABORT; + (yyval.string_list)= (yyvsp[-2].string_list); + } +#line 43719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1840: /* interval: interval_time_stamp */ +#line 11913 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43725 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1841: /* interval: DAY_HOUR_SYM */ +#line 11914 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_HOUR; } +#line 43731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1842: /* interval: DAY_MICROSECOND_SYM */ +#line 11915 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_MICROSECOND; } +#line 43737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1843: /* interval: DAY_MINUTE_SYM */ +#line 11916 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_MINUTE; } +#line 43743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1844: /* interval: DAY_SECOND_SYM */ +#line 11917 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_SECOND; } +#line 43749 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1845: /* interval: HOUR_MICROSECOND_SYM */ +#line 11918 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_MICROSECOND; } +#line 43755 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1846: /* interval: HOUR_MINUTE_SYM */ +#line 11919 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_MINUTE; } +#line 43761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1847: /* interval: HOUR_SECOND_SYM */ +#line 11920 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_SECOND; } +#line 43767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1848: /* interval: MINUTE_MICROSECOND_SYM */ +#line 11921 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_MINUTE_MICROSECOND; } +#line 43773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1849: /* interval: MINUTE_SECOND_SYM */ +#line 11922 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_MINUTE_SECOND; } +#line 43779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1850: /* interval: SECOND_MICROSECOND_SYM */ +#line 11923 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_SECOND_MICROSECOND; } +#line 43785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1851: /* interval: YEAR_MONTH_SYM */ +#line 11924 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_YEAR_MONTH; } +#line 43791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1852: /* interval_time_stamp: DAY_SYM */ +#line 11928 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_DAY; } +#line 43797 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1853: /* interval_time_stamp: WEEK_SYM */ +#line 11929 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_WEEK; } +#line 43803 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1854: /* interval_time_stamp: HOUR_SYM */ +#line 11930 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_HOUR; } +#line 43809 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1855: /* interval_time_stamp: MINUTE_SYM */ +#line 11931 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MINUTE; } +#line 43815 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1856: /* interval_time_stamp: MONTH_SYM */ +#line 11932 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MONTH; } +#line 43821 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1857: /* interval_time_stamp: QUARTER_SYM */ +#line 11933 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_QUARTER; } +#line 43827 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1858: /* interval_time_stamp: SECOND_SYM */ +#line 11934 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_SECOND; } +#line 43833 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1859: /* interval_time_stamp: MICROSECOND_SYM */ +#line 11935 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MICROSECOND; } +#line 43839 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1860: /* interval_time_stamp: YEAR_SYM */ +#line 11936 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_YEAR; } +#line 43845 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1861: /* date_time_type: DATE_SYM */ +#line 11940 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATE;} +#line 43851 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1862: /* date_time_type: TIME_SYM */ +#line 11941 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_TIME;} +#line 43857 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1863: /* date_time_type: DATETIME */ +#line 11942 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATETIME;} +#line 43863 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1864: /* date_time_type: TIMESTAMP */ +#line 11943 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATETIME;} +#line 43869 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1868: /* opt_table_alias_clause: %empty */ +#line 11953 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str_ptr)=0; } +#line 43875 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1869: /* opt_table_alias_clause: table_alias_clause */ +#line 11954 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str_ptr)= (yyvsp[0].lex_str_ptr); } +#line 43881 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1870: /* table_alias_clause: table_alias ident_table_alias */ +#line 11959 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str_ptr)= (LEX_CSTRING*) thd->memdup(&(yyvsp[0].ident_sys),sizeof(LEX_STRING)); + if (unlikely((yyval.lex_str_ptr) == NULL)) + MYSQL_YYABORT; + } +#line 43891 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1873: /* opt_where_clause: %empty */ +#line 11972 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->where= 0; } +#line 43897 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1874: /* $@165: %empty */ +#line 11974 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_WHERE; + } +#line 43905 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1875: /* opt_where_clause: WHERE $@165 expr */ +#line 11978 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *select= Select; + select->where= normalize_cond(thd, (yyvsp[0].item)); + select->parsing_place= NO_MATTER; + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + } +#line 43917 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1877: /* $@166: %empty */ +#line 11990 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_HAVING; + } +#line 43925 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1878: /* opt_having_clause: HAVING $@166 expr */ +#line 11994 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->having= normalize_cond(thd, (yyvsp[0].item)); + sel->parsing_place= NO_MATTER; + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + } +#line 43937 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1881: /* group_list: group_list ',' order_ident order_dir */ +#line 12014 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_group_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 43946 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1882: /* group_list: order_ident order_dir */ +#line 12019 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_group_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 43955 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1883: /* olap_opt: %empty */ +#line 12026 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43961 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1884: /* olap_opt: WITH_CUBE_SYM */ +#line 12028 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + 'WITH CUBE' is reserved in the MySQL syntax, but not implemented, + and cause LALR(2) conflicts. + This syntax is not standard. + MySQL syntax: GROUP BY col1, col2, col3 WITH CUBE + SQL-2003: GROUP BY ... CUBE(col1, col2, col3) + */ + LEX *lex=Lex; + if (unlikely(lex->current_select->get_linkage() == GLOBAL_OPTIONS_TYPE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "WITH CUBE", + "global union parameters")); + lex->current_select->olap= CUBE_TYPE; + + my_yyabort_error((ER_NOT_SUPPORTED_YET, MYF(0), "CUBE")); + } +#line 43982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1885: /* olap_opt: WITH_ROLLUP_SYM */ +#line 12045 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + 'WITH ROLLUP' is needed for backward compatibility, + and cause LALR(2) conflicts. + This syntax is not standard. + MySQL syntax: GROUP BY col1, col2, col3 WITH ROLLUP + SQL-2003: GROUP BY ... ROLLUP(col1, col2, col3) + */ + LEX *lex= Lex; + if (unlikely(lex->current_select->get_linkage() == GLOBAL_OPTIONS_TYPE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "WITH ROLLUP", + "global union parameters")); + lex->current_select->olap= ROLLUP_TYPE; + } +#line 44001 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1886: /* opt_window_clause: %empty */ +#line 12067 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1887: /* opt_window_clause: WINDOW_SYM window_def_list */ +#line 12070 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44013 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1890: /* window_def: window_name AS window_spec */ +#line 12080 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_def(thd, (yyvsp[-2].lex_str_ptr), lex->win_ref, + Select->group_list, + Select->order_list, + lex->win_frame))) + MYSQL_YYABORT; + } +#line 44026 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1891: /* $@167: %empty */ +#line 12092 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->prepare_add_window_spec(thd); } +#line 44032 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1892: /* window_spec: '(' $@167 opt_window_ref opt_window_partition_clause opt_window_order_clause opt_window_frame_clause ')' */ +#line 12096 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 44038 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1893: /* opt_window_ref: %empty */ +#line 12100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1894: /* opt_window_ref: ident */ +#line 12102 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->win_ref= (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + if (unlikely(thd->lex->win_ref == NULL)) + MYSQL_YYABORT; + } +#line 44054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1895: /* opt_window_partition_clause: %empty */ +#line 12110 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 44060 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1897: /* opt_window_order_clause: %empty */ +#line 12115 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 44066 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1898: /* opt_window_order_clause: ORDER_SYM BY order_list */ +#line 12116 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->order_list= *((yyvsp[0].select_order)); } +#line 44072 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1899: /* opt_window_frame_clause: %empty */ +#line 12120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44078 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1900: /* opt_window_frame_clause: window_frame_units window_frame_extent opt_window_frame_exclusion */ +#line 12122 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->win_frame= + new (thd->mem_root) Window_frame((yyvsp[-2].frame_units), + lex->frame_top_bound, + lex->frame_bottom_bound, + (yyvsp[0].frame_exclusion)); + if (unlikely(lex->win_frame == NULL)) + MYSQL_YYABORT; + } +#line 44093 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1901: /* window_frame_units: ROWS_SYM */ +#line 12135 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_units)= Window_frame::UNITS_ROWS; } +#line 44099 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1902: /* window_frame_units: RANGE_SYM */ +#line 12136 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_units)= Window_frame::UNITS_RANGE; } +#line 44105 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1903: /* window_frame_extent: window_frame_start */ +#line 12141 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->frame_top_bound= (yyvsp[0].window_frame_bound); + lex->frame_bottom_bound= + new (thd->mem_root) + Window_frame_bound(Window_frame_bound::CURRENT, NULL); + if (unlikely(lex->frame_bottom_bound == NULL)) + MYSQL_YYABORT; + } +#line 44119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1904: /* window_frame_extent: BETWEEN_SYM window_frame_bound AND_SYM window_frame_bound */ +#line 12151 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->frame_top_bound= (yyvsp[-2].window_frame_bound); + lex->frame_bottom_bound= (yyvsp[0].window_frame_bound); + } +#line 44129 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1905: /* window_frame_start: UNBOUNDED_SYM PRECEDING_SYM */ +#line 12160 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::PRECEDING, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 44140 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1906: /* window_frame_start: CURRENT_SYM ROW_SYM */ +#line 12167 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::CURRENT, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 44151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1907: /* window_frame_start: literal PRECEDING_SYM */ +#line 12174 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::PRECEDING, (yyvsp[-1].item)); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 44162 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1908: /* window_frame_bound: window_frame_start */ +#line 12183 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.window_frame_bound)= (yyvsp[0].window_frame_bound); } +#line 44168 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1909: /* window_frame_bound: UNBOUNDED_SYM FOLLOWING_SYM */ +#line 12185 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::FOLLOWING, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 44179 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1910: /* window_frame_bound: literal FOLLOWING_SYM */ +#line 12192 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::FOLLOWING, (yyvsp[-1].item)); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 44190 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1911: /* opt_window_frame_exclusion: %empty */ +#line 12201 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 44196 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1912: /* opt_window_frame_exclusion: EXCLUDE_SYM CURRENT_SYM ROW_SYM */ +#line 12203 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_CURRENT_ROW; } +#line 44202 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1913: /* opt_window_frame_exclusion: EXCLUDE_SYM GROUP_SYM */ +#line 12205 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_GROUP; } +#line 44208 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1914: /* opt_window_frame_exclusion: EXCLUDE_SYM TIES_SYM */ +#line 12207 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_TIES; } +#line 44214 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1915: /* opt_window_frame_exclusion: EXCLUDE_SYM NO_SYM OTHERS_MARIADB_SYM */ +#line 12209 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 44220 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1916: /* opt_window_frame_exclusion: EXCLUDE_SYM NO_SYM OTHERS_ORACLE_SYM */ +#line 12211 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 44226 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1920: /* alter_order_item: simple_ident_nospvar order_dir */ +#line 12229 "/home/buildbot/git/sql/sql_yacc.yy" + { + bool ascending= ((yyvsp[0].num) == 1) ? true : false; + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item), ascending))) + MYSQL_YYABORT; + } +#line 44236 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1921: /* opt_order_clause: %empty */ +#line 12242 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_order)= NULL; } +#line 44242 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1922: /* opt_order_clause: order_clause */ +#line 12244 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_order)= (yyvsp[0].select_order); } +#line 44248 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1923: /* $@168: %empty */ +#line 12249 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->where= "ORDER clause"; + } +#line 44256 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1924: /* order_clause: ORDER_SYM BY $@168 order_list */ +#line 12253 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= (yyvsp[0].select_order); + } +#line 44264 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1925: /* order_list: order_list ',' order_ident order_dir */ +#line 12260 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= (yyvsp[-3].select_order); + if (add_to_list(thd, *(yyval.select_order), (yyvsp[-1].item),(bool) (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 44274 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1926: /* order_list: order_ident order_dir */ +#line 12266 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= new (thd->mem_root) SQL_I_List(); + if (add_to_list(thd, *(yyval.select_order), (yyvsp[-1].item), (bool) (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 44284 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1927: /* order_dir: %empty */ +#line 12274 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 44290 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1928: /* order_dir: ASC */ +#line 12275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 44296 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1929: /* order_dir: DESC */ +#line 12276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 44302 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1930: /* opt_limit_clause: %empty */ +#line 12282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_limit).clear(); } +#line 44308 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1931: /* opt_limit_clause: limit_clause */ +#line 12284 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_limit)= (yyvsp[0].select_limit); } +#line 44314 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1932: /* limit_clause: LIMIT limit_options */ +#line 12289 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[0].select_limit); + if (!(yyval.select_limit).select_limit->basic_const_item() || + (yyval.select_limit).select_limit->val_int() > 0) + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 44325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1933: /* limit_clause: LIMIT limit_options ROWS_SYM EXAMINED_SYM limit_rows_option */ +#line 12297 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[-3].select_limit); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 44334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1934: /* limit_clause: LIMIT ROWS_SYM EXAMINED_SYM limit_rows_option */ +#line 12302 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).clear(); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 44343 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1935: /* limit_clause: fetch_first_clause */ +#line 12307 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[0].select_limit); + if (!(yyval.select_limit).select_limit || + !(yyval.select_limit).select_limit->basic_const_item() || + (yyval.select_limit).select_limit->val_int() > 0) + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 44355 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1936: /* fetch_first_clause: FETCH_SYM first_or_next row_or_rows only_or_with_ties */ +#line 12318 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + (yyval.select_limit).select_limit= one; + (yyval.select_limit).offset_limit= 0; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 44369 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1937: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows FETCH_SYM first_or_next row_or_rows only_or_with_ties */ +#line 12329 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + (yyval.select_limit).select_limit= one; + (yyval.select_limit).offset_limit= (yyvsp[-5].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 44383 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1938: /* fetch_first_clause: FETCH_SYM first_or_next limit_option row_or_rows only_or_with_ties */ +#line 12339 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= 0; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 44394 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1939: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows FETCH_SYM first_or_next limit_option row_or_rows only_or_with_ties */ +#line 12347 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= (yyvsp[-6].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 44405 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1940: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows */ +#line 12354 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= 0; + (yyval.select_limit).offset_limit= (yyvsp[-1].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 44416 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1945: /* only_or_with_ties: ONLY_SYM */ +#line 12373 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 44422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1946: /* only_or_with_ties: WITH TIES_SYM */ +#line 12374 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 44428 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1947: /* opt_global_limit_clause: opt_limit_clause */ +#line 12380 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->limit_params= (yyvsp[0].select_limit); + } +#line 44436 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1948: /* limit_options: limit_option */ +#line 12387 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[0].item); + (yyval.select_limit).offset_limit= NULL; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 44447 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1949: /* limit_options: limit_option ',' limit_option */ +#line 12394 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[0].item); + (yyval.select_limit).offset_limit= (yyvsp[-2].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 44458 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1950: /* limit_options: limit_option OFFSET_SYM limit_option */ +#line 12401 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= (yyvsp[0].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 44469 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1951: /* limit_option: ident_cli */ +#line 12411 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_limit(thd, &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 44478 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1952: /* limit_option: ident_cli '.' ident_cli */ +#line 12416 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_limit(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 44487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1953: /* limit_option: param_marker */ +#line 12421 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_param)->limit_clause_param= TRUE; + } +#line 44495 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1954: /* limit_option: ULONGLONG_NUM */ +#line 12425 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 44505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1955: /* limit_option: LONG_NUM */ +#line 12431 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 44515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1956: /* limit_option: NUM */ +#line 12437 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 44525 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1957: /* limit_rows_option: limit_option */ +#line 12446 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->limit_rows_examined= (yyvsp[0].item); + } +#line 44533 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1958: /* delete_limit_clause: %empty */ +#line 12453 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->current_select->limit_params.select_limit= 0; + } +#line 44542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1959: /* delete_limit_clause: LIMIT limit_option */ +#line 12458 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->limit_params.select_limit= (yyvsp[0].item); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + sel->limit_params.explicit_limit= 1; + } +#line 44553 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1960: /* delete_limit_clause: LIMIT ROWS_SYM EXAMINED_SYM */ +#line 12464 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(); MYSQL_YYABORT; } +#line 44559 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1961: /* delete_limit_clause: LIMIT limit_option ROWS_SYM EXAMINED_SYM */ +#line 12465 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(); MYSQL_YYABORT; } +#line 44565 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1962: /* order_limit_lock: order_or_limit */ +#line 12470 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= (yyvsp[0].order_limit_lock); + (yyval.order_limit_lock)->lock.empty(); + } +#line 44574 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1963: /* order_limit_lock: order_or_limit select_lock_type */ +#line 12475 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= (yyvsp[-1].order_limit_lock); + (yyval.order_limit_lock)->lock= (yyvsp[0].select_lock); + } +#line 44583 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1964: /* order_limit_lock: select_lock_type */ +#line 12480 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= NULL; + (yyval.order_limit_lock)->limit.clear(); + (yyval.order_limit_lock)->lock= (yyvsp[0].select_lock); + } +#line 44596 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1965: /* opt_order_limit_lock: %empty */ +#line 12492 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyval.order_limit_lock)= NULL; + } +#line 44605 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1966: /* opt_order_limit_lock: order_limit_lock */ +#line 12496 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.order_limit_lock)= (yyvsp[0].order_limit_lock); } +#line 44611 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1969: /* opt_procedure_or_into: %empty */ +#line 12509 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 44619 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1970: /* opt_procedure_or_into: procedure_clause opt_select_lock_type */ +#line 12513 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 44627 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1971: /* opt_procedure_or_into: into opt_select_lock_type */ +#line 12517 "/home/buildbot/git/sql/sql_yacc.yy" + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), + " INTO " + " FROM...'"); + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 44641 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1972: /* order_or_limit: order_clause opt_limit_clause */ +#line 12531 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= (yyvsp[-1].select_order); + (yyval.order_limit_lock)->limit= (yyvsp[0].select_limit); + } +#line 44653 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1973: /* order_or_limit: limit_clause */ +#line 12539 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= NULL; + (yyval.order_limit_lock)->limit= (yyvsp[0].select_limit); + } +#line 44665 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1976: /* int_num: opt_plus NUM */ +#line 12555 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.num)= (int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44671 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1977: /* int_num: '-' NUM */ +#line 12556 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.num)= -(int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44677 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1978: /* ulong_num: opt_plus NUM */ +#line 12560 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44683 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1979: /* ulong_num: HEX_NUM */ +#line 12561 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= strtoul((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 44689 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1980: /* ulong_num: opt_plus LONG_NUM */ +#line 12562 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44695 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1981: /* ulong_num: opt_plus ULONGLONG_NUM */ +#line 12563 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1982: /* ulong_num: opt_plus DECIMAL_NUM */ +#line 12564 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44707 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1983: /* ulong_num: opt_plus FLOAT_NUM */ +#line 12565 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44713 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1984: /* real_ulong_num: NUM */ +#line 12569 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1985: /* real_ulong_num: HEX_NUM */ +#line 12570 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (ulong) strtol((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 44725 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1986: /* real_ulong_num: LONG_NUM */ +#line 12571 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1987: /* real_ulong_num: ULONGLONG_NUM */ +#line 12572 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1988: /* real_ulong_num: dec_num_error */ +#line 12573 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT; } +#line 44743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1989: /* longlong_num: opt_plus NUM */ +#line 12577 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= (longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44749 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1990: /* longlong_num: LONG_NUM */ +#line 12578 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= (longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44755 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1991: /* longlong_num: '-' NUM */ +#line 12579 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= -(longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1992: /* longlong_num: '-' LONG_NUM */ +#line 12580 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= -(longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1993: /* ulonglong_num: opt_plus NUM */ +#line 12584 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1994: /* ulonglong_num: opt_plus ULONGLONG_NUM */ +#line 12585 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1995: /* ulonglong_num: opt_plus LONG_NUM */ +#line 12586 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1996: /* ulonglong_num: opt_plus DECIMAL_NUM */ +#line 12587 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1997: /* ulonglong_num: opt_plus FLOAT_NUM */ +#line 12588 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44797 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1998: /* real_ulonglong_num: NUM */ +#line 12592 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44803 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1999: /* real_ulonglong_num: ULONGLONG_NUM */ +#line 12593 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44809 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2000: /* real_ulonglong_num: HEX_NUM */ +#line 12594 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulonglong_number)= strtoull((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 44815 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2001: /* real_ulonglong_num: LONG_NUM */ +#line 12595 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44821 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2002: /* real_ulonglong_num: dec_num_error */ +#line 12596 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT; } +#line 44827 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2003: /* dec_num_error: dec_num */ +#line 12601 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(ER_ONLY_INTEGERS_ALLOWED); } +#line 44833 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2006: /* choice: ulong_num */ +#line 12610 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.choice)= (yyvsp[0].ulong_num) != 0 ? HA_CHOICE_YES : HA_CHOICE_NO; } +#line 44839 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2007: /* choice: DEFAULT */ +#line 12611 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.choice)= HA_CHOICE_UNDEF; } +#line 44845 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2008: /* bool: ulong_num */ +#line 12615 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num) != 0; } +#line 44851 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2009: /* bool: TRUE_SYM */ +#line 12616 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1; } +#line 44857 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2010: /* bool: FALSE_SYM */ +#line 12617 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 44863 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2011: /* $@169: %empty */ +#line 12622 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->proc_list.elements=0; + lex->proc_list.first=0; + lex->proc_list.next= &lex->proc_list.first; + Item_field *item= new (thd->mem_root) + Item_field(thd, &lex->current_select->context, + (yyvsp[0].ident_sys)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + if (unlikely(add_proc_to_list(thd, item))) + MYSQL_YYABORT; + Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + + /* + PROCEDURE CLAUSE cannot handle subquery as one of its parameter, + so disallow any subqueries further. + Alow subqueries back once the parameters are reduced. + */ + Lex->clause_that_disallows_subselect= "PROCEDURE"; + Select->options|= OPTION_PROCEDURE_CLAUSE; + } +#line 44891 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2012: /* procedure_clause: PROCEDURE_SYM ident $@169 '(' procedure_list ')' */ +#line 12646 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Subqueries are allowed from now.*/ + Lex->clause_that_disallows_subselect= NULL; + } +#line 44900 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2013: /* procedure_list: %empty */ +#line 12653 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44906 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2014: /* procedure_list: procedure_list2 */ +#line 12654 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44912 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2017: /* procedure_item: remember_name expr remember_end */ +#line 12664 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_proc_to_list(thd, (yyvsp[-1].item)))) + MYSQL_YYABORT; + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 44923 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2018: /* $@170: %empty */ +#line 12673 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (!lex->describe && + unlikely((!(lex->result= new (thd->mem_root) + select_dumpvar(thd))))) + MYSQL_YYABORT; + } +#line 44935 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2019: /* select_var_list_init: $@170 select_var_list */ +#line 12681 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2021: /* select_var_list: select_var_ident */ +#line 12686 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44947 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2022: /* select_var_ident: select_outvar */ +#line 12690 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->result) + { + if (unlikely((yyvsp[0].myvar) == NULL)) + MYSQL_YYABORT; + ((select_dumpvar *)Lex->result)->var_list.push_back((yyvsp[0].myvar), thd->mem_root); + } + else + { + /* + The parser won't create select_result instance only + if it's an EXPLAIN. + */ + DBUG_ASSERT(Lex->describe); + } + } +#line 44968 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2023: /* select_outvar: '@' ident_or_text */ +#line 12710 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + (yyval.myvar) = Lex->result ? new (thd->mem_root) my_var_user(&(yyvsp[0].lex_str)) : NULL; + } +#line 44982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2024: /* select_outvar: ident_or_text */ +#line 12720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.myvar)= Lex->create_outvar(thd, &(yyvsp[0].lex_str))) && Lex->result)) + MYSQL_YYABORT; + } +#line 44991 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2025: /* select_outvar: ident '.' ident */ +#line 12725 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.myvar)= Lex->create_outvar(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))) && Lex->result)) + MYSQL_YYABORT; + } +#line 45000 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2026: /* into: INTO into_destination */ +#line 12733 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2027: /* $@171: %empty */ +#line 12738 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + if (unlikely(!(lex->exchange= + new (thd->mem_root) sql_exchange((yyvsp[0].lex_str).str, 0))) || + unlikely(!(lex->result= + new (thd->mem_root) + select_export(thd, lex->exchange)))) + MYSQL_YYABORT; + } +#line 45021 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2028: /* $@172: %empty */ +#line 12749 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->cs= (yyvsp[0].charset); } +#line 45027 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2030: /* into_destination: DUMPFILE TEXT_STRING_filesystem */ +#line 12752 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (!lex->describe) + { + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + if (unlikely(!(lex->exchange= + new (thd->mem_root) sql_exchange((yyvsp[0].lex_str).str,1)))) + MYSQL_YYABORT; + if (unlikely(!(lex->result= + new (thd->mem_root) + select_dump(thd, lex->exchange)))) + MYSQL_YYABORT; + } + } +#line 45046 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2031: /* into_destination: select_var_list_init */ +#line 12767 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + } +#line 45054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2032: /* $@173: %empty */ +#line 12778 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_DO; + if (lex->main_select_push(true)) + MYSQL_YYABORT; + lex->init_select(); + } +#line 45066 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2033: /* do: DO_SYM $@173 expr_list */ +#line 12786 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->insert_list= (yyvsp[0].item_list); + Lex->pop_select(); //main select + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 45077 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2034: /* $@174: %empty */ +#line 12800 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_command(SQLCOM_DROP_TABLE, (yyvsp[-2].num), (yyvsp[0].object_ddl_options)); + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 45088 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2035: /* drop: DROP opt_temporary table_or_tables opt_if_exists $@174 table_list opt_lock_wait_timeout opt_restrict */ +#line 12807 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45094 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2036: /* $@175: %empty */ +#line 12809 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 45103 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2037: /* drop: DROP INDEX_SYM $@175 opt_if_exists_table_element ident ON table_ident opt_lock_wait_timeout */ +#line 12814 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, (yyvsp[-3].ident_sys).str, (yyvsp[-4].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->sql_command= SQLCOM_DROP_INDEX; + lex->alter_info.reset(); + lex->alter_info.flags= ALTER_DROP_INDEX; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + if (unlikely(!lex->current_select-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + TL_READ_NO_INSERT, + MDL_SHARED_UPGRADABLE))) + MYSQL_YYABORT; + Lex->pop_select(); //main select + } +#line 45125 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2038: /* drop: DROP DATABASE opt_if_exists ident */ +#line 12832 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_command(SQLCOM_DROP_DB, (yyvsp[-1].object_ddl_options)); + lex->name= (yyvsp[0].ident_sys); + } +#line 45135 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2039: /* drop: DROP USER_SYM opt_if_exists clear_privileges user_list */ +#line 12838 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_USER, (yyvsp[-2].object_ddl_options)); + } +#line 45143 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2040: /* drop: DROP ROLE_SYM opt_if_exists clear_privileges role_list */ +#line 12842 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_ROLE, (yyvsp[-2].object_ddl_options)); + } +#line 45151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2041: /* $@176: %empty */ +#line 12846 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_VIEW, (yyvsp[0].object_ddl_options)); + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 45162 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2042: /* drop: DROP VIEW_SYM opt_if_exists $@176 table_list opt_restrict */ +#line 12853 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45168 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2043: /* drop: DROP EVENT_SYM opt_if_exists sp_name */ +#line 12855 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->spname= (yyvsp[0].spname); + Lex->set_command(SQLCOM_DROP_EVENT, (yyvsp[-1].object_ddl_options)); + } +#line 45177 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2044: /* drop: DROP TRIGGER_SYM opt_if_exists sp_name */ +#line 12860 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_TRIGGER, (yyvsp[-1].object_ddl_options)); + lex->spname= (yyvsp[0].spname); + } +#line 45187 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2045: /* drop: DROP SERVER_SYM opt_if_exists ident_or_text */ +#line 12866 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_SERVER, (yyvsp[-1].object_ddl_options)); + Lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 45196 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2046: /* $@177: %empty */ +#line 12872 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_SEQUENCE, (yyvsp[-2].num), (yyvsp[0].object_ddl_options)); + lex->table_type= TABLE_TYPE_SEQUENCE; + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 45208 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2047: /* drop: DROP opt_temporary SEQUENCE_SYM opt_if_exists $@177 table_list */ +#line 12880 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45214 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2051: /* table_name: table_ident */ +#line 12891 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!thd->lex->current_select_or_default()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, + TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type)) + MYSQL_YYABORT; + } +#line 45227 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2052: /* table_name_with_opt_use_partition: table_ident opt_use_partition */ +#line 12903 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, + TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type, + NULL, + (yyvsp[0].string_list)))) + MYSQL_YYABORT; + } +#line 45241 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2055: /* table_alias_ref: table_ident_opt_wild */ +#line 12921 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select-> + add_table_to_list(thd, (yyvsp[0].table), NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 45255 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2056: /* opt_if_exists_table_element: %empty */ +#line 12934 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= FALSE; + (yyval.num)= 0; + } +#line 45264 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2057: /* opt_if_exists_table_element: IF_SYM EXISTS */ +#line 12939 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= TRUE; + (yyval.num)= 1; + } +#line 45273 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2058: /* opt_if_exists: %empty */ +#line 12947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_NONE); + } +#line 45281 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2059: /* opt_if_exists: IF_SYM EXISTS */ +#line 12951 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_IF_EXISTS); + } +#line 45289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2060: /* opt_temporary: %empty */ +#line 12957 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 45295 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2061: /* opt_temporary: TEMPORARY */ +#line 12958 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= HA_LEX_CREATE_TMP_TABLE; } +#line 45301 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2062: /* $@178: %empty */ +#line 12966 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_INSERT; + Lex->duplicates= DUP_ERROR; + thd->get_stmt_da()->opt_clear_warning_info(thd->query_id); + thd->get_stmt_da()->reset_current_row_for_warning(1); + } +#line 45312 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2063: /* $@179: %empty */ +#line 12973 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_lock_for_tables((yyvsp[-3].lock_type), true, false); + } +#line 45320 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2064: /* insert: INSERT $@178 insert_start insert_lock_option opt_ignore opt_into insert_table $@179 insert_field_spec opt_insert_update opt_returning stmt_end */ +#line 12978 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + thd->get_stmt_da()->reset_current_row_for_warning(0); + } +#line 45329 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2065: /* $@180: %empty */ +#line 12986 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_REPLACE; + Lex->duplicates= DUP_REPLACE; + thd->get_stmt_da()->opt_clear_warning_info(thd->query_id); + thd->get_stmt_da()->reset_current_row_for_warning(1); + } +#line 45340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2066: /* $@181: %empty */ +#line 12993 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_lock_for_tables((yyvsp[-2].lock_type), true, false); + } +#line 45348 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2067: /* replace: REPLACE $@180 insert_start replace_lock_option opt_into insert_table $@181 insert_field_spec opt_returning stmt_end */ +#line 12998 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + thd->get_stmt_da()->reset_current_row_for_warning(0); + } +#line 45357 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2068: /* insert_start: %empty */ +#line 13004 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->init_select(); + Lex->inc_select_stack_outer_barrier(); + Lex->current_select->parsing_place= BEFORE_OPT_LIST; + } +#line 45369 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2069: /* stmt_end: %empty */ +#line 13013 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 45379 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2070: /* insert_lock_option: %empty */ +#line 13022 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + If it is SP we do not allow insert optimisation when result of + insert visible only after the table unlocking but everyone can + read table. + */ + (yyval.lock_type)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 45392 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2072: /* insert_lock_option: HIGH_PRIORITY */ +#line 13031 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE; } +#line 45398 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2073: /* replace_lock_option: %empty */ +#line 13035 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 45404 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2075: /* insert_replace_option: LOW_PRIORITY */ +#line 13040 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 45410 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2076: /* insert_replace_option: DELAYED_SYM */ +#line 13042 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->keyword_delayed_begin_offset= (uint)((yyvsp[0].kwd).pos() - thd->query()); + Lex->keyword_delayed_end_offset= (uint)((yyvsp[0].kwd).end() - thd->query()); + (yyval.lock_type)= TL_WRITE_DELAYED; + } +#line 45420 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2079: /* $@182: %empty */ +#line 13052 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->save_parsing_place= Select->parsing_place; + } +#line 45428 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2080: /* insert_table: $@182 table_name_with_opt_use_partition */ +#line 13056 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + //lex->field_list.empty(); + lex->many_values.empty(); + lex->insert_list=0; + } +#line 45439 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2081: /* insert_field_spec: insert_values */ +#line 13065 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45445 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2082: /* insert_field_spec: insert_field_list insert_values */ +#line 13066 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45451 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2083: /* $@183: %empty */ +#line 13068 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item)) || + unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + lex->current_select->parsing_place= NO_MATTER; + } +#line 45464 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2085: /* insert_field_list: LEFT_PAREN_ALT opt_fields ')' */ +#line 13081 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->current_select->parsing_place= AFTER_LIST; + } +#line 45472 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2088: /* fields: fields ',' insert_ident */ +#line 13093 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 45478 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2089: /* fields: insert_ident */ +#line 13094 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 45484 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2090: /* insert_values: create_select_query_expression */ +#line 13100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45490 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2095: /* ident_eq_value: simple_ident_nospvar equal expr_or_ignore_or_default */ +#line 13115 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->field_list.push_back((yyvsp[-2].item), thd->mem_root)) || + unlikely(lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 45501 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2096: /* equal: '=' */ +#line 13124 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45507 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2097: /* equal: SET_VAR */ +#line 13125 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45513 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2098: /* opt_equal: %empty */ +#line 13129 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45519 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2099: /* opt_equal: equal */ +#line 13130 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45525 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2100: /* opt_with: opt_equal */ +#line 13134 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45531 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2101: /* opt_with: WITH */ +#line 13135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45537 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2102: /* opt_by: opt_equal */ +#line 13139 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45543 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2103: /* opt_by: BY */ +#line 13140 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45549 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2104: /* $@184: %empty */ +#line 13145 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 45558 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2105: /* no_braces: '(' $@184 opt_values ')' */ +#line 13150 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + thd->get_stmt_da()->inc_current_row_for_warning(); + if (unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 45570 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2106: /* $@185: %empty */ +#line 13161 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 45579 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2107: /* no_braces_with_names: '(' $@185 opt_values_with_names ')' */ +#line 13166 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + thd->get_stmt_da()->inc_current_row_for_warning(); + if (unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 45591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2108: /* opt_values: %empty */ +#line 13176 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2110: /* opt_values_with_names: %empty */ +#line 13181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45603 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2112: /* values: values ',' expr_or_ignore_or_default */ +#line 13187 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 45612 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2113: /* values: expr_or_ignore_or_default */ +#line 13192 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 45621 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2114: /* values_with_names: values_with_names ',' remember_name expr_or_ignore_or_default remember_end */ +#line 13200 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + // give some name in case of using in table value constuctor (TVC) + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 45633 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2115: /* values_with_names: remember_name expr_or_ignore_or_default remember_end */ +#line 13208 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + // give some name in case of using in table value constuctor (TVC) + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 45645 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2116: /* expr_or_ignore: expr */ +#line 13218 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item);} +#line 45651 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2117: /* expr_or_ignore: IGNORE_SYM */ +#line 13220 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_ignore_specification(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 45661 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2118: /* expr_or_ignore_or_default: expr_or_ignore */ +#line 13228 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item);} +#line 45667 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2119: /* expr_or_ignore_or_default: DEFAULT */ +#line 13230 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_default_specification(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 45677 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2121: /* $@186: %empty */ +#line 13239 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates= DUP_UPDATE; } +#line 45683 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2122: /* $@187: %empty */ +#line 13241 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_UPDATE_ON_DUP_KEY; + } +#line 45691 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2123: /* opt_insert_update: ON DUPLICATE_SYM $@186 KEY_SYM UPDATE_SYM $@187 insert_update_list */ +#line 13245 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + } +#line 45699 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2124: /* update_table_list: table_ident opt_use_partition for_portion_of_time_clause opt_table_alias_clause opt_key_definition */ +#line 13253 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->add_table_to_list(thd, (yyvsp[-4].table), (yyvsp[-1].lex_str_ptr), + 0, + YYPS->m_lock_type, + YYPS->m_mdl_type, + Select->pop_index_hints(), + (yyvsp[-3].string_list)))) + MYSQL_YYABORT; + (yyval.table_list)->period_conditions= Lex->period_conditions; + } +#line 45714 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2125: /* update_table_list: join_table_list */ +#line 13263 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 45720 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2126: /* $@188: %empty */ +#line 13270 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->sql_command= SQLCOM_UPDATE; + lex->duplicates= DUP_ERROR; + } +#line 45733 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2127: /* $@189: %empty */ +#line 13280 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *slex= Lex->first_select_lex(); + if (slex->table_list.elements > 1) + Lex->sql_command= SQLCOM_UPDATE_MULTI; + else if (slex->get_table_list()->derived) + { + /* it is single table update and it is update of derived table */ + my_error(ER_NON_UPDATABLE_TABLE, MYF(0), + slex->get_table_list()->alias.str, "UPDATE"); + MYSQL_YYABORT; + } + /* + In case of multi-update setting write lock for all tables may + be too pessimistic. We will decrease lock level if possible in + mysql_multi_update(). + */ + slex->set_lock_for_tables((yyvsp[-4].lock_type), slex->table_list.elements == 1, false); + } +#line 45756 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2128: /* $@190: %empty */ +#line 13299 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].select_order)) + Select->order_list= *((yyvsp[-1].select_order)); + } +#line 45765 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2129: /* update: UPDATE_SYM $@188 opt_low_priority opt_ignore update_table_list SET update_list $@189 opt_where_clause opt_order_clause delete_limit_clause $@190 stmt_end */ +#line 13302 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45771 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2132: /* update_elem: simple_ident_nospvar equal DEFAULT */ +#line 13312 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *def= new (thd->mem_root) Item_default_value(thd, + Lex->current_context(), (yyvsp[-2].item), 1); + if (!def || add_item_to_list(thd, (yyvsp[-2].item)) || add_value_to_list(thd, def)) + MYSQL_YYABORT; + } +#line 45782 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2133: /* update_elem: simple_ident_nospvar equal expr_or_ignore */ +#line 13319 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (add_item_to_list(thd, (yyvsp[-2].item)) || add_value_to_list(thd, (yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 45791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2136: /* insert_update_elem: simple_ident_nospvar equal expr_or_ignore_or_default */ +#line 13332 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->update_list.push_back((yyvsp[-2].item), thd->mem_root)) || + unlikely(lex->value_list.push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 45802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2137: /* opt_low_priority: %empty */ +#line 13341 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 45808 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2138: /* opt_low_priority: LOW_PRIORITY */ +#line 13342 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 45814 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2139: /* $@191: %empty */ +#line 13349 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_DELETE; + YYPS->m_lock_type= TL_WRITE_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_WRITE; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->ignore= 0; + lex->first_select_lex()->order_list.empty(); + } +#line 45830 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2140: /* delete: DELETE_SYM $@191 delete_part2 */ +#line 13361 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 45839 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2141: /* opt_delete_system_time: %empty */ +#line 13369 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_HISTORY); + } +#line 45847 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2142: /* opt_delete_system_time: BEFORE_SYM SYSTEM_TIME_SYM history_point */ +#line 13373 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_BEFORE, (yyvsp[0].vers_history_point)); + } +#line 45855 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2143: /* delete_part2: opt_delete_options single_multi */ +#line 13379 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45861 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2144: /* delete_part2: HISTORY_SYM delete_single_table opt_delete_system_time */ +#line 13381 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_table()->vers_conditions= Lex->vers_conditions; + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 45872 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2145: /* delete_single_table: FROM table_ident opt_use_partition */ +#line 13391 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type, + NULL, + (yyvsp[0].string_list)))) + MYSQL_YYABORT; + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45888 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2146: /* delete_single_table_for_period: delete_single_table opt_for_portion_of_time_clause */ +#line 13406 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].num)) + Lex->last_table()->period_conditions= Lex->period_conditions; + } +#line 45897 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2147: /* single_multi: delete_single_table_for_period opt_where_clause opt_order_clause delete_limit_clause opt_returning */ +#line 13418 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-2].select_order)) + Select->order_list= *((yyvsp[-2].select_order)); + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 45909 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2148: /* $@192: %empty */ +#line 13426 "/home/buildbot/git/sql/sql_yacc.yy" + { + mysql_init_multi_delete(Lex); + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45919 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2149: /* $@193: %empty */ +#line 13432 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(multi_delete_set_locks_and_link_aux_tables(Lex))) + MYSQL_YYABORT; + } +#line 45928 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2150: /* single_multi: table_wild_list $@192 FROM join_table_list opt_where_clause $@193 stmt_end */ +#line 13435 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45934 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2151: /* $@194: %empty */ +#line 13437 "/home/buildbot/git/sql/sql_yacc.yy" + { + mysql_init_multi_delete(Lex); + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45944 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2152: /* $@195: %empty */ +#line 13443 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(multi_delete_set_locks_and_link_aux_tables(Lex))) + MYSQL_YYABORT; + } +#line 45953 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2153: /* single_multi: FROM table_alias_ref_list $@194 USING join_table_list opt_where_clause $@195 stmt_end */ +#line 13446 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45959 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2154: /* opt_returning: %empty */ +#line 13451 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(!Lex->has_returning()); + } +#line 45967 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2155: /* $@196: %empty */ +#line 13455 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(!Lex->has_returning()); + /* + When parsing_place is IN_RETURNING, we push select items to + item_list of builtin_select instead of current_select. + But set parsing_place of current_select to true. + + Because parsing_place for builtin_select will be IN_RETURNING, + regardless there is SELECT in RETURNING. Example, if + there is RETURNING (SELECT...), then when we parse + SELECT inside RETURNING, builtin_select->parsing_place + will still be true. So the select items of SELECT inside + RETURNING will be added to item_list of builtin_select which + is incorrect. We want to prevent this from happening. + Since for every new select, a new SELECT_LEX + object is created and pushed to select stack, current_select + will point to SELECT inside RETURNING, and also has + parsing_place not set to IN_RETURNING by default. + So items are correctly added to item_list of SELECT inside + RETURNING instead of builtin_select. + */ + + thd->lex->current_select->parsing_place= IN_RETURNING; + thd->lex->push_context(&thd->lex->returning()->context); + } +#line 45997 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2156: /* opt_returning: RETURNING_SYM $@196 select_item_list */ +#line 13481 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->pop_context(); + thd->lex->current_select->parsing_place= NO_MATTER; + } +#line 46006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2159: /* table_wild_one: ident opt_wild */ +#line 13494 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_ident *ti= new (thd->mem_root) Table_ident(&(yyvsp[-1].ident_sys)); + if (unlikely(ti == NULL)) + MYSQL_YYABORT; + if (unlikely(!Select-> + add_table_to_list(thd, + ti, + NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 46025 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2160: /* table_wild_one: ident '.' ident opt_wild */ +#line 13509 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_ident *ti= new (thd->mem_root) Table_ident(thd, &(yyvsp[-3].ident_sys), &(yyvsp[-1].ident_sys), 0); + if (unlikely(ti == NULL)) + MYSQL_YYABORT; + if (unlikely(!Select-> + add_table_to_list(thd, + ti, + NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 46044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2161: /* opt_wild: %empty */ +#line 13526 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2162: /* opt_wild: '.' '*' */ +#line 13527 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46056 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2163: /* opt_delete_options: %empty */ +#line 13531 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46062 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2164: /* opt_delete_options: opt_delete_option opt_delete_options */ +#line 13532 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2165: /* opt_delete_option: QUICK */ +#line 13536 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_QUICK; } +#line 46074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2166: /* opt_delete_option: LOW_PRIORITY */ +#line 13537 "/home/buildbot/git/sql/sql_yacc.yy" + { YYPS->m_lock_type= TL_WRITE_LOW_PRIORITY; } +#line 46080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2167: /* opt_delete_option: IGNORE_SYM */ +#line 13538 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1; } +#line 46086 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2168: /* $@197: %empty */ +#line 13543 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= Lex; + lex->sql_command= SQLCOM_TRUNCATE; + lex->alter_info.reset(); + lex->first_select_lex()->options= 0; + lex->sql_cache= LEX::SQL_CACHE_UNSPECIFIED; + lex->first_select_lex()->order_list.empty(); + YYPS->m_lock_type= TL_WRITE; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 46101 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2169: /* $@198: %empty */ +#line 13554 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_truncate_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 46113 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2170: /* truncate: TRUNCATE_SYM $@197 opt_table_sym table_name opt_lock_wait_timeout $@198 opt_truncate_table_storage_clause */ +#line 13561 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 46119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2177: /* profile_def: CPU_SYM */ +#line 13579 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_CPU; + } +#line 46127 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2178: /* profile_def: MEMORY_SYM */ +#line 13583 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_MEMORY; + } +#line 46135 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2179: /* profile_def: BLOCK_SYM IO_SYM */ +#line 13587 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_BLOCK_IO; + } +#line 46143 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2180: /* profile_def: CONTEXT_SYM SWITCHES_SYM */ +#line 13591 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_CONTEXT; + } +#line 46151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2181: /* profile_def: PAGE_SYM FAULTS_SYM */ +#line 13595 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_PAGE_FAULTS; + } +#line 46159 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2182: /* profile_def: IPC_SYM */ +#line 13599 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_IPC; + } +#line 46167 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2183: /* profile_def: SWAPS_SYM */ +#line 13603 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_SWAPS; + } +#line 46175 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2184: /* profile_def: SOURCE_SYM */ +#line 13607 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_SOURCE; + } +#line 46183 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2185: /* profile_def: ALL */ +#line 13611 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_ALL; + } +#line 46191 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2186: /* opt_profile_args: %empty */ +#line 13618 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_query_id= 0; + } +#line 46199 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2187: /* opt_profile_args: FOR_SYM QUERY_SYM NUM */ +#line 13622 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_query_id= atoi((yyvsp[0].lex_str).str); + } +#line 46207 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2188: /* $@199: %empty */ +#line 13631 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->wild=0; + lex->ident= null_clex_str; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->create_info.init(); + } +#line 46222 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2189: /* show: SHOW $@199 show_param */ +#line 13642 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + } +#line 46231 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2190: /* show_param: DATABASES wild_and_where */ +#line 13650 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_DATABASES; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SCHEMATA))) + MYSQL_YYABORT; + } +#line 46242 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2191: /* show_param: opt_full TABLES opt_db wild_and_where */ +#line 13657 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TABLES; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TABLE_NAMES)) + MYSQL_YYABORT; + } +#line 46254 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2192: /* show_param: opt_full TRIGGERS_SYM opt_db wild_and_where */ +#line 13665 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TRIGGERS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TRIGGERS)) + MYSQL_YYABORT; + } +#line 46266 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2193: /* show_param: EVENTS_SYM opt_db wild_and_where */ +#line 13673 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_EVENTS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_EVENTS)) + MYSQL_YYABORT; + } +#line 46278 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2194: /* show_param: TABLE_SYM STATUS_SYM opt_db wild_and_where */ +#line 13681 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TABLE_STATUS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TABLES)) + MYSQL_YYABORT; + } +#line 46290 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2195: /* show_param: OPEN_SYM TABLES opt_db wild_and_where */ +#line 13689 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_OPEN_TABLES; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_OPEN_TABLES)) + MYSQL_YYABORT; + } +#line 46302 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2196: /* show_param: PLUGINS_SYM */ +#line 13697 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PLUGINS))) + MYSQL_YYABORT; + } +#line 46313 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2197: /* show_param: PLUGINS_SYM SONAME_SYM TEXT_STRING_sys */ +#line 13704 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->ident= (yyvsp[0].lex_str); + Lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS))) + MYSQL_YYABORT; + } +#line 46324 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2198: /* show_param: PLUGINS_SYM SONAME_SYM wild_and_where */ +#line 13711 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS))) + MYSQL_YYABORT; + } +#line 46334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2199: /* show_param: ENGINE_SYM known_storage_engines show_engine_param */ +#line 13717 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.db_type= (yyvsp[-1].db_type); } +#line 46340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2200: /* show_param: ENGINE_SYM ALL show_engine_param */ +#line 13719 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.db_type= NULL; } +#line 46346 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2201: /* show_param: opt_full COLUMNS from_or_in table_ident opt_db wild_and_where */ +#line 13721 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_FIELDS; + if ((yyvsp[-1].lex_str).str) + (yyvsp[-2].table)->change_db(&(yyvsp[-1].lex_str)); + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[-2].table), SCH_COLUMNS))) + MYSQL_YYABORT; + } +#line 46359 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2202: /* show_param: master_or_binary LOGS_SYM */ +#line 13730 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOGS; + } +#line 46367 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2203: /* show_param: SLAVE HOSTS_SYM */ +#line 13734 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_SLAVE_HOSTS; + } +#line 46375 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2204: /* $@200: %empty */ +#line 13738 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_BINLOG_EVENTS; + } +#line 46384 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2206: /* $@201: %empty */ +#line 13744 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_RELAYLOG_EVENTS; + } +#line 46393 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2207: /* show_param: RELAYLOG_SYM optional_connection_name EVENTS_SYM binlog_in binlog_from $@201 opt_global_limit_clause optional_for_channel */ +#line 13749 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 46399 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2208: /* show_param: keys_or_index from_or_in table_ident opt_db opt_where_clause */ +#line 13751 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_KEYS; + if ((yyvsp[-1].lex_str).str) + (yyvsp[-2].table)->change_db(&(yyvsp[-1].lex_str)); + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[-2].table), SCH_STATISTICS))) + MYSQL_YYABORT; + } +#line 46412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2209: /* show_param: opt_storage ENGINES_SYM */ +#line 13760 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_ENGINES))) + MYSQL_YYABORT; + } +#line 46423 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2210: /* show_param: AUTHORS_SYM */ +#line 13767 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_AUTHORS; + } +#line 46432 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2211: /* show_param: CONTRIBUTORS_SYM */ +#line 13772 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS; + } +#line 46441 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2212: /* show_param: PRIVILEGES */ +#line 13777 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_PRIVILEGES; + } +#line 46450 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2213: /* show_param: COUNT_SYM '(' '*' ')' WARNINGS */ +#line 13782 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING var= {STRING_WITH_LEN("warning_count")}; + (void) create_select_for_variable(thd, &var); + } +#line 46459 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2214: /* show_param: COUNT_SYM '(' '*' ')' ERRORS */ +#line 13787 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING var= {STRING_WITH_LEN("error_count")}; + (void) create_select_for_variable(thd, &var); + } +#line 46468 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2215: /* show_param: WARNINGS opt_global_limit_clause */ +#line 13792 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_WARNS;} +#line 46474 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2216: /* show_param: ERRORS opt_global_limit_clause */ +#line 13794 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_ERRORS;} +#line 46480 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2217: /* show_param: PROFILES_SYM */ +#line 13796 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_PROFILES; } +#line 46486 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2218: /* show_param: PROFILE_SYM opt_profile_defs opt_profile_args opt_global_limit_clause */ +#line 13798 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_PROFILE; + if (unlikely(prepare_schema_table(thd, lex, NULL, SCH_PROFILES))) + MYSQL_YYABORT; + } +#line 46497 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2219: /* show_param: opt_var_type STATUS_SYM wild_and_where */ +#line 13805 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS; + lex->option_type= (yyvsp[-2].var_type); + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SESSION_STATUS))) + MYSQL_YYABORT; + } +#line 46509 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2220: /* show_param: opt_full PROCESSLIST_SYM */ +#line 13813 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} +#line 46515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2221: /* show_param: opt_var_type VARIABLES wild_and_where */ +#line 13815 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_VARIABLES; + lex->option_type= (yyvsp[-2].var_type); + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SESSION_VARIABLES))) + MYSQL_YYABORT; + } +#line 46527 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2222: /* show_param: charset wild_and_where */ +#line 13823 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_CHARSETS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_CHARSETS))) + MYSQL_YYABORT; + } +#line 46538 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2223: /* show_param: COLLATION_SYM wild_and_where */ +#line 13830 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_COLLATIONS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_COLLATIONS))) + MYSQL_YYABORT; + } +#line 46549 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2224: /* show_param: GRANTS */ +#line 13837 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_GRANTS; + if (unlikely(!(Lex->grant_user= + (LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + Lex->grant_user->user= current_user_and_current_role; + } +#line 46561 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2225: /* show_param: GRANTS FOR_SYM user_or_role clear_privileges */ +#line 13845 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_GRANTS; + lex->grant_user=(yyvsp[-1].lex_user); + } +#line 46571 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2226: /* show_param: CREATE DATABASE opt_if_not_exists ident */ +#line 13851 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_SHOW_CREATE_DB, (yyvsp[-1].object_ddl_options)); + Lex->name= (yyvsp[0].ident_sys); + } +#line 46580 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2227: /* show_param: CREATE TABLE_SYM table_ident */ +#line 13856 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL,0)) + MYSQL_YYABORT; + lex->create_info.storage_media= HA_SM_DEFAULT; + } +#line 46592 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2228: /* show_param: CREATE VIEW_SYM table_ident */ +#line 13864 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL, 0)) + MYSQL_YYABORT; + lex->table_type= TABLE_TYPE_VIEW; + } +#line 46604 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2229: /* show_param: CREATE SEQUENCE_SYM table_ident */ +#line 13872 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL, 0)) + MYSQL_YYABORT; + lex->table_type= TABLE_TYPE_SEQUENCE; + } +#line 46616 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2230: /* show_param: BINLOG_SYM STATUS_SYM */ +#line 13880 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOG_STAT; + } +#line 46624 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2231: /* show_param: MASTER_SYM STATUS_SYM */ +#line 13884 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOG_STAT; + } +#line 46632 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2232: /* show_param: ALL SLAVES STATUS_SYM */ +#line 13888 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_show_slave_status(true))) + MYSQL_YYABORT; + Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; + } +#line 46643 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2233: /* show_param: SLAVE optional_connection_name STATUS_SYM optional_for_channel */ +#line 13895 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_show_slave_status())) + MYSQL_YYABORT; + Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; + } +#line 46654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2234: /* show_param: CREATE PROCEDURE_SYM sp_name */ +#line 13902 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sql_command = SQLCOM_SHOW_CREATE_PROC; + lex->spname= (yyvsp[0].spname); + } +#line 46665 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2235: /* show_param: CREATE FUNCTION_SYM sp_name */ +#line 13909 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sql_command = SQLCOM_SHOW_CREATE_FUNC; + lex->spname= (yyvsp[0].spname); + } +#line 46676 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2236: /* show_param: CREATE PACKAGE_MARIADB_SYM sp_name */ +#line 13916 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE; + lex->spname= (yyvsp[0].spname); + } +#line 46686 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2237: /* show_param: CREATE PACKAGE_ORACLE_SYM sp_name */ +#line 13922 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE; + lex->spname= (yyvsp[0].spname); + } +#line 46696 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2238: /* show_param: CREATE PACKAGE_MARIADB_SYM BODY_MARIADB_SYM sp_name */ +#line 13928 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE_BODY; + lex->spname= (yyvsp[0].spname); + } +#line 46706 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2239: /* show_param: CREATE PACKAGE_ORACLE_SYM BODY_ORACLE_SYM sp_name */ +#line 13934 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE_BODY; + lex->spname= (yyvsp[0].spname); + } +#line 46716 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2240: /* show_param: CREATE TRIGGER_SYM sp_name */ +#line 13940 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_CREATE_TRIGGER; + lex->spname= (yyvsp[0].spname); + } +#line 46726 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2241: /* show_param: CREATE USER_SYM */ +#line 13946 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_CREATE_USER; + if (unlikely(!(Lex->grant_user= + (LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + Lex->grant_user->user= current_user; + } +#line 46738 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2242: /* show_param: CREATE USER_SYM user */ +#line 13954 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_CREATE_USER; + Lex->grant_user= (yyvsp[0].lex_user); + } +#line 46747 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2243: /* show_param: PROCEDURE_SYM STATUS_SYM wild_and_where */ +#line 13959 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PROC; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46758 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2244: /* show_param: FUNCTION_SYM STATUS_SYM wild_and_where */ +#line 13966 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_FUNC; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46769 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2245: /* show_param: PACKAGE_MARIADB_SYM STATUS_SYM wild_and_where */ +#line 13973 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46780 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2246: /* show_param: PACKAGE_ORACLE_SYM STATUS_SYM wild_and_where */ +#line 13980 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2247: /* show_param: PACKAGE_MARIADB_SYM BODY_MARIADB_SYM STATUS_SYM wild_and_where */ +#line 13987 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE_BODY; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2248: /* show_param: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM STATUS_SYM wild_and_where */ +#line 13994 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE_BODY; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46813 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2249: /* show_param: PROCEDURE_SYM CODE_SYM sp_name */ +#line 14001 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PROC_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46822 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2250: /* show_param: FUNCTION_SYM CODE_SYM sp_name */ +#line 14006 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_FUNC_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46831 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2251: /* show_param: PACKAGE_MARIADB_SYM BODY_MARIADB_SYM CODE_SYM sp_name */ +#line 14011 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PACKAGE_BODY_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46840 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2252: /* show_param: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM CODE_SYM sp_name */ +#line 14016 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PACKAGE_BODY_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46849 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2253: /* show_param: CREATE EVENT_SYM sp_name */ +#line 14021 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->spname= (yyvsp[0].spname); + Lex->sql_command = SQLCOM_SHOW_CREATE_EVENT; + } +#line 46858 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2254: /* show_param: describe_command opt_format_json FOR_SYM expr */ +#line 14030 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_EXPLAIN; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_EXPLAIN_JSON : SCH_EXPLAIN_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 46870 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2255: /* show_param: ANALYZE_SYM opt_format_json FOR_SYM expr */ +#line 14038 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_ANALYZE; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_ANALYZE_JSON : SCH_ANALYZE_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 46882 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2256: /* show_param: IDENT_sys remember_tok_start wild_and_where */ +#line 14046 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + bool in_plugin; + lex->sql_command= SQLCOM_SHOW_GENERIC; + ST_SCHEMA_TABLE *table= find_schema_table(thd, &(yyvsp[-2].ident_sys), &in_plugin); + if (unlikely(!table || !table->old_format || !in_plugin)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[-1].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(lex->wild && table->idx_field1 < 0)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(make_schema_select(thd, Lex->current_select, table))) + MYSQL_YYABORT; + } +#line 46905 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2257: /* show_engine_param: STATUS_SYM */ +#line 14068 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_STATUS; } +#line 46911 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2258: /* show_engine_param: MUTEX_SYM */ +#line 14070 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_MUTEX; } +#line 46917 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2259: /* show_engine_param: LOGS_SYM */ +#line 14072 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_LOGS; } +#line 46923 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2264: /* opt_db: %empty */ +#line 14086 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 46929 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2265: /* opt_db: from_or_in ident */ +#line 14087 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 46935 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2266: /* opt_full: %empty */ +#line 14091 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->verbose=0; } +#line 46941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2267: /* opt_full: FULL */ +#line 14092 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->verbose=1; } +#line 46947 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2270: /* binlog_in: %empty */ +#line 14101 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.log_file_name = 0; } +#line 46953 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2271: /* binlog_in: IN_SYM TEXT_STRING_sys */ +#line 14102 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.log_file_name = (yyvsp[0].lex_str).str; } +#line 46959 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2272: /* binlog_from: %empty */ +#line 14106 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.pos = 4; /* skip magic number */ } +#line 46965 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2273: /* binlog_from: FROM ulonglong_num */ +#line 14107 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.pos = (yyvsp[0].ulonglong_number); } +#line 46971 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2274: /* wild_and_where: %empty */ +#line 14111 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.simple_string)= 0; } +#line 46977 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2275: /* wild_and_where: LIKE remember_tok_start TEXT_STRING_sys */ +#line 14113 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->wild= new (thd->mem_root) String((const char*) (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length, + system_charset_info); + if (unlikely(Lex->wild == NULL)) + MYSQL_YYABORT; + (yyval.simple_string)= (yyvsp[-1].simple_string); + } +#line 46990 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2276: /* wild_and_where: WHERE remember_tok_start expr */ +#line 14122 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->where= normalize_cond(thd, (yyvsp[0].item)); + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + (yyval.simple_string)= (yyvsp[-1].simple_string); + } +#line 47001 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2277: /* $@202: %empty */ +#line 14133 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->sql_command= SQLCOM_SHOW_FIELDS; + lex->first_select_lex()->db= null_clex_str; + lex->verbose= 0; + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[0].table), SCH_COLUMNS))) + MYSQL_YYABORT; + } +#line 47018 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2278: /* describe: describe_command table_ident $@202 opt_describe_column */ +#line 14146 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + } +#line 47027 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2279: /* $@203: %empty */ +#line 14151 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_NORMAL; } +#line 47033 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2280: /* describe: describe_command opt_extended_describe $@203 explainable_command */ +#line 14153 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->first_select_lex()->options|= SELECT_DESCRIBE; + } +#line 47042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2289: /* analyze_stmt_command: ANALYZE_SYM opt_format_json explainable_command */ +#line 14175 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->analyze_stmt= true; + } +#line 47050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2290: /* opt_extended_describe: EXTENDED_SYM */ +#line 14181 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_EXTENDED; } +#line 47056 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2291: /* opt_extended_describe: EXTENDED_SYM ALL */ +#line 14183 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_EXTENDED | DESCRIBE_EXTENDED2; } +#line 47062 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2292: /* opt_extended_describe: PARTITIONS_SYM */ +#line 14184 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_PARTITIONS; } +#line 47068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2293: /* opt_extended_describe: opt_format_json */ +#line 14185 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2294: /* opt_format_json: %empty */ +#line 14189 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2295: /* opt_format_json: FORMAT_SYM '=' ident_or_text */ +#line 14191 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("JSON"))) + Lex->explain_json= true; + else if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("TRADITIONAL"))) + DBUG_ASSERT(Lex->explain_json==false); + else + my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), + "EXPLAIN/ANALYZE", (yyvsp[0].lex_str).str)); + } +#line 47094 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2296: /* opt_describe_column: %empty */ +#line 14203 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47100 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2297: /* opt_describe_column: text_string */ +#line 14204 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->wild= (yyvsp[0].string); } +#line 47106 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2298: /* opt_describe_column: ident */ +#line 14206 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->wild= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(Lex->wild == NULL)) + MYSQL_YYABORT; + } +#line 47118 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2299: /* explain_for_connection: describe_command opt_format_json FOR_SYM CONNECTION_SYM expr */ +#line 14222 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->wild=0; + lex->ident= null_clex_str; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->create_info.init(); + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + Lex->sql_command= SQLCOM_SHOW_EXPLAIN; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_EXPLAIN_JSON : SCH_EXPLAIN_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 47140 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2300: /* $@204: %empty */ +#line 14245 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_FLUSH; + lex->type= 0; + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 47151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2301: /* flush: FLUSH_SYM opt_no_write_to_binlog $@204 flush_options */ +#line 14251 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47157 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2302: /* $@205: %empty */ +#line 14256 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_TABLES; + /* + Set type of metadata and table locks for + FLUSH TABLES table_list [WITH READ LOCK]. + */ + YYPS->m_lock_type= TL_READ_NO_INSERT; + YYPS->m_mdl_type= MDL_SHARED_HIGH_PRIO; + } +#line 47171 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2303: /* flush_options: table_or_tables $@205 opt_table_list opt_flush_lock */ +#line 14266 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47177 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2304: /* flush_options: flush_options_list */ +#line 14268 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47183 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2305: /* opt_flush_lock: %empty */ +#line 14272 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47189 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2306: /* opt_flush_lock: flush_lock */ +#line 14274 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *tables= Lex->query_tables; + for (; tables; tables= tables->next_global) + { + tables->mdl_request.set_type(MDL_SHARED_NO_WRITE); + /* Ignore temporary tables. */ + tables->open_type= OT_BASE_ONLY; + } + } +#line 47203 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2307: /* flush_lock: WITH READ_SYM LOCK_SYM optional_flush_tables_arguments */ +#line 14287 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_READ_LOCK | (yyvsp[0].num); } +#line 47209 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2308: /* $@206: %empty */ +#line 14289 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->query_tables == NULL)) + { + // Table list can't be empty + thd->parse_error(ER_NO_TABLES_USED); + MYSQL_YYABORT; + } + Lex->type|= REFRESH_FOR_EXPORT; + } +#line 47223 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2309: /* flush_lock: FOR_SYM $@206 EXPORT_SYM */ +#line 14297 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47229 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2311: /* flush_options_list: flush_option */ +#line 14303 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47235 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2312: /* flush_option: ERROR_SYM LOGS_SYM */ +#line 14308 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_ERROR_LOG; } +#line 47241 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2313: /* flush_option: ENGINE_SYM LOGS_SYM */ +#line 14310 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_ENGINE_LOG; } +#line 47247 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2314: /* flush_option: GENERAL LOGS_SYM */ +#line 14312 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_GENERAL_LOG; } +#line 47253 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2315: /* flush_option: SLOW LOGS_SYM */ +#line 14314 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SLOW_LOG; } +#line 47259 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2316: /* flush_option: BINARY LOGS_SYM opt_delete_gtid_domain */ +#line 14316 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_BINARY_LOG; } +#line 47265 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2317: /* flush_option: RELAY LOGS_SYM optional_connection_name optional_for_channel */ +#line 14318 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->type & REFRESH_RELAY_LOG)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "FLUSH", "RELAY LOGS")); + lex->type|= REFRESH_RELAY_LOG; + lex->relay_log_connection_name= lex->mi.connection_name; + } +#line 47277 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2318: /* flush_option: QUERY_SYM CACHE_SYM */ +#line 14326 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_QUERY_CACHE_FREE; } +#line 47283 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2319: /* flush_option: HOSTS_SYM */ +#line 14328 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_HOSTS; } +#line 47289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2320: /* flush_option: PRIVILEGES */ +#line 14330 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_GRANT; } +#line 47295 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2321: /* flush_option: LOGS_SYM */ +#line 14332 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_LOG; + Lex->relay_log_connection_name= empty_clex_str; + } +#line 47304 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2322: /* flush_option: STATUS_SYM */ +#line 14337 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_STATUS; } +#line 47310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2323: /* flush_option: SLAVE optional_connection_name */ +#line 14339 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->type & REFRESH_SLAVE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "FLUSH","SLAVE")); + lex->type|= REFRESH_SLAVE; + lex->reset_slave_info.all= false; + } +#line 47322 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2324: /* flush_option: MASTER_SYM */ +#line 14347 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_MASTER; } +#line 47328 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2325: /* flush_option: DES_KEY_FILE */ +#line 14349 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_DES_KEY_FILE; } +#line 47334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2326: /* flush_option: RESOURCES */ +#line 14351 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_USER_RESOURCES; } +#line 47340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2327: /* flush_option: SSL_SYM */ +#line 14353 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SSL;} +#line 47346 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2328: /* flush_option: THREADS_SYM */ +#line 14355 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_THREADS;} +#line 47352 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2329: /* flush_option: IDENT_sys remember_tok_start */ +#line 14357 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_GENERIC; + ST_SCHEMA_TABLE *table= find_schema_table(thd, &(yyvsp[-1].ident_sys)); + if (unlikely(!table || !table->reset_table)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[-1].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root))) + MYSQL_YYABORT; + } +#line 47370 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2330: /* opt_table_list: %empty */ +#line 14373 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47376 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2331: /* opt_table_list: table_list */ +#line 14374 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47382 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2332: /* backup: BACKUP_SYM backup_statements */ +#line 14378 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47388 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2333: /* backup_statements: STAGE_SYM ident */ +#line 14383 "/home/buildbot/git/sql/sql_yacc.yy" + { + int type; + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP STAGE")); + if ((type= find_type((yyvsp[0].ident_sys).str, &backup_stage_names, + FIND_TYPE_NO_PREFIX)) <= 0) + my_yyabort_error((ER_BACKUP_UNKNOWN_STAGE, MYF(0), (yyvsp[0].ident_sys).str)); + Lex->sql_command= SQLCOM_BACKUP; + Lex->backup_stage= (backup_stages) (type-1); + break; + } +#line 47404 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2334: /* $@207: %empty */ +#line 14395 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP LOCK")); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 47415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2335: /* backup_statements: LOCK_SYM $@207 table_ident */ +#line 14402 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[0].table), NULL, 0, + TL_READ, MDL_SHARED_HIGH_PRIO))) + MYSQL_YYABORT; + Lex->sql_command= SQLCOM_BACKUP_LOCK; + Lex->pop_select(); //main select + } +#line 47427 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2336: /* backup_statements: UNLOCK_SYM */ +#line 14410 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP UNLOCK")); + /* Table list is empty for unlock */ + Lex->sql_command= SQLCOM_BACKUP_LOCK; + } +#line 47438 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2337: /* opt_delete_gtid_domain: %empty */ +#line 14419 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47444 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2338: /* opt_delete_gtid_domain: DELETE_DOMAIN_ID_SYM '=' '(' delete_domain_id_list ')' */ +#line 14421 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47450 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2342: /* delete_domain_id: ulonglong_num */ +#line 14431 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint32 value= (uint32) (yyvsp[0].ulonglong_number); + if ((yyvsp[0].ulonglong_number) > UINT_MAX32) + { + my_printf_error(ER_BINLOG_CANT_DELETE_GTID_DOMAIN, + "The value of gtid domain being deleted ('%llu') " + "exceeds its maximum size " + "of 32 bit unsigned integer", MYF(0), (yyvsp[0].ulonglong_number)); + MYSQL_YYABORT; + } + insert_dynamic(&Lex->delete_gtid_domain, (uchar*) &value); + } +#line 47467 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2343: /* optional_flush_tables_arguments: %empty */ +#line 14446 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num)= 0;} +#line 47473 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2344: /* optional_flush_tables_arguments: AND_SYM DISABLE_SYM CHECKPOINT_SYM */ +#line 14447 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num)= REFRESH_CHECKPOINT; } +#line 47479 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2345: /* $@208: %empty */ +#line 14452 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_RESET; lex->type=0; + } +#line 47488 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2346: /* reset: RESET_SYM $@208 reset_options */ +#line 14457 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47494 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2349: /* $@209: %empty */ +#line 14466 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SLAVE; } +#line 47500 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2350: /* reset_option: SLAVE $@209 optional_connection_name slave_reset_options optional_for_channel */ +#line 14469 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47506 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2351: /* $@210: %empty */ +#line 14471 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_MASTER; + Lex->next_binlog_file_number= 0; + } +#line 47515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2353: /* reset_option: QUERY_SYM CACHE_SYM */ +#line 14476 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_QUERY_CACHE;} +#line 47521 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2354: /* slave_reset_options: %empty */ +#line 14480 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->reset_slave_info.all= false; } +#line 47527 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2355: /* slave_reset_options: ALL */ +#line 14481 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->reset_slave_info.all= true; } +#line 47533 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2356: /* master_reset_options: %empty */ +#line 14485 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47539 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2357: /* master_reset_options: TO_SYM ulong_num */ +#line 14487 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->next_binlog_file_number = (yyvsp[0].ulong_num); + } +#line 47547 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2358: /* purge: PURGE master_or_binary LOGS_SYM TO_SYM TEXT_STRING_sys */ +#line 14494 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_purge_to((yyvsp[0].lex_str)); + } +#line 47555 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2359: /* $@211: %empty */ +#line 14498 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "PURGE..BEFORE"; } +#line 47561 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2360: /* purge: PURGE master_or_binary LOGS_SYM BEFORE_SYM $@211 expr */ +#line 14500 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->clause_that_disallows_subselect= NULL; + if (Lex->stmt_purge_before((yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 47571 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2361: /* $@212: %empty */ +#line 14512 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->value_list.empty(); + lex->users_list.empty(); + lex->sql_command= SQLCOM_KILL; + lex->kill_type= KILL_TYPE_ID; + } +#line 47583 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2362: /* kill: KILL_SYM $@212 kill_type kill_option */ +#line 14520 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->kill_signal= (killed_state) ((yyvsp[-1].num) | (yyvsp[0].num)); + } +#line 47591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2363: /* kill_type: %empty */ +#line 14526 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_HARD_BIT; } +#line 47597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2364: /* kill_type: HARD_SYM */ +#line 14527 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_HARD_BIT; } +#line 47603 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2365: /* kill_type: SOFT_SYM */ +#line 14528 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 47609 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2366: /* kill_option: opt_connection kill_expr */ +#line 14532 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_CONNECTION; } +#line 47615 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2367: /* kill_option: QUERY_SYM kill_expr */ +#line 14533 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_QUERY; } +#line 47621 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2368: /* kill_option: QUERY_SYM ID_SYM expr */ +#line 14535 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (int) KILL_QUERY; + Lex->kill_type= KILL_TYPE_QUERY; + Lex->value_list.push_front((yyvsp[0].item), thd->mem_root); + } +#line 47631 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2369: /* opt_connection: %empty */ +#line 14543 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47637 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2370: /* opt_connection: CONNECTION_SYM */ +#line 14544 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47643 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2371: /* kill_expr: expr */ +#line 14549 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_front((yyval.item), thd->mem_root); + } +#line 47651 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2372: /* kill_expr: USER_SYM user */ +#line 14553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root); + Lex->kill_type= KILL_TYPE_USER; + } +#line 47660 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2373: /* $@213: %empty */ +#line 14560 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHUTDOWN; } +#line 47666 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2374: /* shutdown: SHUTDOWN $@213 shutdown_option */ +#line 14561 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47672 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2375: /* shutdown_option: %empty */ +#line 14565 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->is_shutdown_wait_for_slaves= false; } +#line 47678 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2376: /* shutdown_option: WAIT_SYM FOR_SYM ALL SLAVES */ +#line 14567 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->is_shutdown_wait_for_slaves= true; + } +#line 47686 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2377: /* use: USE_SYM ident */ +#line 14576 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_CHANGE_DB; + lex->first_select_lex()->db= (yyvsp[0].ident_sys); + } +#line 47696 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2378: /* $@214: %empty */ +#line 14587 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + + if (unlikely(lex->sphead)) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), + (yyvsp[0].filetype) == FILETYPE_CSV ? "LOAD DATA" : "LOAD XML"); + MYSQL_YYABORT; + } + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + } +#line 47714 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2379: /* $@215: %empty */ +#line 14601 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_LOAD; + lex->local_file= (yyvsp[-2].num); + lex->duplicates= DUP_ERROR; + lex->ignore= 0; + if (unlikely(!(lex->exchange= new (thd->mem_root) + sql_exchange((yyvsp[0].lex_str).str, 0, (yyvsp[-5].filetype))))) + MYSQL_YYABORT; + } +#line 47729 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2380: /* $@216: %empty */ +#line 14612 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, + TL_OPTION_UPDATING, + (yyvsp[-9].lock_type), MDL_SHARED_WRITE, + NULL, (yyvsp[0].string_list)))) + MYSQL_YYABORT; + lex->field_list.empty(); + lex->update_list.empty(); + lex->value_list.empty(); + lex->many_values.empty(); + } +#line 47746 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2381: /* $@217: %empty */ +#line 14625 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->cs= (yyvsp[0].charset); } +#line 47752 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2382: /* load: LOAD data_or_xml $@214 load_data_lock opt_local INFILE TEXT_STRING_filesystem $@215 opt_duplicate INTO TABLE_SYM table_ident opt_use_partition $@216 opt_load_data_charset $@217 opt_xml_rows_identified_by opt_field_term opt_line_term opt_ignore_lines opt_field_or_var_spec opt_load_data_set_spec stmt_end */ +#line 14630 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + } +#line 47760 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2383: /* data_or_xml: DATA_SYM */ +#line 14636 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.filetype)= FILETYPE_CSV; } +#line 47766 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2384: /* data_or_xml: XML_SYM */ +#line 14637 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.filetype)= FILETYPE_XML; } +#line 47772 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2385: /* opt_local: %empty */ +#line 14641 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=0;} +#line 47778 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2386: /* opt_local: LOCAL_SYM */ +#line 14642 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1;} +#line 47784 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2387: /* load_data_lock: %empty */ +#line 14646 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 47790 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2388: /* load_data_lock: CONCURRENT */ +#line 14648 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Ignore this option in SP to avoid problem with query cache and + triggers with non default priority locks + */ + (yyval.lock_type)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 47802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2389: /* load_data_lock: LOW_PRIORITY */ +#line 14655 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 47808 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2390: /* opt_duplicate: %empty */ +#line 14659 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates=DUP_ERROR; } +#line 47814 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2391: /* opt_duplicate: REPLACE */ +#line 14660 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates=DUP_REPLACE; } +#line 47820 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2392: /* opt_duplicate: IGNORE_SYM */ +#line 14661 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1; } +#line 47826 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2397: /* field_term: TERMINATED BY text_string */ +#line 14676 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->field_term= (yyvsp[0].string); + } +#line 47835 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2398: /* field_term: OPTIONALLY ENCLOSED BY text_string */ +#line 14681 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + DBUG_ASSERT(lex->exchange != 0); + lex->exchange->enclosed= (yyvsp[0].string); + lex->exchange->opt_enclosed= 1; + } +#line 47846 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2399: /* field_term: ENCLOSED BY text_string */ +#line 14688 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->enclosed= (yyvsp[0].string); + } +#line 47855 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2400: /* field_term: ESCAPED BY text_string */ +#line 14693 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->escaped= (yyvsp[0].string); + } +#line 47864 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2405: /* line_term: TERMINATED BY text_string */ +#line 14711 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->line_term= (yyvsp[0].string); + } +#line 47873 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2406: /* line_term: STARTING BY text_string */ +#line 14716 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->line_start= (yyvsp[0].string); + } +#line 47882 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2407: /* opt_xml_rows_identified_by: %empty */ +#line 14723 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47888 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2408: /* opt_xml_rows_identified_by: ROWS_SYM IDENTIFIED_SYM BY text_string */ +#line 14725 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->line_term = (yyvsp[0].string); } +#line 47894 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2410: /* opt_ignore_lines: IGNORE_SYM NUM lines_or_rows */ +#line 14731 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->skip_lines= atol((yyvsp[-1].lex_str).str); + } +#line 47903 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2411: /* lines_or_rows: LINES */ +#line 14738 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47909 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2412: /* lines_or_rows: ROWS_SYM */ +#line 14739 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47915 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2413: /* opt_field_or_var_spec: %empty */ +#line 14743 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47921 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2414: /* opt_field_or_var_spec: '(' fields_or_vars ')' */ +#line 14744 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47927 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2415: /* opt_field_or_var_spec: '(' ')' */ +#line 14745 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2416: /* fields_or_vars: fields_or_vars ',' field_or_var */ +#line 14750 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 47939 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2417: /* fields_or_vars: field_or_var */ +#line 14752 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 47945 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2418: /* field_or_var: simple_ident_nospvar */ +#line 14756 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.item)= (yyvsp[0].item);} +#line 47951 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2419: /* field_or_var: '@' ident_or_text */ +#line 14758 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + (yyval.item)= new (thd->mem_root) Item_user_var_as_out_param(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47967 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2420: /* opt_load_data_set_spec: %empty */ +#line 14772 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47973 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2421: /* opt_load_data_set_spec: SET load_data_set_list */ +#line 14773 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47979 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2424: /* load_data_set_elem: simple_ident_nospvar equal remember_name expr_or_ignore_or_default remember_end */ +#line 14783 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->update_list.push_back((yyvsp[-4].item), thd->mem_root)) || + unlikely(lex->value_list.push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + (yyvsp[-1].item)->set_name_no_truncate(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 47991 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2425: /* text_literal: TEXT_STRING */ +#line 14796 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal((yyvsp[0].lex_string_with_metadata))))) + MYSQL_YYABORT; + } +#line 48000 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2426: /* text_literal: NCHAR_STRING */ +#line 14801 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal_nchar((yyvsp[0].lex_string_with_metadata))))) + MYSQL_YYABORT; + } +#line 48009 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2427: /* text_literal: UNDERSCORE_CHARSET TEXT_STRING */ +#line 14806 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal_charset((yyvsp[0].lex_string_with_metadata), (yyvsp[-1].charset))))) + MYSQL_YYABORT; + } +#line 48018 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2428: /* text_literal: text_literal TEXT_STRING_literal */ +#line 14811 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= (yyvsp[-1].item_basic_constant)->make_string_literal_concat(thd, &(yyvsp[0].lex_str))))) + MYSQL_YYABORT; + } +#line 48027 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2429: /* text_string: TEXT_STRING_literal */ +#line 14819 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string)= new (thd->mem_root) String((const char*) (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length, + thd->variables.collation_connection); + if (unlikely((yyval.string) == NULL)) + MYSQL_YYABORT; + } +#line 48039 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2430: /* text_string: hex_or_bin_String */ +#line 14826 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string)= (yyvsp[0].string); } +#line 48045 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2431: /* hex_or_bin_String: HEX_NUM */ +#line 14832 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_hex_hybrid(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + (yyval.string)= tmp->val_str((String*) 0); + } +#line 48057 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2432: /* hex_or_bin_String: HEX_STRING */ +#line 14840 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_hex_string(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + (yyval.string)= tmp->val_str((String*) 0); + } +#line 48069 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2433: /* hex_or_bin_String: BIN_NUM */ +#line 14848 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_bin_string(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + /* + it is OK only emulate fix_fields, because we need only + value of constant + */ + (yyval.string)= tmp->val_str((String*) 0); + } +#line 48085 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2434: /* param_marker: PARAM_MARKER */ +#line 14863 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, ¶m_clex_str, + YYLIP->get_tok_start(), + YYLIP->get_tok_start() + 1)))) + MYSQL_YYABORT; + } +#line 48096 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2435: /* param_marker: COLON_ORACLE_SYM ident_cli */ +#line 14870 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, &null_clex_str, + (yyvsp[-1].kwd).pos(), (yyvsp[0].ident_cli).end())))) + MYSQL_YYABORT; + } +#line 48106 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2436: /* param_marker: COLON_ORACLE_SYM NUM */ +#line 14876 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, &null_clex_str, + (yyvsp[-1].kwd).pos(), + YYLIP->get_ptr())))) + MYSQL_YYABORT; + } +#line 48117 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2437: /* signed_literal: '+' NUM_literal */ +#line 14885 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_num); } +#line 48123 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2438: /* signed_literal: '-' NUM_literal */ +#line 14887 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_num)->max_length++; + (yyval.item)= (yyvsp[0].item_num)->neg(thd); + } +#line 48132 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2439: /* literal: text_literal */ +#line 14894 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_basic_constant); } +#line 48138 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2440: /* literal: NUM_literal */ +#line 14895 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_num); } +#line 48144 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2441: /* literal: temporal_literal */ +#line 14896 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 48150 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2442: /* literal: NULL_SYM */ +#line 14898 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + For the digest computation, in this context only, + NULL is considered a literal, hence reduced to '?' + REDUCE: + TOK_GENERIC_VALUE := NULL_SYM + */ + YYLIP->reduce_digest_token(TOK_GENERIC_VALUE, NULL_SYM); + (yyval.item)= new (thd->mem_root) Item_null(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + YYLIP->next_state= MY_LEX_OPERATOR_OR_IDENT; + } +#line 48168 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2443: /* literal: FALSE_SYM */ +#line 14912 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bool(thd, (char*) "FALSE",0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48178 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2444: /* literal: TRUE_SYM */ +#line 14918 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bool(thd, (char*) "TRUE",1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48188 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2445: /* literal: HEX_NUM */ +#line 14924 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_hex_hybrid(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48198 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2446: /* literal: HEX_STRING */ +#line 14930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_hex_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48208 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2447: /* literal: BIN_NUM */ +#line 14936 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bin_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2448: /* literal: UNDERSCORE_CHARSET hex_or_bin_String */ +#line 14942 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_string_with_introducer *item_str; + LEX_CSTRING tmp; + (yyvsp[0].string)->get_value(&tmp); + /* + Pass NULL as name. Name will be set in the "select_item" rule and + will include the introducer and the original hex/bin notation. + */ + item_str= new (thd->mem_root) + Item_string_with_introducer(thd, null_clex_str, + tmp, (yyvsp[-1].charset)); + if (unlikely(!item_str || + !item_str->check_well_formed_result(true))) + MYSQL_YYABORT; + + (yyval.item)= item_str; + } +#line 48240 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2449: /* NUM_literal: NUM */ +#line 14963 "/home/buildbot/git/sql/sql_yacc.yy" + { + int error; + (yyval.item_num)= new (thd->mem_root) + Item_int(thd, (yyvsp[0].lex_str).str, + (longlong) my_strtoll10((yyvsp[0].lex_str).str, NULL, &error), + (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 48254 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2450: /* NUM_literal: LONG_NUM */ +#line 14973 "/home/buildbot/git/sql/sql_yacc.yy" + { + int error; + (yyval.item_num)= new (thd->mem_root) + Item_int(thd, (yyvsp[0].lex_str).str, + (longlong) my_strtoll10((yyvsp[0].lex_str).str, NULL, &error), + (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 48268 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2451: /* NUM_literal: ULONGLONG_NUM */ +#line 14983 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 48278 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2452: /* NUM_literal: DECIMAL_NUM */ +#line 14989 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_decimal(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, + thd->charset()); + if (unlikely((yyval.item_num) == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + } +#line 48289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2453: /* NUM_literal: FLOAT_NUM */ +#line 14996 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_float(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + } +#line 48299 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2454: /* temporal_literal: DATE_SYM TEXT_STRING */ +#line 15006 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_newdate.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 48310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2455: /* temporal_literal: TIME_SYM TEXT_STRING */ +#line 15013 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_time2.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 48321 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2456: /* temporal_literal: TIMESTAMP TEXT_STRING */ +#line 15020 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_datetime.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 48332 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2457: /* $@218: %empty */ +#line 15030 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + With_clause *with_clause= + new With_clause((yyvsp[0].num), Lex->curr_with_clause); + if (unlikely(with_clause == NULL)) + MYSQL_YYABORT; + lex->derived_tables|= DERIVED_WITH; + lex->with_cte_resolution= true; + lex->curr_with_clause= with_clause; + with_clause->add_to_list(&lex->with_clauses_list, + lex->with_clauses_list_last_next); + if (lex->current_select && + lex->current_select->parsing_place == BEFORE_OPT_LIST) + lex->current_select->parsing_place= NO_MATTER; + } +#line 48352 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2458: /* with_clause: WITH opt_recursive $@218 with_list */ +#line 15046 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.with_clause)= Lex->curr_with_clause; + Lex->curr_with_clause= Lex->curr_with_clause->pop(); + } +#line 48361 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2459: /* opt_recursive: %empty */ +#line 15054 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 48367 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2460: /* opt_recursive: RECURSIVE_SYM */ +#line 15055 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 48373 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2463: /* with_list_element: with_element_head opt_with_column_list AS '(' query_expression ')' opt_cycle */ +#line 15069 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + const char *query_start= lex->sphead ? lex->sphead->m_tmp_query + : thd->query(); + const char *spec_start= (yyvsp[-3].kwd).pos() + 1; + With_element *elem= new With_element((yyvsp[-6].with_element_head), *(yyvsp[-5].ident_sys_list), (yyvsp[-2].select_lex_unit)); + if (elem == NULL || Lex->curr_with_clause->add_with_element(elem)) + MYSQL_YYABORT; + if (elem->set_unparsed_spec(thd, spec_start, (yyvsp[-1].kwd).pos(), + spec_start - query_start)) + MYSQL_YYABORT; + if ((yyvsp[0].ident_sys_list)) + { + elem->set_cycle_list((yyvsp[0].ident_sys_list)); + } + elem->set_tables_end_pos(lex->query_tables_last); + } +#line 48395 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2464: /* opt_cycle: %empty */ +#line 15090 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys_list)= NULL; } +#line 48401 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2465: /* $@219: %empty */ +#line 15093 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->curr_with_clause->with_recursive) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].kwd).pos()); + } + } +#line 48412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2466: /* opt_cycle: CYCLE_SYM $@219 comma_separated_ident_list RESTRICT */ +#line 15100 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_list)= (yyvsp[-1].ident_sys_list); + } +#line 48420 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2467: /* opt_with_column_list: %empty */ +#line 15108 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.ident_sys_list)= new (thd->mem_root) List) == NULL) + MYSQL_YYABORT; + } +#line 48429 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2468: /* opt_with_column_list: '(' with_column_list ')' */ +#line 15113 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys_list)= (yyvsp[-1].ident_sys_list); } +#line 48435 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2470: /* ident_sys_alloc: ident_cli */ +#line 15122 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_ptr)= new (thd->mem_root) Lex_ident_sys(thd, &(yyvsp[0].ident_cli)); + } +#line 48443 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2471: /* comma_separated_ident_list: ident_sys_alloc */ +#line 15129 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_list)= new (thd->mem_root) List; + if (unlikely((yyval.ident_sys_list) == NULL || (yyval.ident_sys_list)->push_back((yyvsp[0].ident_sys_ptr)))) + MYSQL_YYABORT; + } +#line 48453 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2472: /* comma_separated_ident_list: comma_separated_ident_list ',' ident_sys_alloc */ +#line 15135 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.ident_sys_list)= (yyvsp[-2].ident_sys_list))->push_back((yyvsp[0].ident_sys_ptr))) + MYSQL_YYABORT; + } +#line 48462 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2473: /* with_element_head: ident */ +#line 15144 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING *name= + (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + (yyval.with_element_head)= new (thd->mem_root) With_element_head(name); + if (unlikely(name == NULL || (yyval.with_element_head) == NULL)) + MYSQL_YYABORT; + (yyval.with_element_head)->tables_pos.set_start_pos(Lex->query_tables_last); + } +#line 48475 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2474: /* insert_ident: simple_ident_nospvar */ +#line 15161 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 48481 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2475: /* insert_ident: table_wild */ +#line 15162 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 48487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2476: /* table_wild: ident '.' '*' */ +#line 15167 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 48496 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2477: /* table_wild: ident '.' ident '.' '*' */ +#line 15172 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 48505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2478: /* select_sublist_qualified_asterisk: ident_cli '.' '*' */ +#line 15180 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-2].ident_cli))))) + MYSQL_YYABORT; + } +#line 48514 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2479: /* select_sublist_qualified_asterisk: ident_cli '.' ident_cli '.' '*' */ +#line 15185 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-4].ident_cli), &(yyvsp[-2].ident_cli))))) + MYSQL_YYABORT; + } +#line 48523 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2480: /* order_ident: expr */ +#line 15192 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 48529 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2481: /* simple_ident: ident_cli */ +#line 15198 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48538 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2482: /* simple_ident: ident_cli '.' ident_cli */ +#line 15203 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48547 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2483: /* simple_ident: '.' ident_cli '.' ident_cli */ +#line 15208 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_cli empty((yyvsp[-2].ident_cli).pos(), 0); + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &empty, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48557 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2484: /* simple_ident: ident_cli '.' ident_cli '.' ident_cli */ +#line 15214 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-4].ident_cli), &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48566 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2485: /* simple_ident: COLON_ORACLE_SYM ident_cli '.' ident_cli */ +#line 15219 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_colon_ident_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48575 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2486: /* simple_ident_nospvar: ident */ +#line 15227 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident_nosp(thd, &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 48584 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2487: /* simple_ident_nospvar: ident '.' ident */ +#line 15232 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident_nospvar(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 48593 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2488: /* simple_ident_nospvar: COLON_ORACLE_SYM ident_cli '.' ident_cli */ +#line 15237 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_colon_ident_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48602 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2489: /* simple_ident_nospvar: '.' ident '.' ident */ +#line 15242 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys none; + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &none, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 48612 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2490: /* simple_ident_nospvar: ident '.' ident '.' ident */ +#line 15248 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 48621 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2491: /* field_ident: ident */ +#line 15255 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 48627 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2492: /* field_ident: ident '.' ident '.' ident */ +#line 15257 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *table= Select->table_list.first; + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-4].ident_sys).str, + table->db.str))) + my_yyabort_error((ER_WRONG_DB_NAME, MYF(0), (yyvsp[-4].ident_sys).str)); + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-2].ident_sys).str, + table->table_name.str))) + my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.lex_str)=(yyvsp[0].ident_sys); + } +#line 48642 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2493: /* field_ident: ident '.' ident */ +#line 15268 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *table= Select->table_list.first; + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-2].ident_sys).str, + table->alias.str))) + my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.lex_str)=(yyvsp[0].ident_sys); + } +#line 48654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2494: /* field_ident: '.' ident */ +#line 15275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 48660 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2495: /* table_ident: ident */ +#line 15280 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[0].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48670 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2496: /* table_ident: ident '.' ident */ +#line 15286 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48680 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2497: /* table_ident: '.' ident */ +#line 15292 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* For Delphi */ + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[0].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48691 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2498: /* table_ident_opt_wild: ident opt_wild */ +#line 15302 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[-1].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2499: /* table_ident_opt_wild: ident '.' ident opt_wild */ +#line 15308 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(thd, &(yyvsp[-3].ident_sys), &(yyvsp[-1].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48711 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2500: /* table_ident_nodb: ident */ +#line 15317 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING db= any_db; + (yyval.table)= new (thd->mem_root) Table_ident(thd, &db, &(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48722 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2505: /* ident_cli: keyword_ident */ +#line 15333 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48728 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2506: /* IDENT_sys: IDENT_cli */ +#line 15338 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->to_ident_sys_alloc(&(yyval.ident_sys), &(yyvsp[0].ident_cli)))) + MYSQL_YYABORT; + } +#line 48737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2509: /* ident_cli_func: keyword_func_sp_var_and_label */ +#line 15347 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2510: /* ident_cli_func: keyword_func_sp_var_not_label */ +#line 15348 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48749 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2511: /* ident_func: ident_cli_func */ +#line 15353 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->to_ident_sys_alloc(&(yyval.ident_sys), &(yyvsp[0].ident_cli)))) + MYSQL_YYABORT; + } +#line 48758 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2512: /* TEXT_STRING_sys: TEXT_STRING */ +#line 15362 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_sys(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2513: /* TEXT_STRING_literal: TEXT_STRING */ +#line 15370 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_connection(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48776 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2514: /* TEXT_STRING_filesystem: TEXT_STRING */ +#line 15378 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_filesystem(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2516: /* ident_table_alias: keyword_table_alias */ +#line 15387 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48794 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2517: /* ident_cli_set_usual_case: IDENT_cli */ +#line 15394 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].ident_cli); } +#line 48800 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2518: /* ident_cli_set_usual_case: keyword_set_usual_case */ +#line 15395 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48806 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2520: /* ident_sysvar_name: keyword_sysvar_name */ +#line 15401 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48815 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2521: /* ident_sysvar_name: TEXT_STRING_sys */ +#line 15406 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_sys(thd, &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 48824 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2523: /* ident: keyword_ident */ +#line 15416 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48833 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2525: /* label_ident: keyword_label */ +#line 15425 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48842 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2526: /* ident_or_text: ident */ +#line 15432 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 48848 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2527: /* ident_or_text: TEXT_STRING_sys */ +#line 15433 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str);} +#line 48854 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2528: /* ident_or_text: LEX_HOSTNAME */ +#line 15434 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str);} +#line 48860 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2529: /* user_maybe_role: ident_or_text */ +#line 15439 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user = (yyvsp[0].lex_str); + + if (unlikely(check_string_char_length(&(yyval.lex_user)->user, ER_USERNAME, + username_char_length, + system_charset_info, 0))) + MYSQL_YYABORT; + } +#line 48875 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2530: /* user_maybe_role: ident_or_text '@' ident_or_text */ +#line 15450 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user = (yyvsp[-2].lex_str); (yyval.lex_user)->host=(yyvsp[0].lex_str); + + if (unlikely(check_string_char_length(&(yyval.lex_user)->user, ER_USERNAME, + username_char_length, + system_charset_info, 0)) || + unlikely(check_host_name(&(yyval.lex_user)->host))) + MYSQL_YYABORT; + if ((yyval.lex_user)->host.str[0]) + { + /* + Convert hostname part of username to lowercase. + It's OK to use in-place lowercase as long as + the character set is utf8. + */ + my_casedn_str(system_charset_info, (char*) (yyval.lex_user)->host.str); + } + else + { + /* + fix historical undocumented convention that empty host is the + same as '%' + */ + (yyval.lex_user)->host= host_not_specified; + } + } +#line 48908 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2531: /* user_maybe_role: CURRENT_USER optional_braces */ +#line 15479 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user= current_user; + (yyval.lex_user)->auth= new (thd->mem_root) USER_AUTH(); + } +#line 48919 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2534: /* user: user_maybe_role */ +#line 15490 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].lex_user)->user.str != current_user.str && (yyvsp[0].lex_user)->host.str == 0) + (yyvsp[0].lex_user)->host= host_not_specified; + (yyval.lex_user)= (yyvsp[0].lex_user); + } +#line 48929 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3262: /* $@220: %empty */ +#line 16359 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_stmt_init(); + } +#line 48938 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3263: /* set: SET $@220 set_param */ +#line 16364 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 48947 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3266: /* $@221: %empty */ +#line 16374 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= OPT_DEFAULT; + if (sp_create_assignment_lex(thd, (yyvsp[0].kwd).pos())) + MYSQL_YYABORT; + } +#line 48957 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3267: /* set_param: TRANSACTION_SYM $@221 transaction_characteristics */ +#line 16380 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48966 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3268: /* $@222: %empty */ +#line 16385 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= (yyvsp[0].var_type); + } +#line 48974 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3270: /* $@223: %empty */ +#line 16391 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->table_or_sp_used())) + my_yyabort_error((ER_SUBQUERIES_NOT_SUPPORTED, MYF(0), "SET STATEMENT")); + lex->stmt_var_list= lex->var_list; + lex->var_list.empty(); + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 48988 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3276: /* $@224: %empty */ +#line 16418 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[0].kwd).pos())) + MYSQL_YYABORT; + } +#line 48997 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3277: /* start_option_value_list_following_option_type: TRANSACTION_SYM $@224 transaction_characteristics */ +#line 16423 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3280: /* $@225: %empty */ +#line 16438 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= (yyvsp[0].var_type); + } +#line 49014 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3283: /* option_type: GLOBAL_SYM */ +#line 16446 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 49020 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3284: /* option_type: LOCAL_SYM */ +#line 16447 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49026 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3285: /* option_type: SESSION_SYM */ +#line 16448 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49032 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3286: /* opt_var_type: %empty */ +#line 16452 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49038 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3287: /* opt_var_type: GLOBAL_SYM */ +#line 16453 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 49044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3288: /* opt_var_type: LOCAL_SYM */ +#line 16454 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3289: /* opt_var_type: SESSION_SYM */ +#line 16455 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49056 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3290: /* opt_var_ident_type: %empty */ +#line 16459 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_DEFAULT; } +#line 49062 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3291: /* opt_var_ident_type: GLOBAL_SYM '.' */ +#line 16460 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 49068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3292: /* opt_var_ident_type: LOCAL_SYM '.' */ +#line 16461 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3293: /* opt_var_ident_type: SESSION_SYM '.' */ +#line 16462 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3294: /* $@226: %empty */ +#line 16471 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 49089 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3295: /* set_stmt_option: ident_cli equal $@226 set_expr_or_default */ +#line 16476 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(Lex->option_type, &tmp, (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 49101 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3296: /* $@227: %empty */ +#line 16484 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 49110 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3297: /* set_stmt_option: ident_cli '.' ident equal $@227 set_expr_or_default */ +#line 16489 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(thd, Lex->option_type, + &tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 49123 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3298: /* $@228: %empty */ +#line 16498 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 49132 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3299: /* set_stmt_option: DEFAULT '.' ident equal $@228 set_expr_or_default */ +#line 16503 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, + &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 49143 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3300: /* $@229: %empty */ +#line 16515 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 49152 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3301: /* option_value_following_option_type: ident_cli equal $@229 set_expr_or_default */ +#line 16520 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(Lex->option_type, &tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49164 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3302: /* $@230: %empty */ +#line 16528 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 49173 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3303: /* option_value_following_option_type: ident_cli '.' ident equal $@230 set_expr_or_default */ +#line 16533 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(thd, Lex->option_type, &tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49185 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3304: /* $@231: %empty */ +#line 16541 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].kwd).pos())) + MYSQL_YYABORT; + } +#line 49194 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3305: /* option_value_following_option_type: DEFAULT '.' ident equal $@231 set_expr_or_default */ +#line 16546 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49204 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3306: /* $@232: %empty */ +#line 16556 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 49213 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3307: /* option_value_no_option_type: ident_cli_set_usual_case equal $@232 set_expr_or_default */ +#line 16561 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49225 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3308: /* $@233: %empty */ +#line 16569 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 49234 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3309: /* option_value_no_option_type: ident_cli_set_usual_case '.' ident equal $@233 set_expr_or_default */ +#line 16574 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49246 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3310: /* $@234: %empty */ +#line 16582 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].kwd).pos())) + MYSQL_YYABORT; + } +#line 49255 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3311: /* option_value_no_option_type: DEFAULT '.' ident equal $@234 set_expr_or_default */ +#line 16587 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49266 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3312: /* $@235: %empty */ +#line 16594 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[-1].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + if (sp_create_assignment_lex(thd, (yyvsp[-2].lex_str).str)) + MYSQL_YYABORT; + } +#line 49281 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3313: /* option_value_no_option_type: '@' ident_or_text equal $@235 expr */ +#line 16605 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_user_variable(thd, &(yyvsp[-3].lex_str), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49291 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3314: /* $@236: %empty */ +#line 16611 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-4].lex_str).str)) + MYSQL_YYABORT; + } +#line 49300 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3315: /* option_value_no_option_type: '@' '@' opt_var_ident_type ident_sysvar_name equal $@236 set_expr_or_default */ +#line 16616 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_system_variable((yyvsp[-4].var_type), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3316: /* $@237: %empty */ +#line 16622 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-6].lex_str).str)) + MYSQL_YYABORT; + } +#line 49319 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3317: /* option_value_no_option_type: '@' '@' opt_var_ident_type ident_sysvar_name '.' ident equal $@237 set_expr_or_default */ +#line 16627 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_system_variable(thd, (yyvsp[-6].var_type), &(yyvsp[-5].ident_sys), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49329 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3318: /* $@238: %empty */ +#line 16633 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-6].lex_str).str)) + MYSQL_YYABORT; + } +#line 49338 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3319: /* option_value_no_option_type: '@' '@' opt_var_ident_type DEFAULT '.' ident equal $@238 set_expr_or_default */ +#line 16638 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable((yyvsp[-6].var_type), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49348 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3320: /* option_value_no_option_type: charset old_or_new_charset_name_or_default */ +#line 16644 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + LEX *lex= thd->lex; + CHARSET_INFO *cs2; + cs2= (yyvsp[0].charset) ? (yyvsp[0].charset): global_system_variables.character_set_client; + set_var_collation_client *var; + var= (new (thd->mem_root) + set_var_collation_client(cs2, + thd->variables.collation_database, + cs2)); + if (unlikely(var == NULL)) + MYSQL_YYABORT; + lex->var_list.push_back(var, thd->mem_root); + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49370 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3321: /* option_value_no_option_type: NAMES_SYM equal expr */ +#line 16662 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + LEX_CSTRING names= { STRING_WITH_LEN("names") }; + if (unlikely(spc && spc->find_variable(&names, false))) + my_error(ER_SP_BAD_VAR_SHADOW, MYF(0), names.str); + else + thd->parse_error(); + MYSQL_YYABORT; + } +#line 49385 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3322: /* option_value_no_option_type: NAMES_SYM charset_name_or_default */ +#line 16673 "/home/buildbot/git/sql/sql_yacc.yy" + { + CHARSET_INFO *def= global_system_variables.character_set_client; + Lex_exact_charset_opt_extended_collate tmp((yyvsp[0].charset) ? (yyvsp[0].charset) : def, false); + if (Lex->set_names((yyvsp[-1].kwd).pos(), tmp, yychar == YYEMPTY)) + MYSQL_YYABORT; + } +#line 49396 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3323: /* option_value_no_option_type: NAMES_SYM charset_name_or_default COLLATE_SYM collation_name_or_default */ +#line 16681 "/home/buildbot/git/sql/sql_yacc.yy" + { + CHARSET_INFO *def= global_system_variables.character_set_client; + Lex_exact_charset_opt_extended_collate tmp((yyvsp[-2].charset) ? (yyvsp[-2].charset) : def, false); + if (tmp.merge_collation((yyvsp[0].Lex_extended_collation)) || + Lex->set_names((yyvsp[-3].kwd).pos(), tmp, yychar == YYEMPTY)) + MYSQL_YYABORT; + } +#line 49408 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3324: /* option_value_no_option_type: DEFAULT ROLE_SYM grant_role */ +#line 16689 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-2].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + LEX_USER *user; + if (unlikely(!(user=(LEX_USER *) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + user->user= current_user; + set_var_default_role *var= (new (thd->mem_root) + set_var_default_role(user, + (yyvsp[0].lex_user)->user)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + + thd->lex->autocommit= TRUE; + if (lex->sphead) + lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49434 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3325: /* option_value_no_option_type: DEFAULT ROLE_SYM grant_role FOR_SYM user */ +#line 16711 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-4].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + set_var_default_role *var= (new (thd->mem_root) + set_var_default_role((yyvsp[0].lex_user), (yyvsp[-2].lex_user)->user)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + thd->lex->autocommit= TRUE; + if (lex->sphead) + lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49454 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3326: /* option_value_no_option_type: ROLE_SYM role_name */ +#line 16727 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + set_var_role *var= new (thd->mem_root) set_var_role((yyvsp[0].lex_user)->user); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root)) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49469 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3327: /* $@239: %empty */ +#line 16738 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 49478 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3328: /* option_value_no_option_type: ROLE_SYM equal $@239 set_expr_or_default */ +#line 16743 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].kwd)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49490 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3329: /* $@240: %empty */ +#line 16751 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 49499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3330: /* option_value_no_option_type: PASSWORD_SYM equal $@240 text_or_password */ +#line 16756 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_create_set_password_instr(thd, (yyvsp[0].user_auth), + yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49509 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3331: /* $@241: %empty */ +#line 16762 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 49518 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3332: /* option_value_no_option_type: PASSWORD_SYM FOR_SYM $@241 user equal text_or_password */ +#line 16767 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_create_set_password_instr(thd, (yyvsp[-2].lex_user), (yyvsp[0].user_auth), + yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49528 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3337: /* transaction_access_mode: transaction_access_mode_types */ +#line 16783 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Item *item= new (thd->mem_root) Item_int(thd, (int32) (yyvsp[0].num)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + set_var *var= (new (thd->mem_root) + set_var(thd, lex->option_type, + find_sys_var(thd, "tx_read_only"), + &null_clex_str, + item)); + if (unlikely(var == NULL)) + MYSQL_YYABORT; + if (unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + } +#line 49548 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3338: /* isolation_level: ISOLATION LEVEL_SYM isolation_types */ +#line 16802 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Item *item= new (thd->mem_root) Item_int(thd, (int32) (yyvsp[0].tx_isolation)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + set_var *var= (new (thd->mem_root) + set_var(thd, lex->option_type, + find_sys_var(thd, "tx_isolation"), + &null_clex_str, + item)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + } +#line 49567 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3339: /* transaction_access_mode_types: READ_SYM ONLY_SYM */ +#line 16819 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 49573 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3340: /* transaction_access_mode_types: READ_SYM WRITE_SYM */ +#line 16820 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 49579 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3341: /* isolation_types: READ_SYM UNCOMMITTED_SYM */ +#line 16824 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_READ_UNCOMMITTED; } +#line 49585 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3342: /* isolation_types: READ_SYM COMMITTED_SYM */ +#line 16825 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_READ_COMMITTED; } +#line 49591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3343: /* isolation_types: REPEATABLE_SYM READ_SYM */ +#line 16826 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_REPEATABLE_READ; } +#line 49597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3344: /* isolation_types: SERIALIZABLE_SYM */ +#line 16827 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_SERIALIZABLE; } +#line 49603 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3345: /* text_or_password: TEXT_STRING */ +#line 16833 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->auth_str= (yyvsp[0].lex_string_with_metadata); + } +#line 49612 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3346: /* text_or_password: PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 16838 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + } +#line 49621 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3347: /* text_or_password: OLD_PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 16843 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + (yyval.user_auth)->auth_str.str= Item_func_password::alloc(thd, + (yyvsp[-1].lex_string_with_metadata).str, (yyvsp[-1].lex_string_with_metadata).length, Item_func_password::OLD); + (yyval.user_auth)->auth_str.length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; + } +#line 49633 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3348: /* set_expr_or_default: expr */ +#line 16853 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 49639 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3349: /* set_expr_or_default: DEFAULT */ +#line 16854 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=0; } +#line 49645 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3350: /* set_expr_or_default: ON */ +#line 16856 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "ON", 2); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 49655 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3351: /* set_expr_or_default: ALL */ +#line 16862 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "ALL", 3); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 49665 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3352: /* set_expr_or_default: BINARY */ +#line 16868 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "binary", 6); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 49675 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3353: /* $@242: %empty */ +#line 16879 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "LOCK")); + lex->sql_command= SQLCOM_LOCK_TABLES; + } +#line 49687 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3354: /* lock: LOCK_SYM table_or_tables $@242 table_lock_list opt_lock_wait_timeout */ +#line 16887 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49693 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3355: /* opt_lock_wait_timeout: %empty */ +#line 16892 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49699 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3356: /* opt_lock_wait_timeout: WAIT_SYM ulong_num */ +#line 16894 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("lock_wait_timeout"), (yyvsp[0].ulong_num))) || + unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("innodb_lock_wait_timeout"), (yyvsp[0].ulong_num)))) + MYSQL_YYABORT; + } +#line 49709 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3357: /* opt_lock_wait_timeout: NOWAIT_SYM */ +#line 16900 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("lock_wait_timeout"), 0)) || + unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("innodb_lock_wait_timeout"), 0))) + MYSQL_YYABORT; + } +#line 49719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3358: /* table_or_tables: TABLE_SYM */ +#line 16908 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 49725 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3359: /* table_or_tables: TABLES */ +#line 16909 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 49731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3362: /* table_lock: table_ident opt_table_alias_clause lock_option */ +#line 16919 "/home/buildbot/git/sql/sql_yacc.yy" + { + thr_lock_type lock_type= (thr_lock_type) (yyvsp[0].num); + bool lock_for_write= (lock_type >= TL_FIRST_WRITE); + ulong table_options= lock_for_write ? TL_OPTION_UPDATING : 0; + enum_mdl_type mdl_type= !lock_for_write + ? MDL_SHARED_READ + : lock_type == TL_WRITE_CONCURRENT_INSERT + ? MDL_SHARED_WRITE + : MDL_SHARED_NO_READ_WRITE; + + if (unlikely(!Lex->current_select_or_default()-> + add_table_to_list(thd, (yyvsp[-2].table), (yyvsp[-1].lex_str_ptr), table_options, + lock_type, mdl_type))) + MYSQL_YYABORT; + } +#line 49751 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3363: /* lock_option: READ_SYM */ +#line 16937 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_READ_NO_INSERT; } +#line 49757 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3364: /* lock_option: WRITE_SYM */ +#line 16938 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_WRITE_DEFAULT; } +#line 49763 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3365: /* lock_option: WRITE_SYM CONCURRENT */ +#line 16940 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 49771 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3366: /* lock_option: LOW_PRIORITY WRITE_SYM */ +#line 16944 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_WRITE_LOW_PRIORITY; } +#line 49777 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3367: /* lock_option: READ_SYM LOCAL_SYM */ +#line 16945 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_READ; } +#line 49783 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3368: /* $@243: %empty */ +#line 16950 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "UNLOCK")); + lex->sql_command= SQLCOM_UNLOCK_TABLES; + } +#line 49795 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3369: /* unlock: UNLOCK_SYM $@243 table_or_tables */ +#line 16958 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49801 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3370: /* $@244: %empty */ +#line 16967 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 49810 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3371: /* handler: HANDLER_SYM $@244 handler_tail */ +#line 16972 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 49818 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3372: /* handler_tail: table_ident OPEN_SYM opt_table_alias_clause */ +#line 16979 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->sql_command = SQLCOM_HA_OPEN; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-2].table), (yyvsp[0].lex_str_ptr), 0)) + MYSQL_YYABORT; + } +#line 49831 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3373: /* handler_tail: table_ident_nodb CLOSE_SYM */ +#line 16988 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->sql_command = SQLCOM_HA_CLOSE; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-1].table), 0, 0)) + MYSQL_YYABORT; + } +#line 49844 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3374: /* $@245: %empty */ +#line 16997 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *select= Select; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->clause_that_disallows_subselect= "HANDLER..READ"; + lex->sql_command = SQLCOM_HA_READ; + lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + select->limit_params.select_limit= one; + select->limit_params.offset_limit= 0; + lex->limit_rows_examined= 0; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-1].table), 0, 0)) + MYSQL_YYABORT; + } +#line 49866 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3375: /* handler_tail: table_ident_nodb READ_SYM $@245 handler_read_or_scan opt_where_clause opt_global_limit_clause */ +#line 17015 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *select= Select; + lex->clause_that_disallows_subselect= NULL; + if (!lex->current_select->limit_params.explicit_limit) + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (one == NULL) + MYSQL_YYABORT; + select->limit_params.select_limit= one; + select->limit_params.offset_limit= 0; + lex->limit_rows_examined= 0; + } + /* Stored functions are not supported for HANDLER READ. */ + if (lex->uses_stored_routines()) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "stored functions in HANDLER ... READ"); + MYSQL_YYABORT; + } + } +#line 49892 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3376: /* handler_read_or_scan: handler_scan_function */ +#line 17039 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ident= null_clex_str; } +#line 49898 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3377: /* handler_read_or_scan: ident handler_rkey_function */ +#line 17040 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ident= (yyvsp[-1].ident_sys); } +#line 49904 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3378: /* handler_scan_function: FIRST_SYM */ +#line 17044 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RFIRST; } +#line 49910 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3379: /* handler_scan_function: NEXT_SYM */ +#line 17045 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RNEXT; } +#line 49916 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3380: /* handler_rkey_function: FIRST_SYM */ +#line 17049 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RFIRST; } +#line 49922 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3381: /* handler_rkey_function: NEXT_SYM */ +#line 17050 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RNEXT; } +#line 49928 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3382: /* handler_rkey_function: PREV_SYM */ +#line 17051 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RPREV; } +#line 49934 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3383: /* handler_rkey_function: LAST_SYM */ +#line 17052 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RLAST; } +#line 49940 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3384: /* $@246: %empty */ +#line 17054 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->ha_read_mode = RKEY; + lex->ha_rkey_mode=(yyvsp[0].ha_rkey_mode); + if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 49952 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3385: /* handler_rkey_function: handler_rkey_mode $@246 '(' values ')' */ +#line 17062 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49958 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3386: /* handler_rkey_mode: '=' */ +#line 17066 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_EXACT; } +#line 49964 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3387: /* handler_rkey_mode: GE */ +#line 17067 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_NEXT; } +#line 49970 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3388: /* handler_rkey_mode: LE */ +#line 17068 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_PREV; } +#line 49976 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3389: /* handler_rkey_mode: '>' */ +#line 17069 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_AFTER_KEY; } +#line 49982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3390: /* handler_rkey_mode: '<' */ +#line 17070 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_BEFORE_KEY; } +#line 49988 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3391: /* revoke: REVOKE clear_privileges revoke_command */ +#line 17077 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49994 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3392: /* revoke_command: grant_privileges ON opt_table grant_ident FROM user_and_role_list */ +#line 17082 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_table(thd, (yyvsp[-5].lex_grant), *(yyvsp[-2].lex_grant_ident))) + MYSQL_YYABORT; + } +#line 50003 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3393: /* revoke_command: grant_privileges ON sp_handler grant_ident FROM user_and_role_list */ +#line 17087 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_sp(thd, (yyvsp[-5].lex_grant), *(yyvsp[-2].lex_grant_ident), *(yyvsp[-3].sp_handler))) + MYSQL_YYABORT; + } +#line 50012 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3394: /* revoke_command: ALL opt_privileges ',' GRANT OPTION FROM user_and_role_list */ +#line 17092 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_REVOKE_ALL; + } +#line 50020 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3395: /* revoke_command: PROXY_SYM ON user FROM user_list */ +#line 17096 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_proxy(thd, (yyvsp[-2].lex_user))) + MYSQL_YYABORT; + } +#line 50029 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3396: /* revoke_command: admin_option_for_role FROM user_and_role_list */ +#line 17101 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_REVOKE_ROLE; + if (unlikely(Lex->users_list.push_front((yyvsp[-2].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50039 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3397: /* admin_option_for_role: ADMIN_SYM OPTION FOR_SYM grant_role */ +#line 17110 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= true; (yyval.lex_user)= (yyvsp[0].lex_user); } +#line 50045 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3398: /* admin_option_for_role: grant_role */ +#line 17112 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= false; (yyval.lex_user)= (yyvsp[0].lex_user); } +#line 50051 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3399: /* grant: GRANT clear_privileges grant_command */ +#line 17117 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50057 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3400: /* grant_command: grant_privileges ON opt_table grant_ident TO_SYM grant_list opt_require_clause opt_grant_options */ +#line 17123 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_table(thd, (yyvsp[-7].lex_grant), *(yyvsp[-4].lex_grant_ident), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 50066 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3401: /* grant_command: grant_privileges ON sp_handler grant_ident TO_SYM grant_list opt_require_clause opt_grant_options */ +#line 17129 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_sp(thd, (yyvsp[-7].lex_grant), *(yyvsp[-4].lex_grant_ident), *(yyvsp[-5].sp_handler), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 50075 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3402: /* grant_command: PROXY_SYM ON user TO_SYM grant_list opt_grant_option */ +#line 17134 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_proxy(thd, (yyvsp[-3].lex_user), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 50084 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3403: /* grant_command: grant_role TO_SYM grant_list opt_with_admin_option */ +#line 17139 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_GRANT_ROLE; + /* The first role is the one that is granted */ + if (unlikely(Lex->users_list.push_front((yyvsp[-3].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50096 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3404: /* opt_with_admin: %empty */ +#line 17150 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->definer = 0; } +#line 50102 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3405: /* opt_with_admin: WITH ADMIN_SYM user_or_role */ +#line 17151 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->definer = (yyvsp[0].lex_user); } +#line 50108 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3406: /* opt_with_admin_option: %empty */ +#line 17155 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= false; } +#line 50114 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3407: /* opt_with_admin_option: WITH ADMIN_SYM OPTION */ +#line 17156 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= true; } +#line 50120 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3408: /* role_list: grant_role */ +#line 17161 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50129 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3409: /* role_list: role_list ',' grant_role */ +#line 17166 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50138 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3410: /* current_role: CURRENT_ROLE optional_braces */ +#line 17174 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user= current_role; + } +#line 50148 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3411: /* role_name: ident_or_text */ +#line 17183 "/home/buildbot/git/sql/sql_yacc.yy" + { + CHARSET_INFO *cs= system_charset_info; + /* trim end spaces (as they'll be lost in mysql.user anyway) */ + (yyvsp[0].lex_str).length= cs->lengthsp((yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + ((char*) (yyvsp[0].lex_str).str)[(yyvsp[0].lex_str).length] = '\0'; + if (unlikely((yyvsp[0].lex_str).length == 0)) + my_yyabort_error((ER_INVALID_ROLE, MYF(0), "")); + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + if (lex_string_eq(&(yyvsp[0].lex_str), &none)) + (yyval.lex_user)->user= none; + else if (lex_string_eq(&(yyvsp[0].lex_str), &public_name)) + (yyval.lex_user)->user= public_name; + else if (check_string_char_length(&((yyval.lex_user)->user= (yyvsp[0].lex_str)), ER_USERNAME, + username_char_length, cs, 0)) + MYSQL_YYABORT; + (yyval.lex_user)->host= empty_clex_str; + } +#line 50171 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3417: /* grant_privileges: ALL opt_privileges */ +#line 17213 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege(GLOBAL_ACLS, true))) + MYSQL_YYABORT; + } +#line 50180 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3420: /* object_privilege_list: object_privilege */ +#line 17226 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege((yyvsp[0].privilege)))) + MYSQL_YYABORT; + } +#line 50189 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3421: /* object_privilege_list: column_list_privilege */ +#line 17231 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege()) || + (yyval.lex_grant)->add_column_list_privilege(thd, (yyvsp[0].column_list_privilege).m_columns[0], + (yyvsp[0].column_list_privilege).m_privilege)) + MYSQL_YYABORT; + } +#line 50200 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3422: /* object_privilege_list: object_privilege_list ',' object_privilege */ +#line 17238 "/home/buildbot/git/sql/sql_yacc.yy" + { + ((yyval.lex_grant)= (yyvsp[-2].lex_grant))->add_object_privilege((yyvsp[0].privilege)); + } +#line 50208 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3423: /* object_privilege_list: object_privilege_list ',' column_list_privilege */ +#line 17242 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.lex_grant)= (yyvsp[-2].lex_grant))->add_column_list_privilege(thd, (yyvsp[0].column_list_privilege).m_columns[0], + (yyvsp[0].column_list_privilege).m_privilege)) + MYSQL_YYABORT; + } +#line 50218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3424: /* column_list_privilege: column_privilege '(' comma_separated_ident_list ')' */ +#line 17251 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.column_list_privilege)= Lex_column_list_privilege((yyvsp[-1].ident_sys_list), (yyvsp[-3].privilege)); + } +#line 50226 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3425: /* column_privilege: SELECT_SYM */ +#line 17257 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SELECT_ACL; } +#line 50232 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3426: /* column_privilege: INSERT */ +#line 17258 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INSERT_ACL; } +#line 50238 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3427: /* column_privilege: UPDATE_SYM */ +#line 17259 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= UPDATE_ACL; } +#line 50244 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3428: /* column_privilege: REFERENCES */ +#line 17260 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REFERENCES_ACL; } +#line 50250 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3429: /* object_privilege: SELECT_SYM */ +#line 17264 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SELECT_ACL; } +#line 50256 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3430: /* object_privilege: INSERT */ +#line 17265 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INSERT_ACL; } +#line 50262 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3431: /* object_privilege: UPDATE_SYM */ +#line 17266 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= UPDATE_ACL; } +#line 50268 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3432: /* object_privilege: REFERENCES */ +#line 17267 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REFERENCES_ACL; } +#line 50274 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3433: /* object_privilege: DELETE_SYM */ +#line 17268 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DELETE_ACL;} +#line 50280 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3434: /* object_privilege: USAGE */ +#line 17269 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50286 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3435: /* object_privilege: INDEX_SYM */ +#line 17270 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INDEX_ACL;} +#line 50292 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3436: /* object_privilege: ALTER */ +#line 17271 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= ALTER_ACL;} +#line 50298 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3437: /* object_privilege: CREATE */ +#line 17272 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_ACL;} +#line 50304 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3438: /* object_privilege: DROP */ +#line 17273 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DROP_ACL;} +#line 50310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3439: /* object_privilege: EXECUTE_SYM */ +#line 17274 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= EXECUTE_ACL;} +#line 50316 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3440: /* object_privilege: RELOAD */ +#line 17275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= RELOAD_ACL;} +#line 50322 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3441: /* object_privilege: SHUTDOWN */ +#line 17276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHUTDOWN_ACL;} +#line 50328 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3442: /* object_privilege: PROCESS */ +#line 17277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= PROCESS_ACL;} +#line 50334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3443: /* object_privilege: FILE_SYM */ +#line 17278 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= FILE_ACL;} +#line 50340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3444: /* object_privilege: GRANT OPTION */ +#line 17279 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL;} +#line 50346 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3445: /* object_privilege: SHOW DATABASES */ +#line 17280 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHOW_DB_ACL;} +#line 50352 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3446: /* object_privilege: SUPER_SYM */ +#line 17281 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SUPER_ACL;} +#line 50358 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3447: /* object_privilege: CREATE TEMPORARY TABLES */ +#line 17282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_TMP_ACL;} +#line 50364 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3448: /* object_privilege: LOCK_SYM TABLES */ +#line 17283 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= LOCK_TABLES_ACL; } +#line 50370 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3449: /* object_privilege: REPLICATION SLAVE */ +#line 17284 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_SLAVE_ACL; } +#line 50376 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3450: /* object_privilege: REPLICATION CLIENT_SYM */ +#line 17285 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_MONITOR_ACL; /*Compatibility*/ } +#line 50382 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3451: /* object_privilege: CREATE VIEW_SYM */ +#line 17286 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_VIEW_ACL; } +#line 50388 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3452: /* object_privilege: SHOW VIEW_SYM */ +#line 17287 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHOW_VIEW_ACL; } +#line 50394 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3453: /* object_privilege: CREATE ROUTINE_SYM */ +#line 17288 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_PROC_ACL; } +#line 50400 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3454: /* object_privilege: ALTER ROUTINE_SYM */ +#line 17289 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= ALTER_PROC_ACL; } +#line 50406 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3455: /* object_privilege: CREATE USER_SYM */ +#line 17290 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_USER_ACL; } +#line 50412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3456: /* object_privilege: EVENT_SYM */ +#line 17291 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= EVENT_ACL;} +#line 50418 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3457: /* object_privilege: TRIGGER_SYM */ +#line 17292 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= TRIGGER_ACL; } +#line 50424 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3458: /* object_privilege: CREATE TABLESPACE */ +#line 17293 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_TABLESPACE_ACL; } +#line 50430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3459: /* object_privilege: DELETE_SYM HISTORY_SYM */ +#line 17294 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DELETE_HISTORY_ACL; } +#line 50436 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3460: /* object_privilege: SET USER_SYM */ +#line 17295 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SET_USER_ACL; } +#line 50442 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3461: /* object_privilege: FEDERATED_SYM ADMIN_SYM */ +#line 17296 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= FEDERATED_ADMIN_ACL; } +#line 50448 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3462: /* object_privilege: CONNECTION_SYM ADMIN_SYM */ +#line 17297 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CONNECTION_ADMIN_ACL; } +#line 50454 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3463: /* object_privilege: READ_SYM ONLY_SYM ADMIN_SYM */ +#line 17298 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= READ_ONLY_ADMIN_ACL; } +#line 50460 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3464: /* object_privilege: READ_ONLY_SYM ADMIN_SYM */ +#line 17299 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= READ_ONLY_ADMIN_ACL; } +#line 50466 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3465: /* object_privilege: BINLOG_SYM MONITOR_SYM */ +#line 17300 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_MONITOR_ACL; } +#line 50472 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3466: /* object_privilege: BINLOG_SYM ADMIN_SYM */ +#line 17301 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_ADMIN_ACL; } +#line 50478 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3467: /* object_privilege: BINLOG_SYM REPLAY_SYM */ +#line 17302 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_REPLAY_ACL; } +#line 50484 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3468: /* object_privilege: REPLICATION MASTER_SYM ADMIN_SYM */ +#line 17303 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_MASTER_ADMIN_ACL; } +#line 50490 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3469: /* object_privilege: REPLICATION SLAVE ADMIN_SYM */ +#line 17304 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_SLAVE_ADMIN_ACL; } +#line 50496 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3470: /* object_privilege: SLAVE MONITOR_SYM */ +#line 17305 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SLAVE_MONITOR_ACL; } +#line 50502 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3471: /* opt_and: %empty */ +#line 17309 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50508 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3472: /* opt_and: AND_SYM */ +#line 17310 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50514 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3475: /* require_list_element: SUBJECT_SYM TEXT_STRING */ +#line 17320 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.x509_subject.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SUBJECT")); + lex->account_options.x509_subject= (yyvsp[0].lex_string_with_metadata); + } +#line 50525 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3476: /* require_list_element: ISSUER_SYM TEXT_STRING */ +#line 17327 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.x509_issuer.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "ISSUER")); + lex->account_options.x509_issuer= (yyvsp[0].lex_string_with_metadata); + } +#line 50536 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3477: /* require_list_element: CIPHER_SYM TEXT_STRING */ +#line 17334 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.ssl_cipher.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CIPHER")); + lex->account_options.ssl_cipher= (yyvsp[0].lex_string_with_metadata); + } +#line 50547 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3478: /* grant_ident: '*' */ +#line 17344 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING db; + if (unlikely(Lex->copy_db_to(&db))) + MYSQL_YYABORT; + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name(db, + Lex_grant_object_name::STAR))) + MYSQL_YYABORT; + } +#line 50560 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3479: /* grant_ident: ident '.' '*' */ +#line 17353 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name((yyvsp[-2].ident_sys), + Lex_grant_object_name::IDENT_STAR))) + MYSQL_YYABORT; + } +#line 50570 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3480: /* grant_ident: '*' '.' '*' */ +#line 17359 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name( + null_clex_str, + Lex_grant_object_name::STAR_STAR))) + MYSQL_YYABORT; + } +#line 50581 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3481: /* grant_ident: table_ident */ +#line 17366 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name((yyvsp[0].table)))) + MYSQL_YYABORT; + } +#line 50590 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3482: /* user_list: user */ +#line 17374 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50599 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3483: /* user_list: user_list ',' user */ +#line 17379 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50608 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3484: /* grant_list: grant_user */ +#line 17387 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50617 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3485: /* grant_list: grant_list ',' grant_user */ +#line 17392 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50626 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3486: /* user_and_role_list: user_or_role */ +#line 17400 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50635 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3487: /* user_and_role_list: user_and_role_list ',' user_or_role */ +#line 17405 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50644 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3492: /* grant_user: user IDENTIFIED_SYM BY TEXT_STRING */ +#line 17416 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-3].lex_user); + (yyvsp[-3].lex_user)->auth= new (thd->mem_root) USER_AUTH(); + (yyvsp[-3].lex_user)->auth->pwtext= (yyvsp[0].lex_string_with_metadata); + } +#line 50654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3493: /* grant_user: user IDENTIFIED_SYM BY PASSWORD_SYM TEXT_STRING */ +#line 17422 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-4].lex_user); + (yyvsp[-4].lex_user)->auth= new (thd->mem_root) USER_AUTH(); + (yyvsp[-4].lex_user)->auth->auth_str= (yyvsp[0].lex_string_with_metadata); + } +#line 50664 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3494: /* grant_user: user IDENTIFIED_SYM via_or_with auth_expression */ +#line 17428 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-3].lex_user); + (yyvsp[-3].lex_user)->auth= (yyvsp[0].user_auth); + } +#line 50673 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3495: /* grant_user: user_or_role */ +#line 17433 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[0].lex_user); + } +#line 50681 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3496: /* auth_expression: auth_token OR_SYM auth_expression */ +#line 17440 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[-2].user_auth); + DBUG_ASSERT((yyval.user_auth)->next == NULL); + (yyval.user_auth)->next= (yyvsp[0].user_auth); + } +#line 50691 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3497: /* auth_expression: auth_token */ +#line 17446 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[0].user_auth); + } +#line 50699 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3498: /* auth_token: ident_or_text opt_auth_str */ +#line 17453 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[0].user_auth); + (yyval.user_auth)->plugin= (yyvsp[-1].lex_str); + } +#line 50708 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3499: /* opt_auth_str: %empty */ +#line 17461 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + } +#line 50717 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3500: /* opt_auth_str: using_or_as TEXT_STRING_sys */ +#line 17466 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + (yyval.user_auth)->auth_str= (yyvsp[0].lex_str); + } +#line 50727 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3501: /* opt_auth_str: using_or_as PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 17472 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + } +#line 50737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3503: /* opt_require_clause: REQUIRE_SYM require_list */ +#line 17482 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_SPECIFIED; + } +#line 50745 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3504: /* opt_require_clause: REQUIRE_SYM SSL_SYM */ +#line 17486 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_ANY; + } +#line 50753 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3505: /* opt_require_clause: REQUIRE_SYM X509_SYM */ +#line 17490 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_X509; + } +#line 50761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3506: /* opt_require_clause: REQUIRE_SYM NONE_SYM */ +#line 17494 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_NONE; + } +#line 50769 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3507: /* resource_option: MAX_QUERIES_PER_HOUR ulong_num */ +#line 17501 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.questions=(yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::QUERIES_PER_HOUR; + } +#line 50778 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3508: /* resource_option: MAX_UPDATES_PER_HOUR ulong_num */ +#line 17506 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.updates=(yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::UPDATES_PER_HOUR; + } +#line 50787 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3509: /* resource_option: MAX_CONNECTIONS_PER_HOUR ulong_num */ +#line 17511 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.conn_per_hour= (yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::CONNECTIONS_PER_HOUR; + } +#line 50796 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3510: /* resource_option: MAX_USER_CONNECTIONS_SYM int_num */ +#line 17516 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.user_conn= (yyvsp[0].num); + Lex->account_options.specified_limits|= USER_RESOURCES::USER_CONNECTIONS; + } +#line 50805 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3511: /* resource_option: MAX_STATEMENT_TIME_SYM NUM_literal */ +#line 17521 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.max_statement_time= (yyvsp[0].item_num)->val_real(); + Lex->account_options.specified_limits|= USER_RESOURCES::MAX_STATEMENT_TIME; + } +#line 50814 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3512: /* resource_option_list: resource_option_list resource_option */ +#line 17528 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50820 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3513: /* resource_option_list: resource_option */ +#line 17529 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50826 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3514: /* opt_resource_options: %empty */ +#line 17533 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50832 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3516: /* opt_grant_options: %empty */ +#line 17539 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50838 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3517: /* opt_grant_options: WITH grant_option_list */ +#line 17540 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= (yyvsp[0].privilege); } +#line 50844 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3518: /* opt_grant_option: %empty */ +#line 17544 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50850 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3519: /* opt_grant_option: WITH GRANT OPTION */ +#line 17545 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL; } +#line 50856 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3520: /* grant_option_list: grant_option_list grant_option */ +#line 17549 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= (yyvsp[-1].privilege) | (yyvsp[0].privilege); } +#line 50862 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3522: /* grant_option: GRANT OPTION */ +#line 17554 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL;} +#line 50868 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3523: /* grant_option: resource_option */ +#line 17555 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50874 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3524: /* $@247: %empty */ +#line 17560 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_BEGIN; + lex->start_transaction_opt= 0; + } +#line 50884 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3525: /* begin_stmt_mariadb: BEGIN_MARIADB_SYM $@247 opt_work */ +#line 17565 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50890 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3526: /* compound_statement: sp_proc_stmt_compound_ok */ +#line 17570 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_COMPOUND; + if (Lex->sp_body_finalize_procedure(thd)) + MYSQL_YYABORT; + } +#line 50900 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3527: /* opt_not: %empty */ +#line 17578 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 50906 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3528: /* opt_not: not */ +#line 17579 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 50912 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3529: /* opt_work: %empty */ +#line 17583 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50918 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3530: /* opt_work: WORK_SYM */ +#line 17584 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50924 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3531: /* opt_chain: %empty */ +#line 17589 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } +#line 50930 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3532: /* opt_chain: AND_SYM NO_SYM CHAIN_SYM */ +#line 17590 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_NO; } +#line 50936 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3533: /* opt_chain: AND_SYM CHAIN_SYM */ +#line 17591 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_YES; } +#line 50942 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3534: /* opt_release: %empty */ +#line 17596 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } +#line 50948 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3535: /* opt_release: RELEASE_SYM */ +#line 17597 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_YES; } +#line 50954 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3536: /* opt_release: NO_SYM RELEASE_SYM */ +#line 17598 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_NO; } +#line 50960 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3537: /* commit: COMMIT_SYM opt_work opt_chain opt_release */ +#line 17603 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_COMMIT; + /* Don't allow AND CHAIN RELEASE. */ + MYSQL_YYABORT_UNLESS((yyvsp[-1].m_yes_no_unk) != TVL_YES || (yyvsp[0].m_yes_no_unk) != TVL_YES); + lex->tx_chain= (yyvsp[-1].m_yes_no_unk); + lex->tx_release= (yyvsp[0].m_yes_no_unk); + } +#line 50973 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3538: /* rollback: ROLLBACK_SYM opt_work opt_chain opt_release */ +#line 17615 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK; + /* Don't allow AND CHAIN RELEASE. */ + MYSQL_YYABORT_UNLESS((yyvsp[-1].m_yes_no_unk) != TVL_YES || (yyvsp[0].m_yes_no_unk) != TVL_YES); + lex->tx_chain= (yyvsp[-1].m_yes_no_unk); + lex->tx_release= (yyvsp[0].m_yes_no_unk); + } +#line 50986 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3539: /* rollback: ROLLBACK_SYM opt_work TO_SYM SAVEPOINT_SYM ident */ +#line 17624 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 50996 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3540: /* rollback: ROLLBACK_SYM opt_work TO_SYM ident */ +#line 17630 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 51006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3541: /* savepoint: SAVEPOINT_SYM ident */ +#line 17639 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 51016 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3542: /* release: RELEASE_SYM SAVEPOINT_SYM ident */ +#line 17648 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_RELEASE_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 51026 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3543: /* unit_type_decl: UNION_SYM union_option */ +#line 17661 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= UNION_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 51032 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3544: /* unit_type_decl: INTERSECT_SYM union_option */ +#line 17663 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= INTERSECT_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 51038 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3545: /* unit_type_decl: EXCEPT_SYM union_option */ +#line 17665 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= EXCEPT_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 51044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3546: /* union_option: %empty */ +#line 17672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1; } +#line 51050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3547: /* union_option: DISTINCT */ +#line 17673 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1; } +#line 51056 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3548: /* union_option: ALL */ +#line 17674 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=0; } +#line 51062 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3549: /* query_expression_option: STRAIGHT_JOIN */ +#line 17678 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_STRAIGHT_JOIN; } +#line 51068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3550: /* query_expression_option: HIGH_PRIORITY */ +#line 17680 "/home/buildbot/git/sql/sql_yacc.yy" + { + YYPS->m_lock_type= TL_READ_HIGH_PRIORITY; + YYPS->m_mdl_type= MDL_SHARED_READ; + Select->options|= SELECT_HIGH_PRIORITY; + } +#line 51078 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3551: /* query_expression_option: DISTINCT */ +#line 17685 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_DISTINCT; } +#line 51084 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3552: /* query_expression_option: UNIQUE_SYM */ +#line 17686 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_DISTINCT; } +#line 51090 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3553: /* query_expression_option: SQL_SMALL_RESULT */ +#line 17687 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_SMALL_RESULT; } +#line 51096 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3554: /* query_expression_option: SQL_BIG_RESULT */ +#line 17688 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_BIG_RESULT; } +#line 51102 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3555: /* query_expression_option: SQL_BUFFER_RESULT */ +#line 17689 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_BUFFER_RESULT; } +#line 51108 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3556: /* query_expression_option: SQL_CALC_FOUND_ROWS */ +#line 17690 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_FOUND_ROWS; } +#line 51114 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3557: /* query_expression_option: ALL */ +#line 17691 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_ALL; } +#line 51120 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3560: /* no_definer: %empty */ +#line 17707 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + We have to distinguish missing DEFINER-clause from case when + CURRENT_USER specified as definer explicitly in order to properly + handle CREATE TRIGGER statements which come to replication thread + from older master servers (i.e. to create non-suid trigger in this + case). + */ + thd->lex->definer= 0; + } +#line 51135 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3561: /* definer: DEFINER_SYM '=' user_or_role */ +#line 17721 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->definer= (yyvsp[0].lex_user); + Lex->account_options.reset(); + } +#line 51144 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3562: /* view_algorithm: ALGORITHM_SYM '=' UNDEFINED_SYM */ +#line 17734 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= DTYPE_ALGORITHM_UNDEFINED; } +#line 51150 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3563: /* view_algorithm: ALGORITHM_SYM '=' MERGE_SYM */ +#line 17735 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_ALGORITHM_MERGE; } +#line 51156 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3564: /* view_algorithm: ALGORITHM_SYM '=' TEMPTABLE_SYM */ +#line 17736 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_ALGORITHM_TMPTABLE; } +#line 51162 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3565: /* opt_view_suid: %empty */ +#line 17740 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_DEFAULT; } +#line 51168 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3566: /* opt_view_suid: view_suid */ +#line 17741 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= (yyvsp[0].view_suid); } +#line 51174 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3567: /* view_suid: SQL_SYM SECURITY_SYM DEFINER_SYM */ +#line 17745 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_DEFINER; } +#line 51180 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3568: /* view_suid: SQL_SYM SECURITY_SYM INVOKER_SYM */ +#line 17746 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_INVOKER; } +#line 51186 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3569: /* view_list_opt: %empty */ +#line 17751 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51192 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3570: /* view_list_opt: '(' view_list ')' */ +#line 17752 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51198 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3571: /* view_list: ident */ +#line 17757 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root); + } +#line 51208 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3572: /* view_list: view_list ',' ident */ +#line 17763 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root); + } +#line 51218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3573: /* $@248: %empty */ +#line 17771 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->parsing_options.allows_variable= FALSE; + lex->create_view->select.str= (char *) YYLIP->get_cpp_ptr(); + } +#line 51228 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3574: /* view_select: $@248 query_expression view_check_option */ +#line 17778 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_create_view((yyvsp[-1].select_lex_unit), (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 51237 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3575: /* view_check_option: %empty */ +#line 17785 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_NONE; } +#line 51243 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3576: /* view_check_option: WITH CHECK_SYM OPTION */ +#line 17786 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_CASCADED; } +#line 51249 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3577: /* view_check_option: WITH CASCADED CHECK_SYM OPTION */ +#line 17787 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_CASCADED; } +#line 51255 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3578: /* view_check_option: WITH LOCAL_SYM CHECK_SYM OPTION */ +#line 17788 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_LOCAL; } +#line 51261 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3579: /* trigger_action_order: FOLLOWS_SYM */ +#line 17799 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trigger_action_order_type)= TRG_ORDER_FOLLOWS; } +#line 51267 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3580: /* trigger_action_order: PRECEDES_SYM */ +#line 17801 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trigger_action_order_type)= TRG_ORDER_PRECEDES; } +#line 51273 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3581: /* trigger_follows_precedes_clause: %empty */ +#line 17806 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.trg_execution_order).ordering_clause= TRG_ORDER_NONE; + (yyval.trg_execution_order).anchor_trigger_name.str= NULL; + (yyval.trg_execution_order).anchor_trigger_name.length= 0; + } +#line 51283 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3582: /* trigger_follows_precedes_clause: trigger_action_order ident_or_text */ +#line 17813 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.trg_execution_order).ordering_clause= (yyvsp[-1].trigger_action_order_type); + (yyval.trg_execution_order).anchor_trigger_name= (yyvsp[0].lex_str); + } +#line 51292 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3583: /* $@249: %empty */ +#line 17822 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_options_with_check((yyvsp[0].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 51301 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3584: /* $@250: %empty */ +#line 17831 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $9 */ + Lex->raw_trg_on_table_name_begin= YYLIP->get_tok_start(); + } +#line 51309 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3585: /* $@251: %empty */ +#line 17837 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $13 */ + Lex->raw_trg_on_table_name_end= YYLIP->get_tok_start(); + } +#line 51317 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3586: /* $@252: %empty */ +#line 17842 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->trg_chistics.ordering_clause_begin= YYLIP->get_cpp_ptr(); + } +#line 51325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3587: /* $@253: %empty */ +#line 17846 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $18 */ + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_RECURSIVE_CREATE, MYF(0), "TRIGGER")); + + lex->stmt_definition_begin= (yyvsp[-16].simple_string); + lex->ident.str= (yyvsp[-9].simple_string); + lex->ident.length= (yyvsp[-5].simple_string) - (yyvsp[-9].simple_string); + lex->spname= (yyvsp[-13].spname); + (*static_cast(&lex->trg_chistics))= ((yyvsp[0].trg_execution_order)); + lex->trg_chistics.ordering_clause_end= lip->get_cpp_ptr(); + + if (unlikely(!lex->make_sp_head(thd, (yyvsp[-13].spname), &sp_handler_trigger, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + + lex->sphead->set_body_start(thd, lip->get_cpp_tok_start()); + } +#line 51350 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3588: /* trigger_tail: remember_name opt_if_not_exists $@249 sp_name trg_action_time trg_event ON remember_name $@250 table_ident FOR_SYM remember_name $@251 EACH_SYM ROW_SYM $@252 trigger_follows_precedes_clause $@253 sp_proc_stmt force_lookahead */ +#line 17867 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $21 */ + LEX *lex= Lex; + + lex->sql_command= SQLCOM_CREATE_TRIGGER; + if (lex->sp_body_finalize_trigger(thd)) + MYSQL_YYABORT; + + /* + We have to do it after parsing trigger body, because some of + sp_proc_stmt alternatives are not saving/restoring LEX, so + lex->query_tables can be wiped out. + */ + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[-10].table), (LEX_CSTRING*) 0, + TL_OPTION_UPDATING, TL_READ_NO_INSERT, + MDL_SHARED_NO_WRITE)) + MYSQL_YYABORT; + } +#line 51373 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3589: /* $@254: %empty */ +#line 17895 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->init_last_field(&lex->sphead->m_return_field_def, + &empty_clex_str); + } +#line 51383 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3590: /* sf_return_type: $@254 field_type */ +#line 17901 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sf_return_fill_definition((yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 51392 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3591: /* xa: XA_SYM begin_or_start xid opt_join_or_resume */ +#line 17911 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_START; + } +#line 51400 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3592: /* xa: XA_SYM END xid opt_suspend */ +#line 17915 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_END; + } +#line 51408 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3593: /* xa: XA_SYM PREPARE_SYM xid */ +#line 17919 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_PREPARE; + } +#line 51416 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3594: /* xa: XA_SYM COMMIT_SYM xid opt_one_phase */ +#line 17923 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_COMMIT; + } +#line 51424 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3595: /* xa: XA_SYM ROLLBACK_SYM xid */ +#line 17927 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_ROLLBACK; + } +#line 51432 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3596: /* xa: XA_SYM RECOVER_SYM opt_format_xid */ +#line 17931 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_RECOVER; + Lex->verbose= (yyvsp[0].num); + } +#line 51441 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3597: /* opt_format_xid: %empty */ +#line 17938 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 51447 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3598: /* opt_format_xid: FORMAT_SYM '=' ident_or_text */ +#line 17940 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("SQL"))) + (yyval.num)= true; + else if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("RAW"))) + (yyval.num)= false; + else + { + my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), + "XA RECOVER", (yyvsp[0].lex_str).str)); + (yyval.num)= false; + } + } +#line 51464 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3599: /* xid: text_string */ +#line 17956 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[0].string)->length() <= MAXGTRIDSIZE); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set(1L, (yyvsp[0].string)->ptr(), (yyvsp[0].string)->length(), 0, 0); + } +#line 51475 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3600: /* xid: text_string ',' text_string */ +#line 17963 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].string)->length() <= MAXGTRIDSIZE && (yyvsp[0].string)->length() <= MAXBQUALSIZE); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set(1L, (yyvsp[-2].string)->ptr(), (yyvsp[-2].string)->length(), (yyvsp[0].string)->ptr(), (yyvsp[0].string)->length()); + } +#line 51486 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3601: /* xid: text_string ',' text_string ',' ulong_num */ +#line 17970 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].string)->length() <= MAXGTRIDSIZE && + (yyvsp[-2].string)->length() <= MAXBQUALSIZE && + (yyvsp[0].ulong_num) <= static_cast( + std::numeric_limits::max())); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set((yyvsp[0].ulong_num), (yyvsp[-4].string)->ptr(), (yyvsp[-4].string)->length(), (yyvsp[-2].string)->ptr(), (yyvsp[-2].string)->length()); + } +#line 51500 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3602: /* begin_or_start: BEGIN_MARIADB_SYM */ +#line 17982 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51506 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3603: /* begin_or_start: BEGIN_ORACLE_SYM */ +#line 17983 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51512 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3604: /* begin_or_start: START_SYM */ +#line 17984 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51518 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3605: /* opt_join_or_resume: %empty */ +#line 17988 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 51524 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3606: /* opt_join_or_resume: JOIN_SYM */ +#line 17989 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_JOIN; } +#line 51530 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3607: /* opt_join_or_resume: RESUME_SYM */ +#line 17990 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_RESUME; } +#line 51536 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3608: /* opt_one_phase: %empty */ +#line 17994 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 51542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3609: /* opt_one_phase: ONE_SYM PHASE_SYM */ +#line 17995 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_ONE_PHASE; } +#line 51548 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3610: /* opt_suspend: %empty */ +#line 18000 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 51554 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3611: /* $@255: %empty */ +#line 18002 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_SUSPEND; } +#line 51560 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3613: /* opt_migrate: %empty */ +#line 18007 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51566 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3614: /* opt_migrate: FOR_SYM MIGRATE_SYM */ +#line 18008 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_FOR_MIGRATE; } +#line 51572 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3615: /* install: INSTALL_SYM PLUGIN_SYM opt_if_not_exists ident SONAME_SYM TEXT_STRING_sys */ +#line 18013 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_install_plugin((yyvsp[-3].object_ddl_options), (yyvsp[-2].ident_sys), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 51581 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3616: /* install: INSTALL_SYM SONAME_SYM TEXT_STRING_sys */ +#line 18018 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_install_plugin((yyvsp[0].lex_str)); + } +#line 51589 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3617: /* uninstall: UNINSTALL_SYM PLUGIN_SYM opt_if_exists ident */ +#line 18025 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_uninstall_plugin_by_name((yyvsp[-1].object_ddl_options), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 51598 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3618: /* uninstall: UNINSTALL_SYM SONAME_SYM opt_if_exists TEXT_STRING_sys */ +#line 18030 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_uninstall_plugin_by_soname((yyvsp[-1].object_ddl_options), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 51607 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3619: /* keep_gcc_happy: IMPOSSIBLE_ACTION */ +#line 18039 "/home/buildbot/git/sql/sql_yacc.yy" + { + YYERROR; + } +#line 51615 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3653: /* row_field_name: ident */ +#line 18122 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spvar_definition)= Lex->row_field_name(thd, (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 51624 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3654: /* $@256: %empty */ +#line 18130 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-1].expr_lex)->sp_while_loop_expression(thd))) + MYSQL_YYABORT; + } +#line 51633 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3655: /* while_body: expr_lex DO_SYM $@256 sp_proc_stmts1 END WHILE_SYM */ +#line 18135 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_while_loop_finalize(thd))) + MYSQL_YYABORT; + } +#line 51642 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3656: /* for_loop_statements: DO_SYM sp_proc_stmts1 END FOR_SYM */ +#line 18143 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51648 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3657: /* sp_label: label_ident ':' */ +#line 18147 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[-1].ident_sys); } +#line 51654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3659: /* sp_block_label: sp_label */ +#line 18156 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->spcont->block_label_declare(&(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + (yyval.lex_str)= (yyvsp[0].lex_str); + } +#line 51664 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3660: /* sp_opt_default: _empty */ +#line 18164 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = NULL; } +#line 51670 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3661: /* sp_opt_default: DEFAULT expr */ +#line 18165 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item); } +#line 51676 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3662: /* sp_decl_variable_list_anchored: sp_decl_idents_init_vars TYPE_SYM OF_SYM optionally_qualified_column_ident sp_opt_default */ +#line 18172 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_with_ref_finalize(thd, (yyvsp[-4].num), (yyvsp[-1].qualified_column_ident), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-4].num)); + } +#line 51686 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3663: /* sp_decl_variable_list_anchored: sp_decl_idents_init_vars ROW_SYM TYPE_SYM OF_SYM optionally_qualified_column_ident sp_opt_default */ +#line 18180 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_rowtype_finalize(thd, (yyvsp[-5].num), (yyvsp[-1].qualified_column_ident), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-5].num)); + } +#line 51696 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3664: /* sp_param_name_and_mode: sp_parameter_type sp_param_name */ +#line 18189 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].spvar)->mode= (yyvsp[-1].spvar_mode); + (yyval.spvar)= (yyvsp[0].spvar); + } +#line 51705 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3666: /* sp_param: sp_param_name_and_mode field_type */ +#line 18198 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_param_fill_definition((yyval.spvar)= (yyvsp[-1].spvar), (yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 51714 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3667: /* sp_param: sp_param_name_and_mode ROW_SYM row_type_body */ +#line 18203 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_row(thd, (yyval.spvar)= (yyvsp[-2].spvar), (yyvsp[0].spvar_definition_list)))) + MYSQL_YYABORT; + } +#line 51723 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3669: /* sp_param_anchored: sp_param_name_and_mode TYPE_SYM OF_SYM ident '.' ident */ +#line 18212 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, + (yyval.spvar)= (yyvsp[-5].spvar), (yyvsp[-2].ident_sys), + (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 51734 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3670: /* sp_param_anchored: sp_param_name_and_mode TYPE_SYM OF_SYM ident '.' ident '.' ident */ +#line 18219 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, (yyval.spvar)= (yyvsp[-7].spvar), + (yyvsp[-4].ident_sys), (yyvsp[-2].ident_sys), (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 51744 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3671: /* sp_param_anchored: sp_param_name_and_mode ROW_SYM TYPE_SYM OF_SYM ident */ +#line 18225 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, (yyval.spvar)= (yyvsp[-4].spvar), (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 51753 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3672: /* sp_param_anchored: sp_param_name_and_mode ROW_SYM TYPE_SYM OF_SYM ident '.' ident */ +#line 18230 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, (yyval.spvar)= (yyvsp[-6].spvar), (yyvsp[-2].ident_sys), (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 51762 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3673: /* $@257: %empty */ +#line 18239 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->sphead->set_c_chistics(lex->sp_chistics); + lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51772 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3674: /* sf_c_chistics_and_body_standalone: sp_c_chistics $@257 sp_proc_stmt_in_returns_clause force_lookahead */ +#line 18245 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_body_finalize_function(thd))) + MYSQL_YYABORT; + } +#line 51781 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3675: /* $@258: %empty */ +#line 18253 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->make_sp_head_no_recursive(thd, (yyvsp[0].spname), + &sp_handler_procedure, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + } +#line 51792 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3676: /* $@259: %empty */ +#line 18261 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51801 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3677: /* sp_tail_standalone: sp_name $@258 sp_parenthesized_pdparam_list sp_c_chistics $@259 sp_proc_stmt force_lookahead */ +#line 18266 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_body_finalize_procedure(thd))) + MYSQL_YYABORT; + } +#line 51810 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3678: /* drop_routine: DROP FUNCTION_SYM opt_if_exists ident '.' ident */ +#line 18274 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_function((yyvsp[-3].object_ddl_options), (yyvsp[-2].ident_sys), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 51819 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3679: /* drop_routine: DROP FUNCTION_SYM opt_if_exists ident */ +#line 18279 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_function((yyvsp[-1].object_ddl_options), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 51828 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3680: /* drop_routine: DROP PROCEDURE_SYM opt_if_exists sp_name */ +#line 18284 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_procedure((yyvsp[-1].object_ddl_options), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51837 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3681: /* $@260: %empty */ +#line 18293 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_procedure_start((yyvsp[-3].object_ddl_options) | (yyvsp[0].object_ddl_options))) + MYSQL_YYABORT; + } +#line 51846 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3682: /* create_routine: create_or_replace definer_opt PROCEDURE_SYM opt_if_not_exists $@260 sp_tail_standalone */ +#line 18298 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_create_routine_finalize(); + } +#line 51854 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3683: /* $@261: %empty */ +#line 18303 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_start((yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-3].sp_aggregate_type), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51863 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3684: /* create_routine: create_or_replace definer opt_aggregate FUNCTION_SYM opt_if_not_exists sp_name $@261 sp_parenthesized_fdparam_list RETURNS_SYM sf_return_type sf_c_chistics_and_body_standalone */ +#line 18310 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_create_routine_finalize(); + } +#line 51871 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3685: /* $@262: %empty */ +#line 18315 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_start((yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-3].sp_aggregate_type), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51880 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3686: /* create_routine: create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists sp_name $@262 sp_parenthesized_fdparam_list RETURNS_SYM sf_return_type sf_c_chistics_and_body_standalone */ +#line 18322 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_create_routine_finalize(); + } +#line 51888 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3687: /* create_routine: create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists ident RETURNS_SYM udf_type SONAME_SYM TEXT_STRING_sys */ +#line 18327 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_udf_function((yyvsp[-9].object_ddl_options) | (yyvsp[-5].object_ddl_options), (yyvsp[-7].sp_aggregate_type), (yyvsp[-4].ident_sys), + (Item_result) (yyvsp[-2].num), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 51898 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3688: /* sp_decls: _empty */ +#line 18337 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spblock).init(); + } +#line 51906 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3689: /* sp_decls: sp_decls sp_decl ';' */ +#line 18341 "/home/buildbot/git/sql/sql_yacc.yy" + { + // We check for declarations out of (standard) order this way + // because letting the grammar rules reflect it caused tricky + // shift/reduce conflicts with the wrong result. (And we get + // better error handling this way.) + if (unlikely(Lex->sp_declarations_join(&(yyval.spblock), (yyvsp[-2].spblock), (yyvsp[-1].spblock)))) + MYSQL_YYABORT; + } +#line 51919 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3690: /* sp_decl: DECLARE_MARIADB_SYM sp_decl_body */ +#line 18352 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock)= (yyvsp[0].spblock); } +#line 51925 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3692: /* sp_decl_body: sp_decl_ident CONDITION_SYM FOR_SYM sp_cond */ +#line 18359 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->spcont->declare_condition(thd, &(yyvsp[-3].ident_sys), (yyvsp[0].spcondvalue)))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).hndlrs= (yyval.spblock).curs= 0; + (yyval.spblock).conds= 1; + } +#line 51936 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3694: /* $@263: %empty */ +#line 18367 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd); + } +#line 51944 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3695: /* sp_decl_body: sp_decl_ident CURSOR_SYM $@263 opt_parenthesized_cursor_formal_parameters FOR_SYM sp_cursor_stmt */ +#line 18372 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_pcontext *param_ctx= Lex->spcont; + if (unlikely(Lex->sp_block_finalize(thd))) + MYSQL_YYABORT; + if (unlikely(Lex->sp_declare_cursor(thd, &(yyvsp[-5].ident_sys), (yyvsp[0].sp_cursor_stmt), param_ctx, true))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).hndlrs= 0; + (yyval.spblock).curs= 1; + } +#line 51958 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3713: /* $@264: %empty */ +#line 18423 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd, &(yyvsp[-1].lex_str)); + } +#line 51966 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3714: /* sp_labeled_block: sp_block_label BEGIN_MARIADB_SYM $@264 sp_decls sp_proc_stmts END sp_opt_label */ +#line 18430 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-3].spblock), &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 51975 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3715: /* $@265: %empty */ +#line 18438 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd); + } +#line 51983 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3716: /* sp_unlabeled_block: BEGIN_MARIADB_SYM $@265 sp_decls sp_proc_stmts END */ +#line 18444 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-2].spblock)))) + MYSQL_YYABORT; + } +#line 51992 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3717: /* $@266: %empty */ +#line 18452 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sp_block_init(thd); + } +#line 52002 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3718: /* sp_unlabeled_block_not_atomic: BEGIN_MARIADB_SYM not ATOMIC_SYM $@266 sp_decls sp_proc_stmts END */ +#line 18460 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-2].spblock)))) + MYSQL_YYABORT; + } +#line 52011 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + +#line 52015 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + + *++yyvsp = yyval; + + /* Now 'shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; + yyerror (thd, YY_("syntax error")); + } + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, thd); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; + ++yynerrs; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + /* Pop stack until we find a state that shifts the error token. */ + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + YY_ACCESSING_SYMBOL (yystate), yyvsp, thd); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturnlab; + + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturnlab; + + +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ +yyexhaustedlab: + yyerror (thd, YY_("memory exhausted")); + yyresult = 2; + goto yyreturnlab; + + +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, thd); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, thd); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + + return yyresult; +} + diff --git a/sql/yy_mariadb.hh b/sql/yy_mariadb.hh new file mode 100644 index 00000000..fa18f2cb --- /dev/null +++ b/sql/yy_mariadb.hh @@ -0,0 +1,981 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + 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 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 General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_MYSQL_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_MARIADB_HH_INCLUDED +# define YY_MYSQL_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_MARIADB_HH_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int MYSQLdebug; +#endif + +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + ABORT_SYM = 258, /* ABORT_SYM */ + IMPOSSIBLE_ACTION = 259, /* IMPOSSIBLE_ACTION */ + FORCE_LOOKAHEAD = 260, /* FORCE_LOOKAHEAD */ + END_OF_INPUT = 261, /* END_OF_INPUT */ + COLON_ORACLE_SYM = 262, /* COLON_ORACLE_SYM */ + PARAM_MARKER = 263, /* PARAM_MARKER */ + FOR_SYSTEM_TIME_SYM = 264, /* FOR_SYSTEM_TIME_SYM */ + LEFT_PAREN_ALT = 265, /* LEFT_PAREN_ALT */ + LEFT_PAREN_WITH = 266, /* LEFT_PAREN_WITH */ + LEFT_PAREN_LIKE = 267, /* LEFT_PAREN_LIKE */ + ORACLE_CONCAT_SYM = 268, /* ORACLE_CONCAT_SYM */ + PERCENT_ORACLE_SYM = 269, /* PERCENT_ORACLE_SYM */ + WITH_CUBE_SYM = 270, /* WITH_CUBE_SYM */ + WITH_ROLLUP_SYM = 271, /* WITH_ROLLUP_SYM */ + WITH_SYSTEM_SYM = 272, /* WITH_SYSTEM_SYM */ + IDENT = 273, /* IDENT */ + IDENT_QUOTED = 274, /* IDENT_QUOTED */ + LEX_HOSTNAME = 275, /* LEX_HOSTNAME */ + UNDERSCORE_CHARSET = 276, /* UNDERSCORE_CHARSET */ + BIN_NUM = 277, /* BIN_NUM */ + DECIMAL_NUM = 278, /* DECIMAL_NUM */ + FLOAT_NUM = 279, /* FLOAT_NUM */ + HEX_NUM = 280, /* HEX_NUM */ + HEX_STRING = 281, /* HEX_STRING */ + LONG_NUM = 282, /* LONG_NUM */ + NCHAR_STRING = 283, /* NCHAR_STRING */ + NUM = 284, /* NUM */ + TEXT_STRING = 285, /* TEXT_STRING */ + ULONGLONG_NUM = 286, /* ULONGLONG_NUM */ + AND_AND_SYM = 287, /* AND_AND_SYM */ + DOT_DOT_SYM = 288, /* DOT_DOT_SYM */ + EQUAL_SYM = 289, /* EQUAL_SYM */ + GE = 290, /* GE */ + LE = 291, /* LE */ + MYSQL_CONCAT_SYM = 292, /* MYSQL_CONCAT_SYM */ + NE = 293, /* NE */ + NOT2_SYM = 294, /* NOT2_SYM */ + OR2_SYM = 295, /* OR2_SYM */ + SET_VAR = 296, /* SET_VAR */ + SHIFT_LEFT = 297, /* SHIFT_LEFT */ + SHIFT_RIGHT = 298, /* SHIFT_RIGHT */ + ACCESSIBLE_SYM = 299, /* ACCESSIBLE_SYM */ + ADD = 300, /* ADD */ + ALL = 301, /* ALL */ + ALTER = 302, /* ALTER */ + ANALYZE_SYM = 303, /* ANALYZE_SYM */ + AND_SYM = 304, /* AND_SYM */ + ASC = 305, /* ASC */ + ASENSITIVE_SYM = 306, /* ASENSITIVE_SYM */ + AS = 307, /* AS */ + BEFORE_SYM = 308, /* BEFORE_SYM */ + BETWEEN_SYM = 309, /* BETWEEN_SYM */ + BIGINT = 310, /* BIGINT */ + BINARY = 311, /* BINARY */ + BIT_AND = 312, /* BIT_AND */ + BIT_OR = 313, /* BIT_OR */ + BIT_XOR = 314, /* BIT_XOR */ + BLOB_MARIADB_SYM = 315, /* BLOB_MARIADB_SYM */ + BLOB_ORACLE_SYM = 316, /* BLOB_ORACLE_SYM */ + BODY_ORACLE_SYM = 317, /* BODY_ORACLE_SYM */ + BOTH = 318, /* BOTH */ + BY = 319, /* BY */ + CALL_SYM = 320, /* CALL_SYM */ + CASCADE = 321, /* CASCADE */ + CASE_SYM = 322, /* CASE_SYM */ + CAST_SYM = 323, /* CAST_SYM */ + CHANGE = 324, /* CHANGE */ + CHAR_SYM = 325, /* CHAR_SYM */ + CHECK_SYM = 326, /* CHECK_SYM */ + COLLATE_SYM = 327, /* COLLATE_SYM */ + CONDITION_SYM = 328, /* CONDITION_SYM */ + CONSTRAINT = 329, /* CONSTRAINT */ + CONTINUE_MARIADB_SYM = 330, /* CONTINUE_MARIADB_SYM */ + CONTINUE_ORACLE_SYM = 331, /* CONTINUE_ORACLE_SYM */ + CONVERT_SYM = 332, /* CONVERT_SYM */ + COUNT_SYM = 333, /* COUNT_SYM */ + CREATE = 334, /* CREATE */ + CROSS = 335, /* CROSS */ + CUME_DIST_SYM = 336, /* CUME_DIST_SYM */ + CURDATE = 337, /* CURDATE */ + CURRENT_ROLE = 338, /* CURRENT_ROLE */ + CURRENT_USER = 339, /* CURRENT_USER */ + CURSOR_SYM = 340, /* CURSOR_SYM */ + CURTIME = 341, /* CURTIME */ + DATABASE = 342, /* DATABASE */ + DATABASES = 343, /* DATABASES */ + DATE_ADD_INTERVAL = 344, /* DATE_ADD_INTERVAL */ + DATE_SUB_INTERVAL = 345, /* DATE_SUB_INTERVAL */ + DAY_HOUR_SYM = 346, /* DAY_HOUR_SYM */ + DAY_MICROSECOND_SYM = 347, /* DAY_MICROSECOND_SYM */ + DAY_MINUTE_SYM = 348, /* DAY_MINUTE_SYM */ + DAY_SECOND_SYM = 349, /* DAY_SECOND_SYM */ + DECIMAL_SYM = 350, /* DECIMAL_SYM */ + DECLARE_MARIADB_SYM = 351, /* DECLARE_MARIADB_SYM */ + DECLARE_ORACLE_SYM = 352, /* DECLARE_ORACLE_SYM */ + DEFAULT = 353, /* DEFAULT */ + DELETE_DOMAIN_ID_SYM = 354, /* DELETE_DOMAIN_ID_SYM */ + DELETE_SYM = 355, /* DELETE_SYM */ + DENSE_RANK_SYM = 356, /* DENSE_RANK_SYM */ + DESCRIBE = 357, /* DESCRIBE */ + DESC = 358, /* DESC */ + DETERMINISTIC_SYM = 359, /* DETERMINISTIC_SYM */ + DISTINCT = 360, /* DISTINCT */ + DIV_SYM = 361, /* DIV_SYM */ + DO_DOMAIN_IDS_SYM = 362, /* DO_DOMAIN_IDS_SYM */ + DOUBLE_SYM = 363, /* DOUBLE_SYM */ + DROP = 364, /* DROP */ + DUAL_SYM = 365, /* DUAL_SYM */ + EACH_SYM = 366, /* EACH_SYM */ + ELSEIF_MARIADB_SYM = 367, /* ELSEIF_MARIADB_SYM */ + ELSE = 368, /* ELSE */ + ELSIF_ORACLE_SYM = 369, /* ELSIF_ORACLE_SYM */ + EMPTY_SYM = 370, /* EMPTY_SYM */ + ENCLOSED = 371, /* ENCLOSED */ + ESCAPED = 372, /* ESCAPED */ + EXCEPT_SYM = 373, /* EXCEPT_SYM */ + EXISTS = 374, /* EXISTS */ + EXTRACT_SYM = 375, /* EXTRACT_SYM */ + FALSE_SYM = 376, /* FALSE_SYM */ + FETCH_SYM = 377, /* FETCH_SYM */ + FIRST_VALUE_SYM = 378, /* FIRST_VALUE_SYM */ + FLOAT_SYM = 379, /* FLOAT_SYM */ + FOREIGN = 380, /* FOREIGN */ + FOR_SYM = 381, /* FOR_SYM */ + FROM = 382, /* FROM */ + FULLTEXT_SYM = 383, /* FULLTEXT_SYM */ + GOTO_ORACLE_SYM = 384, /* GOTO_ORACLE_SYM */ + GRANT = 385, /* GRANT */ + GROUP_CONCAT_SYM = 386, /* GROUP_CONCAT_SYM */ + JSON_ARRAYAGG_SYM = 387, /* JSON_ARRAYAGG_SYM */ + JSON_OBJECTAGG_SYM = 388, /* JSON_OBJECTAGG_SYM */ + JSON_TABLE_SYM = 389, /* JSON_TABLE_SYM */ + GROUP_SYM = 390, /* GROUP_SYM */ + HAVING = 391, /* HAVING */ + HOUR_MICROSECOND_SYM = 392, /* HOUR_MICROSECOND_SYM */ + HOUR_MINUTE_SYM = 393, /* HOUR_MINUTE_SYM */ + HOUR_SECOND_SYM = 394, /* HOUR_SECOND_SYM */ + IF_SYM = 395, /* IF_SYM */ + IGNORE_DOMAIN_IDS_SYM = 396, /* IGNORE_DOMAIN_IDS_SYM */ + IGNORE_SYM = 397, /* IGNORE_SYM */ + IGNORED_SYM = 398, /* IGNORED_SYM */ + INDEX_SYM = 399, /* INDEX_SYM */ + INFILE = 400, /* INFILE */ + INNER_SYM = 401, /* INNER_SYM */ + INOUT_SYM = 402, /* INOUT_SYM */ + INSENSITIVE_SYM = 403, /* INSENSITIVE_SYM */ + INSERT = 404, /* INSERT */ + IN_SYM = 405, /* IN_SYM */ + INTERSECT_SYM = 406, /* INTERSECT_SYM */ + INTERVAL_SYM = 407, /* INTERVAL_SYM */ + INTO = 408, /* INTO */ + INT_SYM = 409, /* INT_SYM */ + IS = 410, /* IS */ + ITERATE_SYM = 411, /* ITERATE_SYM */ + JOIN_SYM = 412, /* JOIN_SYM */ + KEYS = 413, /* KEYS */ + KEY_SYM = 414, /* KEY_SYM */ + KILL_SYM = 415, /* KILL_SYM */ + LAG_SYM = 416, /* LAG_SYM */ + LEADING = 417, /* LEADING */ + LEAD_SYM = 418, /* LEAD_SYM */ + LEAVE_SYM = 419, /* LEAVE_SYM */ + LEFT = 420, /* LEFT */ + LIKE = 421, /* LIKE */ + LIMIT = 422, /* LIMIT */ + LINEAR_SYM = 423, /* LINEAR_SYM */ + LINES = 424, /* LINES */ + LOAD = 425, /* LOAD */ + LOCATOR_SYM = 426, /* LOCATOR_SYM */ + LOCK_SYM = 427, /* LOCK_SYM */ + LONGBLOB = 428, /* LONGBLOB */ + LONG_SYM = 429, /* LONG_SYM */ + LONGTEXT = 430, /* LONGTEXT */ + LOOP_SYM = 431, /* LOOP_SYM */ + LOW_PRIORITY = 432, /* LOW_PRIORITY */ + MASTER_SSL_VERIFY_SERVER_CERT_SYM = 433, /* MASTER_SSL_VERIFY_SERVER_CERT_SYM */ + MATCH = 434, /* MATCH */ + MAX_SYM = 435, /* MAX_SYM */ + MAXVALUE_SYM = 436, /* MAXVALUE_SYM */ + MEDIAN_SYM = 437, /* MEDIAN_SYM */ + MEDIUMBLOB = 438, /* MEDIUMBLOB */ + MEDIUMINT = 439, /* MEDIUMINT */ + MEDIUMTEXT = 440, /* MEDIUMTEXT */ + MIN_SYM = 441, /* MIN_SYM */ + MINUS_ORACLE_SYM = 442, /* MINUS_ORACLE_SYM */ + MINUTE_MICROSECOND_SYM = 443, /* MINUTE_MICROSECOND_SYM */ + MINUTE_SECOND_SYM = 444, /* MINUTE_SECOND_SYM */ + MODIFIES_SYM = 445, /* MODIFIES_SYM */ + MOD_SYM = 446, /* MOD_SYM */ + NATURAL = 447, /* NATURAL */ + NEG = 448, /* NEG */ + NESTED_SYM = 449, /* NESTED_SYM */ + NOT_SYM = 450, /* NOT_SYM */ + NO_WRITE_TO_BINLOG = 451, /* NO_WRITE_TO_BINLOG */ + NOW_SYM = 452, /* NOW_SYM */ + NTH_VALUE_SYM = 453, /* NTH_VALUE_SYM */ + NTILE_SYM = 454, /* NTILE_SYM */ + NULL_SYM = 455, /* NULL_SYM */ + NUMERIC_SYM = 456, /* NUMERIC_SYM */ + ON = 457, /* ON */ + OPTIMIZE = 458, /* OPTIMIZE */ + OPTIONALLY = 459, /* OPTIONALLY */ + ORDER_SYM = 460, /* ORDER_SYM */ + ORDINALITY_SYM = 461, /* ORDINALITY_SYM */ + OR_SYM = 462, /* OR_SYM */ + OTHERS_ORACLE_SYM = 463, /* OTHERS_ORACLE_SYM */ + OUTER = 464, /* OUTER */ + OUTFILE = 465, /* OUTFILE */ + OUT_SYM = 466, /* OUT_SYM */ + OVER_SYM = 467, /* OVER_SYM */ + PACKAGE_ORACLE_SYM = 468, /* PACKAGE_ORACLE_SYM */ + PAGE_CHECKSUM_SYM = 469, /* PAGE_CHECKSUM_SYM */ + PARSE_VCOL_EXPR_SYM = 470, /* PARSE_VCOL_EXPR_SYM */ + PARTITION_SYM = 471, /* PARTITION_SYM */ + PATH_SYM = 472, /* PATH_SYM */ + PERCENTILE_CONT_SYM = 473, /* PERCENTILE_CONT_SYM */ + PERCENTILE_DISC_SYM = 474, /* PERCENTILE_DISC_SYM */ + PERCENT_RANK_SYM = 475, /* PERCENT_RANK_SYM */ + PORTION_SYM = 476, /* PORTION_SYM */ + POSITION_SYM = 477, /* POSITION_SYM */ + PRECISION = 478, /* PRECISION */ + PRIMARY_SYM = 479, /* PRIMARY_SYM */ + PROCEDURE_SYM = 480, /* PROCEDURE_SYM */ + PURGE = 481, /* PURGE */ + RAISE_ORACLE_SYM = 482, /* RAISE_ORACLE_SYM */ + RANGE_SYM = 483, /* RANGE_SYM */ + RANK_SYM = 484, /* RANK_SYM */ + READS_SYM = 485, /* READS_SYM */ + READ_SYM = 486, /* READ_SYM */ + READ_WRITE_SYM = 487, /* READ_WRITE_SYM */ + REAL = 488, /* REAL */ + RECURSIVE_SYM = 489, /* RECURSIVE_SYM */ + REFERENCES = 490, /* REFERENCES */ + REF_SYSTEM_ID_SYM = 491, /* REF_SYSTEM_ID_SYM */ + REGEXP = 492, /* REGEXP */ + RELEASE_SYM = 493, /* RELEASE_SYM */ + RENAME = 494, /* RENAME */ + REPEAT_SYM = 495, /* REPEAT_SYM */ + REQUIRE_SYM = 496, /* REQUIRE_SYM */ + RESIGNAL_SYM = 497, /* RESIGNAL_SYM */ + RESTRICT = 498, /* RESTRICT */ + RETURNING_SYM = 499, /* RETURNING_SYM */ + RETURN_MARIADB_SYM = 500, /* RETURN_MARIADB_SYM */ + RETURN_ORACLE_SYM = 501, /* RETURN_ORACLE_SYM */ + REVOKE = 502, /* REVOKE */ + RIGHT = 503, /* RIGHT */ + ROW_NUMBER_SYM = 504, /* ROW_NUMBER_SYM */ + ROWS_SYM = 505, /* ROWS_SYM */ + ROWTYPE_ORACLE_SYM = 506, /* ROWTYPE_ORACLE_SYM */ + SECOND_MICROSECOND_SYM = 507, /* SECOND_MICROSECOND_SYM */ + SELECT_SYM = 508, /* SELECT_SYM */ + SENSITIVE_SYM = 509, /* SENSITIVE_SYM */ + SEPARATOR_SYM = 510, /* SEPARATOR_SYM */ + SERVER_OPTIONS = 511, /* SERVER_OPTIONS */ + SET = 512, /* SET */ + SHOW = 513, /* SHOW */ + SIGNAL_SYM = 514, /* SIGNAL_SYM */ + SMALLINT = 515, /* SMALLINT */ + SPATIAL_SYM = 516, /* SPATIAL_SYM */ + SPECIFIC_SYM = 517, /* SPECIFIC_SYM */ + SQL_BIG_RESULT = 518, /* SQL_BIG_RESULT */ + SQLEXCEPTION_SYM = 519, /* SQLEXCEPTION_SYM */ + SQL_SMALL_RESULT = 520, /* SQL_SMALL_RESULT */ + SQLSTATE_SYM = 521, /* SQLSTATE_SYM */ + SQL_SYM = 522, /* SQL_SYM */ + SQLWARNING_SYM = 523, /* SQLWARNING_SYM */ + SSL_SYM = 524, /* SSL_SYM */ + STARTING = 525, /* STARTING */ + STATS_AUTO_RECALC_SYM = 526, /* STATS_AUTO_RECALC_SYM */ + STATS_PERSISTENT_SYM = 527, /* STATS_PERSISTENT_SYM */ + STATS_SAMPLE_PAGES_SYM = 528, /* STATS_SAMPLE_PAGES_SYM */ + STDDEV_SAMP_SYM = 529, /* STDDEV_SAMP_SYM */ + STD_SYM = 530, /* STD_SYM */ + STRAIGHT_JOIN = 531, /* STRAIGHT_JOIN */ + SUM_SYM = 532, /* SUM_SYM */ + SYSDATE = 533, /* SYSDATE */ + TABLE_REF_PRIORITY = 534, /* TABLE_REF_PRIORITY */ + TABLE_SYM = 535, /* TABLE_SYM */ + TERMINATED = 536, /* TERMINATED */ + THEN_SYM = 537, /* THEN_SYM */ + TINYBLOB = 538, /* TINYBLOB */ + TINYINT = 539, /* TINYINT */ + TINYTEXT = 540, /* TINYTEXT */ + TO_SYM = 541, /* TO_SYM */ + TRAILING = 542, /* TRAILING */ + TRIGGER_SYM = 543, /* TRIGGER_SYM */ + TRUE_SYM = 544, /* TRUE_SYM */ + UNDO_SYM = 545, /* UNDO_SYM */ + UNION_SYM = 546, /* UNION_SYM */ + UNIQUE_SYM = 547, /* UNIQUE_SYM */ + UNLOCK_SYM = 548, /* UNLOCK_SYM */ + UNSIGNED = 549, /* UNSIGNED */ + UPDATE_SYM = 550, /* UPDATE_SYM */ + USAGE = 551, /* USAGE */ + USE_SYM = 552, /* USE_SYM */ + USING = 553, /* USING */ + UTC_DATE_SYM = 554, /* UTC_DATE_SYM */ + UTC_TIMESTAMP_SYM = 555, /* UTC_TIMESTAMP_SYM */ + UTC_TIME_SYM = 556, /* UTC_TIME_SYM */ + VALUES_IN_SYM = 557, /* VALUES_IN_SYM */ + VALUES_LESS_SYM = 558, /* VALUES_LESS_SYM */ + VALUES = 559, /* VALUES */ + VARBINARY = 560, /* VARBINARY */ + VARCHAR = 561, /* VARCHAR */ + VARIANCE_SYM = 562, /* VARIANCE_SYM */ + VAR_SAMP_SYM = 563, /* VAR_SAMP_SYM */ + VARYING = 564, /* VARYING */ + WHEN_SYM = 565, /* WHEN_SYM */ + WHERE = 566, /* WHERE */ + WHILE_SYM = 567, /* WHILE_SYM */ + WITH = 568, /* WITH */ + XOR = 569, /* XOR */ + YEAR_MONTH_SYM = 570, /* YEAR_MONTH_SYM */ + ZEROFILL = 571, /* ZEROFILL */ + BODY_MARIADB_SYM = 572, /* BODY_MARIADB_SYM */ + ELSEIF_ORACLE_SYM = 573, /* ELSEIF_ORACLE_SYM */ + ELSIF_MARIADB_SYM = 574, /* ELSIF_MARIADB_SYM */ + EXCEPTION_ORACLE_SYM = 575, /* EXCEPTION_ORACLE_SYM */ + GOTO_MARIADB_SYM = 576, /* GOTO_MARIADB_SYM */ + OTHERS_MARIADB_SYM = 577, /* OTHERS_MARIADB_SYM */ + PACKAGE_MARIADB_SYM = 578, /* PACKAGE_MARIADB_SYM */ + RAISE_MARIADB_SYM = 579, /* RAISE_MARIADB_SYM */ + ROWTYPE_MARIADB_SYM = 580, /* ROWTYPE_MARIADB_SYM */ + ROWNUM_SYM = 581, /* ROWNUM_SYM */ + REPLACE = 582, /* REPLACE */ + SUBSTRING = 583, /* SUBSTRING */ + TRIM = 584, /* TRIM */ + ACCOUNT_SYM = 585, /* ACCOUNT_SYM */ + ACTION = 586, /* ACTION */ + ADMIN_SYM = 587, /* ADMIN_SYM */ + ADDDATE_SYM = 588, /* ADDDATE_SYM */ + AFTER_SYM = 589, /* AFTER_SYM */ + AGAINST = 590, /* AGAINST */ + AGGREGATE_SYM = 591, /* AGGREGATE_SYM */ + ALGORITHM_SYM = 592, /* ALGORITHM_SYM */ + ALWAYS_SYM = 593, /* ALWAYS_SYM */ + ANY_SYM = 594, /* ANY_SYM */ + ASCII_SYM = 595, /* ASCII_SYM */ + AT_SYM = 596, /* AT_SYM */ + ATOMIC_SYM = 597, /* ATOMIC_SYM */ + AUTHORS_SYM = 598, /* AUTHORS_SYM */ + AUTOEXTEND_SIZE_SYM = 599, /* AUTOEXTEND_SIZE_SYM */ + AUTO_INC = 600, /* AUTO_INC */ + AUTO_SYM = 601, /* AUTO_SYM */ + AVG_ROW_LENGTH = 602, /* AVG_ROW_LENGTH */ + AVG_SYM = 603, /* AVG_SYM */ + BACKUP_SYM = 604, /* BACKUP_SYM */ + BEGIN_MARIADB_SYM = 605, /* BEGIN_MARIADB_SYM */ + BEGIN_ORACLE_SYM = 606, /* BEGIN_ORACLE_SYM */ + BINLOG_SYM = 607, /* BINLOG_SYM */ + BIT_SYM = 608, /* BIT_SYM */ + BLOCK_SYM = 609, /* BLOCK_SYM */ + BOOL_SYM = 610, /* BOOL_SYM */ + BOOLEAN_SYM = 611, /* BOOLEAN_SYM */ + BTREE_SYM = 612, /* BTREE_SYM */ + BYTE_SYM = 613, /* BYTE_SYM */ + CACHE_SYM = 614, /* CACHE_SYM */ + CASCADED = 615, /* CASCADED */ + CATALOG_NAME_SYM = 616, /* CATALOG_NAME_SYM */ + CHAIN_SYM = 617, /* CHAIN_SYM */ + CHANGED = 618, /* CHANGED */ + CHANNEL_SYM = 619, /* CHANNEL_SYM */ + CHARSET = 620, /* CHARSET */ + CHECKPOINT_SYM = 621, /* CHECKPOINT_SYM */ + CHECKSUM_SYM = 622, /* CHECKSUM_SYM */ + CIPHER_SYM = 623, /* CIPHER_SYM */ + CLASS_ORIGIN_SYM = 624, /* CLASS_ORIGIN_SYM */ + CLIENT_SYM = 625, /* CLIENT_SYM */ + CLOB_MARIADB_SYM = 626, /* CLOB_MARIADB_SYM */ + CLOB_ORACLE_SYM = 627, /* CLOB_ORACLE_SYM */ + CLOSE_SYM = 628, /* CLOSE_SYM */ + COALESCE = 629, /* COALESCE */ + CODE_SYM = 630, /* CODE_SYM */ + COLLATION_SYM = 631, /* COLLATION_SYM */ + COLUMNS = 632, /* COLUMNS */ + COLUMN_ADD_SYM = 633, /* COLUMN_ADD_SYM */ + COLUMN_CHECK_SYM = 634, /* COLUMN_CHECK_SYM */ + COLUMN_CREATE_SYM = 635, /* COLUMN_CREATE_SYM */ + COLUMN_DELETE_SYM = 636, /* COLUMN_DELETE_SYM */ + COLUMN_GET_SYM = 637, /* COLUMN_GET_SYM */ + COLUMN_SYM = 638, /* COLUMN_SYM */ + COLUMN_NAME_SYM = 639, /* COLUMN_NAME_SYM */ + COMMENT_SYM = 640, /* COMMENT_SYM */ + COMMITTED_SYM = 641, /* COMMITTED_SYM */ + COMMIT_SYM = 642, /* COMMIT_SYM */ + COMPACT_SYM = 643, /* COMPACT_SYM */ + COMPLETION_SYM = 644, /* COMPLETION_SYM */ + COMPRESSED_SYM = 645, /* COMPRESSED_SYM */ + CONCURRENT = 646, /* CONCURRENT */ + CONNECTION_SYM = 647, /* CONNECTION_SYM */ + CONSISTENT_SYM = 648, /* CONSISTENT_SYM */ + CONSTRAINT_CATALOG_SYM = 649, /* CONSTRAINT_CATALOG_SYM */ + CONSTRAINT_NAME_SYM = 650, /* CONSTRAINT_NAME_SYM */ + CONSTRAINT_SCHEMA_SYM = 651, /* CONSTRAINT_SCHEMA_SYM */ + CONTAINS_SYM = 652, /* CONTAINS_SYM */ + CONTEXT_SYM = 653, /* CONTEXT_SYM */ + CONTRIBUTORS_SYM = 654, /* CONTRIBUTORS_SYM */ + CPU_SYM = 655, /* CPU_SYM */ + CUBE_SYM = 656, /* CUBE_SYM */ + CURRENT_SYM = 657, /* CURRENT_SYM */ + CURRENT_POS_SYM = 658, /* CURRENT_POS_SYM */ + CURSOR_NAME_SYM = 659, /* CURSOR_NAME_SYM */ + CYCLE_SYM = 660, /* CYCLE_SYM */ + DATAFILE_SYM = 661, /* DATAFILE_SYM */ + DATA_SYM = 662, /* DATA_SYM */ + DATETIME = 663, /* DATETIME */ + DATE_SYM = 664, /* DATE_SYM */ + DAY_SYM = 665, /* DAY_SYM */ + DEALLOCATE_SYM = 666, /* DEALLOCATE_SYM */ + DEFINER_SYM = 667, /* DEFINER_SYM */ + DELAYED_SYM = 668, /* DELAYED_SYM */ + DELAY_KEY_WRITE_SYM = 669, /* DELAY_KEY_WRITE_SYM */ + DES_KEY_FILE = 670, /* DES_KEY_FILE */ + DIAGNOSTICS_SYM = 671, /* DIAGNOSTICS_SYM */ + DIRECTORY_SYM = 672, /* DIRECTORY_SYM */ + DISABLE_SYM = 673, /* DISABLE_SYM */ + DISCARD = 674, /* DISCARD */ + DISK_SYM = 675, /* DISK_SYM */ + DO_SYM = 676, /* DO_SYM */ + DUMPFILE = 677, /* DUMPFILE */ + DUPLICATE_SYM = 678, /* DUPLICATE_SYM */ + DYNAMIC_SYM = 679, /* DYNAMIC_SYM */ + ENABLE_SYM = 680, /* ENABLE_SYM */ + END = 681, /* END */ + ENDS_SYM = 682, /* ENDS_SYM */ + ENGINES_SYM = 683, /* ENGINES_SYM */ + ENGINE_SYM = 684, /* ENGINE_SYM */ + ENUM = 685, /* ENUM */ + ERROR_SYM = 686, /* ERROR_SYM */ + ERRORS = 687, /* ERRORS */ + ESCAPE_SYM = 688, /* ESCAPE_SYM */ + EVENTS_SYM = 689, /* EVENTS_SYM */ + EVENT_SYM = 690, /* EVENT_SYM */ + EVERY_SYM = 691, /* EVERY_SYM */ + EXCHANGE_SYM = 692, /* EXCHANGE_SYM */ + EXAMINED_SYM = 693, /* EXAMINED_SYM */ + EXCLUDE_SYM = 694, /* EXCLUDE_SYM */ + EXECUTE_SYM = 695, /* EXECUTE_SYM */ + EXCEPTION_MARIADB_SYM = 696, /* EXCEPTION_MARIADB_SYM */ + EXIT_MARIADB_SYM = 697, /* EXIT_MARIADB_SYM */ + EXIT_ORACLE_SYM = 698, /* EXIT_ORACLE_SYM */ + EXPANSION_SYM = 699, /* EXPANSION_SYM */ + EXPIRE_SYM = 700, /* EXPIRE_SYM */ + EXPORT_SYM = 701, /* EXPORT_SYM */ + EXTENDED_SYM = 702, /* EXTENDED_SYM */ + EXTENT_SIZE_SYM = 703, /* EXTENT_SIZE_SYM */ + FAST_SYM = 704, /* FAST_SYM */ + FAULTS_SYM = 705, /* FAULTS_SYM */ + FEDERATED_SYM = 706, /* FEDERATED_SYM */ + FILE_SYM = 707, /* FILE_SYM */ + FIRST_SYM = 708, /* FIRST_SYM */ + FIXED_SYM = 709, /* FIXED_SYM */ + FLUSH_SYM = 710, /* FLUSH_SYM */ + FOLLOWS_SYM = 711, /* FOLLOWS_SYM */ + FOLLOWING_SYM = 712, /* FOLLOWING_SYM */ + FORCE_SYM = 713, /* FORCE_SYM */ + FORMAT_SYM = 714, /* FORMAT_SYM */ + FOUND_SYM = 715, /* FOUND_SYM */ + FULL = 716, /* FULL */ + FUNCTION_SYM = 717, /* FUNCTION_SYM */ + GENERAL = 718, /* GENERAL */ + GENERATED_SYM = 719, /* GENERATED_SYM */ + GET_FORMAT = 720, /* GET_FORMAT */ + GET_SYM = 721, /* GET_SYM */ + GLOBAL_SYM = 722, /* GLOBAL_SYM */ + GRANTS = 723, /* GRANTS */ + HANDLER_SYM = 724, /* HANDLER_SYM */ + HARD_SYM = 725, /* HARD_SYM */ + HASH_SYM = 726, /* HASH_SYM */ + HELP_SYM = 727, /* HELP_SYM */ + HIGH_PRIORITY = 728, /* HIGH_PRIORITY */ + HISTORY_SYM = 729, /* HISTORY_SYM */ + HOST_SYM = 730, /* HOST_SYM */ + HOSTS_SYM = 731, /* HOSTS_SYM */ + HOUR_SYM = 732, /* HOUR_SYM */ + ID_SYM = 733, /* ID_SYM */ + IDENTIFIED_SYM = 734, /* IDENTIFIED_SYM */ + IGNORE_SERVER_IDS_SYM = 735, /* IGNORE_SERVER_IDS_SYM */ + IMMEDIATE_SYM = 736, /* IMMEDIATE_SYM */ + IMPORT = 737, /* IMPORT */ + INCREMENT_SYM = 738, /* INCREMENT_SYM */ + INDEXES = 739, /* INDEXES */ + INITIAL_SIZE_SYM = 740, /* INITIAL_SIZE_SYM */ + INSERT_METHOD = 741, /* INSERT_METHOD */ + INSTALL_SYM = 742, /* INSTALL_SYM */ + INVOKER_SYM = 743, /* INVOKER_SYM */ + IO_SYM = 744, /* IO_SYM */ + IPC_SYM = 745, /* IPC_SYM */ + ISOLATION = 746, /* ISOLATION */ + ISOPEN_SYM = 747, /* ISOPEN_SYM */ + ISSUER_SYM = 748, /* ISSUER_SYM */ + INVISIBLE_SYM = 749, /* INVISIBLE_SYM */ + JSON_SYM = 750, /* JSON_SYM */ + KEY_BLOCK_SIZE = 751, /* KEY_BLOCK_SIZE */ + LANGUAGE_SYM = 752, /* LANGUAGE_SYM */ + LAST_SYM = 753, /* LAST_SYM */ + LAST_VALUE = 754, /* LAST_VALUE */ + LASTVAL_SYM = 755, /* LASTVAL_SYM */ + LEAVES = 756, /* LEAVES */ + LESS_SYM = 757, /* LESS_SYM */ + LEVEL_SYM = 758, /* LEVEL_SYM */ + LIST_SYM = 759, /* LIST_SYM */ + LOCAL_SYM = 760, /* LOCAL_SYM */ + LOCKED_SYM = 761, /* LOCKED_SYM */ + LOCKS_SYM = 762, /* LOCKS_SYM */ + LOGFILE_SYM = 763, /* LOGFILE_SYM */ + LOGS_SYM = 764, /* LOGS_SYM */ + MASTER_CONNECT_RETRY_SYM = 765, /* MASTER_CONNECT_RETRY_SYM */ + MASTER_DELAY_SYM = 766, /* MASTER_DELAY_SYM */ + MASTER_GTID_POS_SYM = 767, /* MASTER_GTID_POS_SYM */ + MASTER_HOST_SYM = 768, /* MASTER_HOST_SYM */ + MASTER_LOG_FILE_SYM = 769, /* MASTER_LOG_FILE_SYM */ + MASTER_LOG_POS_SYM = 770, /* MASTER_LOG_POS_SYM */ + MASTER_PASSWORD_SYM = 771, /* MASTER_PASSWORD_SYM */ + MASTER_PORT_SYM = 772, /* MASTER_PORT_SYM */ + MASTER_SERVER_ID_SYM = 773, /* MASTER_SERVER_ID_SYM */ + MASTER_SSL_CAPATH_SYM = 774, /* MASTER_SSL_CAPATH_SYM */ + MASTER_SSL_CA_SYM = 775, /* MASTER_SSL_CA_SYM */ + MASTER_SSL_CERT_SYM = 776, /* MASTER_SSL_CERT_SYM */ + MASTER_SSL_CIPHER_SYM = 777, /* MASTER_SSL_CIPHER_SYM */ + MASTER_SSL_CRL_SYM = 778, /* MASTER_SSL_CRL_SYM */ + MASTER_SSL_CRLPATH_SYM = 779, /* MASTER_SSL_CRLPATH_SYM */ + MASTER_SSL_KEY_SYM = 780, /* MASTER_SSL_KEY_SYM */ + MASTER_SSL_SYM = 781, /* MASTER_SSL_SYM */ + MASTER_SYM = 782, /* MASTER_SYM */ + MASTER_USER_SYM = 783, /* MASTER_USER_SYM */ + MASTER_USE_GTID_SYM = 784, /* MASTER_USE_GTID_SYM */ + MASTER_HEARTBEAT_PERIOD_SYM = 785, /* MASTER_HEARTBEAT_PERIOD_SYM */ + MASTER_DEMOTE_TO_SLAVE_SYM = 786, /* MASTER_DEMOTE_TO_SLAVE_SYM */ + MAX_CONNECTIONS_PER_HOUR = 787, /* MAX_CONNECTIONS_PER_HOUR */ + MAX_QUERIES_PER_HOUR = 788, /* MAX_QUERIES_PER_HOUR */ + MAX_ROWS = 789, /* MAX_ROWS */ + MAX_SIZE_SYM = 790, /* MAX_SIZE_SYM */ + MAX_UPDATES_PER_HOUR = 791, /* MAX_UPDATES_PER_HOUR */ + MAX_STATEMENT_TIME_SYM = 792, /* MAX_STATEMENT_TIME_SYM */ + MAX_USER_CONNECTIONS_SYM = 793, /* MAX_USER_CONNECTIONS_SYM */ + MEDIUM_SYM = 794, /* MEDIUM_SYM */ + MEMORY_SYM = 795, /* MEMORY_SYM */ + MERGE_SYM = 796, /* MERGE_SYM */ + MESSAGE_TEXT_SYM = 797, /* MESSAGE_TEXT_SYM */ + MICROSECOND_SYM = 798, /* MICROSECOND_SYM */ + MIGRATE_SYM = 799, /* MIGRATE_SYM */ + MINUTE_SYM = 800, /* MINUTE_SYM */ + MINVALUE_SYM = 801, /* MINVALUE_SYM */ + MIN_ROWS = 802, /* MIN_ROWS */ + MODE_SYM = 803, /* MODE_SYM */ + MODIFY_SYM = 804, /* MODIFY_SYM */ + MONITOR_SYM = 805, /* MONITOR_SYM */ + MONTH_SYM = 806, /* MONTH_SYM */ + MUTEX_SYM = 807, /* MUTEX_SYM */ + MYSQL_SYM = 808, /* MYSQL_SYM */ + MYSQL_ERRNO_SYM = 809, /* MYSQL_ERRNO_SYM */ + NAMES_SYM = 810, /* NAMES_SYM */ + NAME_SYM = 811, /* NAME_SYM */ + NATIONAL_SYM = 812, /* NATIONAL_SYM */ + NCHAR_SYM = 813, /* NCHAR_SYM */ + NEVER_SYM = 814, /* NEVER_SYM */ + NEXT_SYM = 815, /* NEXT_SYM */ + NEXTVAL_SYM = 816, /* NEXTVAL_SYM */ + NOCACHE_SYM = 817, /* NOCACHE_SYM */ + NOCYCLE_SYM = 818, /* NOCYCLE_SYM */ + NODEGROUP_SYM = 819, /* NODEGROUP_SYM */ + NONE_SYM = 820, /* NONE_SYM */ + NOTFOUND_SYM = 821, /* NOTFOUND_SYM */ + NO_SYM = 822, /* NO_SYM */ + NOMAXVALUE_SYM = 823, /* NOMAXVALUE_SYM */ + NOMINVALUE_SYM = 824, /* NOMINVALUE_SYM */ + NO_WAIT_SYM = 825, /* NO_WAIT_SYM */ + NOWAIT_SYM = 826, /* NOWAIT_SYM */ + NUMBER_MARIADB_SYM = 827, /* NUMBER_MARIADB_SYM */ + NUMBER_ORACLE_SYM = 828, /* NUMBER_ORACLE_SYM */ + NVARCHAR_SYM = 829, /* NVARCHAR_SYM */ + OF_SYM = 830, /* OF_SYM */ + OFFSET_SYM = 831, /* OFFSET_SYM */ + OLD_PASSWORD_SYM = 832, /* OLD_PASSWORD_SYM */ + ONE_SYM = 833, /* ONE_SYM */ + ONLY_SYM = 834, /* ONLY_SYM */ + ONLINE_SYM = 835, /* ONLINE_SYM */ + OPEN_SYM = 836, /* OPEN_SYM */ + OPTIONS_SYM = 837, /* OPTIONS_SYM */ + OPTION = 838, /* OPTION */ + OVERLAPS_SYM = 839, /* OVERLAPS_SYM */ + OWNER_SYM = 840, /* OWNER_SYM */ + PACK_KEYS_SYM = 841, /* PACK_KEYS_SYM */ + PAGE_SYM = 842, /* PAGE_SYM */ + PARSER_SYM = 843, /* PARSER_SYM */ + PARTIAL = 844, /* PARTIAL */ + PARTITIONS_SYM = 845, /* PARTITIONS_SYM */ + PARTITIONING_SYM = 846, /* PARTITIONING_SYM */ + PASSWORD_SYM = 847, /* PASSWORD_SYM */ + PERIOD_SYM = 848, /* PERIOD_SYM */ + PERSISTENT_SYM = 849, /* PERSISTENT_SYM */ + PHASE_SYM = 850, /* PHASE_SYM */ + PLUGINS_SYM = 851, /* PLUGINS_SYM */ + PLUGIN_SYM = 852, /* PLUGIN_SYM */ + PORT_SYM = 853, /* PORT_SYM */ + PRECEDES_SYM = 854, /* PRECEDES_SYM */ + PRECEDING_SYM = 855, /* PRECEDING_SYM */ + PREPARE_SYM = 856, /* PREPARE_SYM */ + PRESERVE_SYM = 857, /* PRESERVE_SYM */ + PREV_SYM = 858, /* PREV_SYM */ + PREVIOUS_SYM = 859, /* PREVIOUS_SYM */ + PRIVILEGES = 860, /* PRIVILEGES */ + PROCESS = 861, /* PROCESS */ + PROCESSLIST_SYM = 862, /* PROCESSLIST_SYM */ + PROFILE_SYM = 863, /* PROFILE_SYM */ + PROFILES_SYM = 864, /* PROFILES_SYM */ + PROXY_SYM = 865, /* PROXY_SYM */ + QUARTER_SYM = 866, /* QUARTER_SYM */ + QUERY_SYM = 867, /* QUERY_SYM */ + QUICK = 868, /* QUICK */ + RAW_MARIADB_SYM = 869, /* RAW_MARIADB_SYM */ + RAW_ORACLE_SYM = 870, /* RAW_ORACLE_SYM */ + READ_ONLY_SYM = 871, /* READ_ONLY_SYM */ + REBUILD_SYM = 872, /* REBUILD_SYM */ + RECOVER_SYM = 873, /* RECOVER_SYM */ + REDOFILE_SYM = 874, /* REDOFILE_SYM */ + REDO_BUFFER_SIZE_SYM = 875, /* REDO_BUFFER_SIZE_SYM */ + REDUNDANT_SYM = 876, /* REDUNDANT_SYM */ + RELAY = 877, /* RELAY */ + RELAYLOG_SYM = 878, /* RELAYLOG_SYM */ + RELAY_LOG_FILE_SYM = 879, /* RELAY_LOG_FILE_SYM */ + RELAY_LOG_POS_SYM = 880, /* RELAY_LOG_POS_SYM */ + RELAY_THREAD = 881, /* RELAY_THREAD */ + RELOAD = 882, /* RELOAD */ + REMOVE_SYM = 883, /* REMOVE_SYM */ + REORGANIZE_SYM = 884, /* REORGANIZE_SYM */ + REPAIR = 885, /* REPAIR */ + REPEATABLE_SYM = 886, /* REPEATABLE_SYM */ + REPLAY_SYM = 887, /* REPLAY_SYM */ + REPLICATION = 888, /* REPLICATION */ + RESET_SYM = 889, /* RESET_SYM */ + RESTART_SYM = 890, /* RESTART_SYM */ + RESOURCES = 891, /* RESOURCES */ + RESTORE_SYM = 892, /* RESTORE_SYM */ + RESUME_SYM = 893, /* RESUME_SYM */ + RETURNED_SQLSTATE_SYM = 894, /* RETURNED_SQLSTATE_SYM */ + RETURNS_SYM = 895, /* RETURNS_SYM */ + REUSE_SYM = 896, /* REUSE_SYM */ + REVERSE_SYM = 897, /* REVERSE_SYM */ + ROLE_SYM = 898, /* ROLE_SYM */ + ROLLBACK_SYM = 899, /* ROLLBACK_SYM */ + ROLLUP_SYM = 900, /* ROLLUP_SYM */ + ROUTINE_SYM = 901, /* ROUTINE_SYM */ + ROWCOUNT_SYM = 902, /* ROWCOUNT_SYM */ + ROW_SYM = 903, /* ROW_SYM */ + ROW_COUNT_SYM = 904, /* ROW_COUNT_SYM */ + ROW_FORMAT_SYM = 905, /* ROW_FORMAT_SYM */ + RTREE_SYM = 906, /* RTREE_SYM */ + SAVEPOINT_SYM = 907, /* SAVEPOINT_SYM */ + SCHEDULE_SYM = 908, /* SCHEDULE_SYM */ + SCHEMA_NAME_SYM = 909, /* SCHEMA_NAME_SYM */ + SECOND_SYM = 910, /* SECOND_SYM */ + SECURITY_SYM = 911, /* SECURITY_SYM */ + SEQUENCE_SYM = 912, /* SEQUENCE_SYM */ + SERIALIZABLE_SYM = 913, /* SERIALIZABLE_SYM */ + SERIAL_SYM = 914, /* SERIAL_SYM */ + SESSION_SYM = 915, /* SESSION_SYM */ + SERVER_SYM = 916, /* SERVER_SYM */ + SETVAL_SYM = 917, /* SETVAL_SYM */ + SHARE_SYM = 918, /* SHARE_SYM */ + SHUTDOWN = 919, /* SHUTDOWN */ + SIGNED_SYM = 920, /* SIGNED_SYM */ + SIMPLE_SYM = 921, /* SIMPLE_SYM */ + SKIP_SYM = 922, /* SKIP_SYM */ + SLAVE = 923, /* SLAVE */ + SLAVES = 924, /* SLAVES */ + SLAVE_POS_SYM = 925, /* SLAVE_POS_SYM */ + SLOW = 926, /* SLOW */ + SNAPSHOT_SYM = 927, /* SNAPSHOT_SYM */ + SOCKET_SYM = 928, /* SOCKET_SYM */ + SOFT_SYM = 929, /* SOFT_SYM */ + SONAME_SYM = 930, /* SONAME_SYM */ + SOUNDS_SYM = 931, /* SOUNDS_SYM */ + SOURCE_SYM = 932, /* SOURCE_SYM */ + SQL_BUFFER_RESULT = 933, /* SQL_BUFFER_RESULT */ + SQL_CACHE_SYM = 934, /* SQL_CACHE_SYM */ + SQL_CALC_FOUND_ROWS = 935, /* SQL_CALC_FOUND_ROWS */ + SQL_NO_CACHE_SYM = 936, /* SQL_NO_CACHE_SYM */ + SQL_THREAD = 937, /* SQL_THREAD */ + STAGE_SYM = 938, /* STAGE_SYM */ + STARTS_SYM = 939, /* STARTS_SYM */ + START_SYM = 940, /* START_SYM */ + STATEMENT_SYM = 941, /* STATEMENT_SYM */ + STATUS_SYM = 942, /* STATUS_SYM */ + STOP_SYM = 943, /* STOP_SYM */ + STORAGE_SYM = 944, /* STORAGE_SYM */ + STORED_SYM = 945, /* STORED_SYM */ + STRING_SYM = 946, /* STRING_SYM */ + SUBCLASS_ORIGIN_SYM = 947, /* SUBCLASS_ORIGIN_SYM */ + SUBDATE_SYM = 948, /* SUBDATE_SYM */ + SUBJECT_SYM = 949, /* SUBJECT_SYM */ + SUBPARTITIONS_SYM = 950, /* SUBPARTITIONS_SYM */ + SUBPARTITION_SYM = 951, /* SUBPARTITION_SYM */ + SUPER_SYM = 952, /* SUPER_SYM */ + SUSPEND_SYM = 953, /* SUSPEND_SYM */ + SWAPS_SYM = 954, /* SWAPS_SYM */ + SWITCHES_SYM = 955, /* SWITCHES_SYM */ + SYSTEM = 956, /* SYSTEM */ + SYSTEM_TIME_SYM = 957, /* SYSTEM_TIME_SYM */ + TABLES = 958, /* TABLES */ + TABLESPACE = 959, /* TABLESPACE */ + TABLE_CHECKSUM_SYM = 960, /* TABLE_CHECKSUM_SYM */ + TABLE_NAME_SYM = 961, /* TABLE_NAME_SYM */ + TEMPORARY = 962, /* TEMPORARY */ + TEMPTABLE_SYM = 963, /* TEMPTABLE_SYM */ + TEXT_SYM = 964, /* TEXT_SYM */ + THAN_SYM = 965, /* THAN_SYM */ + TIES_SYM = 966, /* TIES_SYM */ + TIMESTAMP = 967, /* TIMESTAMP */ + TIMESTAMP_ADD = 968, /* TIMESTAMP_ADD */ + TIMESTAMP_DIFF = 969, /* TIMESTAMP_DIFF */ + TIME_SYM = 970, /* TIME_SYM */ + TRANSACTION_SYM = 971, /* TRANSACTION_SYM */ + TRANSACTIONAL_SYM = 972, /* TRANSACTIONAL_SYM */ + THREADS_SYM = 973, /* THREADS_SYM */ + TRIGGERS_SYM = 974, /* TRIGGERS_SYM */ + TRIM_ORACLE = 975, /* TRIM_ORACLE */ + TRUNCATE_SYM = 976, /* TRUNCATE_SYM */ + TYPE_SYM = 977, /* TYPE_SYM */ + UDF_RETURNS_SYM = 978, /* UDF_RETURNS_SYM */ + UNBOUNDED_SYM = 979, /* UNBOUNDED_SYM */ + UNCOMMITTED_SYM = 980, /* UNCOMMITTED_SYM */ + UNDEFINED_SYM = 981, /* UNDEFINED_SYM */ + UNDOFILE_SYM = 982, /* UNDOFILE_SYM */ + UNDO_BUFFER_SIZE_SYM = 983, /* UNDO_BUFFER_SIZE_SYM */ + UNICODE_SYM = 984, /* UNICODE_SYM */ + UNINSTALL_SYM = 985, /* UNINSTALL_SYM */ + UNKNOWN_SYM = 986, /* UNKNOWN_SYM */ + UNTIL_SYM = 987, /* UNTIL_SYM */ + UPGRADE_SYM = 988, /* UPGRADE_SYM */ + USER_SYM = 989, /* USER_SYM */ + USE_FRM = 990, /* USE_FRM */ + VALUE_SYM = 991, /* VALUE_SYM */ + VARCHAR2_MARIADB_SYM = 992, /* VARCHAR2_MARIADB_SYM */ + VARCHAR2_ORACLE_SYM = 993, /* VARCHAR2_ORACLE_SYM */ + VARIABLES = 994, /* VARIABLES */ + VERSIONING_SYM = 995, /* VERSIONING_SYM */ + VIA_SYM = 996, /* VIA_SYM */ + VIEW_SYM = 997, /* VIEW_SYM */ + VISIBLE_SYM = 998, /* VISIBLE_SYM */ + VIRTUAL_SYM = 999, /* VIRTUAL_SYM */ + WAIT_SYM = 1000, /* WAIT_SYM */ + WARNINGS = 1001, /* WARNINGS */ + WEEK_SYM = 1002, /* WEEK_SYM */ + WEIGHT_STRING_SYM = 1003, /* WEIGHT_STRING_SYM */ + WINDOW_SYM = 1004, /* WINDOW_SYM */ + WITHIN = 1005, /* WITHIN */ + WITHOUT = 1006, /* WITHOUT */ + WORK_SYM = 1007, /* WORK_SYM */ + WRAPPER_SYM = 1008, /* WRAPPER_SYM */ + WRITE_SYM = 1009, /* WRITE_SYM */ + X509_SYM = 1010, /* X509_SYM */ + XA_SYM = 1011, /* XA_SYM */ + XML_SYM = 1012, /* XML_SYM */ + YEAR_SYM = 1013, /* YEAR_SYM */ + CONDITIONLESS_JOIN = 1014, /* CONDITIONLESS_JOIN */ + ON_SYM = 1015, /* ON_SYM */ + PREC_BELOW_NOT = 1016, /* PREC_BELOW_NOT */ + SUBQUERY_AS_EXPR = 1017, /* SUBQUERY_AS_EXPR */ + PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE = 1018, /* PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE */ + USER = 1019, /* USER */ + PREC_BELOW_CONTRACTION_TOKEN2 = 1020, /* PREC_BELOW_CONTRACTION_TOKEN2 */ + EMPTY_FROM_CLAUSE = 1021 /* EMPTY_FROM_CLAUSE */ + }; + typedef enum yytokentype yytoken_kind_t; +#endif + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +union YYSTYPE +{ +#line 192 "/home/buildbot/git/sql/sql_yacc.yy" + + int num; + ulong ulong_num; + ulonglong ulonglong_number; + longlong longlong_number; + uint sp_instr_addr; + + /* structs */ + LEX_CSTRING lex_str; + Lex_ident_cli_st kwd; + Lex_ident_cli_st ident_cli; + Lex_ident_sys_st ident_sys; + Lex_column_list_privilege_st column_list_privilege; + Lex_string_with_metadata_st lex_string_with_metadata; + Lex_spblock_st spblock; + Lex_spblock_handlers_st spblock_handlers; + Lex_length_and_dec_st Lex_length_and_dec; + Lex_cast_type_st Lex_cast_type; + Lex_field_type_st Lex_field_type; + Lex_exact_charset_extended_collation_attrs_st + Lex_exact_charset_extended_collation_attrs; + Lex_extended_collation_st Lex_extended_collation; + Lex_dyncol_type_st Lex_dyncol_type; + Lex_for_loop_st for_loop; + Lex_for_loop_bounds_st for_loop_bounds; + Lex_trim_st trim; + Json_table_column::On_response json_on_response; + Lex_substring_spec_st substring_spec; + vers_history_point_t vers_history_point; + struct + { + enum sub_select_type unit_type; + bool distinct; + } unit_operation; + struct + { + SELECT_LEX *first; + SELECT_LEX *prev_last; + } select_list; + SQL_I_List *select_order; + Lex_select_lock select_lock; + Lex_select_limit select_limit; + Lex_order_limit_lock *order_limit_lock; + + /* pointers */ + Lex_ident_sys *ident_sys_ptr; + Create_field *create_field; + Spvar_definition *spvar_definition; + Row_definition_list *spvar_definition_list; + const Type_handler *type_handler; + const class Sp_handler *sp_handler; + CHARSET_INFO *charset; + Condition_information_item *cond_info_item; + DYNCALL_CREATE_DEF *dyncol_def; + Diagnostics_information *diag_info; + Item *item; + Item_num *item_num; + Item_param *item_param; + Item_basic_constant *item_basic_constant; + Key_part_spec *key_part; + LEX *lex; + sp_expr_lex *expr_lex; + sp_assignment_lex *assignment_lex; + class sp_lex_cursor *sp_cursor_stmt; + LEX_CSTRING *lex_str_ptr; + LEX_USER *lex_user; + USER_AUTH *user_auth; + List *cond_info_list; + List *dyncol_def_list; + List *item_list; + List *sp_assignment_lex_list; + List *stmt_info_list; + List *string_list; + List *ident_sys_list; + Statement_information_item *stmt_info_item; + String *string; + TABLE_LIST *table_list; + Table_ident *table; + Qualified_column_ident *qualified_column_ident; + char *simple_string; + const char *const_simple_string; + chooser_compare_func_creator boolfunc2creator; + class Lex_grant_privilege *lex_grant; + class Lex_grant_object_name *lex_grant_ident; + class my_var *myvar; + class sp_condition_value *spcondvalue; + class sp_head *sphead; + class sp_name *spname; + class sp_variable *spvar; + class With_element_head *with_element_head; + class With_clause *with_clause; + class Virtual_column_info *virtual_column; + engine_option_value *engine_option_value_ptr; + + handlerton *db_type; + st_select_lex *select_lex; + st_select_lex_unit *select_lex_unit; + struct p_elem_val *p_elem_value; + class Window_frame *window_frame; + class Window_frame_bound *window_frame_bound; + udf_func *udf; + st_trg_execution_order trg_execution_order; + + /* enums */ + enum enum_sp_suid_behaviour sp_suid; + enum enum_sp_aggregate_type sp_aggregate_type; + enum enum_view_suid view_suid; + enum Condition_information_item::Name cond_info_item_name; + enum enum_diag_condition_item_name diag_condition_item_name; + enum Diagnostics_information::Which_area diag_area; + enum enum_fk_option m_fk_option; + enum Item_udftype udf_type; + enum Key::Keytype key_type; + enum Statement_information_item::Name stmt_info_item_name; + enum enum_filetype filetype; + enum enum_tx_isolation tx_isolation; + enum enum_var_type var_type; + enum enum_yes_no_unknown m_yes_no_unk; + enum ha_choice choice; + enum ha_key_alg key_alg; + enum ha_rkey_function ha_rkey_mode; + enum index_hint_type index_hint; + enum interval_type interval, interval_time_st; + enum row_type row_type; + enum sp_variable::enum_mode spvar_mode; + enum thr_lock_type lock_type; + enum enum_mysql_timestamp_type date_time_type; + enum Window_frame_bound::Bound_precedence_type bound_precedence_type; + enum Window_frame::Frame_units frame_units; + enum Window_frame::Frame_exclusion frame_exclusion; + enum trigger_order_type trigger_action_order_type; + DDL_options_st object_ddl_options; + enum vers_kind_t vers_range_unit; + enum Column_definition::enum_column_versioning vers_column_versioning; + enum plsql_cursor_attr_t plsql_cursor_attr; + privilege_t privilege; + +#line 968 "/home/buildbot/git/mkdist/sql/yy_mariadb.hh" + +}; +typedef union YYSTYPE YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + + + +int MYSQLparse (THD *thd); + + +#endif /* !YY_MYSQL_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_MARIADB_HH_INCLUDED */ diff --git a/sql/yy_oracle.cc b/sql/yy_oracle.cc new file mode 100644 index 00000000..a9d8cddd --- /dev/null +++ b/sql/yy_oracle.cc @@ -0,0 +1,52289 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + 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 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 General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output, and Bison version. */ +#define YYBISON 30802 + +/* Bison version string. */ +#define YYBISON_VERSION "3.8.2" + +/* Skeleton name. */ +#define YYSKELETON_NAME "/home/buildbot/git/mkdist/sql/myskel.m4" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + +/* Substitute the variable and function names. */ +#define yyparse ORAparse +#define yylex ORAlex +#define yyerror ORAerror +#define yydebug ORAdebug +#define yynerrs ORAnerrs + +/* First part of user prologue. */ +#line 25 "/home/buildbot/git/sql/sql_yacc.yy" + +#define YYLIP (& thd->m_parser_state->m_lip) +#define YYPS (& thd->m_parser_state->m_yacc) +#define YYCSCL (thd->variables.character_set_client) + +#define MYSQL_YACC +#define YYINITDEPTH 100 +#define YYMAXDEPTH 3200 /* Because of 64K stack */ +#define Lex (thd->lex) + +#define Select Lex->current_select +#include "mariadb.h" +#include "sql_priv.h" +#include "sql_parse.h" /* comp_*_creator */ +#include "sql_table.h" /* primary_key_name */ +#include "sql_partition.h" /* partition_info, HASH_PARTITION */ +#include "sql_class.h" /* Key_part_spec, enum_filetype, Diag_condition_item_name */ +#include "slave.h" +#include "lex_symbol.h" +#include "item_create.h" +#include "sp_head.h" +#include "sp_rcontext.h" +#include "sp.h" +#include "sql_show.h" +#include "sql_alter.h" // Sql_cmd_alter_table* +#include "sql_truncate.h" // Sql_cmd_truncate_table +#include "sql_admin.h" // Sql_cmd_analyze/Check..._table +#include "sql_partition_admin.h" // Sql_cmd_alter_table_*_part. +#include "sql_handler.h" // Sql_cmd_handler_* +#include "sql_signal.h" +#include "sql_get_diagnostics.h" // Sql_cmd_get_diagnostics +#include "sql_cte.h" +#include "sql_window.h" +#include "item_windowfunc.h" +#include "event_parse_data.h" +#include "create_options.h" +#include +#include +#include "keycaches.h" +#include "set_var.h" +#include "rpl_mi.h" +#include "lex_token.h" +#include "sql_lex.h" +#include "sql_sequence.h" +#include "my_base.h" +#include "sql_type_json.h" +#include "json_table.h" + +/* this is to get the bison compilation windows warnings out */ +#ifdef _MSC_VER +/* warning C4065: switch statement contains 'default' but no 'case' labels */ +/* warning C4102: 'yyexhaustedlab': unreferenced label */ +#pragma warning (disable : 4065 4102) +#endif +#if defined (__GNUC__) || defined (__clang__) +#pragma GCC diagnostic ignored "-Wunused-label" /* yyexhaustedlab: */ +#endif + +/* Stack size 28200 with clang for MYSQLparse() and ORAparse() */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + +int yylex(void *yylval, void *yythd); + +#define yyoverflow(A,B,C,D,E,F) \ + { \ + size_t val= *(F); \ + if (unlikely(my_yyoverflow((B), (D), &val))) \ + { \ + yyerror(thd, (char*) (A)); \ + return 2; \ + } \ + else \ + { \ + *(F)= (YYSIZE_T)val; \ + } \ + } + +#define MYSQL_YYABORT \ + do \ + { \ + YYABORT; \ + } while (0) + +#define MYSQL_YYABORT_UNLESS(A) \ + if (unlikely(!(A))) \ + { \ + thd->parse_error(); \ + MYSQL_YYABORT; \ + } + +#define my_yyabort_error(A) \ + do { my_error A; MYSQL_YYABORT; } while(0) + +#ifndef DBUG_OFF +#define YYDEBUG 1 +#else +#define YYDEBUG 0 +#endif + + +static Item* escape(THD *thd) +{ + thd->lex->escape_used= false; + const char *esc= thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES ? "" : "\\"; + return new (thd->mem_root) Item_string_ascii(thd, esc, MY_TEST(esc[0])); +} + + +/** + @brief Bison callback to report a syntax/OOM error + + This function is invoked by the bison-generated parser + when a syntax error, a parse error or an out-of-memory + condition occurs. This function is not invoked when the + parser is requested to abort by semantic action code + by means of YYABORT or YYACCEPT macros. This is why these + macros should not be used (use MYSQL_YYABORT/MYSQL_YYACCEPT + instead). + + The parser will abort immediately after invoking this callback. + + This function is not for use in semantic actions and is internal to + the parser, as it performs some pre-return cleanup. + In semantic actions, please use thd->parse_error() or my_error to + push an error into the error stack and MYSQL_YYABORT + to abort from the parser. +*/ + +static void yyerror(THD *thd, const char *s) +{ + /* "parse error" changed into "syntax error" between bison 1.75 and 1.875 */ + if (strcmp(s,"parse error") == 0 || strcmp(s,"syntax error") == 0) + s= ER_THD(thd, ER_SYNTAX_ERROR); + thd->parse_error(s, 0); +} + + +#ifndef DBUG_OFF +#define __CONCAT_UNDERSCORED(x,y) x ## _ ## y +#define _CONCAT_UNDERSCORED(x,y) __CONCAT_UNDERSCORED(x,y) +void _CONCAT_UNDERSCORED(turn_parser_debug_on,yyparse)() +{ + /* + MYSQLdebug is in sql/yy_*.cc, in bison generated code. + Turning this option on is **VERY** verbose, and should be + used when investigating a syntax error problem only. + + The syntax to run with bison traces is as follows : + - Starting a server manually : + mysqld --debug-dbug="d,parser_debug" ... + - Running a test : + mysql-test-run.pl --mysqld="--debug-dbug=d,parser_debug" ... + + The result will be in the process stderr (var/log/master.err) + */ + +#ifndef _AIX + extern int yydebug; +#else + static int yydebug; +#endif + yydebug= 1; +} +#endif + + + +#line 244 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +#include "yy_oracle.hh" +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_3_ = 3, /* '@' */ + YYSYMBOL_ABORT_SYM = 4, /* ABORT_SYM */ + YYSYMBOL_IMPOSSIBLE_ACTION = 5, /* IMPOSSIBLE_ACTION */ + YYSYMBOL_FORCE_LOOKAHEAD = 6, /* FORCE_LOOKAHEAD */ + YYSYMBOL_END_OF_INPUT = 7, /* END_OF_INPUT */ + YYSYMBOL_COLON_ORACLE_SYM = 8, /* COLON_ORACLE_SYM */ + YYSYMBOL_PARAM_MARKER = 9, /* PARAM_MARKER */ + YYSYMBOL_FOR_SYSTEM_TIME_SYM = 10, /* FOR_SYSTEM_TIME_SYM */ + YYSYMBOL_LEFT_PAREN_ALT = 11, /* LEFT_PAREN_ALT */ + YYSYMBOL_LEFT_PAREN_WITH = 12, /* LEFT_PAREN_WITH */ + YYSYMBOL_LEFT_PAREN_LIKE = 13, /* LEFT_PAREN_LIKE */ + YYSYMBOL_ORACLE_CONCAT_SYM = 14, /* ORACLE_CONCAT_SYM */ + YYSYMBOL_PERCENT_ORACLE_SYM = 15, /* PERCENT_ORACLE_SYM */ + YYSYMBOL_WITH_CUBE_SYM = 16, /* WITH_CUBE_SYM */ + YYSYMBOL_WITH_ROLLUP_SYM = 17, /* WITH_ROLLUP_SYM */ + YYSYMBOL_WITH_SYSTEM_SYM = 18, /* WITH_SYSTEM_SYM */ + YYSYMBOL_IDENT = 19, /* IDENT */ + YYSYMBOL_IDENT_QUOTED = 20, /* IDENT_QUOTED */ + YYSYMBOL_LEX_HOSTNAME = 21, /* LEX_HOSTNAME */ + YYSYMBOL_UNDERSCORE_CHARSET = 22, /* UNDERSCORE_CHARSET */ + YYSYMBOL_BIN_NUM = 23, /* BIN_NUM */ + YYSYMBOL_DECIMAL_NUM = 24, /* DECIMAL_NUM */ + YYSYMBOL_FLOAT_NUM = 25, /* FLOAT_NUM */ + YYSYMBOL_HEX_NUM = 26, /* HEX_NUM */ + YYSYMBOL_HEX_STRING = 27, /* HEX_STRING */ + YYSYMBOL_LONG_NUM = 28, /* LONG_NUM */ + YYSYMBOL_NCHAR_STRING = 29, /* NCHAR_STRING */ + YYSYMBOL_NUM = 30, /* NUM */ + YYSYMBOL_TEXT_STRING = 31, /* TEXT_STRING */ + YYSYMBOL_ULONGLONG_NUM = 32, /* ULONGLONG_NUM */ + YYSYMBOL_AND_AND_SYM = 33, /* AND_AND_SYM */ + YYSYMBOL_DOT_DOT_SYM = 34, /* DOT_DOT_SYM */ + YYSYMBOL_EQUAL_SYM = 35, /* EQUAL_SYM */ + YYSYMBOL_GE = 36, /* GE */ + YYSYMBOL_LE = 37, /* LE */ + YYSYMBOL_MYSQL_CONCAT_SYM = 38, /* MYSQL_CONCAT_SYM */ + YYSYMBOL_NE = 39, /* NE */ + YYSYMBOL_NOT2_SYM = 40, /* NOT2_SYM */ + YYSYMBOL_OR2_SYM = 41, /* OR2_SYM */ + YYSYMBOL_SET_VAR = 42, /* SET_VAR */ + YYSYMBOL_SHIFT_LEFT = 43, /* SHIFT_LEFT */ + YYSYMBOL_SHIFT_RIGHT = 44, /* SHIFT_RIGHT */ + YYSYMBOL_ACCESSIBLE_SYM = 45, /* ACCESSIBLE_SYM */ + YYSYMBOL_ADD = 46, /* ADD */ + YYSYMBOL_ALL = 47, /* ALL */ + YYSYMBOL_ALTER = 48, /* ALTER */ + YYSYMBOL_ANALYZE_SYM = 49, /* ANALYZE_SYM */ + YYSYMBOL_AND_SYM = 50, /* AND_SYM */ + YYSYMBOL_ASC = 51, /* ASC */ + YYSYMBOL_ASENSITIVE_SYM = 52, /* ASENSITIVE_SYM */ + YYSYMBOL_AS = 53, /* AS */ + YYSYMBOL_BEFORE_SYM = 54, /* BEFORE_SYM */ + YYSYMBOL_BETWEEN_SYM = 55, /* BETWEEN_SYM */ + YYSYMBOL_BIGINT = 56, /* BIGINT */ + YYSYMBOL_BINARY = 57, /* BINARY */ + YYSYMBOL_BIT_AND = 58, /* BIT_AND */ + YYSYMBOL_BIT_OR = 59, /* BIT_OR */ + YYSYMBOL_BIT_XOR = 60, /* BIT_XOR */ + YYSYMBOL_BLOB_MARIADB_SYM = 61, /* BLOB_MARIADB_SYM */ + YYSYMBOL_BLOB_ORACLE_SYM = 62, /* BLOB_ORACLE_SYM */ + YYSYMBOL_BODY_ORACLE_SYM = 63, /* BODY_ORACLE_SYM */ + YYSYMBOL_BOTH = 64, /* BOTH */ + YYSYMBOL_BY = 65, /* BY */ + YYSYMBOL_CALL_SYM = 66, /* CALL_SYM */ + YYSYMBOL_CASCADE = 67, /* CASCADE */ + YYSYMBOL_CASE_SYM = 68, /* CASE_SYM */ + YYSYMBOL_CAST_SYM = 69, /* CAST_SYM */ + YYSYMBOL_CHANGE = 70, /* CHANGE */ + YYSYMBOL_CHAR_SYM = 71, /* CHAR_SYM */ + YYSYMBOL_CHECK_SYM = 72, /* CHECK_SYM */ + YYSYMBOL_COLLATE_SYM = 73, /* COLLATE_SYM */ + YYSYMBOL_CONDITION_SYM = 74, /* CONDITION_SYM */ + YYSYMBOL_CONSTRAINT = 75, /* CONSTRAINT */ + YYSYMBOL_CONTINUE_MARIADB_SYM = 76, /* CONTINUE_MARIADB_SYM */ + YYSYMBOL_CONTINUE_ORACLE_SYM = 77, /* CONTINUE_ORACLE_SYM */ + YYSYMBOL_CONVERT_SYM = 78, /* CONVERT_SYM */ + YYSYMBOL_COUNT_SYM = 79, /* COUNT_SYM */ + YYSYMBOL_CREATE = 80, /* CREATE */ + YYSYMBOL_CROSS = 81, /* CROSS */ + YYSYMBOL_CUME_DIST_SYM = 82, /* CUME_DIST_SYM */ + YYSYMBOL_CURDATE = 83, /* CURDATE */ + YYSYMBOL_CURRENT_ROLE = 84, /* CURRENT_ROLE */ + YYSYMBOL_CURRENT_USER = 85, /* CURRENT_USER */ + YYSYMBOL_CURSOR_SYM = 86, /* CURSOR_SYM */ + YYSYMBOL_CURTIME = 87, /* CURTIME */ + YYSYMBOL_DATABASE = 88, /* DATABASE */ + YYSYMBOL_DATABASES = 89, /* DATABASES */ + YYSYMBOL_DATE_ADD_INTERVAL = 90, /* DATE_ADD_INTERVAL */ + YYSYMBOL_DATE_SUB_INTERVAL = 91, /* DATE_SUB_INTERVAL */ + YYSYMBOL_DAY_HOUR_SYM = 92, /* DAY_HOUR_SYM */ + YYSYMBOL_DAY_MICROSECOND_SYM = 93, /* DAY_MICROSECOND_SYM */ + YYSYMBOL_DAY_MINUTE_SYM = 94, /* DAY_MINUTE_SYM */ + YYSYMBOL_DAY_SECOND_SYM = 95, /* DAY_SECOND_SYM */ + YYSYMBOL_DECIMAL_SYM = 96, /* DECIMAL_SYM */ + YYSYMBOL_DECLARE_MARIADB_SYM = 97, /* DECLARE_MARIADB_SYM */ + YYSYMBOL_DECLARE_ORACLE_SYM = 98, /* DECLARE_ORACLE_SYM */ + YYSYMBOL_DEFAULT = 99, /* DEFAULT */ + YYSYMBOL_DELETE_DOMAIN_ID_SYM = 100, /* DELETE_DOMAIN_ID_SYM */ + YYSYMBOL_DELETE_SYM = 101, /* DELETE_SYM */ + YYSYMBOL_DENSE_RANK_SYM = 102, /* DENSE_RANK_SYM */ + YYSYMBOL_DESCRIBE = 103, /* DESCRIBE */ + YYSYMBOL_DESC = 104, /* DESC */ + YYSYMBOL_DETERMINISTIC_SYM = 105, /* DETERMINISTIC_SYM */ + YYSYMBOL_DISTINCT = 106, /* DISTINCT */ + YYSYMBOL_DIV_SYM = 107, /* DIV_SYM */ + YYSYMBOL_DO_DOMAIN_IDS_SYM = 108, /* DO_DOMAIN_IDS_SYM */ + YYSYMBOL_DOUBLE_SYM = 109, /* DOUBLE_SYM */ + YYSYMBOL_DROP = 110, /* DROP */ + YYSYMBOL_DUAL_SYM = 111, /* DUAL_SYM */ + YYSYMBOL_EACH_SYM = 112, /* EACH_SYM */ + YYSYMBOL_ELSEIF_MARIADB_SYM = 113, /* ELSEIF_MARIADB_SYM */ + YYSYMBOL_ELSE = 114, /* ELSE */ + YYSYMBOL_ELSIF_ORACLE_SYM = 115, /* ELSIF_ORACLE_SYM */ + YYSYMBOL_EMPTY_SYM = 116, /* EMPTY_SYM */ + YYSYMBOL_ENCLOSED = 117, /* ENCLOSED */ + YYSYMBOL_ESCAPED = 118, /* ESCAPED */ + YYSYMBOL_EXCEPT_SYM = 119, /* EXCEPT_SYM */ + YYSYMBOL_EXISTS = 120, /* EXISTS */ + YYSYMBOL_EXTRACT_SYM = 121, /* EXTRACT_SYM */ + YYSYMBOL_FALSE_SYM = 122, /* FALSE_SYM */ + YYSYMBOL_FETCH_SYM = 123, /* FETCH_SYM */ + YYSYMBOL_FIRST_VALUE_SYM = 124, /* FIRST_VALUE_SYM */ + YYSYMBOL_FLOAT_SYM = 125, /* FLOAT_SYM */ + YYSYMBOL_FOREIGN = 126, /* FOREIGN */ + YYSYMBOL_FOR_SYM = 127, /* FOR_SYM */ + YYSYMBOL_FROM = 128, /* FROM */ + YYSYMBOL_FULLTEXT_SYM = 129, /* FULLTEXT_SYM */ + YYSYMBOL_GOTO_ORACLE_SYM = 130, /* GOTO_ORACLE_SYM */ + YYSYMBOL_GRANT = 131, /* GRANT */ + YYSYMBOL_GROUP_CONCAT_SYM = 132, /* GROUP_CONCAT_SYM */ + YYSYMBOL_JSON_ARRAYAGG_SYM = 133, /* JSON_ARRAYAGG_SYM */ + YYSYMBOL_JSON_OBJECTAGG_SYM = 134, /* JSON_OBJECTAGG_SYM */ + YYSYMBOL_JSON_TABLE_SYM = 135, /* JSON_TABLE_SYM */ + YYSYMBOL_GROUP_SYM = 136, /* GROUP_SYM */ + YYSYMBOL_HAVING = 137, /* HAVING */ + YYSYMBOL_HOUR_MICROSECOND_SYM = 138, /* HOUR_MICROSECOND_SYM */ + YYSYMBOL_HOUR_MINUTE_SYM = 139, /* HOUR_MINUTE_SYM */ + YYSYMBOL_HOUR_SECOND_SYM = 140, /* HOUR_SECOND_SYM */ + YYSYMBOL_IF_SYM = 141, /* IF_SYM */ + YYSYMBOL_IGNORE_DOMAIN_IDS_SYM = 142, /* IGNORE_DOMAIN_IDS_SYM */ + YYSYMBOL_IGNORE_SYM = 143, /* IGNORE_SYM */ + YYSYMBOL_IGNORED_SYM = 144, /* IGNORED_SYM */ + YYSYMBOL_INDEX_SYM = 145, /* INDEX_SYM */ + YYSYMBOL_INFILE = 146, /* INFILE */ + YYSYMBOL_INNER_SYM = 147, /* INNER_SYM */ + YYSYMBOL_INOUT_SYM = 148, /* INOUT_SYM */ + YYSYMBOL_INSENSITIVE_SYM = 149, /* INSENSITIVE_SYM */ + YYSYMBOL_INSERT = 150, /* INSERT */ + YYSYMBOL_IN_SYM = 151, /* IN_SYM */ + YYSYMBOL_INTERSECT_SYM = 152, /* INTERSECT_SYM */ + YYSYMBOL_INTERVAL_SYM = 153, /* INTERVAL_SYM */ + YYSYMBOL_INTO = 154, /* INTO */ + YYSYMBOL_INT_SYM = 155, /* INT_SYM */ + YYSYMBOL_IS = 156, /* IS */ + YYSYMBOL_ITERATE_SYM = 157, /* ITERATE_SYM */ + YYSYMBOL_JOIN_SYM = 158, /* JOIN_SYM */ + YYSYMBOL_KEYS = 159, /* KEYS */ + YYSYMBOL_KEY_SYM = 160, /* KEY_SYM */ + YYSYMBOL_KILL_SYM = 161, /* KILL_SYM */ + YYSYMBOL_LAG_SYM = 162, /* LAG_SYM */ + YYSYMBOL_LEADING = 163, /* LEADING */ + YYSYMBOL_LEAD_SYM = 164, /* LEAD_SYM */ + YYSYMBOL_LEAVE_SYM = 165, /* LEAVE_SYM */ + YYSYMBOL_LEFT = 166, /* LEFT */ + YYSYMBOL_LIKE = 167, /* LIKE */ + YYSYMBOL_LIMIT = 168, /* LIMIT */ + YYSYMBOL_LINEAR_SYM = 169, /* LINEAR_SYM */ + YYSYMBOL_LINES = 170, /* LINES */ + YYSYMBOL_LOAD = 171, /* LOAD */ + YYSYMBOL_LOCATOR_SYM = 172, /* LOCATOR_SYM */ + YYSYMBOL_LOCK_SYM = 173, /* LOCK_SYM */ + YYSYMBOL_LONGBLOB = 174, /* LONGBLOB */ + YYSYMBOL_LONG_SYM = 175, /* LONG_SYM */ + YYSYMBOL_LONGTEXT = 176, /* LONGTEXT */ + YYSYMBOL_LOOP_SYM = 177, /* LOOP_SYM */ + YYSYMBOL_LOW_PRIORITY = 178, /* LOW_PRIORITY */ + YYSYMBOL_MASTER_SSL_VERIFY_SERVER_CERT_SYM = 179, /* MASTER_SSL_VERIFY_SERVER_CERT_SYM */ + YYSYMBOL_MATCH = 180, /* MATCH */ + YYSYMBOL_MAX_SYM = 181, /* MAX_SYM */ + YYSYMBOL_MAXVALUE_SYM = 182, /* MAXVALUE_SYM */ + YYSYMBOL_MEDIAN_SYM = 183, /* MEDIAN_SYM */ + YYSYMBOL_MEDIUMBLOB = 184, /* MEDIUMBLOB */ + YYSYMBOL_MEDIUMINT = 185, /* MEDIUMINT */ + YYSYMBOL_MEDIUMTEXT = 186, /* MEDIUMTEXT */ + YYSYMBOL_MIN_SYM = 187, /* MIN_SYM */ + YYSYMBOL_MINUS_ORACLE_SYM = 188, /* MINUS_ORACLE_SYM */ + YYSYMBOL_MINUTE_MICROSECOND_SYM = 189, /* MINUTE_MICROSECOND_SYM */ + YYSYMBOL_MINUTE_SECOND_SYM = 190, /* MINUTE_SECOND_SYM */ + YYSYMBOL_MODIFIES_SYM = 191, /* MODIFIES_SYM */ + YYSYMBOL_MOD_SYM = 192, /* MOD_SYM */ + YYSYMBOL_NATURAL = 193, /* NATURAL */ + YYSYMBOL_NEG = 194, /* NEG */ + YYSYMBOL_NESTED_SYM = 195, /* NESTED_SYM */ + YYSYMBOL_NOT_SYM = 196, /* NOT_SYM */ + YYSYMBOL_NO_WRITE_TO_BINLOG = 197, /* NO_WRITE_TO_BINLOG */ + YYSYMBOL_NOW_SYM = 198, /* NOW_SYM */ + YYSYMBOL_NTH_VALUE_SYM = 199, /* NTH_VALUE_SYM */ + YYSYMBOL_NTILE_SYM = 200, /* NTILE_SYM */ + YYSYMBOL_NULL_SYM = 201, /* NULL_SYM */ + YYSYMBOL_NUMERIC_SYM = 202, /* NUMERIC_SYM */ + YYSYMBOL_ON = 203, /* ON */ + YYSYMBOL_OPTIMIZE = 204, /* OPTIMIZE */ + YYSYMBOL_OPTIONALLY = 205, /* OPTIONALLY */ + YYSYMBOL_ORDER_SYM = 206, /* ORDER_SYM */ + YYSYMBOL_ORDINALITY_SYM = 207, /* ORDINALITY_SYM */ + YYSYMBOL_OR_SYM = 208, /* OR_SYM */ + YYSYMBOL_OTHERS_ORACLE_SYM = 209, /* OTHERS_ORACLE_SYM */ + YYSYMBOL_OUTER = 210, /* OUTER */ + YYSYMBOL_OUTFILE = 211, /* OUTFILE */ + YYSYMBOL_OUT_SYM = 212, /* OUT_SYM */ + YYSYMBOL_OVER_SYM = 213, /* OVER_SYM */ + YYSYMBOL_PACKAGE_ORACLE_SYM = 214, /* PACKAGE_ORACLE_SYM */ + YYSYMBOL_PAGE_CHECKSUM_SYM = 215, /* PAGE_CHECKSUM_SYM */ + YYSYMBOL_PARSE_VCOL_EXPR_SYM = 216, /* PARSE_VCOL_EXPR_SYM */ + YYSYMBOL_PARTITION_SYM = 217, /* PARTITION_SYM */ + YYSYMBOL_PATH_SYM = 218, /* PATH_SYM */ + YYSYMBOL_PERCENTILE_CONT_SYM = 219, /* PERCENTILE_CONT_SYM */ + YYSYMBOL_PERCENTILE_DISC_SYM = 220, /* PERCENTILE_DISC_SYM */ + YYSYMBOL_PERCENT_RANK_SYM = 221, /* PERCENT_RANK_SYM */ + YYSYMBOL_PORTION_SYM = 222, /* PORTION_SYM */ + YYSYMBOL_POSITION_SYM = 223, /* POSITION_SYM */ + YYSYMBOL_PRECISION = 224, /* PRECISION */ + YYSYMBOL_PRIMARY_SYM = 225, /* PRIMARY_SYM */ + YYSYMBOL_PROCEDURE_SYM = 226, /* PROCEDURE_SYM */ + YYSYMBOL_PURGE = 227, /* PURGE */ + YYSYMBOL_RAISE_ORACLE_SYM = 228, /* RAISE_ORACLE_SYM */ + YYSYMBOL_RANGE_SYM = 229, /* RANGE_SYM */ + YYSYMBOL_RANK_SYM = 230, /* RANK_SYM */ + YYSYMBOL_READS_SYM = 231, /* READS_SYM */ + YYSYMBOL_READ_SYM = 232, /* READ_SYM */ + YYSYMBOL_READ_WRITE_SYM = 233, /* READ_WRITE_SYM */ + YYSYMBOL_REAL = 234, /* REAL */ + YYSYMBOL_RECURSIVE_SYM = 235, /* RECURSIVE_SYM */ + YYSYMBOL_REFERENCES = 236, /* REFERENCES */ + YYSYMBOL_REF_SYSTEM_ID_SYM = 237, /* REF_SYSTEM_ID_SYM */ + YYSYMBOL_REGEXP = 238, /* REGEXP */ + YYSYMBOL_RELEASE_SYM = 239, /* RELEASE_SYM */ + YYSYMBOL_RENAME = 240, /* RENAME */ + YYSYMBOL_REPEAT_SYM = 241, /* REPEAT_SYM */ + YYSYMBOL_REQUIRE_SYM = 242, /* REQUIRE_SYM */ + YYSYMBOL_RESIGNAL_SYM = 243, /* RESIGNAL_SYM */ + YYSYMBOL_RESTRICT = 244, /* RESTRICT */ + YYSYMBOL_RETURNING_SYM = 245, /* RETURNING_SYM */ + YYSYMBOL_RETURN_MARIADB_SYM = 246, /* RETURN_MARIADB_SYM */ + YYSYMBOL_RETURN_ORACLE_SYM = 247, /* RETURN_ORACLE_SYM */ + YYSYMBOL_REVOKE = 248, /* REVOKE */ + YYSYMBOL_RIGHT = 249, /* RIGHT */ + YYSYMBOL_ROW_NUMBER_SYM = 250, /* ROW_NUMBER_SYM */ + YYSYMBOL_ROWS_SYM = 251, /* ROWS_SYM */ + YYSYMBOL_ROWTYPE_ORACLE_SYM = 252, /* ROWTYPE_ORACLE_SYM */ + YYSYMBOL_SECOND_MICROSECOND_SYM = 253, /* SECOND_MICROSECOND_SYM */ + YYSYMBOL_SELECT_SYM = 254, /* SELECT_SYM */ + YYSYMBOL_SENSITIVE_SYM = 255, /* SENSITIVE_SYM */ + YYSYMBOL_SEPARATOR_SYM = 256, /* SEPARATOR_SYM */ + YYSYMBOL_SERVER_OPTIONS = 257, /* SERVER_OPTIONS */ + YYSYMBOL_SET = 258, /* SET */ + YYSYMBOL_SHOW = 259, /* SHOW */ + YYSYMBOL_SIGNAL_SYM = 260, /* SIGNAL_SYM */ + YYSYMBOL_SMALLINT = 261, /* SMALLINT */ + YYSYMBOL_SPATIAL_SYM = 262, /* SPATIAL_SYM */ + YYSYMBOL_SPECIFIC_SYM = 263, /* SPECIFIC_SYM */ + YYSYMBOL_SQL_BIG_RESULT = 264, /* SQL_BIG_RESULT */ + YYSYMBOL_SQLEXCEPTION_SYM = 265, /* SQLEXCEPTION_SYM */ + YYSYMBOL_SQL_SMALL_RESULT = 266, /* SQL_SMALL_RESULT */ + YYSYMBOL_SQLSTATE_SYM = 267, /* SQLSTATE_SYM */ + YYSYMBOL_SQL_SYM = 268, /* SQL_SYM */ + YYSYMBOL_SQLWARNING_SYM = 269, /* SQLWARNING_SYM */ + YYSYMBOL_SSL_SYM = 270, /* SSL_SYM */ + YYSYMBOL_STARTING = 271, /* STARTING */ + YYSYMBOL_STATS_AUTO_RECALC_SYM = 272, /* STATS_AUTO_RECALC_SYM */ + YYSYMBOL_STATS_PERSISTENT_SYM = 273, /* STATS_PERSISTENT_SYM */ + YYSYMBOL_STATS_SAMPLE_PAGES_SYM = 274, /* STATS_SAMPLE_PAGES_SYM */ + YYSYMBOL_STDDEV_SAMP_SYM = 275, /* STDDEV_SAMP_SYM */ + YYSYMBOL_STD_SYM = 276, /* STD_SYM */ + YYSYMBOL_STRAIGHT_JOIN = 277, /* STRAIGHT_JOIN */ + YYSYMBOL_SUM_SYM = 278, /* SUM_SYM */ + YYSYMBOL_SYSDATE = 279, /* SYSDATE */ + YYSYMBOL_TABLE_REF_PRIORITY = 280, /* TABLE_REF_PRIORITY */ + YYSYMBOL_TABLE_SYM = 281, /* TABLE_SYM */ + YYSYMBOL_TERMINATED = 282, /* TERMINATED */ + YYSYMBOL_THEN_SYM = 283, /* THEN_SYM */ + YYSYMBOL_TINYBLOB = 284, /* TINYBLOB */ + YYSYMBOL_TINYINT = 285, /* TINYINT */ + YYSYMBOL_TINYTEXT = 286, /* TINYTEXT */ + YYSYMBOL_TO_SYM = 287, /* TO_SYM */ + YYSYMBOL_TRAILING = 288, /* TRAILING */ + YYSYMBOL_TRIGGER_SYM = 289, /* TRIGGER_SYM */ + YYSYMBOL_TRUE_SYM = 290, /* TRUE_SYM */ + YYSYMBOL_UNDO_SYM = 291, /* UNDO_SYM */ + YYSYMBOL_UNION_SYM = 292, /* UNION_SYM */ + YYSYMBOL_UNIQUE_SYM = 293, /* UNIQUE_SYM */ + YYSYMBOL_UNLOCK_SYM = 294, /* UNLOCK_SYM */ + YYSYMBOL_UNSIGNED = 295, /* UNSIGNED */ + YYSYMBOL_UPDATE_SYM = 296, /* UPDATE_SYM */ + YYSYMBOL_USAGE = 297, /* USAGE */ + YYSYMBOL_USE_SYM = 298, /* USE_SYM */ + YYSYMBOL_USING = 299, /* USING */ + YYSYMBOL_UTC_DATE_SYM = 300, /* UTC_DATE_SYM */ + YYSYMBOL_UTC_TIMESTAMP_SYM = 301, /* UTC_TIMESTAMP_SYM */ + YYSYMBOL_UTC_TIME_SYM = 302, /* UTC_TIME_SYM */ + YYSYMBOL_VALUES_IN_SYM = 303, /* VALUES_IN_SYM */ + YYSYMBOL_VALUES_LESS_SYM = 304, /* VALUES_LESS_SYM */ + YYSYMBOL_VALUES = 305, /* VALUES */ + YYSYMBOL_VARBINARY = 306, /* VARBINARY */ + YYSYMBOL_VARCHAR = 307, /* VARCHAR */ + YYSYMBOL_VARIANCE_SYM = 308, /* VARIANCE_SYM */ + YYSYMBOL_VAR_SAMP_SYM = 309, /* VAR_SAMP_SYM */ + YYSYMBOL_VARYING = 310, /* VARYING */ + YYSYMBOL_WHEN_SYM = 311, /* WHEN_SYM */ + YYSYMBOL_WHERE = 312, /* WHERE */ + YYSYMBOL_WHILE_SYM = 313, /* WHILE_SYM */ + YYSYMBOL_WITH = 314, /* WITH */ + YYSYMBOL_XOR = 315, /* XOR */ + YYSYMBOL_YEAR_MONTH_SYM = 316, /* YEAR_MONTH_SYM */ + YYSYMBOL_ZEROFILL = 317, /* ZEROFILL */ + YYSYMBOL_BODY_MARIADB_SYM = 318, /* BODY_MARIADB_SYM */ + YYSYMBOL_ELSEIF_ORACLE_SYM = 319, /* ELSEIF_ORACLE_SYM */ + YYSYMBOL_ELSIF_MARIADB_SYM = 320, /* ELSIF_MARIADB_SYM */ + YYSYMBOL_EXCEPTION_ORACLE_SYM = 321, /* EXCEPTION_ORACLE_SYM */ + YYSYMBOL_GOTO_MARIADB_SYM = 322, /* GOTO_MARIADB_SYM */ + YYSYMBOL_OTHERS_MARIADB_SYM = 323, /* OTHERS_MARIADB_SYM */ + YYSYMBOL_PACKAGE_MARIADB_SYM = 324, /* PACKAGE_MARIADB_SYM */ + YYSYMBOL_RAISE_MARIADB_SYM = 325, /* RAISE_MARIADB_SYM */ + YYSYMBOL_ROWTYPE_MARIADB_SYM = 326, /* ROWTYPE_MARIADB_SYM */ + YYSYMBOL_ROWNUM_SYM = 327, /* ROWNUM_SYM */ + YYSYMBOL_REPLACE = 328, /* REPLACE */ + YYSYMBOL_SUBSTRING = 329, /* SUBSTRING */ + YYSYMBOL_TRIM = 330, /* TRIM */ + YYSYMBOL_ACCOUNT_SYM = 331, /* ACCOUNT_SYM */ + YYSYMBOL_ACTION = 332, /* ACTION */ + YYSYMBOL_ADMIN_SYM = 333, /* ADMIN_SYM */ + YYSYMBOL_ADDDATE_SYM = 334, /* ADDDATE_SYM */ + YYSYMBOL_AFTER_SYM = 335, /* AFTER_SYM */ + YYSYMBOL_AGAINST = 336, /* AGAINST */ + YYSYMBOL_AGGREGATE_SYM = 337, /* AGGREGATE_SYM */ + YYSYMBOL_ALGORITHM_SYM = 338, /* ALGORITHM_SYM */ + YYSYMBOL_ALWAYS_SYM = 339, /* ALWAYS_SYM */ + YYSYMBOL_ANY_SYM = 340, /* ANY_SYM */ + YYSYMBOL_ASCII_SYM = 341, /* ASCII_SYM */ + YYSYMBOL_AT_SYM = 342, /* AT_SYM */ + YYSYMBOL_ATOMIC_SYM = 343, /* ATOMIC_SYM */ + YYSYMBOL_AUTHORS_SYM = 344, /* AUTHORS_SYM */ + YYSYMBOL_AUTOEXTEND_SIZE_SYM = 345, /* AUTOEXTEND_SIZE_SYM */ + YYSYMBOL_AUTO_INC = 346, /* AUTO_INC */ + YYSYMBOL_AUTO_SYM = 347, /* AUTO_SYM */ + YYSYMBOL_AVG_ROW_LENGTH = 348, /* AVG_ROW_LENGTH */ + YYSYMBOL_AVG_SYM = 349, /* AVG_SYM */ + YYSYMBOL_BACKUP_SYM = 350, /* BACKUP_SYM */ + YYSYMBOL_BEGIN_MARIADB_SYM = 351, /* BEGIN_MARIADB_SYM */ + YYSYMBOL_BEGIN_ORACLE_SYM = 352, /* BEGIN_ORACLE_SYM */ + YYSYMBOL_BINLOG_SYM = 353, /* BINLOG_SYM */ + YYSYMBOL_BIT_SYM = 354, /* BIT_SYM */ + YYSYMBOL_BLOCK_SYM = 355, /* BLOCK_SYM */ + YYSYMBOL_BOOL_SYM = 356, /* BOOL_SYM */ + YYSYMBOL_BOOLEAN_SYM = 357, /* BOOLEAN_SYM */ + YYSYMBOL_BTREE_SYM = 358, /* BTREE_SYM */ + YYSYMBOL_BYTE_SYM = 359, /* BYTE_SYM */ + YYSYMBOL_CACHE_SYM = 360, /* CACHE_SYM */ + YYSYMBOL_CASCADED = 361, /* CASCADED */ + YYSYMBOL_CATALOG_NAME_SYM = 362, /* CATALOG_NAME_SYM */ + YYSYMBOL_CHAIN_SYM = 363, /* CHAIN_SYM */ + YYSYMBOL_CHANGED = 364, /* CHANGED */ + YYSYMBOL_CHANNEL_SYM = 365, /* CHANNEL_SYM */ + YYSYMBOL_CHARSET = 366, /* CHARSET */ + YYSYMBOL_CHECKPOINT_SYM = 367, /* CHECKPOINT_SYM */ + YYSYMBOL_CHECKSUM_SYM = 368, /* CHECKSUM_SYM */ + YYSYMBOL_CIPHER_SYM = 369, /* CIPHER_SYM */ + YYSYMBOL_CLASS_ORIGIN_SYM = 370, /* CLASS_ORIGIN_SYM */ + YYSYMBOL_CLIENT_SYM = 371, /* CLIENT_SYM */ + YYSYMBOL_CLOB_MARIADB_SYM = 372, /* CLOB_MARIADB_SYM */ + YYSYMBOL_CLOB_ORACLE_SYM = 373, /* CLOB_ORACLE_SYM */ + YYSYMBOL_CLOSE_SYM = 374, /* CLOSE_SYM */ + YYSYMBOL_COALESCE = 375, /* COALESCE */ + YYSYMBOL_CODE_SYM = 376, /* CODE_SYM */ + YYSYMBOL_COLLATION_SYM = 377, /* COLLATION_SYM */ + YYSYMBOL_COLUMNS = 378, /* COLUMNS */ + YYSYMBOL_COLUMN_ADD_SYM = 379, /* COLUMN_ADD_SYM */ + YYSYMBOL_COLUMN_CHECK_SYM = 380, /* COLUMN_CHECK_SYM */ + YYSYMBOL_COLUMN_CREATE_SYM = 381, /* COLUMN_CREATE_SYM */ + YYSYMBOL_COLUMN_DELETE_SYM = 382, /* COLUMN_DELETE_SYM */ + YYSYMBOL_COLUMN_GET_SYM = 383, /* COLUMN_GET_SYM */ + YYSYMBOL_COLUMN_SYM = 384, /* COLUMN_SYM */ + YYSYMBOL_COLUMN_NAME_SYM = 385, /* COLUMN_NAME_SYM */ + YYSYMBOL_COMMENT_SYM = 386, /* COMMENT_SYM */ + YYSYMBOL_COMMITTED_SYM = 387, /* COMMITTED_SYM */ + YYSYMBOL_COMMIT_SYM = 388, /* COMMIT_SYM */ + YYSYMBOL_COMPACT_SYM = 389, /* COMPACT_SYM */ + YYSYMBOL_COMPLETION_SYM = 390, /* COMPLETION_SYM */ + YYSYMBOL_COMPRESSED_SYM = 391, /* COMPRESSED_SYM */ + YYSYMBOL_CONCURRENT = 392, /* CONCURRENT */ + YYSYMBOL_CONNECTION_SYM = 393, /* CONNECTION_SYM */ + YYSYMBOL_CONSISTENT_SYM = 394, /* CONSISTENT_SYM */ + YYSYMBOL_CONSTRAINT_CATALOG_SYM = 395, /* CONSTRAINT_CATALOG_SYM */ + YYSYMBOL_CONSTRAINT_NAME_SYM = 396, /* CONSTRAINT_NAME_SYM */ + YYSYMBOL_CONSTRAINT_SCHEMA_SYM = 397, /* CONSTRAINT_SCHEMA_SYM */ + YYSYMBOL_CONTAINS_SYM = 398, /* CONTAINS_SYM */ + YYSYMBOL_CONTEXT_SYM = 399, /* CONTEXT_SYM */ + YYSYMBOL_CONTRIBUTORS_SYM = 400, /* CONTRIBUTORS_SYM */ + YYSYMBOL_CPU_SYM = 401, /* CPU_SYM */ + YYSYMBOL_CUBE_SYM = 402, /* CUBE_SYM */ + YYSYMBOL_CURRENT_SYM = 403, /* CURRENT_SYM */ + YYSYMBOL_CURRENT_POS_SYM = 404, /* CURRENT_POS_SYM */ + YYSYMBOL_CURSOR_NAME_SYM = 405, /* CURSOR_NAME_SYM */ + YYSYMBOL_CYCLE_SYM = 406, /* CYCLE_SYM */ + YYSYMBOL_DATAFILE_SYM = 407, /* DATAFILE_SYM */ + YYSYMBOL_DATA_SYM = 408, /* DATA_SYM */ + YYSYMBOL_DATETIME = 409, /* DATETIME */ + YYSYMBOL_DATE_SYM = 410, /* DATE_SYM */ + YYSYMBOL_DAY_SYM = 411, /* DAY_SYM */ + YYSYMBOL_DEALLOCATE_SYM = 412, /* DEALLOCATE_SYM */ + YYSYMBOL_DEFINER_SYM = 413, /* DEFINER_SYM */ + YYSYMBOL_DELAYED_SYM = 414, /* DELAYED_SYM */ + YYSYMBOL_DELAY_KEY_WRITE_SYM = 415, /* DELAY_KEY_WRITE_SYM */ + YYSYMBOL_DES_KEY_FILE = 416, /* DES_KEY_FILE */ + YYSYMBOL_DIAGNOSTICS_SYM = 417, /* DIAGNOSTICS_SYM */ + YYSYMBOL_DIRECTORY_SYM = 418, /* DIRECTORY_SYM */ + YYSYMBOL_DISABLE_SYM = 419, /* DISABLE_SYM */ + YYSYMBOL_DISCARD = 420, /* DISCARD */ + YYSYMBOL_DISK_SYM = 421, /* DISK_SYM */ + YYSYMBOL_DO_SYM = 422, /* DO_SYM */ + YYSYMBOL_DUMPFILE = 423, /* DUMPFILE */ + YYSYMBOL_DUPLICATE_SYM = 424, /* DUPLICATE_SYM */ + YYSYMBOL_DYNAMIC_SYM = 425, /* DYNAMIC_SYM */ + YYSYMBOL_ENABLE_SYM = 426, /* ENABLE_SYM */ + YYSYMBOL_END = 427, /* END */ + YYSYMBOL_ENDS_SYM = 428, /* ENDS_SYM */ + YYSYMBOL_ENGINES_SYM = 429, /* ENGINES_SYM */ + YYSYMBOL_ENGINE_SYM = 430, /* ENGINE_SYM */ + YYSYMBOL_ENUM = 431, /* ENUM */ + YYSYMBOL_ERROR_SYM = 432, /* ERROR_SYM */ + YYSYMBOL_ERRORS = 433, /* ERRORS */ + YYSYMBOL_ESCAPE_SYM = 434, /* ESCAPE_SYM */ + YYSYMBOL_EVENTS_SYM = 435, /* EVENTS_SYM */ + YYSYMBOL_EVENT_SYM = 436, /* EVENT_SYM */ + YYSYMBOL_EVERY_SYM = 437, /* EVERY_SYM */ + YYSYMBOL_EXCHANGE_SYM = 438, /* EXCHANGE_SYM */ + YYSYMBOL_EXAMINED_SYM = 439, /* EXAMINED_SYM */ + YYSYMBOL_EXCLUDE_SYM = 440, /* EXCLUDE_SYM */ + YYSYMBOL_EXECUTE_SYM = 441, /* EXECUTE_SYM */ + YYSYMBOL_EXCEPTION_MARIADB_SYM = 442, /* EXCEPTION_MARIADB_SYM */ + YYSYMBOL_EXIT_MARIADB_SYM = 443, /* EXIT_MARIADB_SYM */ + YYSYMBOL_EXIT_ORACLE_SYM = 444, /* EXIT_ORACLE_SYM */ + YYSYMBOL_EXPANSION_SYM = 445, /* EXPANSION_SYM */ + YYSYMBOL_EXPIRE_SYM = 446, /* EXPIRE_SYM */ + YYSYMBOL_EXPORT_SYM = 447, /* EXPORT_SYM */ + YYSYMBOL_EXTENDED_SYM = 448, /* EXTENDED_SYM */ + YYSYMBOL_EXTENT_SIZE_SYM = 449, /* EXTENT_SIZE_SYM */ + YYSYMBOL_FAST_SYM = 450, /* FAST_SYM */ + YYSYMBOL_FAULTS_SYM = 451, /* FAULTS_SYM */ + YYSYMBOL_FEDERATED_SYM = 452, /* FEDERATED_SYM */ + YYSYMBOL_FILE_SYM = 453, /* FILE_SYM */ + YYSYMBOL_FIRST_SYM = 454, /* FIRST_SYM */ + YYSYMBOL_FIXED_SYM = 455, /* FIXED_SYM */ + YYSYMBOL_FLUSH_SYM = 456, /* FLUSH_SYM */ + YYSYMBOL_FOLLOWS_SYM = 457, /* FOLLOWS_SYM */ + YYSYMBOL_FOLLOWING_SYM = 458, /* FOLLOWING_SYM */ + YYSYMBOL_FORCE_SYM = 459, /* FORCE_SYM */ + YYSYMBOL_FORMAT_SYM = 460, /* FORMAT_SYM */ + YYSYMBOL_FOUND_SYM = 461, /* FOUND_SYM */ + YYSYMBOL_FULL = 462, /* FULL */ + YYSYMBOL_FUNCTION_SYM = 463, /* FUNCTION_SYM */ + YYSYMBOL_GENERAL = 464, /* GENERAL */ + YYSYMBOL_GENERATED_SYM = 465, /* GENERATED_SYM */ + YYSYMBOL_GET_FORMAT = 466, /* GET_FORMAT */ + YYSYMBOL_GET_SYM = 467, /* GET_SYM */ + YYSYMBOL_GLOBAL_SYM = 468, /* GLOBAL_SYM */ + YYSYMBOL_GRANTS = 469, /* GRANTS */ + YYSYMBOL_HANDLER_SYM = 470, /* HANDLER_SYM */ + YYSYMBOL_HARD_SYM = 471, /* HARD_SYM */ + YYSYMBOL_HASH_SYM = 472, /* HASH_SYM */ + YYSYMBOL_HELP_SYM = 473, /* HELP_SYM */ + YYSYMBOL_HIGH_PRIORITY = 474, /* HIGH_PRIORITY */ + YYSYMBOL_HISTORY_SYM = 475, /* HISTORY_SYM */ + YYSYMBOL_HOST_SYM = 476, /* HOST_SYM */ + YYSYMBOL_HOSTS_SYM = 477, /* HOSTS_SYM */ + YYSYMBOL_HOUR_SYM = 478, /* HOUR_SYM */ + YYSYMBOL_ID_SYM = 479, /* ID_SYM */ + YYSYMBOL_IDENTIFIED_SYM = 480, /* IDENTIFIED_SYM */ + YYSYMBOL_IGNORE_SERVER_IDS_SYM = 481, /* IGNORE_SERVER_IDS_SYM */ + YYSYMBOL_IMMEDIATE_SYM = 482, /* IMMEDIATE_SYM */ + YYSYMBOL_IMPORT = 483, /* IMPORT */ + YYSYMBOL_INCREMENT_SYM = 484, /* INCREMENT_SYM */ + YYSYMBOL_INDEXES = 485, /* INDEXES */ + YYSYMBOL_INITIAL_SIZE_SYM = 486, /* INITIAL_SIZE_SYM */ + YYSYMBOL_INSERT_METHOD = 487, /* INSERT_METHOD */ + YYSYMBOL_INSTALL_SYM = 488, /* INSTALL_SYM */ + YYSYMBOL_INVOKER_SYM = 489, /* INVOKER_SYM */ + YYSYMBOL_IO_SYM = 490, /* IO_SYM */ + YYSYMBOL_IPC_SYM = 491, /* IPC_SYM */ + YYSYMBOL_ISOLATION = 492, /* ISOLATION */ + YYSYMBOL_ISOPEN_SYM = 493, /* ISOPEN_SYM */ + YYSYMBOL_ISSUER_SYM = 494, /* ISSUER_SYM */ + YYSYMBOL_INVISIBLE_SYM = 495, /* INVISIBLE_SYM */ + YYSYMBOL_JSON_SYM = 496, /* JSON_SYM */ + YYSYMBOL_KEY_BLOCK_SIZE = 497, /* KEY_BLOCK_SIZE */ + YYSYMBOL_LANGUAGE_SYM = 498, /* LANGUAGE_SYM */ + YYSYMBOL_LAST_SYM = 499, /* LAST_SYM */ + YYSYMBOL_LAST_VALUE = 500, /* LAST_VALUE */ + YYSYMBOL_LASTVAL_SYM = 501, /* LASTVAL_SYM */ + YYSYMBOL_LEAVES = 502, /* LEAVES */ + YYSYMBOL_LESS_SYM = 503, /* LESS_SYM */ + YYSYMBOL_LEVEL_SYM = 504, /* LEVEL_SYM */ + YYSYMBOL_LIST_SYM = 505, /* LIST_SYM */ + YYSYMBOL_LOCAL_SYM = 506, /* LOCAL_SYM */ + YYSYMBOL_LOCKED_SYM = 507, /* LOCKED_SYM */ + YYSYMBOL_LOCKS_SYM = 508, /* LOCKS_SYM */ + YYSYMBOL_LOGFILE_SYM = 509, /* LOGFILE_SYM */ + YYSYMBOL_LOGS_SYM = 510, /* LOGS_SYM */ + YYSYMBOL_MASTER_CONNECT_RETRY_SYM = 511, /* MASTER_CONNECT_RETRY_SYM */ + YYSYMBOL_MASTER_DELAY_SYM = 512, /* MASTER_DELAY_SYM */ + YYSYMBOL_MASTER_GTID_POS_SYM = 513, /* MASTER_GTID_POS_SYM */ + YYSYMBOL_MASTER_HOST_SYM = 514, /* MASTER_HOST_SYM */ + YYSYMBOL_MASTER_LOG_FILE_SYM = 515, /* MASTER_LOG_FILE_SYM */ + YYSYMBOL_MASTER_LOG_POS_SYM = 516, /* MASTER_LOG_POS_SYM */ + YYSYMBOL_MASTER_PASSWORD_SYM = 517, /* MASTER_PASSWORD_SYM */ + YYSYMBOL_MASTER_PORT_SYM = 518, /* MASTER_PORT_SYM */ + YYSYMBOL_MASTER_SERVER_ID_SYM = 519, /* MASTER_SERVER_ID_SYM */ + YYSYMBOL_MASTER_SSL_CAPATH_SYM = 520, /* MASTER_SSL_CAPATH_SYM */ + YYSYMBOL_MASTER_SSL_CA_SYM = 521, /* MASTER_SSL_CA_SYM */ + YYSYMBOL_MASTER_SSL_CERT_SYM = 522, /* MASTER_SSL_CERT_SYM */ + YYSYMBOL_MASTER_SSL_CIPHER_SYM = 523, /* MASTER_SSL_CIPHER_SYM */ + YYSYMBOL_MASTER_SSL_CRL_SYM = 524, /* MASTER_SSL_CRL_SYM */ + YYSYMBOL_MASTER_SSL_CRLPATH_SYM = 525, /* MASTER_SSL_CRLPATH_SYM */ + YYSYMBOL_MASTER_SSL_KEY_SYM = 526, /* MASTER_SSL_KEY_SYM */ + YYSYMBOL_MASTER_SSL_SYM = 527, /* MASTER_SSL_SYM */ + YYSYMBOL_MASTER_SYM = 528, /* MASTER_SYM */ + YYSYMBOL_MASTER_USER_SYM = 529, /* MASTER_USER_SYM */ + YYSYMBOL_MASTER_USE_GTID_SYM = 530, /* MASTER_USE_GTID_SYM */ + YYSYMBOL_MASTER_HEARTBEAT_PERIOD_SYM = 531, /* MASTER_HEARTBEAT_PERIOD_SYM */ + YYSYMBOL_MASTER_DEMOTE_TO_SLAVE_SYM = 532, /* MASTER_DEMOTE_TO_SLAVE_SYM */ + YYSYMBOL_MAX_CONNECTIONS_PER_HOUR = 533, /* MAX_CONNECTIONS_PER_HOUR */ + YYSYMBOL_MAX_QUERIES_PER_HOUR = 534, /* MAX_QUERIES_PER_HOUR */ + YYSYMBOL_MAX_ROWS = 535, /* MAX_ROWS */ + YYSYMBOL_MAX_SIZE_SYM = 536, /* MAX_SIZE_SYM */ + YYSYMBOL_MAX_UPDATES_PER_HOUR = 537, /* MAX_UPDATES_PER_HOUR */ + YYSYMBOL_MAX_STATEMENT_TIME_SYM = 538, /* MAX_STATEMENT_TIME_SYM */ + YYSYMBOL_MAX_USER_CONNECTIONS_SYM = 539, /* MAX_USER_CONNECTIONS_SYM */ + YYSYMBOL_MEDIUM_SYM = 540, /* MEDIUM_SYM */ + YYSYMBOL_MEMORY_SYM = 541, /* MEMORY_SYM */ + YYSYMBOL_MERGE_SYM = 542, /* MERGE_SYM */ + YYSYMBOL_MESSAGE_TEXT_SYM = 543, /* MESSAGE_TEXT_SYM */ + YYSYMBOL_MICROSECOND_SYM = 544, /* MICROSECOND_SYM */ + YYSYMBOL_MIGRATE_SYM = 545, /* MIGRATE_SYM */ + YYSYMBOL_MINUTE_SYM = 546, /* MINUTE_SYM */ + YYSYMBOL_MINVALUE_SYM = 547, /* MINVALUE_SYM */ + YYSYMBOL_MIN_ROWS = 548, /* MIN_ROWS */ + YYSYMBOL_MODE_SYM = 549, /* MODE_SYM */ + YYSYMBOL_MODIFY_SYM = 550, /* MODIFY_SYM */ + YYSYMBOL_MONITOR_SYM = 551, /* MONITOR_SYM */ + YYSYMBOL_MONTH_SYM = 552, /* MONTH_SYM */ + YYSYMBOL_MUTEX_SYM = 553, /* MUTEX_SYM */ + YYSYMBOL_MYSQL_SYM = 554, /* MYSQL_SYM */ + YYSYMBOL_MYSQL_ERRNO_SYM = 555, /* MYSQL_ERRNO_SYM */ + YYSYMBOL_NAMES_SYM = 556, /* NAMES_SYM */ + YYSYMBOL_NAME_SYM = 557, /* NAME_SYM */ + YYSYMBOL_NATIONAL_SYM = 558, /* NATIONAL_SYM */ + YYSYMBOL_NCHAR_SYM = 559, /* NCHAR_SYM */ + YYSYMBOL_NEVER_SYM = 560, /* NEVER_SYM */ + YYSYMBOL_NEXT_SYM = 561, /* NEXT_SYM */ + YYSYMBOL_NEXTVAL_SYM = 562, /* NEXTVAL_SYM */ + YYSYMBOL_NOCACHE_SYM = 563, /* NOCACHE_SYM */ + YYSYMBOL_NOCYCLE_SYM = 564, /* NOCYCLE_SYM */ + YYSYMBOL_NODEGROUP_SYM = 565, /* NODEGROUP_SYM */ + YYSYMBOL_NONE_SYM = 566, /* NONE_SYM */ + YYSYMBOL_NOTFOUND_SYM = 567, /* NOTFOUND_SYM */ + YYSYMBOL_NO_SYM = 568, /* NO_SYM */ + YYSYMBOL_NOMAXVALUE_SYM = 569, /* NOMAXVALUE_SYM */ + YYSYMBOL_NOMINVALUE_SYM = 570, /* NOMINVALUE_SYM */ + YYSYMBOL_NO_WAIT_SYM = 571, /* NO_WAIT_SYM */ + YYSYMBOL_NOWAIT_SYM = 572, /* NOWAIT_SYM */ + YYSYMBOL_NUMBER_MARIADB_SYM = 573, /* NUMBER_MARIADB_SYM */ + YYSYMBOL_NUMBER_ORACLE_SYM = 574, /* NUMBER_ORACLE_SYM */ + YYSYMBOL_NVARCHAR_SYM = 575, /* NVARCHAR_SYM */ + YYSYMBOL_OF_SYM = 576, /* OF_SYM */ + YYSYMBOL_OFFSET_SYM = 577, /* OFFSET_SYM */ + YYSYMBOL_OLD_PASSWORD_SYM = 578, /* OLD_PASSWORD_SYM */ + YYSYMBOL_ONE_SYM = 579, /* ONE_SYM */ + YYSYMBOL_ONLY_SYM = 580, /* ONLY_SYM */ + YYSYMBOL_ONLINE_SYM = 581, /* ONLINE_SYM */ + YYSYMBOL_OPEN_SYM = 582, /* OPEN_SYM */ + YYSYMBOL_OPTIONS_SYM = 583, /* OPTIONS_SYM */ + YYSYMBOL_OPTION = 584, /* OPTION */ + YYSYMBOL_OVERLAPS_SYM = 585, /* OVERLAPS_SYM */ + YYSYMBOL_OWNER_SYM = 586, /* OWNER_SYM */ + YYSYMBOL_PACK_KEYS_SYM = 587, /* PACK_KEYS_SYM */ + YYSYMBOL_PAGE_SYM = 588, /* PAGE_SYM */ + YYSYMBOL_PARSER_SYM = 589, /* PARSER_SYM */ + YYSYMBOL_PARTIAL = 590, /* PARTIAL */ + YYSYMBOL_PARTITIONS_SYM = 591, /* PARTITIONS_SYM */ + YYSYMBOL_PARTITIONING_SYM = 592, /* PARTITIONING_SYM */ + YYSYMBOL_PASSWORD_SYM = 593, /* PASSWORD_SYM */ + YYSYMBOL_PERIOD_SYM = 594, /* PERIOD_SYM */ + YYSYMBOL_PERSISTENT_SYM = 595, /* PERSISTENT_SYM */ + YYSYMBOL_PHASE_SYM = 596, /* PHASE_SYM */ + YYSYMBOL_PLUGINS_SYM = 597, /* PLUGINS_SYM */ + YYSYMBOL_PLUGIN_SYM = 598, /* PLUGIN_SYM */ + YYSYMBOL_PORT_SYM = 599, /* PORT_SYM */ + YYSYMBOL_PRECEDES_SYM = 600, /* PRECEDES_SYM */ + YYSYMBOL_PRECEDING_SYM = 601, /* PRECEDING_SYM */ + YYSYMBOL_PREPARE_SYM = 602, /* PREPARE_SYM */ + YYSYMBOL_PRESERVE_SYM = 603, /* PRESERVE_SYM */ + YYSYMBOL_PREV_SYM = 604, /* PREV_SYM */ + YYSYMBOL_PREVIOUS_SYM = 605, /* PREVIOUS_SYM */ + YYSYMBOL_PRIVILEGES = 606, /* PRIVILEGES */ + YYSYMBOL_PROCESS = 607, /* PROCESS */ + YYSYMBOL_PROCESSLIST_SYM = 608, /* PROCESSLIST_SYM */ + YYSYMBOL_PROFILE_SYM = 609, /* PROFILE_SYM */ + YYSYMBOL_PROFILES_SYM = 610, /* PROFILES_SYM */ + YYSYMBOL_PROXY_SYM = 611, /* PROXY_SYM */ + YYSYMBOL_QUARTER_SYM = 612, /* QUARTER_SYM */ + YYSYMBOL_QUERY_SYM = 613, /* QUERY_SYM */ + YYSYMBOL_QUICK = 614, /* QUICK */ + YYSYMBOL_RAW_MARIADB_SYM = 615, /* RAW_MARIADB_SYM */ + YYSYMBOL_RAW_ORACLE_SYM = 616, /* RAW_ORACLE_SYM */ + YYSYMBOL_READ_ONLY_SYM = 617, /* READ_ONLY_SYM */ + YYSYMBOL_REBUILD_SYM = 618, /* REBUILD_SYM */ + YYSYMBOL_RECOVER_SYM = 619, /* RECOVER_SYM */ + YYSYMBOL_REDOFILE_SYM = 620, /* REDOFILE_SYM */ + YYSYMBOL_REDO_BUFFER_SIZE_SYM = 621, /* REDO_BUFFER_SIZE_SYM */ + YYSYMBOL_REDUNDANT_SYM = 622, /* REDUNDANT_SYM */ + YYSYMBOL_RELAY = 623, /* RELAY */ + YYSYMBOL_RELAYLOG_SYM = 624, /* RELAYLOG_SYM */ + YYSYMBOL_RELAY_LOG_FILE_SYM = 625, /* RELAY_LOG_FILE_SYM */ + YYSYMBOL_RELAY_LOG_POS_SYM = 626, /* RELAY_LOG_POS_SYM */ + YYSYMBOL_RELAY_THREAD = 627, /* RELAY_THREAD */ + YYSYMBOL_RELOAD = 628, /* RELOAD */ + YYSYMBOL_REMOVE_SYM = 629, /* REMOVE_SYM */ + YYSYMBOL_REORGANIZE_SYM = 630, /* REORGANIZE_SYM */ + YYSYMBOL_REPAIR = 631, /* REPAIR */ + YYSYMBOL_REPEATABLE_SYM = 632, /* REPEATABLE_SYM */ + YYSYMBOL_REPLAY_SYM = 633, /* REPLAY_SYM */ + YYSYMBOL_REPLICATION = 634, /* REPLICATION */ + YYSYMBOL_RESET_SYM = 635, /* RESET_SYM */ + YYSYMBOL_RESTART_SYM = 636, /* RESTART_SYM */ + YYSYMBOL_RESOURCES = 637, /* RESOURCES */ + YYSYMBOL_RESTORE_SYM = 638, /* RESTORE_SYM */ + YYSYMBOL_RESUME_SYM = 639, /* RESUME_SYM */ + YYSYMBOL_RETURNED_SQLSTATE_SYM = 640, /* RETURNED_SQLSTATE_SYM */ + YYSYMBOL_RETURNS_SYM = 641, /* RETURNS_SYM */ + YYSYMBOL_REUSE_SYM = 642, /* REUSE_SYM */ + YYSYMBOL_REVERSE_SYM = 643, /* REVERSE_SYM */ + YYSYMBOL_ROLE_SYM = 644, /* ROLE_SYM */ + YYSYMBOL_ROLLBACK_SYM = 645, /* ROLLBACK_SYM */ + YYSYMBOL_ROLLUP_SYM = 646, /* ROLLUP_SYM */ + YYSYMBOL_ROUTINE_SYM = 647, /* ROUTINE_SYM */ + YYSYMBOL_ROWCOUNT_SYM = 648, /* ROWCOUNT_SYM */ + YYSYMBOL_ROW_SYM = 649, /* ROW_SYM */ + YYSYMBOL_ROW_COUNT_SYM = 650, /* ROW_COUNT_SYM */ + YYSYMBOL_ROW_FORMAT_SYM = 651, /* ROW_FORMAT_SYM */ + YYSYMBOL_RTREE_SYM = 652, /* RTREE_SYM */ + YYSYMBOL_SAVEPOINT_SYM = 653, /* SAVEPOINT_SYM */ + YYSYMBOL_SCHEDULE_SYM = 654, /* SCHEDULE_SYM */ + YYSYMBOL_SCHEMA_NAME_SYM = 655, /* SCHEMA_NAME_SYM */ + YYSYMBOL_SECOND_SYM = 656, /* SECOND_SYM */ + YYSYMBOL_SECURITY_SYM = 657, /* SECURITY_SYM */ + YYSYMBOL_SEQUENCE_SYM = 658, /* SEQUENCE_SYM */ + YYSYMBOL_SERIALIZABLE_SYM = 659, /* SERIALIZABLE_SYM */ + YYSYMBOL_SERIAL_SYM = 660, /* SERIAL_SYM */ + YYSYMBOL_SESSION_SYM = 661, /* SESSION_SYM */ + YYSYMBOL_SERVER_SYM = 662, /* SERVER_SYM */ + YYSYMBOL_SETVAL_SYM = 663, /* SETVAL_SYM */ + YYSYMBOL_SHARE_SYM = 664, /* SHARE_SYM */ + YYSYMBOL_SHUTDOWN = 665, /* SHUTDOWN */ + YYSYMBOL_SIGNED_SYM = 666, /* SIGNED_SYM */ + YYSYMBOL_SIMPLE_SYM = 667, /* SIMPLE_SYM */ + YYSYMBOL_SKIP_SYM = 668, /* SKIP_SYM */ + YYSYMBOL_SLAVE = 669, /* SLAVE */ + YYSYMBOL_SLAVES = 670, /* SLAVES */ + YYSYMBOL_SLAVE_POS_SYM = 671, /* SLAVE_POS_SYM */ + YYSYMBOL_SLOW = 672, /* SLOW */ + YYSYMBOL_SNAPSHOT_SYM = 673, /* SNAPSHOT_SYM */ + YYSYMBOL_SOCKET_SYM = 674, /* SOCKET_SYM */ + YYSYMBOL_SOFT_SYM = 675, /* SOFT_SYM */ + YYSYMBOL_SONAME_SYM = 676, /* SONAME_SYM */ + YYSYMBOL_SOUNDS_SYM = 677, /* SOUNDS_SYM */ + YYSYMBOL_SOURCE_SYM = 678, /* SOURCE_SYM */ + YYSYMBOL_SQL_BUFFER_RESULT = 679, /* SQL_BUFFER_RESULT */ + YYSYMBOL_SQL_CACHE_SYM = 680, /* SQL_CACHE_SYM */ + YYSYMBOL_SQL_CALC_FOUND_ROWS = 681, /* SQL_CALC_FOUND_ROWS */ + YYSYMBOL_SQL_NO_CACHE_SYM = 682, /* SQL_NO_CACHE_SYM */ + YYSYMBOL_SQL_THREAD = 683, /* SQL_THREAD */ + YYSYMBOL_STAGE_SYM = 684, /* STAGE_SYM */ + YYSYMBOL_STARTS_SYM = 685, /* STARTS_SYM */ + YYSYMBOL_START_SYM = 686, /* START_SYM */ + YYSYMBOL_STATEMENT_SYM = 687, /* STATEMENT_SYM */ + YYSYMBOL_STATUS_SYM = 688, /* STATUS_SYM */ + YYSYMBOL_STOP_SYM = 689, /* STOP_SYM */ + YYSYMBOL_STORAGE_SYM = 690, /* STORAGE_SYM */ + YYSYMBOL_STORED_SYM = 691, /* STORED_SYM */ + YYSYMBOL_STRING_SYM = 692, /* STRING_SYM */ + YYSYMBOL_SUBCLASS_ORIGIN_SYM = 693, /* SUBCLASS_ORIGIN_SYM */ + YYSYMBOL_SUBDATE_SYM = 694, /* SUBDATE_SYM */ + YYSYMBOL_SUBJECT_SYM = 695, /* SUBJECT_SYM */ + YYSYMBOL_SUBPARTITIONS_SYM = 696, /* SUBPARTITIONS_SYM */ + YYSYMBOL_SUBPARTITION_SYM = 697, /* SUBPARTITION_SYM */ + YYSYMBOL_SUPER_SYM = 698, /* SUPER_SYM */ + YYSYMBOL_SUSPEND_SYM = 699, /* SUSPEND_SYM */ + YYSYMBOL_SWAPS_SYM = 700, /* SWAPS_SYM */ + YYSYMBOL_SWITCHES_SYM = 701, /* SWITCHES_SYM */ + YYSYMBOL_SYSTEM = 702, /* SYSTEM */ + YYSYMBOL_SYSTEM_TIME_SYM = 703, /* SYSTEM_TIME_SYM */ + YYSYMBOL_TABLES = 704, /* TABLES */ + YYSYMBOL_TABLESPACE = 705, /* TABLESPACE */ + YYSYMBOL_TABLE_CHECKSUM_SYM = 706, /* TABLE_CHECKSUM_SYM */ + YYSYMBOL_TABLE_NAME_SYM = 707, /* TABLE_NAME_SYM */ + YYSYMBOL_TEMPORARY = 708, /* TEMPORARY */ + YYSYMBOL_TEMPTABLE_SYM = 709, /* TEMPTABLE_SYM */ + YYSYMBOL_TEXT_SYM = 710, /* TEXT_SYM */ + YYSYMBOL_THAN_SYM = 711, /* THAN_SYM */ + YYSYMBOL_TIES_SYM = 712, /* TIES_SYM */ + YYSYMBOL_TIMESTAMP = 713, /* TIMESTAMP */ + YYSYMBOL_TIMESTAMP_ADD = 714, /* TIMESTAMP_ADD */ + YYSYMBOL_TIMESTAMP_DIFF = 715, /* TIMESTAMP_DIFF */ + YYSYMBOL_TIME_SYM = 716, /* TIME_SYM */ + YYSYMBOL_TRANSACTION_SYM = 717, /* TRANSACTION_SYM */ + YYSYMBOL_TRANSACTIONAL_SYM = 718, /* TRANSACTIONAL_SYM */ + YYSYMBOL_THREADS_SYM = 719, /* THREADS_SYM */ + YYSYMBOL_TRIGGERS_SYM = 720, /* TRIGGERS_SYM */ + YYSYMBOL_TRIM_ORACLE = 721, /* TRIM_ORACLE */ + YYSYMBOL_TRUNCATE_SYM = 722, /* TRUNCATE_SYM */ + YYSYMBOL_TYPE_SYM = 723, /* TYPE_SYM */ + YYSYMBOL_UDF_RETURNS_SYM = 724, /* UDF_RETURNS_SYM */ + YYSYMBOL_UNBOUNDED_SYM = 725, /* UNBOUNDED_SYM */ + YYSYMBOL_UNCOMMITTED_SYM = 726, /* UNCOMMITTED_SYM */ + YYSYMBOL_UNDEFINED_SYM = 727, /* UNDEFINED_SYM */ + YYSYMBOL_UNDOFILE_SYM = 728, /* UNDOFILE_SYM */ + YYSYMBOL_UNDO_BUFFER_SIZE_SYM = 729, /* UNDO_BUFFER_SIZE_SYM */ + YYSYMBOL_UNICODE_SYM = 730, /* UNICODE_SYM */ + YYSYMBOL_UNINSTALL_SYM = 731, /* UNINSTALL_SYM */ + YYSYMBOL_UNKNOWN_SYM = 732, /* UNKNOWN_SYM */ + YYSYMBOL_UNTIL_SYM = 733, /* UNTIL_SYM */ + YYSYMBOL_UPGRADE_SYM = 734, /* UPGRADE_SYM */ + YYSYMBOL_USER_SYM = 735, /* USER_SYM */ + YYSYMBOL_USE_FRM = 736, /* USE_FRM */ + YYSYMBOL_VALUE_SYM = 737, /* VALUE_SYM */ + YYSYMBOL_VARCHAR2_MARIADB_SYM = 738, /* VARCHAR2_MARIADB_SYM */ + YYSYMBOL_VARCHAR2_ORACLE_SYM = 739, /* VARCHAR2_ORACLE_SYM */ + YYSYMBOL_VARIABLES = 740, /* VARIABLES */ + YYSYMBOL_VERSIONING_SYM = 741, /* VERSIONING_SYM */ + YYSYMBOL_VIA_SYM = 742, /* VIA_SYM */ + YYSYMBOL_VIEW_SYM = 743, /* VIEW_SYM */ + YYSYMBOL_VISIBLE_SYM = 744, /* VISIBLE_SYM */ + YYSYMBOL_VIRTUAL_SYM = 745, /* VIRTUAL_SYM */ + YYSYMBOL_WAIT_SYM = 746, /* WAIT_SYM */ + YYSYMBOL_WARNINGS = 747, /* WARNINGS */ + YYSYMBOL_WEEK_SYM = 748, /* WEEK_SYM */ + YYSYMBOL_WEIGHT_STRING_SYM = 749, /* WEIGHT_STRING_SYM */ + YYSYMBOL_WINDOW_SYM = 750, /* WINDOW_SYM */ + YYSYMBOL_WITHIN = 751, /* WITHIN */ + YYSYMBOL_WITHOUT = 752, /* WITHOUT */ + YYSYMBOL_WORK_SYM = 753, /* WORK_SYM */ + YYSYMBOL_WRAPPER_SYM = 754, /* WRAPPER_SYM */ + YYSYMBOL_WRITE_SYM = 755, /* WRITE_SYM */ + YYSYMBOL_X509_SYM = 756, /* X509_SYM */ + YYSYMBOL_XA_SYM = 757, /* XA_SYM */ + YYSYMBOL_XML_SYM = 758, /* XML_SYM */ + YYSYMBOL_YEAR_SYM = 759, /* YEAR_SYM */ + YYSYMBOL_CONDITIONLESS_JOIN = 760, /* CONDITIONLESS_JOIN */ + YYSYMBOL_ON_SYM = 761, /* ON_SYM */ + YYSYMBOL_PREC_BELOW_NOT = 762, /* PREC_BELOW_NOT */ + YYSYMBOL_763_ = 763, /* '=' */ + YYSYMBOL_764_ = 764, /* '>' */ + YYSYMBOL_765_ = 765, /* '<' */ + YYSYMBOL_766_ = 766, /* '|' */ + YYSYMBOL_767_ = 767, /* '&' */ + YYSYMBOL_768_ = 768, /* '-' */ + YYSYMBOL_769_ = 769, /* '+' */ + YYSYMBOL_770_ = 770, /* '*' */ + YYSYMBOL_771_ = 771, /* '/' */ + YYSYMBOL_772_ = 772, /* '%' */ + YYSYMBOL_773_ = 773, /* '^' */ + YYSYMBOL_774_ = 774, /* '~' */ + YYSYMBOL_SUBQUERY_AS_EXPR = 775, /* SUBQUERY_AS_EXPR */ + YYSYMBOL_PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE = 776, /* PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE */ + YYSYMBOL_USER = 777, /* USER */ + YYSYMBOL_PREC_BELOW_CONTRACTION_TOKEN2 = 778, /* PREC_BELOW_CONTRACTION_TOKEN2 */ + YYSYMBOL_779_ = 779, /* '(' */ + YYSYMBOL_780_ = 780, /* ')' */ + YYSYMBOL_EMPTY_FROM_CLAUSE = 781, /* EMPTY_FROM_CLAUSE */ + YYSYMBOL_782_ = 782, /* ',' */ + YYSYMBOL_783_ = 783, /* '!' */ + YYSYMBOL_784_ = 784, /* '{' */ + YYSYMBOL_785_ = 785, /* '}' */ + YYSYMBOL_786_ = 786, /* ';' */ + YYSYMBOL_787_ = 787, /* '.' */ + YYSYMBOL_YYACCEPT = 788, /* $accept */ + YYSYMBOL_query = 789, /* query */ + YYSYMBOL_790_1 = 790, /* $@1 */ + YYSYMBOL_opt_end_of_input = 791, /* opt_end_of_input */ + YYSYMBOL_directly_executable_statement = 792, /* directly_executable_statement */ + YYSYMBOL_verb_clause = 793, /* verb_clause */ + YYSYMBOL_deallocate = 794, /* deallocate */ + YYSYMBOL_deallocate_or_drop = 795, /* deallocate_or_drop */ + YYSYMBOL_prepare = 796, /* prepare */ + YYSYMBOL_797_2 = 797, /* $@2 */ + YYSYMBOL_execute = 798, /* execute */ + YYSYMBOL_799_3 = 799, /* $@3 */ + YYSYMBOL_800_4 = 800, /* $@4 */ + YYSYMBOL_execute_using = 801, /* execute_using */ + YYSYMBOL_802_5 = 802, /* $@5 */ + YYSYMBOL_execute_params = 803, /* execute_params */ + YYSYMBOL_help = 804, /* help */ + YYSYMBOL_805_6 = 805, /* $@6 */ + YYSYMBOL_change = 806, /* change */ + YYSYMBOL_807_7 = 807, /* $@7 */ + YYSYMBOL_master_defs = 808, /* master_defs */ + YYSYMBOL_master_def = 809, /* master_def */ + YYSYMBOL_ignore_server_id_list = 810, /* ignore_server_id_list */ + YYSYMBOL_ignore_server_id = 811, /* ignore_server_id */ + YYSYMBOL_do_domain_id_list = 812, /* do_domain_id_list */ + YYSYMBOL_do_domain_id = 813, /* do_domain_id */ + YYSYMBOL_ignore_domain_id_list = 814, /* ignore_domain_id_list */ + YYSYMBOL_ignore_domain_id = 815, /* ignore_domain_id */ + YYSYMBOL_master_file_def = 816, /* master_file_def */ + YYSYMBOL_optional_connection_name = 817, /* optional_connection_name */ + YYSYMBOL_connection_name = 818, /* connection_name */ + YYSYMBOL_optional_for_channel = 819, /* optional_for_channel */ + YYSYMBOL_for_channel = 820, /* for_channel */ + YYSYMBOL_create = 821, /* create */ + YYSYMBOL_822_8 = 822, /* $@8 */ + YYSYMBOL_823_9 = 823, /* $@9 */ + YYSYMBOL_824_10 = 824, /* $@10 */ + YYSYMBOL_825_11 = 825, /* $@11 */ + YYSYMBOL_826_12 = 826, /* $@12 */ + YYSYMBOL_827_13 = 827, /* $@13 */ + YYSYMBOL_828_14 = 828, /* $@14 */ + YYSYMBOL_829_15 = 829, /* $@15 */ + YYSYMBOL_830_16 = 830, /* $@16 */ + YYSYMBOL_831_17 = 831, /* $@17 */ + YYSYMBOL_832_18 = 832, /* $@18 */ + YYSYMBOL_833_19 = 833, /* $@19 */ + YYSYMBOL_834_20 = 834, /* $@20 */ + YYSYMBOL_835_21 = 835, /* $@21 */ + YYSYMBOL_836_22 = 836, /* $@22 */ + YYSYMBOL_837_23 = 837, /* $@23 */ + YYSYMBOL_838_24 = 838, /* $@24 */ + YYSYMBOL_opt_sequence = 839, /* opt_sequence */ + YYSYMBOL_sequence_defs = 840, /* sequence_defs */ + YYSYMBOL_sequence_def = 841, /* sequence_def */ + YYSYMBOL_force_lookahead = 842, /* force_lookahead */ + YYSYMBOL_server_def = 843, /* server_def */ + YYSYMBOL_844_25 = 844, /* $@25 */ + YYSYMBOL_server_options_list = 845, /* server_options_list */ + YYSYMBOL_server_option = 846, /* server_option */ + YYSYMBOL_event_tail = 847, /* event_tail */ + YYSYMBOL_848_26 = 848, /* $@26 */ + YYSYMBOL_ev_schedule_time = 849, /* ev_schedule_time */ + YYSYMBOL_850_27 = 850, /* $@27 */ + YYSYMBOL_opt_ev_status = 851, /* opt_ev_status */ + YYSYMBOL_ev_starts = 852, /* ev_starts */ + YYSYMBOL_ev_ends = 853, /* ev_ends */ + YYSYMBOL_opt_ev_on_completion = 854, /* opt_ev_on_completion */ + YYSYMBOL_ev_on_completion = 855, /* ev_on_completion */ + YYSYMBOL_opt_ev_comment = 856, /* opt_ev_comment */ + YYSYMBOL_ev_sql_stmt = 857, /* ev_sql_stmt */ + YYSYMBOL_858_28 = 858, /* $@28 */ + YYSYMBOL_clear_privileges = 859, /* clear_privileges */ + YYSYMBOL_opt_aggregate = 860, /* opt_aggregate */ + YYSYMBOL_sp_handler = 861, /* sp_handler */ + YYSYMBOL_sp_name = 862, /* sp_name */ + YYSYMBOL_sp_a_chistics = 863, /* sp_a_chistics */ + YYSYMBOL_sp_c_chistics = 864, /* sp_c_chistics */ + YYSYMBOL_sp_chistic = 865, /* sp_chistic */ + YYSYMBOL_sp_c_chistic = 866, /* sp_c_chistic */ + YYSYMBOL_sp_suid = 867, /* sp_suid */ + YYSYMBOL_call = 868, /* call */ + YYSYMBOL_869_29 = 869, /* $@29 */ + YYSYMBOL_870_30 = 870, /* $@30 */ + YYSYMBOL_871_31 = 871, /* $@31 */ + YYSYMBOL_opt_sp_cparam_list = 872, /* opt_sp_cparam_list */ + YYSYMBOL_opt_sp_cparams = 873, /* opt_sp_cparams */ + YYSYMBOL_sp_cparams = 874, /* sp_cparams */ + YYSYMBOL_sp_fdparam_list = 875, /* sp_fdparam_list */ + YYSYMBOL_876_32 = 876, /* $@32 */ + YYSYMBOL_sp_fdparams = 877, /* sp_fdparams */ + YYSYMBOL_sp_param_name = 878, /* sp_param_name */ + YYSYMBOL_sp_pdparam_list = 879, /* sp_pdparam_list */ + YYSYMBOL_sp_pdparams = 880, /* sp_pdparams */ + YYSYMBOL_sp_parameter_type = 881, /* sp_parameter_type */ + YYSYMBOL_sp_parenthesized_pdparam_list = 882, /* sp_parenthesized_pdparam_list */ + YYSYMBOL_883_33 = 883, /* $@33 */ + YYSYMBOL_sp_parenthesized_fdparam_list = 884, /* sp_parenthesized_fdparam_list */ + YYSYMBOL_sp_proc_stmts = 885, /* sp_proc_stmts */ + YYSYMBOL_sp_proc_stmts1 = 886, /* sp_proc_stmts1 */ + YYSYMBOL_optionally_qualified_column_ident = 887, /* optionally_qualified_column_ident */ + YYSYMBOL_row_field_definition = 888, /* row_field_definition */ + YYSYMBOL_row_field_definition_list = 889, /* row_field_definition_list */ + YYSYMBOL_row_type_body = 890, /* row_type_body */ + YYSYMBOL_sp_decl_idents_init_vars = 891, /* sp_decl_idents_init_vars */ + YYSYMBOL_sp_decl_variable_list = 892, /* sp_decl_variable_list */ + YYSYMBOL_893_34 = 893, /* $@34 */ + YYSYMBOL_sp_decl_handler = 894, /* sp_decl_handler */ + YYSYMBOL_895_35 = 895, /* $@35 */ + YYSYMBOL_opt_parenthesized_cursor_formal_parameters = 896, /* opt_parenthesized_cursor_formal_parameters */ + YYSYMBOL_sp_cursor_stmt_lex = 897, /* sp_cursor_stmt_lex */ + YYSYMBOL_sp_cursor_stmt = 898, /* sp_cursor_stmt */ + YYSYMBOL_899_36 = 899, /* $@36 */ + YYSYMBOL_sp_handler_type = 900, /* sp_handler_type */ + YYSYMBOL_sp_hcond_list = 901, /* sp_hcond_list */ + YYSYMBOL_sp_hcond_element = 902, /* sp_hcond_element */ + YYSYMBOL_sp_cond = 903, /* sp_cond */ + YYSYMBOL_sqlstate = 904, /* sqlstate */ + YYSYMBOL_opt_value = 905, /* opt_value */ + YYSYMBOL_sp_hcond = 906, /* sp_hcond */ + YYSYMBOL_raise_stmt_oracle = 907, /* raise_stmt_oracle */ + YYSYMBOL_signal_stmt = 908, /* signal_stmt */ + YYSYMBOL_signal_value = 909, /* signal_value */ + YYSYMBOL_opt_signal_value = 910, /* opt_signal_value */ + YYSYMBOL_opt_set_signal_information = 911, /* opt_set_signal_information */ + YYSYMBOL_signal_information_item_list = 912, /* signal_information_item_list */ + YYSYMBOL_signal_allowed_expr = 913, /* signal_allowed_expr */ + YYSYMBOL_signal_condition_information_item_name = 914, /* signal_condition_information_item_name */ + YYSYMBOL_resignal_stmt = 915, /* resignal_stmt */ + YYSYMBOL_get_diagnostics = 916, /* get_diagnostics */ + YYSYMBOL_which_area = 917, /* which_area */ + YYSYMBOL_diagnostics_information = 918, /* diagnostics_information */ + YYSYMBOL_statement_information = 919, /* statement_information */ + YYSYMBOL_statement_information_item = 920, /* statement_information_item */ + YYSYMBOL_simple_target_specification = 921, /* simple_target_specification */ + YYSYMBOL_statement_information_item_name = 922, /* statement_information_item_name */ + YYSYMBOL_condition_number = 923, /* condition_number */ + YYSYMBOL_condition_information = 924, /* condition_information */ + YYSYMBOL_condition_information_item = 925, /* condition_information_item */ + YYSYMBOL_condition_information_item_name = 926, /* condition_information_item_name */ + YYSYMBOL_sp_decl_ident = 927, /* sp_decl_ident */ + YYSYMBOL_sp_decl_idents = 928, /* sp_decl_idents */ + YYSYMBOL_sp_proc_stmt_if = 929, /* sp_proc_stmt_if */ + YYSYMBOL_930_37 = 930, /* $@37 */ + YYSYMBOL_sp_proc_stmt_statement = 931, /* sp_proc_stmt_statement */ + YYSYMBOL_932_38 = 932, /* $@38 */ + YYSYMBOL_RETURN_ALLMODES_SYM = 933, /* RETURN_ALLMODES_SYM */ + YYSYMBOL_sp_proc_stmt_return = 934, /* sp_proc_stmt_return */ + YYSYMBOL_935_39 = 935, /* $@39 */ + YYSYMBOL_sp_proc_stmt_exit_oracle = 936, /* sp_proc_stmt_exit_oracle */ + YYSYMBOL_937_40 = 937, /* $@40 */ + YYSYMBOL_938_41 = 938, /* $@41 */ + YYSYMBOL_sp_proc_stmt_continue_oracle = 939, /* sp_proc_stmt_continue_oracle */ + YYSYMBOL_940_42 = 940, /* $@42 */ + YYSYMBOL_941_43 = 941, /* $@43 */ + YYSYMBOL_sp_proc_stmt_leave = 942, /* sp_proc_stmt_leave */ + YYSYMBOL_sp_proc_stmt_iterate = 943, /* sp_proc_stmt_iterate */ + YYSYMBOL_sp_proc_stmt_goto_oracle = 944, /* sp_proc_stmt_goto_oracle */ + YYSYMBOL_expr_lex = 945, /* expr_lex */ + YYSYMBOL_946_44 = 946, /* @44 */ + YYSYMBOL_assignment_source_lex = 947, /* assignment_source_lex */ + YYSYMBOL_assignment_source_expr = 948, /* assignment_source_expr */ + YYSYMBOL_949_45 = 949, /* $@45 */ + YYSYMBOL_for_loop_bound_expr = 950, /* for_loop_bound_expr */ + YYSYMBOL_951_46 = 951, /* $@46 */ + YYSYMBOL_cursor_actual_parameters = 952, /* cursor_actual_parameters */ + YYSYMBOL_opt_parenthesized_cursor_actual_parameters = 953, /* opt_parenthesized_cursor_actual_parameters */ + YYSYMBOL_sp_proc_stmt_with_cursor = 954, /* sp_proc_stmt_with_cursor */ + YYSYMBOL_sp_proc_stmt_open = 955, /* sp_proc_stmt_open */ + YYSYMBOL_sp_proc_stmt_fetch_head = 956, /* sp_proc_stmt_fetch_head */ + YYSYMBOL_sp_proc_stmt_fetch = 957, /* sp_proc_stmt_fetch */ + YYSYMBOL_sp_proc_stmt_close = 958, /* sp_proc_stmt_close */ + YYSYMBOL_sp_fetch_list = 959, /* sp_fetch_list */ + YYSYMBOL_sp_if = 960, /* sp_if */ + YYSYMBOL_961_47 = 961, /* $@47 */ + YYSYMBOL_962_48 = 962, /* $@48 */ + YYSYMBOL_sp_elseifs = 963, /* sp_elseifs */ + YYSYMBOL_case_stmt_specification = 964, /* case_stmt_specification */ + YYSYMBOL_965_49 = 965, /* $@49 */ + YYSYMBOL_case_stmt_body = 966, /* case_stmt_body */ + YYSYMBOL_967_50 = 967, /* $@50 */ + YYSYMBOL_simple_when_clause_list = 968, /* simple_when_clause_list */ + YYSYMBOL_searched_when_clause_list = 969, /* searched_when_clause_list */ + YYSYMBOL_simple_when_clause = 970, /* simple_when_clause */ + YYSYMBOL_971_51 = 971, /* $@51 */ + YYSYMBOL_searched_when_clause = 972, /* searched_when_clause */ + YYSYMBOL_973_52 = 973, /* $@52 */ + YYSYMBOL_else_clause_opt = 974, /* else_clause_opt */ + YYSYMBOL_sp_opt_label = 975, /* sp_opt_label */ + YYSYMBOL_opt_sp_for_loop_direction = 976, /* opt_sp_for_loop_direction */ + YYSYMBOL_sp_for_loop_index_and_bounds = 977, /* sp_for_loop_index_and_bounds */ + YYSYMBOL_sp_for_loop_bounds = 978, /* sp_for_loop_bounds */ + YYSYMBOL_loop_body = 979, /* loop_body */ + YYSYMBOL_repeat_body = 980, /* repeat_body */ + YYSYMBOL_pop_sp_loop_label = 981, /* pop_sp_loop_label */ + YYSYMBOL_sp_labeled_control = 982, /* sp_labeled_control */ + YYSYMBOL_983_53 = 983, /* $@53 */ + YYSYMBOL_984_54 = 984, /* $@54 */ + YYSYMBOL_985_55 = 985, /* $@55 */ + YYSYMBOL_986_56 = 986, /* $@56 */ + YYSYMBOL_987_57 = 987, /* $@57 */ + YYSYMBOL_988_58 = 988, /* $@58 */ + YYSYMBOL_sp_unlabeled_control = 989, /* sp_unlabeled_control */ + YYSYMBOL_990_59 = 990, /* $@59 */ + YYSYMBOL_991_60 = 991, /* $@60 */ + YYSYMBOL_992_61 = 992, /* $@61 */ + YYSYMBOL_993_62 = 993, /* $@62 */ + YYSYMBOL_994_63 = 994, /* $@63 */ + YYSYMBOL_trg_action_time = 995, /* trg_action_time */ + YYSYMBOL_trg_event = 996, /* trg_event */ + YYSYMBOL_create_body = 997, /* create_body */ + YYSYMBOL_998_64 = 998, /* $@64 */ + YYSYMBOL_create_like = 999, /* create_like */ + YYSYMBOL_opt_create_select = 1000, /* opt_create_select */ + YYSYMBOL_create_select_query_expression = 1001, /* create_select_query_expression */ + YYSYMBOL_opt_create_partitioning = 1002, /* opt_create_partitioning */ + YYSYMBOL_opt_partitioning = 1003, /* opt_partitioning */ + YYSYMBOL_partitioning = 1004, /* partitioning */ + YYSYMBOL_1005_65 = 1005, /* $@65 */ + YYSYMBOL_have_partitioning = 1006, /* have_partitioning */ + YYSYMBOL_partition_entry = 1007, /* partition_entry */ + YYSYMBOL_1008_66 = 1008, /* $@66 */ + YYSYMBOL_partition = 1009, /* partition */ + YYSYMBOL_1010_67 = 1010, /* $@67 */ + YYSYMBOL_part_type_def = 1011, /* part_type_def */ + YYSYMBOL_1012_68 = 1012, /* $@68 */ + YYSYMBOL_1013_69 = 1013, /* $@69 */ + YYSYMBOL_1014_70 = 1014, /* $@70 */ + YYSYMBOL_opt_linear = 1015, /* opt_linear */ + YYSYMBOL_opt_key_algo = 1016, /* opt_key_algo */ + YYSYMBOL_part_field_list = 1017, /* part_field_list */ + YYSYMBOL_part_field_item_list = 1018, /* part_field_item_list */ + YYSYMBOL_part_field_item = 1019, /* part_field_item */ + YYSYMBOL_part_column_list = 1020, /* part_column_list */ + YYSYMBOL_part_func = 1021, /* part_func */ + YYSYMBOL_sub_part_func = 1022, /* sub_part_func */ + YYSYMBOL_opt_num_parts = 1023, /* opt_num_parts */ + YYSYMBOL_opt_sub_part = 1024, /* opt_sub_part */ + YYSYMBOL_1025_71 = 1025, /* $@71 */ + YYSYMBOL_1026_72 = 1026, /* $@72 */ + YYSYMBOL_sub_part_field_list = 1027, /* sub_part_field_list */ + YYSYMBOL_sub_part_field_item = 1028, /* sub_part_field_item */ + YYSYMBOL_part_func_expr = 1029, /* part_func_expr */ + YYSYMBOL_opt_num_subparts = 1030, /* opt_num_subparts */ + YYSYMBOL_part_defs = 1031, /* part_defs */ + YYSYMBOL_part_def_list = 1032, /* part_def_list */ + YYSYMBOL_opt_partition = 1033, /* opt_partition */ + YYSYMBOL_part_definition = 1034, /* part_definition */ + YYSYMBOL_1035_73 = 1035, /* $@73 */ + YYSYMBOL_part_name = 1036, /* part_name */ + YYSYMBOL_opt_part_values = 1037, /* opt_part_values */ + YYSYMBOL_1038_74 = 1038, /* $@74 */ + YYSYMBOL_1039_75 = 1039, /* $@75 */ + YYSYMBOL_part_func_max = 1040, /* part_func_max */ + YYSYMBOL_part_values_in = 1041, /* part_values_in */ + YYSYMBOL_part_value_list = 1042, /* part_value_list */ + YYSYMBOL_part_value_item = 1043, /* part_value_item */ + YYSYMBOL_1044_76 = 1044, /* $@76 */ + YYSYMBOL_1045_77 = 1045, /* $@77 */ + YYSYMBOL_part_value_item_list = 1046, /* part_value_item_list */ + YYSYMBOL_part_value_expr_item = 1047, /* part_value_expr_item */ + YYSYMBOL_opt_sub_partition = 1048, /* opt_sub_partition */ + YYSYMBOL_sub_part_list = 1049, /* sub_part_list */ + YYSYMBOL_sub_part_definition = 1050, /* sub_part_definition */ + YYSYMBOL_1051_78 = 1051, /* $@78 */ + YYSYMBOL_sub_name = 1052, /* sub_name */ + YYSYMBOL_opt_part_options = 1053, /* opt_part_options */ + YYSYMBOL_part_option_list = 1054, /* part_option_list */ + YYSYMBOL_part_option = 1055, /* part_option */ + YYSYMBOL_opt_subpart_options = 1056, /* opt_subpart_options */ + YYSYMBOL_subpart_option_list = 1057, /* subpart_option_list */ + YYSYMBOL_server_part_option = 1058, /* server_part_option */ + YYSYMBOL_opt_versioning_rotation = 1059, /* opt_versioning_rotation */ + YYSYMBOL_1060_79 = 1060, /* $@79 */ + YYSYMBOL_opt_versioning_interval_start = 1061, /* opt_versioning_interval_start */ + YYSYMBOL_opt_vers_auto_part = 1062, /* opt_vers_auto_part */ + YYSYMBOL_opt_as = 1063, /* opt_as */ + YYSYMBOL_opt_create_database_options = 1064, /* opt_create_database_options */ + YYSYMBOL_create_database_options = 1065, /* create_database_options */ + YYSYMBOL_create_database_option = 1066, /* create_database_option */ + YYSYMBOL_opt_if_not_exists_table_element = 1067, /* opt_if_not_exists_table_element */ + YYSYMBOL_opt_if_not_exists = 1068, /* opt_if_not_exists */ + YYSYMBOL_create_or_replace = 1069, /* create_or_replace */ + YYSYMBOL_opt_create_table_options = 1070, /* opt_create_table_options */ + YYSYMBOL_create_table_options_space_separated = 1071, /* create_table_options_space_separated */ + YYSYMBOL_create_table_options = 1072, /* create_table_options */ + YYSYMBOL_create_table_option = 1073, /* create_table_option */ + YYSYMBOL_1074_80 = 1074, /* $@80 */ + YYSYMBOL_engine_defined_option = 1075, /* engine_defined_option */ + YYSYMBOL_opt_versioning_option = 1076, /* opt_versioning_option */ + YYSYMBOL_versioning_option = 1077, /* versioning_option */ + YYSYMBOL_default_charset = 1078, /* default_charset */ + YYSYMBOL_default_collation = 1079, /* default_collation */ + YYSYMBOL_storage_engines = 1080, /* storage_engines */ + YYSYMBOL_known_storage_engines = 1081, /* known_storage_engines */ + YYSYMBOL_row_types = 1082, /* row_types */ + YYSYMBOL_merge_insert_types = 1083, /* merge_insert_types */ + YYSYMBOL_udf_type = 1084, /* udf_type */ + YYSYMBOL_create_field_list = 1085, /* create_field_list */ + YYSYMBOL_create_field_list_parens = 1086, /* create_field_list_parens */ + YYSYMBOL_field_list = 1087, /* field_list */ + YYSYMBOL_field_list_item = 1088, /* field_list_item */ + YYSYMBOL_column_def = 1089, /* column_def */ + YYSYMBOL_key_def = 1090, /* key_def */ + YYSYMBOL_1091_81 = 1091, /* $@81 */ + YYSYMBOL_1092_82 = 1092, /* $@82 */ + YYSYMBOL_1093_83 = 1093, /* $@83 */ + YYSYMBOL_1094_84 = 1094, /* $@84 */ + YYSYMBOL_1095_85 = 1095, /* $@85 */ + YYSYMBOL_1096_86 = 1096, /* $@86 */ + YYSYMBOL_1097_87 = 1097, /* $@87 */ + YYSYMBOL_constraint_def = 1098, /* constraint_def */ + YYSYMBOL_period_for_system_time = 1099, /* period_for_system_time */ + YYSYMBOL_period_for_application_time = 1100, /* period_for_application_time */ + YYSYMBOL_opt_check_constraint = 1101, /* opt_check_constraint */ + YYSYMBOL_check_constraint = 1102, /* check_constraint */ + YYSYMBOL_opt_constraint_no_id = 1103, /* opt_constraint_no_id */ + YYSYMBOL_opt_constraint = 1104, /* opt_constraint */ + YYSYMBOL_constraint = 1105, /* constraint */ + YYSYMBOL_field_spec = 1106, /* field_spec */ + YYSYMBOL_1107_88 = 1107, /* @88 */ + YYSYMBOL_field_type_or_serial = 1108, /* field_type_or_serial */ + YYSYMBOL_1109_89 = 1109, /* $@89 */ + YYSYMBOL_1110_90 = 1110, /* $@90 */ + YYSYMBOL_opt_serial_attribute = 1111, /* opt_serial_attribute */ + YYSYMBOL_opt_serial_attribute_list = 1112, /* opt_serial_attribute_list */ + YYSYMBOL_opt_asrow_attribute = 1113, /* opt_asrow_attribute */ + YYSYMBOL_opt_asrow_attribute_list = 1114, /* opt_asrow_attribute_list */ + YYSYMBOL_field_def = 1115, /* field_def */ + YYSYMBOL_1116_91 = 1116, /* $@91 */ + YYSYMBOL_opt_generated_always = 1117, /* opt_generated_always */ + YYSYMBOL_vcol_opt_specifier = 1118, /* vcol_opt_specifier */ + YYSYMBOL_vcol_opt_attribute = 1119, /* vcol_opt_attribute */ + YYSYMBOL_vcol_opt_attribute_list = 1120, /* vcol_opt_attribute_list */ + YYSYMBOL_vcol_attribute = 1121, /* vcol_attribute */ + YYSYMBOL_parse_vcol_expr = 1122, /* parse_vcol_expr */ + YYSYMBOL_1123_92 = 1123, /* $@92 */ + YYSYMBOL_parenthesized_expr = 1124, /* parenthesized_expr */ + YYSYMBOL_virtual_column_func = 1125, /* virtual_column_func */ + YYSYMBOL_expr_or_literal = 1126, /* expr_or_literal */ + YYSYMBOL_column_default_expr = 1127, /* column_default_expr */ + YYSYMBOL_field_type = 1128, /* field_type */ + YYSYMBOL_qualified_field_type = 1129, /* qualified_field_type */ + YYSYMBOL_udt_name = 1130, /* udt_name */ + YYSYMBOL_field_type_all = 1131, /* field_type_all */ + YYSYMBOL_field_type_numeric = 1132, /* field_type_numeric */ + YYSYMBOL_opt_binary_and_compression = 1133, /* opt_binary_and_compression */ + YYSYMBOL_field_type_string = 1134, /* field_type_string */ + YYSYMBOL_field_type_temporal = 1135, /* field_type_temporal */ + YYSYMBOL_field_type_lob = 1136, /* field_type_lob */ + YYSYMBOL_field_type_misc = 1137, /* field_type_misc */ + YYSYMBOL_char = 1138, /* char */ + YYSYMBOL_nchar = 1139, /* nchar */ + YYSYMBOL_varchar = 1140, /* varchar */ + YYSYMBOL_nvarchar = 1141, /* nvarchar */ + YYSYMBOL_int_type = 1142, /* int_type */ + YYSYMBOL_real_type = 1143, /* real_type */ + YYSYMBOL_srid_option = 1144, /* srid_option */ + YYSYMBOL_float_options = 1145, /* float_options */ + YYSYMBOL_precision = 1146, /* precision */ + YYSYMBOL_field_options = 1147, /* field_options */ + YYSYMBOL_last_field_options = 1148, /* last_field_options */ + YYSYMBOL_field_length_str = 1149, /* field_length_str */ + YYSYMBOL_field_length = 1150, /* field_length */ + YYSYMBOL_field_scale = 1151, /* field_scale */ + YYSYMBOL_opt_field_length = 1152, /* opt_field_length */ + YYSYMBOL_opt_field_scale = 1153, /* opt_field_scale */ + YYSYMBOL_opt_precision = 1154, /* opt_precision */ + YYSYMBOL_attribute_list = 1155, /* attribute_list */ + YYSYMBOL_attribute = 1156, /* attribute */ + YYSYMBOL_opt_compression_method = 1157, /* opt_compression_method */ + YYSYMBOL_opt_compressed = 1158, /* opt_compressed */ + YYSYMBOL_opt_enable = 1159, /* opt_enable */ + YYSYMBOL_compressed = 1160, /* compressed */ + YYSYMBOL_compressed_deprecated_data_type_attribute = 1161, /* compressed_deprecated_data_type_attribute */ + YYSYMBOL_compressed_deprecated_column_attribute = 1162, /* compressed_deprecated_column_attribute */ + YYSYMBOL_asrow_attribute = 1163, /* asrow_attribute */ + YYSYMBOL_serial_attribute = 1164, /* serial_attribute */ + YYSYMBOL_with_or_without_system = 1165, /* with_or_without_system */ + YYSYMBOL_charset = 1166, /* charset */ + YYSYMBOL_charset_name = 1167, /* charset_name */ + YYSYMBOL_charset_name_or_default = 1168, /* charset_name_or_default */ + YYSYMBOL_opt_load_data_charset = 1169, /* opt_load_data_charset */ + YYSYMBOL_old_or_new_charset_name = 1170, /* old_or_new_charset_name */ + YYSYMBOL_old_or_new_charset_name_or_default = 1171, /* old_or_new_charset_name_or_default */ + YYSYMBOL_collation_name = 1172, /* collation_name */ + YYSYMBOL_collation_name_or_default = 1173, /* collation_name_or_default */ + YYSYMBOL_opt_default = 1174, /* opt_default */ + YYSYMBOL_charset_or_alias = 1175, /* charset_or_alias */ + YYSYMBOL_opt_binary = 1176, /* opt_binary */ + YYSYMBOL_binary = 1177, /* binary */ + YYSYMBOL_opt_bin_mod = 1178, /* opt_bin_mod */ + YYSYMBOL_ws_nweights = 1179, /* ws_nweights */ + YYSYMBOL_1180_93 = 1180, /* $@93 */ + YYSYMBOL_ws_level_flag_desc = 1181, /* ws_level_flag_desc */ + YYSYMBOL_ws_level_flag_reverse = 1182, /* ws_level_flag_reverse */ + YYSYMBOL_ws_level_flags = 1183, /* ws_level_flags */ + YYSYMBOL_ws_level_number = 1184, /* ws_level_number */ + YYSYMBOL_ws_level_list_item = 1185, /* ws_level_list_item */ + YYSYMBOL_ws_level_list = 1186, /* ws_level_list */ + YYSYMBOL_ws_level_range = 1187, /* ws_level_range */ + YYSYMBOL_ws_level_list_or_range = 1188, /* ws_level_list_or_range */ + YYSYMBOL_opt_ws_levels = 1189, /* opt_ws_levels */ + YYSYMBOL_opt_primary = 1190, /* opt_primary */ + YYSYMBOL_references = 1191, /* references */ + YYSYMBOL_opt_ref_list = 1192, /* opt_ref_list */ + YYSYMBOL_ref_list = 1193, /* ref_list */ + YYSYMBOL_opt_match_clause = 1194, /* opt_match_clause */ + YYSYMBOL_opt_on_update_delete = 1195, /* opt_on_update_delete */ + YYSYMBOL_delete_option = 1196, /* delete_option */ + YYSYMBOL_constraint_key_type = 1197, /* constraint_key_type */ + YYSYMBOL_key_or_index = 1198, /* key_or_index */ + YYSYMBOL_opt_key_or_index = 1199, /* opt_key_or_index */ + YYSYMBOL_keys_or_index = 1200, /* keys_or_index */ + YYSYMBOL_fulltext = 1201, /* fulltext */ + YYSYMBOL_spatial = 1202, /* spatial */ + YYSYMBOL_normal_key_options = 1203, /* normal_key_options */ + YYSYMBOL_fulltext_key_options = 1204, /* fulltext_key_options */ + YYSYMBOL_spatial_key_options = 1205, /* spatial_key_options */ + YYSYMBOL_normal_key_opts = 1206, /* normal_key_opts */ + YYSYMBOL_spatial_key_opts = 1207, /* spatial_key_opts */ + YYSYMBOL_fulltext_key_opts = 1208, /* fulltext_key_opts */ + YYSYMBOL_opt_USING_key_algorithm = 1209, /* opt_USING_key_algorithm */ + YYSYMBOL_opt_key_algorithm_clause = 1210, /* opt_key_algorithm_clause */ + YYSYMBOL_key_using_alg = 1211, /* key_using_alg */ + YYSYMBOL_all_key_opt = 1212, /* all_key_opt */ + YYSYMBOL_normal_key_opt = 1213, /* normal_key_opt */ + YYSYMBOL_spatial_key_opt = 1214, /* spatial_key_opt */ + YYSYMBOL_fulltext_key_opt = 1215, /* fulltext_key_opt */ + YYSYMBOL_btree_or_rtree = 1216, /* btree_or_rtree */ + YYSYMBOL_ignorability = 1217, /* ignorability */ + YYSYMBOL_key_list = 1218, /* key_list */ + YYSYMBOL_opt_without_overlaps = 1219, /* opt_without_overlaps */ + YYSYMBOL_key_part = 1220, /* key_part */ + YYSYMBOL_opt_ident = 1221, /* opt_ident */ + YYSYMBOL_string_list = 1222, /* string_list */ + YYSYMBOL_alter = 1223, /* alter */ + YYSYMBOL_1224_94 = 1224, /* $@94 */ + YYSYMBOL_1225_95 = 1225, /* $@95 */ + YYSYMBOL_1226_96 = 1226, /* $@96 */ + YYSYMBOL_1227_97 = 1227, /* $@97 */ + YYSYMBOL_1228_98 = 1228, /* $@98 */ + YYSYMBOL_1229_99 = 1229, /* $@99 */ + YYSYMBOL_1230_100 = 1230, /* $@100 */ + YYSYMBOL_1231_101 = 1231, /* $@101 */ + YYSYMBOL_1232_102 = 1232, /* $@102 */ + YYSYMBOL_1233_103 = 1233, /* $@103 */ + YYSYMBOL_1234_104 = 1234, /* $@104 */ + YYSYMBOL_1235_105 = 1235, /* $@105 */ + YYSYMBOL_1236_106 = 1236, /* $@106 */ + YYSYMBOL_account_locking_option = 1237, /* account_locking_option */ + YYSYMBOL_opt_password_expire_option = 1238, /* opt_password_expire_option */ + YYSYMBOL_opt_account_locking_and_opt_password_expiration = 1239, /* opt_account_locking_and_opt_password_expiration */ + YYSYMBOL_ev_alter_on_schedule_completion = 1240, /* ev_alter_on_schedule_completion */ + YYSYMBOL_opt_ev_rename_to = 1241, /* opt_ev_rename_to */ + YYSYMBOL_opt_ev_sql_stmt = 1242, /* opt_ev_sql_stmt */ + YYSYMBOL_ident_or_empty = 1243, /* ident_or_empty */ + YYSYMBOL_alter_commands = 1244, /* alter_commands */ + YYSYMBOL_1245_107 = 1245, /* $@107 */ + YYSYMBOL_1246_108 = 1246, /* $@108 */ + YYSYMBOL_1247_109 = 1247, /* $@109 */ + YYSYMBOL_1248_110 = 1248, /* $@110 */ + YYSYMBOL_remove_partitioning = 1249, /* remove_partitioning */ + YYSYMBOL_all_or_alt_part_name_list = 1250, /* all_or_alt_part_name_list */ + YYSYMBOL_add_partition_rule = 1251, /* add_partition_rule */ + YYSYMBOL_1252_111 = 1252, /* $@111 */ + YYSYMBOL_add_part_extra = 1253, /* add_part_extra */ + YYSYMBOL_reorg_partition_rule = 1254, /* reorg_partition_rule */ + YYSYMBOL_1255_112 = 1255, /* $@112 */ + YYSYMBOL_reorg_parts_rule = 1256, /* reorg_parts_rule */ + YYSYMBOL_1257_113 = 1257, /* $@113 */ + YYSYMBOL_alt_part_name_list = 1258, /* alt_part_name_list */ + YYSYMBOL_alt_part_name_item = 1259, /* alt_part_name_item */ + YYSYMBOL_alter_list = 1260, /* alter_list */ + YYSYMBOL_add_column = 1261, /* add_column */ + YYSYMBOL_alter_list_item = 1262, /* alter_list_item */ + YYSYMBOL_opt_index_lock_algorithm = 1263, /* opt_index_lock_algorithm */ + YYSYMBOL_alter_algorithm_option = 1264, /* alter_algorithm_option */ + YYSYMBOL_alter_lock_option = 1265, /* alter_lock_option */ + YYSYMBOL_opt_column = 1266, /* opt_column */ + YYSYMBOL_opt_ignore = 1267, /* opt_ignore */ + YYSYMBOL_alter_options = 1268, /* alter_options */ + YYSYMBOL_1269_114 = 1269, /* $@114 */ + YYSYMBOL_alter_options_part2 = 1270, /* alter_options_part2 */ + YYSYMBOL_alter_option_list = 1271, /* alter_option_list */ + YYSYMBOL_alter_option = 1272, /* alter_option */ + YYSYMBOL_opt_restrict = 1273, /* opt_restrict */ + YYSYMBOL_opt_place = 1274, /* opt_place */ + YYSYMBOL_opt_to = 1275, /* opt_to */ + YYSYMBOL_slave = 1276, /* slave */ + YYSYMBOL_1277_115 = 1277, /* $@115 */ + YYSYMBOL_1278_116 = 1278, /* $@116 */ + YYSYMBOL_start = 1279, /* start */ + YYSYMBOL_opt_start_transaction_option_list = 1280, /* opt_start_transaction_option_list */ + YYSYMBOL_start_transaction_option_list = 1281, /* start_transaction_option_list */ + YYSYMBOL_start_transaction_option = 1282, /* start_transaction_option */ + YYSYMBOL_slave_thread_opts = 1283, /* slave_thread_opts */ + YYSYMBOL_1284_117 = 1284, /* $@117 */ + YYSYMBOL_slave_thread_opt_list = 1285, /* slave_thread_opt_list */ + YYSYMBOL_slave_thread_opt = 1286, /* slave_thread_opt */ + YYSYMBOL_slave_until = 1287, /* slave_until */ + YYSYMBOL_slave_until_opts = 1288, /* slave_until_opts */ + YYSYMBOL_checksum = 1289, /* checksum */ + YYSYMBOL_1290_118 = 1290, /* $@118 */ + YYSYMBOL_opt_checksum_type = 1291, /* opt_checksum_type */ + YYSYMBOL_repair_table_or_view = 1292, /* repair_table_or_view */ + YYSYMBOL_1293_119 = 1293, /* $@119 */ + YYSYMBOL_repair = 1294, /* repair */ + YYSYMBOL_1295_120 = 1295, /* $@120 */ + YYSYMBOL_opt_mi_repair_type = 1296, /* opt_mi_repair_type */ + YYSYMBOL_mi_repair_types = 1297, /* mi_repair_types */ + YYSYMBOL_mi_repair_type = 1298, /* mi_repair_type */ + YYSYMBOL_opt_view_repair_type = 1299, /* opt_view_repair_type */ + YYSYMBOL_analyze = 1300, /* analyze */ + YYSYMBOL_1301_121 = 1301, /* $@121 */ + YYSYMBOL_analyze_table_list = 1302, /* analyze_table_list */ + YYSYMBOL_analyze_table_elem_spec = 1303, /* analyze_table_elem_spec */ + YYSYMBOL_opt_persistent_stat_clause = 1304, /* opt_persistent_stat_clause */ + YYSYMBOL_persistent_stat_spec = 1305, /* persistent_stat_spec */ + YYSYMBOL_persistent_column_stat_spec = 1306, /* persistent_column_stat_spec */ + YYSYMBOL_1307_122 = 1307, /* $@122 */ + YYSYMBOL_persistent_index_stat_spec = 1308, /* persistent_index_stat_spec */ + YYSYMBOL_1309_123 = 1309, /* $@123 */ + YYSYMBOL_table_column_list = 1310, /* table_column_list */ + YYSYMBOL_table_index_list = 1311, /* table_index_list */ + YYSYMBOL_table_index_name = 1312, /* table_index_name */ + YYSYMBOL_binlog_base64_event = 1313, /* binlog_base64_event */ + YYSYMBOL_check_view_or_table = 1314, /* check_view_or_table */ + YYSYMBOL_1315_124 = 1315, /* $@124 */ + YYSYMBOL_check = 1316, /* check */ + YYSYMBOL_1317_125 = 1317, /* $@125 */ + YYSYMBOL_opt_mi_check_type = 1318, /* opt_mi_check_type */ + YYSYMBOL_mi_check_types = 1319, /* mi_check_types */ + YYSYMBOL_mi_check_type = 1320, /* mi_check_type */ + YYSYMBOL_opt_view_check_type = 1321, /* opt_view_check_type */ + YYSYMBOL_optimize = 1322, /* optimize */ + YYSYMBOL_1323_126 = 1323, /* $@126 */ + YYSYMBOL_opt_no_write_to_binlog = 1324, /* opt_no_write_to_binlog */ + YYSYMBOL_rename = 1325, /* rename */ + YYSYMBOL_1326_127 = 1326, /* $@127 */ + YYSYMBOL_rename_list = 1327, /* rename_list */ + YYSYMBOL_table_to_table_list = 1328, /* table_to_table_list */ + YYSYMBOL_table_to_table = 1329, /* table_to_table */ + YYSYMBOL_keycache = 1330, /* keycache */ + YYSYMBOL_1331_128 = 1331, /* $@128 */ + YYSYMBOL_keycache_list_or_parts = 1332, /* keycache_list_or_parts */ + YYSYMBOL_keycache_list = 1333, /* keycache_list */ + YYSYMBOL_assign_to_keycache = 1334, /* assign_to_keycache */ + YYSYMBOL_assign_to_keycache_parts = 1335, /* assign_to_keycache_parts */ + YYSYMBOL_key_cache_name = 1336, /* key_cache_name */ + YYSYMBOL_preload = 1337, /* preload */ + YYSYMBOL_1338_129 = 1338, /* $@129 */ + YYSYMBOL_preload_list_or_parts = 1339, /* preload_list_or_parts */ + YYSYMBOL_preload_list = 1340, /* preload_list */ + YYSYMBOL_preload_keys = 1341, /* preload_keys */ + YYSYMBOL_preload_keys_parts = 1342, /* preload_keys_parts */ + YYSYMBOL_adm_partition = 1343, /* adm_partition */ + YYSYMBOL_1344_130 = 1344, /* $@130 */ + YYSYMBOL_cache_keys_spec = 1345, /* cache_keys_spec */ + YYSYMBOL_1346_131 = 1346, /* $@131 */ + YYSYMBOL_cache_key_list_or_empty = 1347, /* cache_key_list_or_empty */ + YYSYMBOL_opt_ignore_leaves = 1348, /* opt_ignore_leaves */ + YYSYMBOL_select = 1349, /* select */ + YYSYMBOL_1350_132 = 1350, /* $@132 */ + YYSYMBOL_1351_133 = 1351, /* $@133 */ + YYSYMBOL_select_into = 1352, /* select_into */ + YYSYMBOL_1353_134 = 1353, /* $@134 */ + YYSYMBOL_1354_135 = 1354, /* $@135 */ + YYSYMBOL_simple_table = 1355, /* simple_table */ + YYSYMBOL_table_value_constructor = 1356, /* table_value_constructor */ + YYSYMBOL_1357_136 = 1357, /* $@136 */ + YYSYMBOL_query_specification_start = 1358, /* query_specification_start */ + YYSYMBOL_1359_137 = 1359, /* $@137 */ + YYSYMBOL_1360_138 = 1360, /* $@138 */ + YYSYMBOL_query_specification = 1361, /* query_specification */ + YYSYMBOL_select_into_query_specification = 1362, /* select_into_query_specification */ + YYSYMBOL_query_expression = 1363, /* query_expression */ + YYSYMBOL_query_expression_no_with_clause = 1364, /* query_expression_no_with_clause */ + YYSYMBOL_query_expression_body_ext = 1365, /* query_expression_body_ext */ + YYSYMBOL_1366_139 = 1366, /* $@139 */ + YYSYMBOL_1367_140 = 1367, /* $@140 */ + YYSYMBOL_query_expression_body_ext_parens = 1368, /* query_expression_body_ext_parens */ + YYSYMBOL_query_expression_body = 1369, /* query_expression_body */ + YYSYMBOL_1370_141 = 1370, /* $@141 */ + YYSYMBOL_query_primary = 1371, /* query_primary */ + YYSYMBOL_query_simple = 1372, /* query_simple */ + YYSYMBOL_subselect = 1373, /* subselect */ + YYSYMBOL_subquery = 1374, /* subquery */ + YYSYMBOL_opt_from_clause = 1375, /* opt_from_clause */ + YYSYMBOL_from_clause = 1376, /* from_clause */ + YYSYMBOL_table_reference_list = 1377, /* table_reference_list */ + YYSYMBOL_select_options = 1378, /* select_options */ + YYSYMBOL_opt_history_unit = 1379, /* opt_history_unit */ + YYSYMBOL_history_point = 1380, /* history_point */ + YYSYMBOL_for_portion_of_time_clause = 1381, /* for_portion_of_time_clause */ + YYSYMBOL_opt_for_portion_of_time_clause = 1382, /* opt_for_portion_of_time_clause */ + YYSYMBOL_opt_for_system_time_clause = 1383, /* opt_for_system_time_clause */ + YYSYMBOL_system_time_expr = 1384, /* system_time_expr */ + YYSYMBOL_select_option_list = 1385, /* select_option_list */ + YYSYMBOL_select_option = 1386, /* select_option */ + YYSYMBOL_select_lock_type = 1387, /* select_lock_type */ + YYSYMBOL_opt_select_lock_type = 1388, /* opt_select_lock_type */ + YYSYMBOL_opt_lock_wait_timeout_new = 1389, /* opt_lock_wait_timeout_new */ + YYSYMBOL_select_item_list = 1390, /* select_item_list */ + YYSYMBOL_select_item = 1391, /* select_item */ + YYSYMBOL_remember_tok_start = 1392, /* remember_tok_start */ + YYSYMBOL_remember_name = 1393, /* remember_name */ + YYSYMBOL_remember_end = 1394, /* remember_end */ + YYSYMBOL_select_alias = 1395, /* select_alias */ + YYSYMBOL_opt_default_time_precision = 1396, /* opt_default_time_precision */ + YYSYMBOL_opt_time_precision = 1397, /* opt_time_precision */ + YYSYMBOL_optional_braces = 1398, /* optional_braces */ + YYSYMBOL_expr = 1399, /* expr */ + YYSYMBOL_boolean_test = 1400, /* boolean_test */ + YYSYMBOL_predicate = 1401, /* predicate */ + YYSYMBOL_bit_expr = 1402, /* bit_expr */ + YYSYMBOL_or = 1403, /* or */ + YYSYMBOL_and = 1404, /* and */ + YYSYMBOL_not = 1405, /* not */ + YYSYMBOL_not2 = 1406, /* not2 */ + YYSYMBOL_comp_op = 1407, /* comp_op */ + YYSYMBOL_all_or_any = 1408, /* all_or_any */ + YYSYMBOL_opt_dyncol_type = 1409, /* opt_dyncol_type */ + YYSYMBOL_dyncol_type = 1410, /* dyncol_type */ + YYSYMBOL_numeric_dyncol_type = 1411, /* numeric_dyncol_type */ + YYSYMBOL_temporal_dyncol_type = 1412, /* temporal_dyncol_type */ + YYSYMBOL_string_dyncol_type = 1413, /* string_dyncol_type */ + YYSYMBOL_dyncall_create_element = 1414, /* dyncall_create_element */ + YYSYMBOL_dyncall_create_list = 1415, /* dyncall_create_list */ + YYSYMBOL_plsql_cursor_attr = 1416, /* plsql_cursor_attr */ + YYSYMBOL_explicit_cursor_attr = 1417, /* explicit_cursor_attr */ + YYSYMBOL_trim_operands = 1418, /* trim_operands */ + YYSYMBOL_trim_operands_regular = 1419, /* trim_operands_regular */ + YYSYMBOL_trim_operands_special = 1420, /* trim_operands_special */ + YYSYMBOL_column_default_non_parenthesized_expr = 1421, /* column_default_non_parenthesized_expr */ + YYSYMBOL_primary_expr = 1422, /* primary_expr */ + YYSYMBOL_string_factor_expr = 1423, /* string_factor_expr */ + YYSYMBOL_simple_expr = 1424, /* simple_expr */ + YYSYMBOL_mysql_concatenation_expr = 1425, /* mysql_concatenation_expr */ + YYSYMBOL_function_call_keyword_timestamp = 1426, /* function_call_keyword_timestamp */ + YYSYMBOL_function_call_keyword = 1427, /* function_call_keyword */ + YYSYMBOL_substring_operands = 1428, /* substring_operands */ + YYSYMBOL_substring_operands_regular = 1429, /* substring_operands_regular */ + YYSYMBOL_substring_operands_special = 1430, /* substring_operands_special */ + YYSYMBOL_function_call_nonkeyword = 1431, /* function_call_nonkeyword */ + YYSYMBOL_function_call_conflict = 1432, /* function_call_conflict */ + YYSYMBOL_function_call_generic = 1433, /* function_call_generic */ + YYSYMBOL_1434_142 = 1434, /* @142 */ + YYSYMBOL_fulltext_options = 1435, /* fulltext_options */ + YYSYMBOL_opt_natural_language_mode = 1436, /* opt_natural_language_mode */ + YYSYMBOL_opt_query_expansion = 1437, /* opt_query_expansion */ + YYSYMBOL_opt_udf_expr_list = 1438, /* opt_udf_expr_list */ + YYSYMBOL_udf_expr_list = 1439, /* udf_expr_list */ + YYSYMBOL_udf_expr = 1440, /* udf_expr */ + YYSYMBOL_sum_expr = 1441, /* sum_expr */ + YYSYMBOL_1442_143 = 1442, /* $@143 */ + YYSYMBOL_1443_144 = 1443, /* $@144 */ + YYSYMBOL_1444_145 = 1444, /* $@145 */ + YYSYMBOL_1445_146 = 1445, /* $@146 */ + YYSYMBOL_1446_147 = 1446, /* $@147 */ + YYSYMBOL_window_func_expr = 1447, /* window_func_expr */ + YYSYMBOL_window_func = 1448, /* window_func */ + YYSYMBOL_simple_window_func = 1449, /* simple_window_func */ + YYSYMBOL_inverse_distribution_function = 1450, /* inverse_distribution_function */ + YYSYMBOL_percentile_function = 1451, /* percentile_function */ + YYSYMBOL_1452_148 = 1452, /* $@148 */ + YYSYMBOL_inverse_distribution_function_def = 1453, /* inverse_distribution_function_def */ + YYSYMBOL_order_by_single_element_list = 1454, /* order_by_single_element_list */ + YYSYMBOL_window_name = 1455, /* window_name */ + YYSYMBOL_variable = 1456, /* variable */ + YYSYMBOL_1457_149 = 1457, /* $@149 */ + YYSYMBOL_variable_aux = 1458, /* variable_aux */ + YYSYMBOL_opt_distinct = 1459, /* opt_distinct */ + YYSYMBOL_opt_gconcat_separator = 1460, /* opt_gconcat_separator */ + YYSYMBOL_opt_gorder_clause = 1461, /* opt_gorder_clause */ + YYSYMBOL_gorder_list = 1462, /* gorder_list */ + YYSYMBOL_opt_glimit_clause = 1463, /* opt_glimit_clause */ + YYSYMBOL_glimit_clause = 1464, /* glimit_clause */ + YYSYMBOL_glimit_options = 1465, /* glimit_options */ + YYSYMBOL_in_sum_expr = 1466, /* in_sum_expr */ + YYSYMBOL_1467_150 = 1467, /* $@150 */ + YYSYMBOL_cast_type = 1468, /* cast_type */ + YYSYMBOL_cast_type_numeric = 1469, /* cast_type_numeric */ + YYSYMBOL_cast_type_temporal = 1470, /* cast_type_temporal */ + YYSYMBOL_opt_expr_list = 1471, /* opt_expr_list */ + YYSYMBOL_expr_list = 1472, /* expr_list */ + YYSYMBOL_ident_list_arg = 1473, /* ident_list_arg */ + YYSYMBOL_ident_list = 1474, /* ident_list */ + YYSYMBOL_when_list = 1475, /* when_list */ + YYSYMBOL_when_list_opt_else = 1476, /* when_list_opt_else */ + YYSYMBOL_table_ref = 1477, /* table_ref */ + YYSYMBOL_json_text_literal = 1478, /* json_text_literal */ + YYSYMBOL_json_text_literal_or_num = 1479, /* json_text_literal_or_num */ + YYSYMBOL_join_table_list = 1480, /* join_table_list */ + YYSYMBOL_json_table_columns_clause = 1481, /* json_table_columns_clause */ + YYSYMBOL_json_table_columns_list = 1482, /* json_table_columns_list */ + YYSYMBOL_json_table_column = 1483, /* json_table_column */ + YYSYMBOL_1484_151 = 1484, /* $@151 */ + YYSYMBOL_1485_152 = 1485, /* $@152 */ + YYSYMBOL_json_table_column_type = 1486, /* json_table_column_type */ + YYSYMBOL_json_table_field_type = 1487, /* json_table_field_type */ + YYSYMBOL_json_opt_on_empty_or_error = 1488, /* json_opt_on_empty_or_error */ + YYSYMBOL_json_on_response = 1489, /* json_on_response */ + YYSYMBOL_json_on_error_response = 1490, /* json_on_error_response */ + YYSYMBOL_json_on_empty_response = 1491, /* json_on_empty_response */ + YYSYMBOL_table_function = 1492, /* table_function */ + YYSYMBOL_1493_153 = 1493, /* $@153 */ + YYSYMBOL_1494_154 = 1494, /* $@154 */ + YYSYMBOL_esc_table_ref = 1495, /* esc_table_ref */ + YYSYMBOL_derived_table_list = 1496, /* derived_table_list */ + YYSYMBOL_join_table = 1497, /* join_table */ + YYSYMBOL_1498_155 = 1498, /* $@155 */ + YYSYMBOL_1499_156 = 1499, /* $@156 */ + YYSYMBOL_1500_157 = 1500, /* $@157 */ + YYSYMBOL_1501_158 = 1501, /* $@158 */ + YYSYMBOL_1502_159 = 1502, /* $@159 */ + YYSYMBOL_1503_160 = 1503, /* $@160 */ + YYSYMBOL_inner_join = 1504, /* inner_join */ + YYSYMBOL_normal_join = 1505, /* normal_join */ + YYSYMBOL_opt_use_partition = 1506, /* opt_use_partition */ + YYSYMBOL_use_partition = 1507, /* use_partition */ + YYSYMBOL_table_factor = 1508, /* table_factor */ + YYSYMBOL_table_primary_ident_opt_parens = 1509, /* table_primary_ident_opt_parens */ + YYSYMBOL_table_primary_derived_opt_parens = 1510, /* table_primary_derived_opt_parens */ + YYSYMBOL_table_reference_list_parens = 1511, /* table_reference_list_parens */ + YYSYMBOL_nested_table_reference_list = 1512, /* nested_table_reference_list */ + YYSYMBOL_join_table_parens = 1513, /* join_table_parens */ + YYSYMBOL_table_primary_ident = 1514, /* table_primary_ident */ + YYSYMBOL_table_primary_derived = 1515, /* table_primary_derived */ + YYSYMBOL_opt_outer = 1516, /* opt_outer */ + YYSYMBOL_index_hint_clause = 1517, /* index_hint_clause */ + YYSYMBOL_index_hint_type = 1518, /* index_hint_type */ + YYSYMBOL_index_hint_definition = 1519, /* index_hint_definition */ + YYSYMBOL_1520_161 = 1520, /* $@161 */ + YYSYMBOL_1521_162 = 1521, /* $@162 */ + YYSYMBOL_index_hints_list = 1522, /* index_hints_list */ + YYSYMBOL_opt_index_hints_list = 1523, /* opt_index_hints_list */ + YYSYMBOL_1524_163 = 1524, /* $@163 */ + YYSYMBOL_opt_key_definition = 1525, /* opt_key_definition */ + YYSYMBOL_1526_164 = 1526, /* $@164 */ + YYSYMBOL_opt_key_usage_list = 1527, /* opt_key_usage_list */ + YYSYMBOL_key_usage_element = 1528, /* key_usage_element */ + YYSYMBOL_key_usage_list = 1529, /* key_usage_list */ + YYSYMBOL_using_list = 1530, /* using_list */ + YYSYMBOL_interval = 1531, /* interval */ + YYSYMBOL_interval_time_stamp = 1532, /* interval_time_stamp */ + YYSYMBOL_date_time_type = 1533, /* date_time_type */ + YYSYMBOL_table_alias = 1534, /* table_alias */ + YYSYMBOL_opt_table_alias_clause = 1535, /* opt_table_alias_clause */ + YYSYMBOL_table_alias_clause = 1536, /* table_alias_clause */ + YYSYMBOL_opt_all = 1537, /* opt_all */ + YYSYMBOL_opt_where_clause = 1538, /* opt_where_clause */ + YYSYMBOL_1539_165 = 1539, /* $@165 */ + YYSYMBOL_opt_having_clause = 1540, /* opt_having_clause */ + YYSYMBOL_1541_166 = 1541, /* $@166 */ + YYSYMBOL_opt_group_clause = 1542, /* opt_group_clause */ + YYSYMBOL_group_list = 1543, /* group_list */ + YYSYMBOL_olap_opt = 1544, /* olap_opt */ + YYSYMBOL_opt_window_clause = 1545, /* opt_window_clause */ + YYSYMBOL_window_def_list = 1546, /* window_def_list */ + YYSYMBOL_window_def = 1547, /* window_def */ + YYSYMBOL_window_spec = 1548, /* window_spec */ + YYSYMBOL_1549_167 = 1549, /* $@167 */ + YYSYMBOL_opt_window_ref = 1550, /* opt_window_ref */ + YYSYMBOL_opt_window_partition_clause = 1551, /* opt_window_partition_clause */ + YYSYMBOL_opt_window_order_clause = 1552, /* opt_window_order_clause */ + YYSYMBOL_opt_window_frame_clause = 1553, /* opt_window_frame_clause */ + YYSYMBOL_window_frame_units = 1554, /* window_frame_units */ + YYSYMBOL_window_frame_extent = 1555, /* window_frame_extent */ + YYSYMBOL_window_frame_start = 1556, /* window_frame_start */ + YYSYMBOL_window_frame_bound = 1557, /* window_frame_bound */ + YYSYMBOL_opt_window_frame_exclusion = 1558, /* opt_window_frame_exclusion */ + YYSYMBOL_alter_order_clause = 1559, /* alter_order_clause */ + YYSYMBOL_alter_order_list = 1560, /* alter_order_list */ + YYSYMBOL_alter_order_item = 1561, /* alter_order_item */ + YYSYMBOL_opt_order_clause = 1562, /* opt_order_clause */ + YYSYMBOL_order_clause = 1563, /* order_clause */ + YYSYMBOL_1564_168 = 1564, /* $@168 */ + YYSYMBOL_order_list = 1565, /* order_list */ + YYSYMBOL_order_dir = 1566, /* order_dir */ + YYSYMBOL_opt_limit_clause = 1567, /* opt_limit_clause */ + YYSYMBOL_limit_clause = 1568, /* limit_clause */ + YYSYMBOL_fetch_first_clause = 1569, /* fetch_first_clause */ + YYSYMBOL_first_or_next = 1570, /* first_or_next */ + YYSYMBOL_row_or_rows = 1571, /* row_or_rows */ + YYSYMBOL_only_or_with_ties = 1572, /* only_or_with_ties */ + YYSYMBOL_opt_global_limit_clause = 1573, /* opt_global_limit_clause */ + YYSYMBOL_limit_options = 1574, /* limit_options */ + YYSYMBOL_limit_option = 1575, /* limit_option */ + YYSYMBOL_limit_rows_option = 1576, /* limit_rows_option */ + YYSYMBOL_delete_limit_clause = 1577, /* delete_limit_clause */ + YYSYMBOL_order_limit_lock = 1578, /* order_limit_lock */ + YYSYMBOL_opt_order_limit_lock = 1579, /* opt_order_limit_lock */ + YYSYMBOL_query_expression_tail = 1580, /* query_expression_tail */ + YYSYMBOL_opt_query_expression_tail = 1581, /* opt_query_expression_tail */ + YYSYMBOL_opt_procedure_or_into = 1582, /* opt_procedure_or_into */ + YYSYMBOL_order_or_limit = 1583, /* order_or_limit */ + YYSYMBOL_opt_plus = 1584, /* opt_plus */ + YYSYMBOL_int_num = 1585, /* int_num */ + YYSYMBOL_ulong_num = 1586, /* ulong_num */ + YYSYMBOL_real_ulong_num = 1587, /* real_ulong_num */ + YYSYMBOL_longlong_num = 1588, /* longlong_num */ + YYSYMBOL_ulonglong_num = 1589, /* ulonglong_num */ + YYSYMBOL_real_ulonglong_num = 1590, /* real_ulonglong_num */ + YYSYMBOL_dec_num_error = 1591, /* dec_num_error */ + YYSYMBOL_dec_num = 1592, /* dec_num */ + YYSYMBOL_choice = 1593, /* choice */ + YYSYMBOL_bool = 1594, /* bool */ + YYSYMBOL_procedure_clause = 1595, /* procedure_clause */ + YYSYMBOL_1596_169 = 1596, /* $@169 */ + YYSYMBOL_procedure_list = 1597, /* procedure_list */ + YYSYMBOL_procedure_list2 = 1598, /* procedure_list2 */ + YYSYMBOL_procedure_item = 1599, /* procedure_item */ + YYSYMBOL_select_var_list_init = 1600, /* select_var_list_init */ + YYSYMBOL_1601_170 = 1601, /* $@170 */ + YYSYMBOL_select_var_list = 1602, /* select_var_list */ + YYSYMBOL_select_var_ident = 1603, /* select_var_ident */ + YYSYMBOL_select_outvar = 1604, /* select_outvar */ + YYSYMBOL_into = 1605, /* into */ + YYSYMBOL_into_destination = 1606, /* into_destination */ + YYSYMBOL_1607_171 = 1607, /* $@171 */ + YYSYMBOL_1608_172 = 1608, /* $@172 */ + YYSYMBOL_do = 1609, /* do */ + YYSYMBOL_1610_173 = 1610, /* $@173 */ + YYSYMBOL_drop = 1611, /* drop */ + YYSYMBOL_1612_174 = 1612, /* $@174 */ + YYSYMBOL_1613_175 = 1613, /* $@175 */ + YYSYMBOL_1614_176 = 1614, /* $@176 */ + YYSYMBOL_1615_177 = 1615, /* $@177 */ + YYSYMBOL_table_list = 1616, /* table_list */ + YYSYMBOL_table_name = 1617, /* table_name */ + YYSYMBOL_table_name_with_opt_use_partition = 1618, /* table_name_with_opt_use_partition */ + YYSYMBOL_table_alias_ref_list = 1619, /* table_alias_ref_list */ + YYSYMBOL_table_alias_ref = 1620, /* table_alias_ref */ + YYSYMBOL_opt_if_exists_table_element = 1621, /* opt_if_exists_table_element */ + YYSYMBOL_opt_if_exists = 1622, /* opt_if_exists */ + YYSYMBOL_opt_temporary = 1623, /* opt_temporary */ + YYSYMBOL_insert = 1624, /* insert */ + YYSYMBOL_1625_178 = 1625, /* $@178 */ + YYSYMBOL_1626_179 = 1626, /* $@179 */ + YYSYMBOL_replace = 1627, /* replace */ + YYSYMBOL_1628_180 = 1628, /* $@180 */ + YYSYMBOL_1629_181 = 1629, /* $@181 */ + YYSYMBOL_insert_start = 1630, /* insert_start */ + YYSYMBOL_stmt_end = 1631, /* stmt_end */ + YYSYMBOL_insert_lock_option = 1632, /* insert_lock_option */ + YYSYMBOL_replace_lock_option = 1633, /* replace_lock_option */ + YYSYMBOL_insert_replace_option = 1634, /* insert_replace_option */ + YYSYMBOL_opt_into = 1635, /* opt_into */ + YYSYMBOL_insert_table = 1636, /* insert_table */ + YYSYMBOL_1637_182 = 1637, /* $@182 */ + YYSYMBOL_insert_field_spec = 1638, /* insert_field_spec */ + YYSYMBOL_1639_183 = 1639, /* $@183 */ + YYSYMBOL_insert_field_list = 1640, /* insert_field_list */ + YYSYMBOL_opt_fields = 1641, /* opt_fields */ + YYSYMBOL_fields = 1642, /* fields */ + YYSYMBOL_insert_values = 1643, /* insert_values */ + YYSYMBOL_values_list = 1644, /* values_list */ + YYSYMBOL_ident_eq_list = 1645, /* ident_eq_list */ + YYSYMBOL_ident_eq_value = 1646, /* ident_eq_value */ + YYSYMBOL_equal = 1647, /* equal */ + YYSYMBOL_opt_equal = 1648, /* opt_equal */ + YYSYMBOL_opt_with = 1649, /* opt_with */ + YYSYMBOL_opt_by = 1650, /* opt_by */ + YYSYMBOL_no_braces = 1651, /* no_braces */ + YYSYMBOL_1652_184 = 1652, /* $@184 */ + YYSYMBOL_no_braces_with_names = 1653, /* no_braces_with_names */ + YYSYMBOL_1654_185 = 1654, /* $@185 */ + YYSYMBOL_opt_values = 1655, /* opt_values */ + YYSYMBOL_opt_values_with_names = 1656, /* opt_values_with_names */ + YYSYMBOL_values = 1657, /* values */ + YYSYMBOL_values_with_names = 1658, /* values_with_names */ + YYSYMBOL_expr_or_ignore = 1659, /* expr_or_ignore */ + YYSYMBOL_expr_or_ignore_or_default = 1660, /* expr_or_ignore_or_default */ + YYSYMBOL_opt_insert_update = 1661, /* opt_insert_update */ + YYSYMBOL_1662_186 = 1662, /* $@186 */ + YYSYMBOL_1663_187 = 1663, /* $@187 */ + YYSYMBOL_update_table_list = 1664, /* update_table_list */ + YYSYMBOL_update = 1665, /* update */ + YYSYMBOL_1666_188 = 1666, /* $@188 */ + YYSYMBOL_1667_189 = 1667, /* $@189 */ + YYSYMBOL_1668_190 = 1668, /* $@190 */ + YYSYMBOL_update_list = 1669, /* update_list */ + YYSYMBOL_update_elem = 1670, /* update_elem */ + YYSYMBOL_insert_update_list = 1671, /* insert_update_list */ + YYSYMBOL_insert_update_elem = 1672, /* insert_update_elem */ + YYSYMBOL_opt_low_priority = 1673, /* opt_low_priority */ + YYSYMBOL_delete = 1674, /* delete */ + YYSYMBOL_1675_191 = 1675, /* $@191 */ + YYSYMBOL_opt_delete_system_time = 1676, /* opt_delete_system_time */ + YYSYMBOL_delete_part2 = 1677, /* delete_part2 */ + YYSYMBOL_delete_single_table = 1678, /* delete_single_table */ + YYSYMBOL_delete_single_table_for_period = 1679, /* delete_single_table_for_period */ + YYSYMBOL_single_multi = 1680, /* single_multi */ + YYSYMBOL_1681_192 = 1681, /* $@192 */ + YYSYMBOL_1682_193 = 1682, /* $@193 */ + YYSYMBOL_1683_194 = 1683, /* $@194 */ + YYSYMBOL_1684_195 = 1684, /* $@195 */ + YYSYMBOL_opt_returning = 1685, /* opt_returning */ + YYSYMBOL_1686_196 = 1686, /* $@196 */ + YYSYMBOL_table_wild_list = 1687, /* table_wild_list */ + YYSYMBOL_table_wild_one = 1688, /* table_wild_one */ + YYSYMBOL_opt_wild = 1689, /* opt_wild */ + YYSYMBOL_opt_delete_options = 1690, /* opt_delete_options */ + YYSYMBOL_opt_delete_option = 1691, /* opt_delete_option */ + YYSYMBOL_truncate = 1692, /* truncate */ + YYSYMBOL_1693_197 = 1693, /* $@197 */ + YYSYMBOL_1694_198 = 1694, /* $@198 */ + YYSYMBOL_opt_table_sym = 1695, /* opt_table_sym */ + YYSYMBOL_opt_profile_defs = 1696, /* opt_profile_defs */ + YYSYMBOL_profile_defs = 1697, /* profile_defs */ + YYSYMBOL_profile_def = 1698, /* profile_def */ + YYSYMBOL_opt_profile_args = 1699, /* opt_profile_args */ + YYSYMBOL_show = 1700, /* show */ + YYSYMBOL_1701_199 = 1701, /* $@199 */ + YYSYMBOL_show_param = 1702, /* show_param */ + YYSYMBOL_1703_200 = 1703, /* $@200 */ + YYSYMBOL_1704_201 = 1704, /* $@201 */ + YYSYMBOL_show_engine_param = 1705, /* show_engine_param */ + YYSYMBOL_master_or_binary = 1706, /* master_or_binary */ + YYSYMBOL_opt_storage = 1707, /* opt_storage */ + YYSYMBOL_opt_db = 1708, /* opt_db */ + YYSYMBOL_opt_full = 1709, /* opt_full */ + YYSYMBOL_from_or_in = 1710, /* from_or_in */ + YYSYMBOL_binlog_in = 1711, /* binlog_in */ + YYSYMBOL_binlog_from = 1712, /* binlog_from */ + YYSYMBOL_wild_and_where = 1713, /* wild_and_where */ + YYSYMBOL_describe = 1714, /* describe */ + YYSYMBOL_1715_202 = 1715, /* $@202 */ + YYSYMBOL_1716_203 = 1716, /* $@203 */ + YYSYMBOL_explainable_command = 1717, /* explainable_command */ + YYSYMBOL_describe_command = 1718, /* describe_command */ + YYSYMBOL_analyze_stmt_command = 1719, /* analyze_stmt_command */ + YYSYMBOL_opt_extended_describe = 1720, /* opt_extended_describe */ + YYSYMBOL_opt_format_json = 1721, /* opt_format_json */ + YYSYMBOL_opt_describe_column = 1722, /* opt_describe_column */ + YYSYMBOL_explain_for_connection = 1723, /* explain_for_connection */ + YYSYMBOL_flush = 1724, /* flush */ + YYSYMBOL_1725_204 = 1725, /* $@204 */ + YYSYMBOL_flush_options = 1726, /* flush_options */ + YYSYMBOL_1727_205 = 1727, /* $@205 */ + YYSYMBOL_opt_flush_lock = 1728, /* opt_flush_lock */ + YYSYMBOL_flush_lock = 1729, /* flush_lock */ + YYSYMBOL_1730_206 = 1730, /* $@206 */ + YYSYMBOL_flush_options_list = 1731, /* flush_options_list */ + YYSYMBOL_flush_option = 1732, /* flush_option */ + YYSYMBOL_opt_table_list = 1733, /* opt_table_list */ + YYSYMBOL_backup = 1734, /* backup */ + YYSYMBOL_backup_statements = 1735, /* backup_statements */ + YYSYMBOL_1736_207 = 1736, /* $@207 */ + YYSYMBOL_opt_delete_gtid_domain = 1737, /* opt_delete_gtid_domain */ + YYSYMBOL_delete_domain_id_list = 1738, /* delete_domain_id_list */ + YYSYMBOL_delete_domain_id = 1739, /* delete_domain_id */ + YYSYMBOL_optional_flush_tables_arguments = 1740, /* optional_flush_tables_arguments */ + YYSYMBOL_reset = 1741, /* reset */ + YYSYMBOL_1742_208 = 1742, /* $@208 */ + YYSYMBOL_reset_options = 1743, /* reset_options */ + YYSYMBOL_reset_option = 1744, /* reset_option */ + YYSYMBOL_1745_209 = 1745, /* $@209 */ + YYSYMBOL_1746_210 = 1746, /* $@210 */ + YYSYMBOL_slave_reset_options = 1747, /* slave_reset_options */ + YYSYMBOL_master_reset_options = 1748, /* master_reset_options */ + YYSYMBOL_purge = 1749, /* purge */ + YYSYMBOL_1750_211 = 1750, /* $@211 */ + YYSYMBOL_kill = 1751, /* kill */ + YYSYMBOL_1752_212 = 1752, /* $@212 */ + YYSYMBOL_kill_type = 1753, /* kill_type */ + YYSYMBOL_kill_option = 1754, /* kill_option */ + YYSYMBOL_opt_connection = 1755, /* opt_connection */ + YYSYMBOL_kill_expr = 1756, /* kill_expr */ + YYSYMBOL_shutdown = 1757, /* shutdown */ + YYSYMBOL_1758_213 = 1758, /* $@213 */ + YYSYMBOL_shutdown_option = 1759, /* shutdown_option */ + YYSYMBOL_use = 1760, /* use */ + YYSYMBOL_load = 1761, /* load */ + YYSYMBOL_1762_214 = 1762, /* $@214 */ + YYSYMBOL_1763_215 = 1763, /* $@215 */ + YYSYMBOL_1764_216 = 1764, /* $@216 */ + YYSYMBOL_1765_217 = 1765, /* $@217 */ + YYSYMBOL_data_or_xml = 1766, /* data_or_xml */ + YYSYMBOL_opt_local = 1767, /* opt_local */ + YYSYMBOL_load_data_lock = 1768, /* load_data_lock */ + YYSYMBOL_opt_duplicate = 1769, /* opt_duplicate */ + YYSYMBOL_opt_field_term = 1770, /* opt_field_term */ + YYSYMBOL_field_term_list = 1771, /* field_term_list */ + YYSYMBOL_field_term = 1772, /* field_term */ + YYSYMBOL_opt_line_term = 1773, /* opt_line_term */ + YYSYMBOL_line_term_list = 1774, /* line_term_list */ + YYSYMBOL_line_term = 1775, /* line_term */ + YYSYMBOL_opt_xml_rows_identified_by = 1776, /* opt_xml_rows_identified_by */ + YYSYMBOL_opt_ignore_lines = 1777, /* opt_ignore_lines */ + YYSYMBOL_lines_or_rows = 1778, /* lines_or_rows */ + YYSYMBOL_opt_field_or_var_spec = 1779, /* opt_field_or_var_spec */ + YYSYMBOL_fields_or_vars = 1780, /* fields_or_vars */ + YYSYMBOL_field_or_var = 1781, /* field_or_var */ + YYSYMBOL_opt_load_data_set_spec = 1782, /* opt_load_data_set_spec */ + YYSYMBOL_load_data_set_list = 1783, /* load_data_set_list */ + YYSYMBOL_load_data_set_elem = 1784, /* load_data_set_elem */ + YYSYMBOL_text_literal = 1785, /* text_literal */ + YYSYMBOL_text_string = 1786, /* text_string */ + YYSYMBOL_hex_or_bin_String = 1787, /* hex_or_bin_String */ + YYSYMBOL_param_marker = 1788, /* param_marker */ + YYSYMBOL_signed_literal = 1789, /* signed_literal */ + YYSYMBOL_literal = 1790, /* literal */ + YYSYMBOL_NUM_literal = 1791, /* NUM_literal */ + YYSYMBOL_temporal_literal = 1792, /* temporal_literal */ + YYSYMBOL_with_clause = 1793, /* with_clause */ + YYSYMBOL_1794_218 = 1794, /* $@218 */ + YYSYMBOL_opt_recursive = 1795, /* opt_recursive */ + YYSYMBOL_with_list = 1796, /* with_list */ + YYSYMBOL_with_list_element = 1797, /* with_list_element */ + YYSYMBOL_opt_cycle = 1798, /* opt_cycle */ + YYSYMBOL_1799_219 = 1799, /* $@219 */ + YYSYMBOL_opt_with_column_list = 1800, /* opt_with_column_list */ + YYSYMBOL_with_column_list = 1801, /* with_column_list */ + YYSYMBOL_ident_sys_alloc = 1802, /* ident_sys_alloc */ + YYSYMBOL_comma_separated_ident_list = 1803, /* comma_separated_ident_list */ + YYSYMBOL_with_element_head = 1804, /* with_element_head */ + YYSYMBOL_insert_ident = 1805, /* insert_ident */ + YYSYMBOL_table_wild = 1806, /* table_wild */ + YYSYMBOL_select_sublist_qualified_asterisk = 1807, /* select_sublist_qualified_asterisk */ + YYSYMBOL_order_ident = 1808, /* order_ident */ + YYSYMBOL_simple_ident = 1809, /* simple_ident */ + YYSYMBOL_simple_ident_nospvar = 1810, /* simple_ident_nospvar */ + YYSYMBOL_field_ident = 1811, /* field_ident */ + YYSYMBOL_table_ident = 1812, /* table_ident */ + YYSYMBOL_table_ident_opt_wild = 1813, /* table_ident_opt_wild */ + YYSYMBOL_table_ident_nodb = 1814, /* table_ident_nodb */ + YYSYMBOL_IDENT_cli = 1815, /* IDENT_cli */ + YYSYMBOL_ident_cli = 1816, /* ident_cli */ + YYSYMBOL_IDENT_sys = 1817, /* IDENT_sys */ + YYSYMBOL_ident_cli_func = 1818, /* ident_cli_func */ + YYSYMBOL_ident_func = 1819, /* ident_func */ + YYSYMBOL_TEXT_STRING_sys = 1820, /* TEXT_STRING_sys */ + YYSYMBOL_TEXT_STRING_literal = 1821, /* TEXT_STRING_literal */ + YYSYMBOL_TEXT_STRING_filesystem = 1822, /* TEXT_STRING_filesystem */ + YYSYMBOL_ident_table_alias = 1823, /* ident_table_alias */ + YYSYMBOL_ident_cli_set_usual_case = 1824, /* ident_cli_set_usual_case */ + YYSYMBOL_ident_sysvar_name = 1825, /* ident_sysvar_name */ + YYSYMBOL_ident = 1826, /* ident */ + YYSYMBOL_label_ident = 1827, /* label_ident */ + YYSYMBOL_ident_or_text = 1828, /* ident_or_text */ + YYSYMBOL_user_maybe_role = 1829, /* user_maybe_role */ + YYSYMBOL_user_or_role = 1830, /* user_or_role */ + YYSYMBOL_user = 1831, /* user */ + YYSYMBOL_keyword_table_alias = 1832, /* keyword_table_alias */ + YYSYMBOL_keyword_ident = 1833, /* keyword_ident */ + YYSYMBOL_keyword_sysvar_name = 1834, /* keyword_sysvar_name */ + YYSYMBOL_keyword_set_usual_case = 1835, /* keyword_set_usual_case */ + YYSYMBOL_non_reserved_keyword_udt = 1836, /* non_reserved_keyword_udt */ + YYSYMBOL_keyword_sp_var_not_label = 1837, /* keyword_sp_var_not_label */ + YYSYMBOL_keyword_sp_head = 1838, /* keyword_sp_head */ + YYSYMBOL_keyword_verb_clause = 1839, /* keyword_verb_clause */ + YYSYMBOL_keyword_set_special_case = 1840, /* keyword_set_special_case */ + YYSYMBOL_keyword_sysvar_type = 1841, /* keyword_sysvar_type */ + YYSYMBOL_keyword_data_type = 1842, /* keyword_data_type */ + YYSYMBOL_keyword_cast_type = 1843, /* keyword_cast_type */ + YYSYMBOL_keyword_func_sp_var_and_label = 1844, /* keyword_func_sp_var_and_label */ + YYSYMBOL_keyword_func_sp_var_not_label = 1845, /* keyword_func_sp_var_not_label */ + YYSYMBOL_keyword_sp_var_and_label = 1846, /* keyword_sp_var_and_label */ + YYSYMBOL_reserved_keyword_udt_not_param_type = 1847, /* reserved_keyword_udt_not_param_type */ + YYSYMBOL_set = 1848, /* set */ + YYSYMBOL_1849_220 = 1849, /* $@220 */ + YYSYMBOL_set_param = 1850, /* set_param */ + YYSYMBOL_1851_221 = 1851, /* $@221 */ + YYSYMBOL_1852_222 = 1852, /* $@222 */ + YYSYMBOL_1853_223 = 1853, /* $@223 */ + YYSYMBOL_set_stmt_option_list = 1854, /* set_stmt_option_list */ + YYSYMBOL_start_option_value_list_following_option_type = 1855, /* start_option_value_list_following_option_type */ + YYSYMBOL_1856_224 = 1856, /* $@224 */ + YYSYMBOL_option_value_list = 1857, /* option_value_list */ + YYSYMBOL_option_value = 1858, /* option_value */ + YYSYMBOL_1859_225 = 1859, /* $@225 */ + YYSYMBOL_option_type = 1860, /* option_type */ + YYSYMBOL_opt_var_type = 1861, /* opt_var_type */ + YYSYMBOL_opt_var_ident_type = 1862, /* opt_var_ident_type */ + YYSYMBOL_set_stmt_option = 1863, /* set_stmt_option */ + YYSYMBOL_1864_226 = 1864, /* $@226 */ + YYSYMBOL_1865_227 = 1865, /* $@227 */ + YYSYMBOL_1866_228 = 1866, /* $@228 */ + YYSYMBOL_option_value_following_option_type = 1867, /* option_value_following_option_type */ + YYSYMBOL_1868_229 = 1868, /* $@229 */ + YYSYMBOL_1869_230 = 1869, /* $@230 */ + YYSYMBOL_1870_231 = 1870, /* $@231 */ + YYSYMBOL_option_value_no_option_type = 1871, /* option_value_no_option_type */ + YYSYMBOL_1872_232 = 1872, /* $@232 */ + YYSYMBOL_1873_233 = 1873, /* $@233 */ + YYSYMBOL_1874_234 = 1874, /* $@234 */ + YYSYMBOL_1875_235 = 1875, /* $@235 */ + YYSYMBOL_1876_236 = 1876, /* $@236 */ + YYSYMBOL_1877_237 = 1877, /* $@237 */ + YYSYMBOL_1878_238 = 1878, /* $@238 */ + YYSYMBOL_1879_239 = 1879, /* $@239 */ + YYSYMBOL_1880_240 = 1880, /* $@240 */ + YYSYMBOL_1881_241 = 1881, /* $@241 */ + YYSYMBOL_transaction_characteristics = 1882, /* transaction_characteristics */ + YYSYMBOL_transaction_access_mode = 1883, /* transaction_access_mode */ + YYSYMBOL_isolation_level = 1884, /* isolation_level */ + YYSYMBOL_transaction_access_mode_types = 1885, /* transaction_access_mode_types */ + YYSYMBOL_isolation_types = 1886, /* isolation_types */ + YYSYMBOL_text_or_password = 1887, /* text_or_password */ + YYSYMBOL_set_expr_or_default = 1888, /* set_expr_or_default */ + YYSYMBOL_lock = 1889, /* lock */ + YYSYMBOL_1890_242 = 1890, /* $@242 */ + YYSYMBOL_opt_lock_wait_timeout = 1891, /* opt_lock_wait_timeout */ + YYSYMBOL_table_or_tables = 1892, /* table_or_tables */ + YYSYMBOL_table_lock_list = 1893, /* table_lock_list */ + YYSYMBOL_table_lock = 1894, /* table_lock */ + YYSYMBOL_lock_option = 1895, /* lock_option */ + YYSYMBOL_unlock = 1896, /* unlock */ + YYSYMBOL_1897_243 = 1897, /* $@243 */ + YYSYMBOL_handler = 1898, /* handler */ + YYSYMBOL_1899_244 = 1899, /* $@244 */ + YYSYMBOL_handler_tail = 1900, /* handler_tail */ + YYSYMBOL_1901_245 = 1901, /* $@245 */ + YYSYMBOL_handler_read_or_scan = 1902, /* handler_read_or_scan */ + YYSYMBOL_handler_scan_function = 1903, /* handler_scan_function */ + YYSYMBOL_handler_rkey_function = 1904, /* handler_rkey_function */ + YYSYMBOL_1905_246 = 1905, /* $@246 */ + YYSYMBOL_handler_rkey_mode = 1906, /* handler_rkey_mode */ + YYSYMBOL_revoke = 1907, /* revoke */ + YYSYMBOL_revoke_command = 1908, /* revoke_command */ + YYSYMBOL_admin_option_for_role = 1909, /* admin_option_for_role */ + YYSYMBOL_grant = 1910, /* grant */ + YYSYMBOL_grant_command = 1911, /* grant_command */ + YYSYMBOL_opt_with_admin = 1912, /* opt_with_admin */ + YYSYMBOL_opt_with_admin_option = 1913, /* opt_with_admin_option */ + YYSYMBOL_role_list = 1914, /* role_list */ + YYSYMBOL_current_role = 1915, /* current_role */ + YYSYMBOL_role_name = 1916, /* role_name */ + YYSYMBOL_grant_role = 1917, /* grant_role */ + YYSYMBOL_opt_table = 1918, /* opt_table */ + YYSYMBOL_grant_privileges = 1919, /* grant_privileges */ + YYSYMBOL_opt_privileges = 1920, /* opt_privileges */ + YYSYMBOL_object_privilege_list = 1921, /* object_privilege_list */ + YYSYMBOL_column_list_privilege = 1922, /* column_list_privilege */ + YYSYMBOL_column_privilege = 1923, /* column_privilege */ + YYSYMBOL_object_privilege = 1924, /* object_privilege */ + YYSYMBOL_opt_and = 1925, /* opt_and */ + YYSYMBOL_require_list = 1926, /* require_list */ + YYSYMBOL_require_list_element = 1927, /* require_list_element */ + YYSYMBOL_grant_ident = 1928, /* grant_ident */ + YYSYMBOL_user_list = 1929, /* user_list */ + YYSYMBOL_grant_list = 1930, /* grant_list */ + YYSYMBOL_user_and_role_list = 1931, /* user_and_role_list */ + YYSYMBOL_via_or_with = 1932, /* via_or_with */ + YYSYMBOL_using_or_as = 1933, /* using_or_as */ + YYSYMBOL_grant_user = 1934, /* grant_user */ + YYSYMBOL_auth_expression = 1935, /* auth_expression */ + YYSYMBOL_auth_token = 1936, /* auth_token */ + YYSYMBOL_opt_auth_str = 1937, /* opt_auth_str */ + YYSYMBOL_opt_require_clause = 1938, /* opt_require_clause */ + YYSYMBOL_resource_option = 1939, /* resource_option */ + YYSYMBOL_resource_option_list = 1940, /* resource_option_list */ + YYSYMBOL_opt_resource_options = 1941, /* opt_resource_options */ + YYSYMBOL_opt_grant_options = 1942, /* opt_grant_options */ + YYSYMBOL_opt_grant_option = 1943, /* opt_grant_option */ + YYSYMBOL_grant_option_list = 1944, /* grant_option_list */ + YYSYMBOL_grant_option = 1945, /* grant_option */ + YYSYMBOL_begin_stmt_mariadb = 1946, /* begin_stmt_mariadb */ + YYSYMBOL_1947_247 = 1947, /* $@247 */ + YYSYMBOL_compound_statement = 1948, /* compound_statement */ + YYSYMBOL_opt_not = 1949, /* opt_not */ + YYSYMBOL_opt_work = 1950, /* opt_work */ + YYSYMBOL_opt_chain = 1951, /* opt_chain */ + YYSYMBOL_opt_release = 1952, /* opt_release */ + YYSYMBOL_commit = 1953, /* commit */ + YYSYMBOL_rollback = 1954, /* rollback */ + YYSYMBOL_savepoint = 1955, /* savepoint */ + YYSYMBOL_release = 1956, /* release */ + YYSYMBOL_unit_type_decl = 1957, /* unit_type_decl */ + YYSYMBOL_union_option = 1958, /* union_option */ + YYSYMBOL_query_expression_option = 1959, /* query_expression_option */ + YYSYMBOL_definer_opt = 1960, /* definer_opt */ + YYSYMBOL_no_definer = 1961, /* no_definer */ + YYSYMBOL_definer = 1962, /* definer */ + YYSYMBOL_view_algorithm = 1963, /* view_algorithm */ + YYSYMBOL_opt_view_suid = 1964, /* opt_view_suid */ + YYSYMBOL_view_suid = 1965, /* view_suid */ + YYSYMBOL_view_list_opt = 1966, /* view_list_opt */ + YYSYMBOL_view_list = 1967, /* view_list */ + YYSYMBOL_view_select = 1968, /* view_select */ + YYSYMBOL_1969_248 = 1969, /* $@248 */ + YYSYMBOL_view_check_option = 1970, /* view_check_option */ + YYSYMBOL_trigger_action_order = 1971, /* trigger_action_order */ + YYSYMBOL_trigger_follows_precedes_clause = 1972, /* trigger_follows_precedes_clause */ + YYSYMBOL_trigger_tail = 1973, /* trigger_tail */ + YYSYMBOL_1974_249 = 1974, /* $@249 */ + YYSYMBOL_1975_250 = 1975, /* $@250 */ + YYSYMBOL_1976_251 = 1976, /* $@251 */ + YYSYMBOL_1977_252 = 1977, /* $@252 */ + YYSYMBOL_1978_253 = 1978, /* $@253 */ + YYSYMBOL_sf_return_type = 1979, /* sf_return_type */ + YYSYMBOL_1980_254 = 1980, /* $@254 */ + YYSYMBOL_xa = 1981, /* xa */ + YYSYMBOL_opt_format_xid = 1982, /* opt_format_xid */ + YYSYMBOL_xid = 1983, /* xid */ + YYSYMBOL_begin_or_start = 1984, /* begin_or_start */ + YYSYMBOL_opt_join_or_resume = 1985, /* opt_join_or_resume */ + YYSYMBOL_opt_one_phase = 1986, /* opt_one_phase */ + YYSYMBOL_opt_suspend = 1987, /* opt_suspend */ + YYSYMBOL_1988_255 = 1988, /* $@255 */ + YYSYMBOL_opt_migrate = 1989, /* opt_migrate */ + YYSYMBOL_install = 1990, /* install */ + YYSYMBOL_uninstall = 1991, /* uninstall */ + YYSYMBOL_keep_gcc_happy = 1992, /* keep_gcc_happy */ + YYSYMBOL__empty = 1993, /* _empty */ + YYSYMBOL_statement = 1994, /* statement */ + YYSYMBOL_sp_statement = 1995, /* sp_statement */ + YYSYMBOL_1996_256 = 1996, /* $@256 */ + YYSYMBOL_1997_257 = 1997, /* $@257 */ + YYSYMBOL_1998_258 = 1998, /* $@258 */ + YYSYMBOL_sp_if_then_statements = 1999, /* sp_if_then_statements */ + YYSYMBOL_sp_case_then_statements = 2000, /* sp_case_then_statements */ + YYSYMBOL_reserved_keyword_udt = 2001, /* reserved_keyword_udt */ + YYSYMBOL_keyword_sp_block_section = 2002, /* keyword_sp_block_section */ + YYSYMBOL_keyword_label = 2003, /* keyword_label */ + YYSYMBOL_keyword_sp_decl = 2004, /* keyword_sp_decl */ + YYSYMBOL_opt_truncate_table_storage_clause = 2005, /* opt_truncate_table_storage_clause */ + YYSYMBOL_ident_for_loop_index = 2006, /* ident_for_loop_index */ + YYSYMBOL_row_field_name = 2007, /* row_field_name */ + YYSYMBOL_while_body = 2008, /* while_body */ + YYSYMBOL_2009_259 = 2009, /* $@259 */ + YYSYMBOL_for_loop_statements = 2010, /* for_loop_statements */ + YYSYMBOL_sp_control_label = 2011, /* sp_control_label */ + YYSYMBOL_sp_block_label = 2012, /* sp_block_label */ + YYSYMBOL_remember_end_opt = 2013, /* remember_end_opt */ + YYSYMBOL_sp_opt_default = 2014, /* sp_opt_default */ + YYSYMBOL_sp_opt_inout = 2015, /* sp_opt_inout */ + YYSYMBOL_sp_proc_stmts1_implicit_block = 2016, /* sp_proc_stmts1_implicit_block */ + YYSYMBOL_2017_260 = 2017, /* $@260 */ + YYSYMBOL_remember_lex = 2018, /* remember_lex */ + YYSYMBOL_keyword_directly_assignable = 2019, /* keyword_directly_assignable */ + YYSYMBOL_ident_directly_assignable = 2020, /* ident_directly_assignable */ + YYSYMBOL_ident_cli_directly_assignable = 2021, /* ident_cli_directly_assignable */ + YYSYMBOL_set_assign = 2022, /* set_assign */ + YYSYMBOL_2023_261 = 2023, /* $@261 */ + YYSYMBOL_2024_262 = 2024, /* $@262 */ + YYSYMBOL_2025_263 = 2025, /* $@263 */ + YYSYMBOL_labels_declaration_oracle = 2026, /* labels_declaration_oracle */ + YYSYMBOL_label_declaration_oracle = 2027, /* label_declaration_oracle */ + YYSYMBOL_opt_exception_clause = 2028, /* opt_exception_clause */ + YYSYMBOL_exception_handlers = 2029, /* exception_handlers */ + YYSYMBOL_exception_handler = 2030, /* exception_handler */ + YYSYMBOL_2031_264 = 2031, /* $@264 */ + YYSYMBOL_sp_no_param = 2032, /* sp_no_param */ + YYSYMBOL_opt_sp_parenthesized_fdparam_list = 2033, /* opt_sp_parenthesized_fdparam_list */ + YYSYMBOL_opt_sp_parenthesized_pdparam_list = 2034, /* opt_sp_parenthesized_pdparam_list */ + YYSYMBOL_opt_sp_name = 2035, /* opt_sp_name */ + YYSYMBOL_opt_package_routine_end_name = 2036, /* opt_package_routine_end_name */ + YYSYMBOL_sp_tail_is = 2037, /* sp_tail_is */ + YYSYMBOL_sp_instr_addr = 2038, /* sp_instr_addr */ + YYSYMBOL_sp_body = 2039, /* sp_body */ + YYSYMBOL_2040_265 = 2040, /* $@265 */ + YYSYMBOL_2041_266 = 2041, /* $@266 */ + YYSYMBOL_2042_267 = 2042, /* $@267 */ + YYSYMBOL_create_package_chistic = 2043, /* create_package_chistic */ + YYSYMBOL_create_package_chistics = 2044, /* create_package_chistics */ + YYSYMBOL_opt_create_package_chistics = 2045, /* opt_create_package_chistics */ + YYSYMBOL_opt_create_package_chistics_init = 2046, /* opt_create_package_chistics_init */ + YYSYMBOL_2047_268 = 2047, /* $@268 */ + YYSYMBOL_package_implementation_executable_section = 2048, /* package_implementation_executable_section */ + YYSYMBOL_package_implementation_declare_section = 2049, /* package_implementation_declare_section */ + YYSYMBOL_package_implementation_declare_section_list1 = 2050, /* package_implementation_declare_section_list1 */ + YYSYMBOL_package_implementation_declare_section_list2 = 2051, /* package_implementation_declare_section_list2 */ + YYSYMBOL_package_routine_lex = 2052, /* package_routine_lex */ + YYSYMBOL_package_specification_function = 2053, /* package_specification_function */ + YYSYMBOL_2054_269 = 2054, /* $@269 */ + YYSYMBOL_package_specification_procedure = 2055, /* package_specification_procedure */ + YYSYMBOL_2056_270 = 2056, /* $@270 */ + YYSYMBOL_package_implementation_routine_definition = 2057, /* package_implementation_routine_definition */ + YYSYMBOL_package_implementation_function_body = 2058, /* package_implementation_function_body */ + YYSYMBOL_2059_271 = 2059, /* $@271 */ + YYSYMBOL_package_implementation_procedure_body = 2060, /* package_implementation_procedure_body */ + YYSYMBOL_2061_272 = 2061, /* $@272 */ + YYSYMBOL_package_implementation_item_declaration = 2062, /* package_implementation_item_declaration */ + YYSYMBOL_opt_package_specification_element_list = 2063, /* opt_package_specification_element_list */ + YYSYMBOL_package_specification_element_list = 2064, /* package_specification_element_list */ + YYSYMBOL_package_specification_element = 2065, /* package_specification_element */ + YYSYMBOL_sp_decl_variable_list_anchored = 2066, /* sp_decl_variable_list_anchored */ + YYSYMBOL_sp_param_name_and_mode = 2067, /* sp_param_name_and_mode */ + YYSYMBOL_sp_param = 2068, /* sp_param */ + YYSYMBOL_sp_param_anchored = 2069, /* sp_param_anchored */ + YYSYMBOL_sf_c_chistics_and_body_standalone = 2070, /* sf_c_chistics_and_body_standalone */ + YYSYMBOL_2071_273 = 2071, /* $@273 */ + YYSYMBOL_sp_tail_standalone = 2072, /* sp_tail_standalone */ + YYSYMBOL_2073_274 = 2073, /* $@274 */ + YYSYMBOL_2074_275 = 2074, /* $@275 */ + YYSYMBOL_drop_routine = 2075, /* drop_routine */ + YYSYMBOL_create_routine = 2076, /* create_routine */ + YYSYMBOL_2077_276 = 2077, /* $@276 */ + YYSYMBOL_2078_277 = 2078, /* $@277 */ + YYSYMBOL_2079_278 = 2079, /* $@278 */ + YYSYMBOL_2080_279 = 2080, /* $@279 */ + YYSYMBOL_2081_280 = 2081, /* $@280 */ + YYSYMBOL_2082_281 = 2082, /* $@281 */ + YYSYMBOL_2083_282 = 2083, /* $@282 */ + YYSYMBOL_opt_sp_decl_body_list = 2084, /* opt_sp_decl_body_list */ + YYSYMBOL_sp_decl_body_list = 2085, /* sp_decl_body_list */ + YYSYMBOL_2086_283 = 2086, /* $@283 */ + YYSYMBOL_sp_decl_non_handler_list = 2087, /* sp_decl_non_handler_list */ + YYSYMBOL_sp_decl_handler_list = 2088, /* sp_decl_handler_list */ + YYSYMBOL_opt_sp_decl_handler_list = 2089, /* opt_sp_decl_handler_list */ + YYSYMBOL_sp_decl_non_handler = 2090, /* sp_decl_non_handler */ + YYSYMBOL_2091_284 = 2091, /* $@284 */ + YYSYMBOL_sp_proc_stmt = 2092, /* sp_proc_stmt */ + YYSYMBOL_sp_labelable_stmt = 2093, /* sp_labelable_stmt */ + YYSYMBOL_sp_proc_stmt_compound_ok = 2094, /* sp_proc_stmt_compound_ok */ + YYSYMBOL_sp_labeled_block = 2095, /* sp_labeled_block */ + YYSYMBOL_2096_285 = 2096, /* $@285 */ + YYSYMBOL_2097_286 = 2097, /* $@286 */ + YYSYMBOL_2098_287 = 2098, /* $@287 */ + YYSYMBOL_opt_not_atomic = 2099, /* opt_not_atomic */ + YYSYMBOL_sp_unlabeled_block = 2100, /* sp_unlabeled_block */ + YYSYMBOL_2101_288 = 2101, /* $@288 */ + YYSYMBOL_2102_289 = 2102, /* $@289 */ + YYSYMBOL_2103_290 = 2103, /* $@290 */ + YYSYMBOL_sp_block_statements_and_exceptions = 2104, /* sp_block_statements_and_exceptions */ + YYSYMBOL_2105_291 = 2105 /* $@291 */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; + + +/* Second part of user prologue. */ +#line 330 "/home/buildbot/git/sql/sql_yacc.yy" + +/* avoid unintentional %union size increases, it's what a parser stack made of */ +static_assert(sizeof(YYSTYPE) == sizeof(void*)*2+8, "%union size check"); +bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); + +#line 2389 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + + +#ifdef short +# undef short +#endif + +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif +#endif + +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; +#else +typedef short yytype_int16; +#endif + +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 +#endif + +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; +#else +typedef short yytype_uint8; +#endif + +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; +#else +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned +# endif +#endif + +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_int16 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YY_USE(E) ((void) (E)) +#else +# define YY_USE(E) /* empty */ +#endif + +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + + +#define YY_ASSERT(E) ((void) (0 && (E))) + +#if !defined yyoverflow + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* !defined yyoverflow */ + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yy_state_t yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYPTRDIFF_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 757 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 108324 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 788 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 1318 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 3833 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 6409 + +/* YYMAXUTOK -- Last valid token kind. */ +#define YYMAXUTOK 1021 + + +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_int16 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 783, 2, 2, 2, 772, 767, 2, + 779, 780, 770, 769, 782, 768, 787, 771, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 786, + 765, 763, 764, 2, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 773, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 784, 766, 785, 774, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, + 756, 757, 758, 759, 760, 761, 762, 775, 776, 777, + 778, 781 +}; + +#if YYDEBUG +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_int16 yyrline[] = +{ + 0, 1975, 1975, 1985, 1984, 2009, 2016, 2018, 2022, 2023, + 2024, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, + 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, + 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, + 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, + 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, + 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, + 2088, 2092, 2099, 2100, 2105, 2104, 2115, 2121, 2123, 2120, + 2132, 2134, 2133, 2143, 2148, 2160, 2159, 2176, 2175, 2185, + 2186, 2190, 2194, 2198, 2202, 2206, 2210, 2220, 2225, 2229, + 2233, 2237, 2241, 2245, 2250, 2254, 2259, 2287, 2291, 2295, + 2300, 2303, 2305, 2306, 2310, 2316, 2318, 2319, 2323, 2329, + 2331, 2332, 2336, 2343, 2347, 2362, 2366, 2372, 2378, 2384, + 2390, 2398, 2402, 2406, 2418, 2421, 2426, 2448, 2460, 2447, + 2483, 2482, 2538, 2545, 2537, 2557, 2564, 2556, 2577, 2583, + 2576, 2595, 2601, 2594, 2613, 2612, 2626, 2624, 2640, 2638, + 2652, 2651, 2662, 2661, 2671, 2678, 2685, 2685, 2688, 2692, + 2693, 2697, 2698, 2702, 2707, 2713, 2719, 2727, 2733, 2739, + 2747, 2755, 2763, 2771, 2779, 2787, 2799, 2815, 2815, 2819, + 2818, 2830, 2831, 2835, 2840, 2845, 2850, 2855, 2860, 2865, + 2873, 2872, 2905, 2904, 2911, 2918, 2919, 2925, 2931, 2941, + 2947, 2953, 2955, 2962, 2963, 2967, 2977, 2978, 2986, 2986, + 3028, 3037, 3038, 3043, 3044, 3045, 3046, 3051, 3056, 3064, + 3065, 3069, 3070, 3075, 3077, 3079, 3081, 3083, 3085, 3087, + 3093, 3094, 3098, 3099, 3104, 3103, 3114, 3113, 3124, 3123, + 3136, 3138, 3141, 3143, 3147, 3151, 3160, 3165, 3165, 3175, + 3176, 3180, 3188, 3190, 3194, 3195, 3199, 3200, 3201, 3206, + 3205, 3217, 3221, 3222, 3226, 3227, 3232, 3238, 3244, 3254, + 3262, 3267, 3275, 3279, 3288, 3286, 3300, 3308, 3313, 3312, + 3326, 3328, 3333, 3343, 3342, 3361, 3362, 3363, 3364, 3369, + 3371, 3376, 3391, 3399, 3403, 3423, 3424, 3428, 3432, 3438, + 3444, 3450, 3456, 3466, 3471, 3479, 3487, 3492, 3498, 3499, + 3505, 3508, 3512, 3520, 3537, 3539, 3557, 3563, 3565, 3567, + 3569, 3571, 3573, 3575, 3577, 3579, 3581, 3583, 3585, 3587, + 3592, 3600, 3616, 3617, 3622, 3628, 3637, 3644, 3653, 3662, + 3667, 3681, 3683, 3685, 3694, 3699, 3706, 3715, 3724, 3726, + 3728, 3730, 3732, 3734, 3736, 3738, 3740, 3742, 3744, 3746, + 3748, 3750, 3755, 3756, 3764, 3776, 3792, 3791, 3802, 3802, + 3824, 3825, 3830, 3829, 3837, 3848, 3853, 3859, 3858, 3865, + 3864, 3873, 3878, 3884, 3883, 3890, 3889, 3899, 3907, 3915, + 3924, 3924, 3947, 3957, 3956, 3977, 3976, 3996, 4002, 4010, + 4011, 4015, 4016, 4017, 4021, 4029, 4034, 4039, 4047, 4048, + 4056, 4074, 4090, 4110, 4115, 4109, 4127, 4129, 4130, 4131, + 4136, 4135, 4206, 4205, 4212, 4217, 4218, 4222, 4223, 4228, + 4227, 4243, 4242, 4257, 4267, 4271, 4272, 4277, 4278, 4282, + 4290, 4295, 4302, 4311, 4325, 4333, 4342, 4341, 4349, 4348, + 4356, 4361, 4368, 4355, 4378, 4377, 4388, 4387, 4397, 4396, + 4406, 4413, 4405, 4428, 4427, 4439, 4441, 4446, 4448, 4450, + 4456, 4455, 4458, 4459, 4473, 4474, 4478, 4479, 4489, 4494, + 4505, 4542, 4543, 4548, 4547, 4563, 4578, 4577, 4599, 4598, + 4604, 4612, 4611, 4614, 4616, 4619, 4618, 4627, 4630, 4629, + 4638, 4639, 4645, 4646, 4663, 4664, 4668, 4669, 4673, 4687, + 4697, 4708, 4717, 4718, 4731, 4733, 4732, 4737, 4735, 4746, + 4747, 4751, 4765, 4777, 4778, 4791, 4800, 4822, 4823, 4826, + 4828, 4833, 4832, 4856, 4868, 4884, 4883, 4898, 4897, 4911, + 4918, 4925, 4945, 4963, 4967, 4994, 5006, 5007, 5012, 5021, + 5011, 5046, 5047, 5051, 5062, 5081, 5094, 5120, 5121, 5126, + 5125, 5162, 5171, 5172, 5176, 5177, 5181, 5182, 5190, 5191, + 5195, 5196, 5200, 5202, 5208, 5214, 5216, 5218, 5220, 5222, + 5224, 5229, 5230, 5230, 5239, 5251, 5254, 5262, 5265, 5275, + 5276, 5280, 5281, 5285, 5286, 5290, 5291, 5292, 5301, 5304, + 5312, 5315, 5322, 5326, 5332, 5334, 5338, 5339, 5343, 5344, + 5345, 5349, 5364, 5369, 5374, 5379, 5384, 5389, 5394, 5409, + 5415, 5430, 5435, 5450, 5456, 5474, 5479, 5484, 5489, 5494, + 5499, 5505, 5504, 5530, 5531, 5532, 5537, 5542, 5547, 5549, + 5551, 5553, 5559, 5564, 5569, 5573, 5578, 5582, 5589, 5596, + 5601, 5608, 5610, 5614, 5633, 5641, 5650, 5660, 5671, 5672, + 5673, 5674, 5675, 5676, 5677, 5681, 5682, 5683, 5687, 5688, + 5689, 5690, 5695, 5702, 5709, 5710, 5714, 5715, 5716, 5717, + 5718, 5722, 5724, 5735, 5734, 5742, 5741, 5749, 5748, 5756, + 5755, 5765, 5762, 5773, 5771, 5780, 5779, 5798, 5806, 5814, + 5822, 5823, 5827, 5837, 5838, 5842, 5843, 5847, 5852, 5851, + 5890, 5889, 5902, 5901, 5912, 5913, 5917, 5918, 5922, 5923, + 5927, 5928, 5932, 5933, 5934, 5935, 5941, 5940, 5948, 5954, + 5963, 5964, 5969, 5972, 5976, 5980, 5987, 5988, 5992, 5993, + 5997, 6003, 6009, 6010, 6018, 6017, 6039, 6040, 6050, 6058, + 6070, 6070, 6073, 6074, 6081, 6088, 6092, 6100, 6101, 6102, + 6106, 6107, 6108, 6109, 6110, 6111, 6119, 6123, 6124, 6138, + 6142, 6146, 6150, 6152, 6159, 6161, 6167, 6168, 6169, 6170, + 6174, 6178, 6183, 6187, 6191, 6195, 6200, 6204, 6211, 6227, + 6228, 6235, 6242, 6250, 6254, 6258, 6262, 6266, 6270, 6274, + 6278, 6280, 6282, 6284, 6286, 6288, 6290, 6292, 6299, 6301, + 6306, 6310, 6311, 6315, 6316, 6320, 6321, 6322, 6323, 6324, + 6328, 6329, 6330, 6331, 6332, 6336, 6342, 6343, 6348, 6350, + 6357, 6358, 6359, 6363, 6367, 6368, 6369, 6370, 6371, 6372, + 6376, 6380, 6381, 6382, 6383, 6386, 6390, 6395, 6396, 6400, + 6401, 6405, 6406, 6411, 6416, 6420, 6426, 6431, 6439, 6440, + 6447, 6451, 6455, 6456, 6460, 6461, 6465, 6466, 6470, 6478, + 6486, 6495, 6499, 6505, 6509, 6510, 6514, 6527, 6533, 6543, + 6544, 6548, 6555, 6559, 6560, 6564, 6565, 6569, 6578, 6582, + 6583, 6587, 6595, 6596, 6600, 6601, 6605, 6606, 6607, 6615, + 6616, 6620, 6624, 6628, 6633, 6634, 6639, 6643, 6649, 6653, + 6660, 6661, 6666, 6665, 6678, 6679, 6683, 6686, 6687, 6688, + 6689, 6693, 6701, 6708, 6709, 6713, 6723, 6724, 6728, 6729, + 6732, 6734, 6738, 6750, 6751, 6755, 6762, 6775, 6776, 6778, + 6780, 6786, 6791, 6797, 6803, 6810, 6820, 6821, 6822, 6823, + 6824, 6828, 6829, 6833, 6834, 6838, 6839, 6843, 6844, 6845, + 6849, 6853, 6865, 6866, 6870, 6871, 6875, 6876, 6880, 6881, + 6885, 6886, 6890, 6891, 6895, 6896, 6901, 6902, 6903, 6907, + 6909, 6914, 6919, 6921, 6925, 6929, 6936, 6937, 6941, 6945, + 6946, 6956, 6957, 6958, 6962, 6963, 6967, 6972, 6980, 6981, + 6989, 6995, 7007, 7008, 7012, 7014, 7024, 7040, 7023, 7063, + 7062, 7079, 7078, 7093, 7102, 7101, 7109, 7108, 7116, 7115, + 7129, 7123, 7137, 7136, 7176, 7175, 7182, 7189, 7197, 7207, + 7188, 7216, 7220, 7228, 7231, 7235, 7239, 7247, 7249, 7250, + 7251, 7252, 7256, 7257, 7258, 7259, 7263, 7264, 7276, 7277, + 7282, 7283, 7286, 7288, 7296, 7304, 7306, 7308, 7309, 7317, + 7318, 7324, 7333, 7331, 7344, 7357, 7356, 7369, 7367, 7380, + 7387, 7397, 7398, 7404, 7416, 7415, 7455, 7462, 7466, 7472, + 7470, 7487, 7489, 7494, 7502, 7501, 7515, 7519, 7518, 7530, + 7531, 7535, 7548, 7549, 7553, 7557, 7564, 7569, 7573, 7580, + 7587, 7591, 7596, 7604, 7612, 7622, 7633, 7643, 7654, 7664, + 7670, 7676, 7683, 7693, 7698, 7704, 7709, 7719, 7724, 7730, + 7735, 7739, 7744, 7745, 7746, 7751, 7756, 7760, 7770, 7772, + 7773, 7774, 7775, 7779, 7784, 7792, 7797, 7805, 7806, 7810, + 7811, 7815, 7815, 7818, 7820, 7824, 7825, 7829, 7830, 7838, + 7839, 7840, 7844, 7845, 7850, 7859, 7860, 7861, 7862, 7867, + 7866, 7876, 7875, 7883, 7890, 7900, 7917, 7920, 7927, 7931, + 7938, 7942, 7946, 7953, 7953, 7959, 7960, 7964, 7965, 7966, + 7970, 7971, 7980, 7987, 7988, 7993, 7992, 8004, 8005, 8006, + 8010, 8012, 8011, 8018, 8017, 8038, 8039, 8043, 8044, 8048, + 8049, 8050, 8054, 8055, 8056, 8061, 8060, 8081, 8082, 8086, + 8091, 8092, 8099, 8101, 8106, 8108, 8107, 8120, 8122, 8121, + 8135, 8136, 8141, 8150, 8151, 8152, 8156, 8163, 8173, 8181, + 8190, 8192, 8191, 8197, 8196, 8219, 8220, 8224, 8225, 8229, + 8230, 8231, 8232, 8233, 8234, 8238, 8239, 8244, 8243, 8264, + 8265, 8266, 8271, 8270, 8281, 8288, 8294, 8303, 8304, 8308, + 8324, 8323, 8336, 8337, 8341, 8342, 8346, 8357, 8368, 8369, + 8374, 8373, 8388, 8389, 8393, 8394, 8398, 8409, 8421, 8420, + 8428, 8428, 8437, 8438, 8443, 8444, 8454, 8453, 8468, 8467, + 8486, 8485, 8502, 8500, 8521, 8522, 8527, 8526, 8540, 8549, + 8539, 8559, 8571, 8635, 8640, 8655, 8656, 8671, 8670, 8686, + 8685, 8698, 8700, 8715, 8723, 8721, 8736, 8754, 8756, 8766, + 8770, 8811, 8820, 8830, 8831, 8835, 8839, 8845, 8852, 8854, + 8863, 8867, 8871, 8878, 8887, 8891, 8898, 8915, 8918, 8926, + 8929, 8936, 8940, 8944, 8948, 8955, 8956, 8960, 8961, 8970, + 8983, 8989, 9000, 9003, 9011, 9014, 9020, 9026, 9035, 9036, + 9037, 9057, 9062, 9084, 9090, 9096, 9102, 9103, 9104, 9105, + 9106, 9110, 9111, 9112, 9116, 9117, 9118, 9122, 9123, 9128, + 9179, 9186, 9229, 9235, 9239, 9245, 9251, 9257, 9263, 9269, + 9275, 9281, 9287, 9293, 9299, 9305, 9309, 9315, 9324, 9330, + 9338, 9344, 9353, 9359, 9367, 9377, 9383, 9390, 9397, 9405, + 9411, 9420, 9424, 9430, 9436, 9442, 9448, 9455, 9461, 9467, + 9473, 9479, 9486, 9492, 9498, 9504, 9510, 9516, 9522, 9528, + 9534, 9538, 9539, 9543, 9544, 9548, 9549, 9553, 9554, 9558, + 9559, 9560, 9561, 9562, 9563, 9567, 9568, 9573, 9576, 9580, + 9581, 9582, 9586, 9587, 9588, 9589, 9590, 9591, 9595, 9596, + 9597, 9601, 9606, 9613, 9635, 9642, 9651, 9652, 9653, 9654, + 9658, 9667, 9668, 9672, 9676, 9677, 9678, 9679, 9680, 9681, + 9682, 9714, 9715, 9716, 9717, 9718, 9719, 9720, 9721, 9722, + 9730, 9738, 9739, 9746, 9752, 9757, 9767, 9772, 9777, 9783, + 9788, 9794, 9805, 9812, 9817, 9822, 9827, 9832, 9837, 9842, + 9850, 9851, 9852, 9853, 9861, 9862, 9871, 9872, 9878, 9882, + 9888, 9894, 9903, 9904, 9913, 9920, 9934, 9940, 9946, 9955, + 9964, 9970, 9976, 9982, 9988, 10003, 10014, 10020, 10026, 10032, + 10038, 10044, 10052, 10059, 10063, 10069, 10077, 10086, 10087, 10091, + 10095, 10102, 10106, 10126, 10133, 10139, 10146, 10153, 10159, 10165, + 10171, 10177, 10184, 10190, 10201, 10208, 10214, 10221, 10227, 10232, + 10237, 10243, 10249, 10254, 10261, 10268, 10276, 10283, 10290, 10297, + 10312, 10318, 10324, 10333, 10344, 10351, 10357, 10365, 10371, 10377, + 10383, 10389, 10397, 10409, 10429, 10428, 10504, 10510, 10516, 10522, + 10527, 10532, 10537, 10542, 10547, 10552, 10572, 10574, 10579, 10580, + 10584, 10585, 10589, 10590, 10594, 10601, 10609, 10636, 10642, 10648, + 10654, 10660, 10666, 10675, 10682, 10684, 10681, 10691, 10702, 10708, + 10714, 10720, 10726, 10732, 10738, 10744, 10750, 10757, 10756, 10777, + 10776, 10807, 10806, 10820, 10829, 10847, 10849, 10851, 10866, 10873, + 10880, 10887, 10894, 10901, 10908, 10915, 10922, 10929, 10940, 10947, + 10958, 10969, 10989, 10988, 10994, 11011, 11017, 11026, 11035, 11045, + 11044, 11056, 11071, 11084, 11089, 11097, 11098, 11103, 11108, 11111, + 11113, 11117, 11122, 11130, 11131, 11136, 11143, 11153, 11152, 11169, + 11171, 11177, 11183, 11189, 11193, 11194, 11195, 11203, 11204, 11205, + 11206, 11207, 11208, 11209, 11210, 11214, 11215, 11216, 11217, 11224, + 11225, 11229, 11234, 11242, 11243, 11247, 11254, 11262, 11271, 11281, + 11282, 11293, 11294, 11306, 11310, 11314, 11322, 11323, 11327, 11331, + 11335, 11342, 11346, 11351, 11352, 11358, 11357, 11386, 11385, 11401, + 11410, 11422, 11434, 11435, 11436, 11437, 11442, 11443, 11444, 11445, + 11446, 11450, 11454, 11458, 11468, 11475, 11483, 11489, 11482, 11535, + 11536, 11542, 11547, 11561, 11569, 11567, 11587, 11585, 11598, 11610, + 11608, 11628, 11627, 11639, 11652, 11650, 11671, 11670, 11683, 11697, + 11698, 11699, 11703, 11704, 11712, 11713, 11717, 11726, 11727, 11728, + 11733, 11734, 11738, 11739, 11743, 11744, 11748, 11749, 11757, 11765, + 11773, 11774, 11787, 11803, 11810, 11822, 11823, 11828, 11832, 11833, + 11834, 11838, 11839, 11844, 11843, 11849, 11848, 11856, 11857, 11860, + 11862, 11862, 11866, 11866, 11871, 11872, 11876, 11878, 11883, 11884, + 11888, 11899, 11913, 11914, 11915, 11916, 11917, 11918, 11919, 11920, + 11921, 11922, 11923, 11924, 11928, 11929, 11930, 11931, 11932, 11933, + 11934, 11935, 11936, 11940, 11941, 11942, 11943, 11946, 11948, 11949, + 11953, 11954, 11958, 11966, 11968, 11972, 11974, 11973, 11987, 11990, + 11989, 12007, 12009, 12013, 12018, 12026, 12027, 12044, 12067, 12068, + 12074, 12075, 12079, 12092, 12091, 12100, 12101, 12110, 12111, 12115, + 12116, 12120, 12121, 12135, 12136, 12140, 12150, 12159, 12166, 12173, + 12183, 12184, 12191, 12201, 12202, 12204, 12206, 12208, 12210, 12219, + 12223, 12224, 12228, 12242, 12243, 12249, 12248, 12259, 12265, 12274, + 12275, 12276, 12282, 12283, 12288, 12295, 12301, 12306, 12317, 12327, + 12338, 12345, 12353, 12363, 12364, 12368, 12369, 12373, 12374, 12379, + 12386, 12393, 12400, 12410, 12415, 12420, 12424, 12430, 12436, 12445, + 12453, 12457, 12464, 12465, 12469, 12474, 12479, 12492, 12496, 12500, + 12504, 12509, 12512, 12516, 12530, 12538, 12549, 12551, 12555, 12556, + 12560, 12561, 12562, 12563, 12564, 12565, 12569, 12570, 12571, 12572, + 12573, 12577, 12578, 12579, 12580, 12584, 12585, 12586, 12587, 12588, + 12592, 12593, 12594, 12595, 12596, 12600, 12605, 12606, 12610, 12611, + 12615, 12616, 12617, 12622, 12621, 12653, 12654, 12658, 12659, 12663, + 12673, 12673, 12685, 12686, 12689, 12709, 12719, 12724, 12732, 12738, + 12749, 12737, 12751, 12766, 12778, 12777, 12800, 12799, 12809, 12808, + 12831, 12837, 12841, 12846, 12845, 12854, 12859, 12865, 12872, 12870, + 12881, 12885, 12886, 12890, 12902, 12915, 12916, 12920, 12934, 12938, + 12947, 12950, 12957, 12958, 12966, 12973, 12965, 12986, 12993, 12985, + 13004, 13013, 13022, 13030, 13031, 13035, 13036, 13040, 13041, 13049, + 13049, 13052, 13052, 13065, 13066, 13068, 13067, 13080, 13086, 13088, + 13092, 13094, 13100, 13104, 13105, 13109, 13110, 13114, 13124, 13125, + 13129, 13130, 13134, 13135, 13139, 13140, 13145, 13144, 13161, 13160, + 13176, 13177, 13181, 13182, 13186, 13191, 13199, 13207, 13218, 13219, + 13228, 13229, 13237, 13239, 13241, 13239, 13251, 13263, 13270, 13280, + 13299, 13269, 13306, 13307, 13311, 13318, 13326, 13327, 13331, 13341, + 13342, 13349, 13348, 13369, 13372, 13379, 13380, 13390, 13405, 13413, + 13426, 13432, 13425, 13437, 13443, 13436, 13451, 13455, 13454, 13488, + 13489, 13493, 13508, 13526, 13527, 13531, 13532, 13536, 13537, 13538, + 13543, 13554, 13542, 13564, 13566, 13569, 13571, 13574, 13575, 13578, + 13582, 13586, 13590, 13594, 13598, 13602, 13606, 13610, 13618, 13621, + 13631, 13630, 13649, 13656, 13664, 13672, 13680, 13688, 13696, 13703, + 13710, 13716, 13718, 13720, 13729, 13733, 13738, 13737, 13744, 13743, + 13750, 13759, 13766, 13771, 13776, 13781, 13786, 13791, 13793, 13795, + 13797, 13804, 13812, 13814, 13822, 13829, 13836, 13844, 13850, 13855, + 13863, 13871, 13879, 13883, 13887, 13894, 13901, 13908, 13915, 13921, + 13927, 13933, 13939, 13945, 13953, 13958, 13965, 13972, 13979, 13986, + 13993, 14000, 14005, 14010, 14015, 14020, 14025, 14037, 14045, 14067, + 14069, 14071, 14076, 14077, 14080, 14082, 14086, 14087, 14091, 14092, + 14096, 14097, 14101, 14102, 14106, 14107, 14111, 14112, 14121, 14133, + 14132, 14151, 14150, 14160, 14161, 14162, 14163, 14164, 14165, 14169, + 14170, 14174, 14181, 14182, 14184, 14185, 14189, 14190, 14203, 14204, + 14205, 14221, 14245, 14244, 14256, 14255, 14267, 14272, 14273, 14286, + 14289, 14288, 14301, 14302, 14307, 14309, 14311, 14313, 14315, 14317, + 14325, 14327, 14329, 14331, 14336, 14338, 14346, 14348, 14350, 14352, + 14354, 14356, 14373, 14374, 14378, 14382, 14395, 14394, 14409, 14419, + 14420, 14423, 14425, 14426, 14430, 14446, 14447, 14452, 14451, 14461, + 14462, 14466, 14466, 14471, 14470, 14476, 14480, 14481, 14485, 14486, + 14493, 14498, 14497, 14512, 14511, 14526, 14527, 14528, 14532, 14533, + 14534, 14543, 14544, 14548, 14552, 14560, 14560, 14565, 14566, 14575, + 14587, 14601, 14612, 14625, 14586, 14636, 14637, 14641, 14642, 14646, + 14647, 14655, 14659, 14660, 14661, 14664, 14666, 14670, 14671, 14675, + 14680, 14687, 14692, 14699, 14701, 14705, 14706, 14710, 14715, 14723, + 14724, 14728, 14730, 14738, 14739, 14743, 14744, 14745, 14749, 14751, + 14756, 14757, 14772, 14773, 14777, 14778, 14782, 14795, 14800, 14805, + 14810, 14818, 14826, 14831, 14839, 14847, 14862, 14869, 14875, 14885, + 14886, 14894, 14895, 14896, 14897, 14911, 14917, 14923, 14929, 14935, + 14941, 14962, 14972, 14982, 14988, 14995, 15005, 15012, 15019, 15030, + 15029, 15054, 15055, 15060, 15061, 15066, 15090, 15093, 15092, 15108, + 15112, 15117, 15121, 15128, 15134, 15143, 15161, 15162, 15166, 15171, + 15179, 15184, 15192, 15197, 15202, 15207, 15213, 15218, 15226, 15231, + 15236, 15241, 15247, 15255, 15256, 15267, 15275, 15279, 15285, 15291, + 15301, 15307, 15316, 15326, 15327, 15331, 15332, 15333, 15337, 15345, + 15346, 15347, 15348, 15352, 15361, 15369, 15377, 15385, 15386, 15394, + 15395, 15399, 15400, 15405, 15414, 15415, 15423, 15424, 15432, 15433, + 15434, 15438, 15449, 15478, 15487, 15487, 15489, 15499, 15500, 15501, + 15502, 15503, 15504, 15505, 15506, 15507, 15508, 15509, 15510, 15515, + 15516, 15517, 15518, 15519, 15520, 15521, 15522, 15523, 15524, 15525, + 15526, 15527, 15531, 15532, 15533, 15534, 15535, 15536, 15537, 15538, + 15539, 15540, 15541, 15542, 15543, 15547, 15548, 15549, 15550, 15551, + 15552, 15553, 15554, 15555, 15556, 15557, 15558, 15559, 15563, 15564, + 15565, 15566, 15567, 15568, 15569, 15570, 15583, 15584, 15585, 15586, + 15587, 15588, 15589, 15590, 15591, 15592, 15593, 15594, 15595, 15596, + 15597, 15598, 15599, 15600, 15601, 15602, 15603, 15604, 15605, 15606, + 15607, 15608, 15609, 15610, 15611, 15612, 15613, 15614, 15615, 15616, + 15617, 15618, 15619, 15620, 15621, 15622, 15623, 15624, 15625, 15626, + 15627, 15628, 15629, 15630, 15631, 15632, 15633, 15634, 15635, 15676, + 15677, 15678, 15679, 15680, 15681, 15692, 15693, 15694, 15695, 15696, + 15697, 15698, 15699, 15700, 15701, 15705, 15706, 15707, 15711, 15712, + 15713, 15722, 15723, 15724, 15725, 15726, 15727, 15728, 15729, 15730, + 15731, 15732, 15733, 15734, 15735, 15736, 15737, 15738, 15739, 15740, + 15741, 15742, 15743, 15744, 15745, 15746, 15747, 15752, 15757, 15758, + 15759, 15760, 15761, 15762, 15763, 15764, 15765, 15766, 15767, 15768, + 15769, 15770, 15771, 15772, 15773, 15774, 15775, 15776, 15777, 15778, + 15779, 15780, 15781, 15782, 15783, 15784, 15785, 15786, 15787, 15788, + 15789, 15790, 15791, 15792, 15793, 15794, 15795, 15796, 15797, 15798, + 15799, 15800, 15805, 15806, 15807, 15808, 15809, 15810, 15811, 15812, + 15813, 15814, 15815, 15816, 15817, 15818, 15819, 15820, 15821, 15822, + 15823, 15824, 15825, 15826, 15827, 15828, 15829, 15830, 15831, 15832, + 15833, 15834, 15835, 15836, 15837, 15838, 15839, 15840, 15841, 15842, + 15843, 15844, 15845, 15846, 15847, 15848, 15849, 15850, 15851, 15852, + 15853, 15854, 15855, 15856, 15857, 15858, 15859, 15860, 15861, 15862, + 15863, 15864, 15865, 15866, 15867, 15868, 15869, 15870, 15871, 15872, + 15873, 15874, 15875, 15876, 15877, 15878, 15879, 15880, 15881, 15882, + 15883, 15884, 15885, 15886, 15887, 15888, 15889, 15890, 15891, 15892, + 15893, 15894, 15895, 15896, 15897, 15898, 15899, 15900, 15901, 15902, + 15903, 15904, 15905, 15906, 15907, 15908, 15909, 15910, 15911, 15912, + 15913, 15914, 15915, 15919, 15920, 15921, 15922, 15923, 15924, 15925, + 15926, 15927, 15928, 15929, 15930, 15931, 15932, 15933, 15934, 15935, + 15936, 15937, 15938, 15939, 15940, 15941, 15942, 15943, 15944, 15945, + 15946, 15947, 15948, 15949, 15950, 15951, 15952, 15953, 15954, 15955, + 15956, 15957, 15958, 15959, 15960, 15961, 15962, 15963, 15964, 15965, + 15966, 15967, 15968, 15969, 15970, 15971, 15972, 15973, 15974, 15975, + 15976, 15977, 15978, 15979, 15980, 15981, 15982, 15983, 15984, 15985, + 15986, 15987, 15988, 15989, 15990, 15991, 15992, 15993, 15994, 15995, + 15996, 15997, 15998, 15999, 16000, 16001, 16002, 16003, 16004, 16005, + 16006, 16007, 16008, 16009, 16010, 16011, 16012, 16013, 16014, 16015, + 16016, 16017, 16018, 16019, 16020, 16021, 16022, 16023, 16024, 16025, + 16026, 16027, 16028, 16029, 16030, 16031, 16032, 16033, 16034, 16035, + 16036, 16037, 16038, 16039, 16040, 16041, 16042, 16043, 16044, 16045, + 16046, 16047, 16048, 16049, 16050, 16051, 16052, 16053, 16054, 16055, + 16056, 16057, 16058, 16059, 16060, 16061, 16062, 16063, 16064, 16068, + 16069, 16075, 16076, 16077, 16078, 16079, 16080, 16081, 16082, 16083, + 16084, 16085, 16086, 16087, 16088, 16089, 16093, 16094, 16095, 16096, + 16100, 16101, 16102, 16103, 16104, 16105, 16110, 16111, 16112, 16113, + 16114, 16115, 16116, 16117, 16118, 16119, 16120, 16121, 16122, 16123, + 16124, 16125, 16126, 16127, 16128, 16129, 16130, 16131, 16132, 16133, + 16134, 16135, 16136, 16137, 16138, 16139, 16140, 16141, 16142, 16143, + 16144, 16145, 16146, 16147, 16148, 16149, 16150, 16151, 16152, 16153, + 16154, 16155, 16156, 16157, 16158, 16159, 16160, 16161, 16162, 16163, + 16164, 16165, 16166, 16167, 16168, 16169, 16170, 16171, 16172, 16173, + 16174, 16175, 16176, 16177, 16178, 16179, 16180, 16181, 16182, 16183, + 16184, 16185, 16186, 16187, 16188, 16189, 16190, 16191, 16192, 16193, + 16194, 16195, 16196, 16197, 16198, 16199, 16200, 16201, 16202, 16203, + 16204, 16205, 16206, 16207, 16208, 16209, 16210, 16211, 16212, 16213, + 16214, 16215, 16216, 16217, 16218, 16219, 16220, 16221, 16222, 16223, + 16224, 16225, 16226, 16227, 16228, 16229, 16231, 16233, 16234, 16235, + 16236, 16237, 16238, 16239, 16240, 16241, 16242, 16243, 16244, 16245, + 16246, 16247, 16248, 16249, 16250, 16251, 16252, 16253, 16254, 16255, + 16256, 16257, 16258, 16259, 16260, 16261, 16262, 16263, 16264, 16265, + 16266, 16267, 16268, 16269, 16270, 16271, 16272, 16273, 16274, 16275, + 16276, 16277, 16278, 16279, 16280, 16281, 16282, 16283, 16284, 16285, + 16286, 16287, 16288, 16289, 16290, 16291, 16292, 16293, 16294, 16295, + 16296, 16297, 16298, 16299, 16300, 16301, 16302, 16303, 16304, 16305, + 16306, 16307, 16308, 16309, 16310, 16311, 16312, 16313, 16314, 16315, + 16316, 16317, 16318, 16319, 16320, 16321, 16322, 16323, 16324, 16325, + 16326, 16327, 16328, 16329, 16330, 16331, 16332, 16333, 16334, 16335, + 16336, 16337, 16338, 16339, 16340, 16341, 16342, 16343, 16344, 16345, + 16346, 16347, 16359, 16358, 16371, 16372, 16374, 16373, 16385, 16384, + 16391, 16389, 16409, 16410, 16415, 16416, 16418, 16417, 16431, 16432, + 16438, 16437, 16442, 16446, 16447, 16448, 16452, 16453, 16454, 16455, + 16459, 16460, 16461, 16462, 16471, 16470, 16484, 16483, 16498, 16497, + 16515, 16514, 16528, 16527, 16541, 16540, 16556, 16555, 16569, 16568, + 16582, 16581, 16594, 16593, 16611, 16610, 16622, 16621, 16633, 16632, + 16643, 16661, 16672, 16679, 16688, 16710, 16726, 16738, 16737, 16751, + 16750, 16762, 16761, 16775, 16776, 16777, 16778, 16782, 16801, 16819, + 16820, 16824, 16825, 16826, 16827, 16832, 16837, 16842, 16853, 16854, + 16855, 16861, 16867, 16879, 16878, 16892, 16893, 16899, 16908, 16909, + 16913, 16914, 16918, 16937, 16938, 16939, 16944, 16945, 16950, 16949, + 16967, 16966, 16978, 16987, 16997, 16996, 17039, 17040, 17044, 17045, + 17049, 17050, 17051, 17052, 17054, 17053, 17066, 17067, 17068, 17069, + 17070, 17076, 17081, 17086, 17091, 17095, 17100, 17109, 17111, 17116, + 17121, 17127, 17133, 17138, 17150, 17151, 17155, 17156, 17160, 17165, + 17173, 17182, 17203, 17203, 17205, 17207, 17211, 17212, 17219, 17221, + 17225, 17230, 17237, 17241, 17250, 17257, 17258, 17259, 17260, 17264, + 17265, 17266, 17267, 17268, 17269, 17270, 17271, 17272, 17273, 17274, + 17275, 17276, 17277, 17278, 17279, 17280, 17281, 17282, 17283, 17284, + 17285, 17286, 17287, 17288, 17289, 17290, 17291, 17292, 17293, 17294, + 17295, 17296, 17297, 17298, 17299, 17300, 17301, 17302, 17303, 17304, + 17305, 17309, 17310, 17314, 17315, 17319, 17326, 17333, 17343, 17352, + 17358, 17365, 17373, 17378, 17386, 17391, 17399, 17404, 17411, 17411, + 17412, 17412, 17415, 17421, 17427, 17432, 17439, 17445, 17452, 17461, + 17465, 17471, 17479, 17481, 17485, 17489, 17493, 17500, 17505, 17510, + 17515, 17520, 17528, 17529, 17533, 17534, 17539, 17540, 17544, 17545, + 17549, 17550, 17554, 17555, 17560, 17559, 17569, 17578, 17579, 17583, + 17584, 17589, 17590, 17591, 17596, 17597, 17598, 17602, 17614, 17623, + 17629, 17638, 17647, 17660, 17662, 17664, 17672, 17673, 17674, 17678, + 17679, 17685, 17686, 17687, 17688, 17689, 17690, 17691, 17701, 17702, + 17707, 17720, 17734, 17735, 17736, 17740, 17741, 17745, 17746, 17751, + 17752, 17756, 17762, 17771, 17771, 17785, 17786, 17787, 17788, 17798, + 17800, 17806, 17812, 17822, 17831, 17837, 17842, 17846, 17820, 17895, + 17895, 17910, 17914, 17918, 17922, 17926, 17930, 17938, 17939, 17955, + 17962, 17969, 17982, 17983, 17984, 17988, 17989, 17990, 17994, 17995, + 18000, 18002, 18001, 18007, 18008, 18012, 18017, 18024, 18029, 18038, + 18044, 18473, 18474, 18478, 18480, 18479, 18493, 18492, 18505, 18504, + 18518, 18522, 18526, 18531, 18532, 18538, 18539, 18540, 18541, 18542, + 18543, 18544, 18545, 18549, 18550, 18551, 18552, 18553, 18554, 18555, + 18556, 18560, 18561, 18562, 18567, 18571, 18580, 18579, 18592, 18598, + 18602, 18612, 18621, 18622, 18623, 18627, 18628, 18629, 18633, 18633, + 18645, 18651, 18652, 18653, 18654, 18655, 18656, 18657, 18658, 18662, + 18663, 18671, 18672, 18678, 18677, 18694, 18693, 18712, 18711, 18735, + 18736, 18740, 18749, 18750, 18754, 18755, 18760, 18759, 18774, 18782, + 18783, 18787, 18788, 18793, 18794, 18799, 18800, 18804, 18805, 18809, + 18813, 18817, 18823, 18813, 18832, 18834, 18839, 18840, 18844, 18845, + 18849, 18849, 18855, 18861, 18869, 18870, 18871, 18877, 18878, 18884, + 18885, 18891, 18902, 18901, 18929, 18928, 18954, 18963, 18972, 18978, + 18977, 18997, 18996, 19016, 19020, 19021, 19025, 19026, 19030, 19037, + 19047, 19055, 19066, 19074, 19079, 19084, 19088, 19093, 19098, 19103, + 19113, 19112, 19127, 19135, 19126, 19149, 19154, 19159, 19164, 19172, + 19185, 19184, 19195, 19193, 19209, 19207, 19221, 19230, 19228, 19250, + 19264, 19269, 19248, 19282, 19286, 19291, 19290, 19299, 19303, 19304, + 19311, 19312, 19319, 19320, 19324, 19325, 19332, 19343, 19342, 19361, + 19362, 19363, 19364, 19365, 19366, 19370, 19371, 19372, 19373, 19374, + 19375, 19376, 19377, 19378, 19379, 19380, 19384, 19385, 19386, 19387, + 19394, 19392, 19408, 19412, 19406, 19428, 19429, 19434, 19433, 19448, + 19454, 19447, 19471, 19469 +}; +#endif + +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) + +#if YYDEBUG || 0 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; + +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"end of file\"", "error", "\"invalid token\"", "'@'", "ABORT_SYM", + "IMPOSSIBLE_ACTION", "FORCE_LOOKAHEAD", "END_OF_INPUT", + "COLON_ORACLE_SYM", "PARAM_MARKER", "FOR_SYSTEM_TIME_SYM", + "LEFT_PAREN_ALT", "LEFT_PAREN_WITH", "LEFT_PAREN_LIKE", + "ORACLE_CONCAT_SYM", "PERCENT_ORACLE_SYM", "WITH_CUBE_SYM", + "WITH_ROLLUP_SYM", "WITH_SYSTEM_SYM", "IDENT", "IDENT_QUOTED", + "LEX_HOSTNAME", "UNDERSCORE_CHARSET", "BIN_NUM", "DECIMAL_NUM", + "FLOAT_NUM", "HEX_NUM", "HEX_STRING", "LONG_NUM", "NCHAR_STRING", "NUM", + "TEXT_STRING", "ULONGLONG_NUM", "AND_AND_SYM", "DOT_DOT_SYM", + "EQUAL_SYM", "GE", "LE", "MYSQL_CONCAT_SYM", "NE", "NOT2_SYM", "OR2_SYM", + "SET_VAR", "SHIFT_LEFT", "SHIFT_RIGHT", "ACCESSIBLE_SYM", "ADD", "ALL", + "ALTER", "ANALYZE_SYM", "AND_SYM", "ASC", "ASENSITIVE_SYM", "AS", + "BEFORE_SYM", "BETWEEN_SYM", "BIGINT", "BINARY", "BIT_AND", "BIT_OR", + "BIT_XOR", "BLOB_MARIADB_SYM", "BLOB_ORACLE_SYM", "BODY_ORACLE_SYM", + "BOTH", "BY", "CALL_SYM", "CASCADE", "CASE_SYM", "CAST_SYM", "CHANGE", + "CHAR_SYM", "CHECK_SYM", "COLLATE_SYM", "CONDITION_SYM", "CONSTRAINT", + "CONTINUE_MARIADB_SYM", "CONTINUE_ORACLE_SYM", "CONVERT_SYM", + "COUNT_SYM", "CREATE", "CROSS", "CUME_DIST_SYM", "CURDATE", + "CURRENT_ROLE", "CURRENT_USER", "CURSOR_SYM", "CURTIME", "DATABASE", + "DATABASES", "DATE_ADD_INTERVAL", "DATE_SUB_INTERVAL", "DAY_HOUR_SYM", + "DAY_MICROSECOND_SYM", "DAY_MINUTE_SYM", "DAY_SECOND_SYM", "DECIMAL_SYM", + "DECLARE_MARIADB_SYM", "DECLARE_ORACLE_SYM", "DEFAULT", + "DELETE_DOMAIN_ID_SYM", "DELETE_SYM", "DENSE_RANK_SYM", "DESCRIBE", + "DESC", "DETERMINISTIC_SYM", "DISTINCT", "DIV_SYM", "DO_DOMAIN_IDS_SYM", + "DOUBLE_SYM", "DROP", "DUAL_SYM", "EACH_SYM", "ELSEIF_MARIADB_SYM", + "ELSE", "ELSIF_ORACLE_SYM", "EMPTY_SYM", "ENCLOSED", "ESCAPED", + "EXCEPT_SYM", "EXISTS", "EXTRACT_SYM", "FALSE_SYM", "FETCH_SYM", + "FIRST_VALUE_SYM", "FLOAT_SYM", "FOREIGN", "FOR_SYM", "FROM", + "FULLTEXT_SYM", "GOTO_ORACLE_SYM", "GRANT", "GROUP_CONCAT_SYM", + "JSON_ARRAYAGG_SYM", "JSON_OBJECTAGG_SYM", "JSON_TABLE_SYM", "GROUP_SYM", + "HAVING", "HOUR_MICROSECOND_SYM", "HOUR_MINUTE_SYM", "HOUR_SECOND_SYM", + "IF_SYM", "IGNORE_DOMAIN_IDS_SYM", "IGNORE_SYM", "IGNORED_SYM", + "INDEX_SYM", "INFILE", "INNER_SYM", "INOUT_SYM", "INSENSITIVE_SYM", + "INSERT", "IN_SYM", "INTERSECT_SYM", "INTERVAL_SYM", "INTO", "INT_SYM", + "IS", "ITERATE_SYM", "JOIN_SYM", "KEYS", "KEY_SYM", "KILL_SYM", + "LAG_SYM", "LEADING", "LEAD_SYM", "LEAVE_SYM", "LEFT", "LIKE", "LIMIT", + "LINEAR_SYM", "LINES", "LOAD", "LOCATOR_SYM", "LOCK_SYM", "LONGBLOB", + "LONG_SYM", "LONGTEXT", "LOOP_SYM", "LOW_PRIORITY", + "MASTER_SSL_VERIFY_SERVER_CERT_SYM", "MATCH", "MAX_SYM", "MAXVALUE_SYM", + "MEDIAN_SYM", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIN_SYM", + "MINUS_ORACLE_SYM", "MINUTE_MICROSECOND_SYM", "MINUTE_SECOND_SYM", + "MODIFIES_SYM", "MOD_SYM", "NATURAL", "NEG", "NESTED_SYM", "NOT_SYM", + "NO_WRITE_TO_BINLOG", "NOW_SYM", "NTH_VALUE_SYM", "NTILE_SYM", + "NULL_SYM", "NUMERIC_SYM", "ON", "OPTIMIZE", "OPTIONALLY", "ORDER_SYM", + "ORDINALITY_SYM", "OR_SYM", "OTHERS_ORACLE_SYM", "OUTER", "OUTFILE", + "OUT_SYM", "OVER_SYM", "PACKAGE_ORACLE_SYM", "PAGE_CHECKSUM_SYM", + "PARSE_VCOL_EXPR_SYM", "PARTITION_SYM", "PATH_SYM", + "PERCENTILE_CONT_SYM", "PERCENTILE_DISC_SYM", "PERCENT_RANK_SYM", + "PORTION_SYM", "POSITION_SYM", "PRECISION", "PRIMARY_SYM", + "PROCEDURE_SYM", "PURGE", "RAISE_ORACLE_SYM", "RANGE_SYM", "RANK_SYM", + "READS_SYM", "READ_SYM", "READ_WRITE_SYM", "REAL", "RECURSIVE_SYM", + "REFERENCES", "REF_SYSTEM_ID_SYM", "REGEXP", "RELEASE_SYM", "RENAME", + "REPEAT_SYM", "REQUIRE_SYM", "RESIGNAL_SYM", "RESTRICT", "RETURNING_SYM", + "RETURN_MARIADB_SYM", "RETURN_ORACLE_SYM", "REVOKE", "RIGHT", + "ROW_NUMBER_SYM", "ROWS_SYM", "ROWTYPE_ORACLE_SYM", + "SECOND_MICROSECOND_SYM", "SELECT_SYM", "SENSITIVE_SYM", "SEPARATOR_SYM", + "SERVER_OPTIONS", "SET", "SHOW", "SIGNAL_SYM", "SMALLINT", "SPATIAL_SYM", + "SPECIFIC_SYM", "SQL_BIG_RESULT", "SQLEXCEPTION_SYM", "SQL_SMALL_RESULT", + "SQLSTATE_SYM", "SQL_SYM", "SQLWARNING_SYM", "SSL_SYM", "STARTING", + "STATS_AUTO_RECALC_SYM", "STATS_PERSISTENT_SYM", + "STATS_SAMPLE_PAGES_SYM", "STDDEV_SAMP_SYM", "STD_SYM", "STRAIGHT_JOIN", + "SUM_SYM", "SYSDATE", "TABLE_REF_PRIORITY", "TABLE_SYM", "TERMINATED", + "THEN_SYM", "TINYBLOB", "TINYINT", "TINYTEXT", "TO_SYM", "TRAILING", + "TRIGGER_SYM", "TRUE_SYM", "UNDO_SYM", "UNION_SYM", "UNIQUE_SYM", + "UNLOCK_SYM", "UNSIGNED", "UPDATE_SYM", "USAGE", "USE_SYM", "USING", + "UTC_DATE_SYM", "UTC_TIMESTAMP_SYM", "UTC_TIME_SYM", "VALUES_IN_SYM", + "VALUES_LESS_SYM", "VALUES", "VARBINARY", "VARCHAR", "VARIANCE_SYM", + "VAR_SAMP_SYM", "VARYING", "WHEN_SYM", "WHERE", "WHILE_SYM", "WITH", + "XOR", "YEAR_MONTH_SYM", "ZEROFILL", "BODY_MARIADB_SYM", + "ELSEIF_ORACLE_SYM", "ELSIF_MARIADB_SYM", "EXCEPTION_ORACLE_SYM", + "GOTO_MARIADB_SYM", "OTHERS_MARIADB_SYM", "PACKAGE_MARIADB_SYM", + "RAISE_MARIADB_SYM", "ROWTYPE_MARIADB_SYM", "ROWNUM_SYM", "REPLACE", + "SUBSTRING", "TRIM", "ACCOUNT_SYM", "ACTION", "ADMIN_SYM", "ADDDATE_SYM", + "AFTER_SYM", "AGAINST", "AGGREGATE_SYM", "ALGORITHM_SYM", "ALWAYS_SYM", + "ANY_SYM", "ASCII_SYM", "AT_SYM", "ATOMIC_SYM", "AUTHORS_SYM", + "AUTOEXTEND_SIZE_SYM", "AUTO_INC", "AUTO_SYM", "AVG_ROW_LENGTH", + "AVG_SYM", "BACKUP_SYM", "BEGIN_MARIADB_SYM", "BEGIN_ORACLE_SYM", + "BINLOG_SYM", "BIT_SYM", "BLOCK_SYM", "BOOL_SYM", "BOOLEAN_SYM", + "BTREE_SYM", "BYTE_SYM", "CACHE_SYM", "CASCADED", "CATALOG_NAME_SYM", + "CHAIN_SYM", "CHANGED", "CHANNEL_SYM", "CHARSET", "CHECKPOINT_SYM", + "CHECKSUM_SYM", "CIPHER_SYM", "CLASS_ORIGIN_SYM", "CLIENT_SYM", + "CLOB_MARIADB_SYM", "CLOB_ORACLE_SYM", "CLOSE_SYM", "COALESCE", + "CODE_SYM", "COLLATION_SYM", "COLUMNS", "COLUMN_ADD_SYM", + "COLUMN_CHECK_SYM", "COLUMN_CREATE_SYM", "COLUMN_DELETE_SYM", + "COLUMN_GET_SYM", "COLUMN_SYM", "COLUMN_NAME_SYM", "COMMENT_SYM", + "COMMITTED_SYM", "COMMIT_SYM", "COMPACT_SYM", "COMPLETION_SYM", + "COMPRESSED_SYM", "CONCURRENT", "CONNECTION_SYM", "CONSISTENT_SYM", + "CONSTRAINT_CATALOG_SYM", "CONSTRAINT_NAME_SYM", "CONSTRAINT_SCHEMA_SYM", + "CONTAINS_SYM", "CONTEXT_SYM", "CONTRIBUTORS_SYM", "CPU_SYM", "CUBE_SYM", + "CURRENT_SYM", "CURRENT_POS_SYM", "CURSOR_NAME_SYM", "CYCLE_SYM", + "DATAFILE_SYM", "DATA_SYM", "DATETIME", "DATE_SYM", "DAY_SYM", + "DEALLOCATE_SYM", "DEFINER_SYM", "DELAYED_SYM", "DELAY_KEY_WRITE_SYM", + "DES_KEY_FILE", "DIAGNOSTICS_SYM", "DIRECTORY_SYM", "DISABLE_SYM", + "DISCARD", "DISK_SYM", "DO_SYM", "DUMPFILE", "DUPLICATE_SYM", + "DYNAMIC_SYM", "ENABLE_SYM", "END", "ENDS_SYM", "ENGINES_SYM", + "ENGINE_SYM", "ENUM", "ERROR_SYM", "ERRORS", "ESCAPE_SYM", "EVENTS_SYM", + "EVENT_SYM", "EVERY_SYM", "EXCHANGE_SYM", "EXAMINED_SYM", "EXCLUDE_SYM", + "EXECUTE_SYM", "EXCEPTION_MARIADB_SYM", "EXIT_MARIADB_SYM", + "EXIT_ORACLE_SYM", "EXPANSION_SYM", "EXPIRE_SYM", "EXPORT_SYM", + "EXTENDED_SYM", "EXTENT_SIZE_SYM", "FAST_SYM", "FAULTS_SYM", + "FEDERATED_SYM", "FILE_SYM", "FIRST_SYM", "FIXED_SYM", "FLUSH_SYM", + "FOLLOWS_SYM", "FOLLOWING_SYM", "FORCE_SYM", "FORMAT_SYM", "FOUND_SYM", + "FULL", "FUNCTION_SYM", "GENERAL", "GENERATED_SYM", "GET_FORMAT", + "GET_SYM", "GLOBAL_SYM", "GRANTS", "HANDLER_SYM", "HARD_SYM", "HASH_SYM", + "HELP_SYM", "HIGH_PRIORITY", "HISTORY_SYM", "HOST_SYM", "HOSTS_SYM", + "HOUR_SYM", "ID_SYM", "IDENTIFIED_SYM", "IGNORE_SERVER_IDS_SYM", + "IMMEDIATE_SYM", "IMPORT", "INCREMENT_SYM", "INDEXES", + "INITIAL_SIZE_SYM", "INSERT_METHOD", "INSTALL_SYM", "INVOKER_SYM", + "IO_SYM", "IPC_SYM", "ISOLATION", "ISOPEN_SYM", "ISSUER_SYM", + "INVISIBLE_SYM", "JSON_SYM", "KEY_BLOCK_SIZE", "LANGUAGE_SYM", + "LAST_SYM", "LAST_VALUE", "LASTVAL_SYM", "LEAVES", "LESS_SYM", + "LEVEL_SYM", "LIST_SYM", "LOCAL_SYM", "LOCKED_SYM", "LOCKS_SYM", + "LOGFILE_SYM", "LOGS_SYM", "MASTER_CONNECT_RETRY_SYM", + "MASTER_DELAY_SYM", "MASTER_GTID_POS_SYM", "MASTER_HOST_SYM", + "MASTER_LOG_FILE_SYM", "MASTER_LOG_POS_SYM", "MASTER_PASSWORD_SYM", + "MASTER_PORT_SYM", "MASTER_SERVER_ID_SYM", "MASTER_SSL_CAPATH_SYM", + "MASTER_SSL_CA_SYM", "MASTER_SSL_CERT_SYM", "MASTER_SSL_CIPHER_SYM", + "MASTER_SSL_CRL_SYM", "MASTER_SSL_CRLPATH_SYM", "MASTER_SSL_KEY_SYM", + "MASTER_SSL_SYM", "MASTER_SYM", "MASTER_USER_SYM", "MASTER_USE_GTID_SYM", + "MASTER_HEARTBEAT_PERIOD_SYM", "MASTER_DEMOTE_TO_SLAVE_SYM", + "MAX_CONNECTIONS_PER_HOUR", "MAX_QUERIES_PER_HOUR", "MAX_ROWS", + "MAX_SIZE_SYM", "MAX_UPDATES_PER_HOUR", "MAX_STATEMENT_TIME_SYM", + "MAX_USER_CONNECTIONS_SYM", "MEDIUM_SYM", "MEMORY_SYM", "MERGE_SYM", + "MESSAGE_TEXT_SYM", "MICROSECOND_SYM", "MIGRATE_SYM", "MINUTE_SYM", + "MINVALUE_SYM", "MIN_ROWS", "MODE_SYM", "MODIFY_SYM", "MONITOR_SYM", + "MONTH_SYM", "MUTEX_SYM", "MYSQL_SYM", "MYSQL_ERRNO_SYM", "NAMES_SYM", + "NAME_SYM", "NATIONAL_SYM", "NCHAR_SYM", "NEVER_SYM", "NEXT_SYM", + "NEXTVAL_SYM", "NOCACHE_SYM", "NOCYCLE_SYM", "NODEGROUP_SYM", "NONE_SYM", + "NOTFOUND_SYM", "NO_SYM", "NOMAXVALUE_SYM", "NOMINVALUE_SYM", + "NO_WAIT_SYM", "NOWAIT_SYM", "NUMBER_MARIADB_SYM", "NUMBER_ORACLE_SYM", + "NVARCHAR_SYM", "OF_SYM", "OFFSET_SYM", "OLD_PASSWORD_SYM", "ONE_SYM", + "ONLY_SYM", "ONLINE_SYM", "OPEN_SYM", "OPTIONS_SYM", "OPTION", + "OVERLAPS_SYM", "OWNER_SYM", "PACK_KEYS_SYM", "PAGE_SYM", "PARSER_SYM", + "PARTIAL", "PARTITIONS_SYM", "PARTITIONING_SYM", "PASSWORD_SYM", + "PERIOD_SYM", "PERSISTENT_SYM", "PHASE_SYM", "PLUGINS_SYM", "PLUGIN_SYM", + "PORT_SYM", "PRECEDES_SYM", "PRECEDING_SYM", "PREPARE_SYM", + "PRESERVE_SYM", "PREV_SYM", "PREVIOUS_SYM", "PRIVILEGES", "PROCESS", + "PROCESSLIST_SYM", "PROFILE_SYM", "PROFILES_SYM", "PROXY_SYM", + "QUARTER_SYM", "QUERY_SYM", "QUICK", "RAW_MARIADB_SYM", "RAW_ORACLE_SYM", + "READ_ONLY_SYM", "REBUILD_SYM", "RECOVER_SYM", "REDOFILE_SYM", + "REDO_BUFFER_SIZE_SYM", "REDUNDANT_SYM", "RELAY", "RELAYLOG_SYM", + "RELAY_LOG_FILE_SYM", "RELAY_LOG_POS_SYM", "RELAY_THREAD", "RELOAD", + "REMOVE_SYM", "REORGANIZE_SYM", "REPAIR", "REPEATABLE_SYM", "REPLAY_SYM", + "REPLICATION", "RESET_SYM", "RESTART_SYM", "RESOURCES", "RESTORE_SYM", + "RESUME_SYM", "RETURNED_SQLSTATE_SYM", "RETURNS_SYM", "REUSE_SYM", + "REVERSE_SYM", "ROLE_SYM", "ROLLBACK_SYM", "ROLLUP_SYM", "ROUTINE_SYM", + "ROWCOUNT_SYM", "ROW_SYM", "ROW_COUNT_SYM", "ROW_FORMAT_SYM", + "RTREE_SYM", "SAVEPOINT_SYM", "SCHEDULE_SYM", "SCHEMA_NAME_SYM", + "SECOND_SYM", "SECURITY_SYM", "SEQUENCE_SYM", "SERIALIZABLE_SYM", + "SERIAL_SYM", "SESSION_SYM", "SERVER_SYM", "SETVAL_SYM", "SHARE_SYM", + "SHUTDOWN", "SIGNED_SYM", "SIMPLE_SYM", "SKIP_SYM", "SLAVE", "SLAVES", + "SLAVE_POS_SYM", "SLOW", "SNAPSHOT_SYM", "SOCKET_SYM", "SOFT_SYM", + "SONAME_SYM", "SOUNDS_SYM", "SOURCE_SYM", "SQL_BUFFER_RESULT", + "SQL_CACHE_SYM", "SQL_CALC_FOUND_ROWS", "SQL_NO_CACHE_SYM", "SQL_THREAD", + "STAGE_SYM", "STARTS_SYM", "START_SYM", "STATEMENT_SYM", "STATUS_SYM", + "STOP_SYM", "STORAGE_SYM", "STORED_SYM", "STRING_SYM", + "SUBCLASS_ORIGIN_SYM", "SUBDATE_SYM", "SUBJECT_SYM", "SUBPARTITIONS_SYM", + "SUBPARTITION_SYM", "SUPER_SYM", "SUSPEND_SYM", "SWAPS_SYM", + "SWITCHES_SYM", "SYSTEM", "SYSTEM_TIME_SYM", "TABLES", "TABLESPACE", + "TABLE_CHECKSUM_SYM", "TABLE_NAME_SYM", "TEMPORARY", "TEMPTABLE_SYM", + "TEXT_SYM", "THAN_SYM", "TIES_SYM", "TIMESTAMP", "TIMESTAMP_ADD", + "TIMESTAMP_DIFF", "TIME_SYM", "TRANSACTION_SYM", "TRANSACTIONAL_SYM", + "THREADS_SYM", "TRIGGERS_SYM", "TRIM_ORACLE", "TRUNCATE_SYM", "TYPE_SYM", + "UDF_RETURNS_SYM", "UNBOUNDED_SYM", "UNCOMMITTED_SYM", "UNDEFINED_SYM", + "UNDOFILE_SYM", "UNDO_BUFFER_SIZE_SYM", "UNICODE_SYM", "UNINSTALL_SYM", + "UNKNOWN_SYM", "UNTIL_SYM", "UPGRADE_SYM", "USER_SYM", "USE_FRM", + "VALUE_SYM", "VARCHAR2_MARIADB_SYM", "VARCHAR2_ORACLE_SYM", "VARIABLES", + "VERSIONING_SYM", "VIA_SYM", "VIEW_SYM", "VISIBLE_SYM", "VIRTUAL_SYM", + "WAIT_SYM", "WARNINGS", "WEEK_SYM", "WEIGHT_STRING_SYM", "WINDOW_SYM", + "WITHIN", "WITHOUT", "WORK_SYM", "WRAPPER_SYM", "WRITE_SYM", "X509_SYM", + "XA_SYM", "XML_SYM", "YEAR_SYM", "CONDITIONLESS_JOIN", "ON_SYM", + "PREC_BELOW_NOT", "'='", "'>'", "'<'", "'|'", "'&'", "'-'", "'+'", "'*'", + "'/'", "'%'", "'^'", "'~'", "SUBQUERY_AS_EXPR", + "PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE", "USER", + "PREC_BELOW_CONTRACTION_TOKEN2", "'('", "')'", "EMPTY_FROM_CLAUSE", + "','", "'!'", "'{'", "'}'", "';'", "'.'", "$accept", "query", "$@1", + "opt_end_of_input", "directly_executable_statement", "verb_clause", + "deallocate", "deallocate_or_drop", "prepare", "$@2", "execute", "$@3", + "$@4", "execute_using", "$@5", "execute_params", "help", "$@6", "change", + "$@7", "master_defs", "master_def", "ignore_server_id_list", + "ignore_server_id", "do_domain_id_list", "do_domain_id", + "ignore_domain_id_list", "ignore_domain_id", "master_file_def", + "optional_connection_name", "connection_name", "optional_for_channel", + "for_channel", "create", "$@8", "$@9", "$@10", "$@11", "$@12", "$@13", + "$@14", "$@15", "$@16", "$@17", "$@18", "$@19", "$@20", "$@21", "$@22", + "$@23", "$@24", "opt_sequence", "sequence_defs", "sequence_def", + "force_lookahead", "server_def", "$@25", "server_options_list", + "server_option", "event_tail", "$@26", "ev_schedule_time", "$@27", + "opt_ev_status", "ev_starts", "ev_ends", "opt_ev_on_completion", + "ev_on_completion", "opt_ev_comment", "ev_sql_stmt", "$@28", + "clear_privileges", "opt_aggregate", "sp_handler", "sp_name", + "sp_a_chistics", "sp_c_chistics", "sp_chistic", "sp_c_chistic", + "sp_suid", "call", "$@29", "$@30", "$@31", "opt_sp_cparam_list", + "opt_sp_cparams", "sp_cparams", "sp_fdparam_list", "$@32", "sp_fdparams", + "sp_param_name", "sp_pdparam_list", "sp_pdparams", "sp_parameter_type", + "sp_parenthesized_pdparam_list", "$@33", "sp_parenthesized_fdparam_list", + "sp_proc_stmts", "sp_proc_stmts1", "optionally_qualified_column_ident", + "row_field_definition", "row_field_definition_list", "row_type_body", + "sp_decl_idents_init_vars", "sp_decl_variable_list", "$@34", + "sp_decl_handler", "$@35", "opt_parenthesized_cursor_formal_parameters", + "sp_cursor_stmt_lex", "sp_cursor_stmt", "$@36", "sp_handler_type", + "sp_hcond_list", "sp_hcond_element", "sp_cond", "sqlstate", "opt_value", + "sp_hcond", "raise_stmt_oracle", "signal_stmt", "signal_value", + "opt_signal_value", "opt_set_signal_information", + "signal_information_item_list", "signal_allowed_expr", + "signal_condition_information_item_name", "resignal_stmt", + "get_diagnostics", "which_area", "diagnostics_information", + "statement_information", "statement_information_item", + "simple_target_specification", "statement_information_item_name", + "condition_number", "condition_information", + "condition_information_item", "condition_information_item_name", + "sp_decl_ident", "sp_decl_idents", "sp_proc_stmt_if", "$@37", + "sp_proc_stmt_statement", "$@38", "RETURN_ALLMODES_SYM", + "sp_proc_stmt_return", "$@39", "sp_proc_stmt_exit_oracle", "$@40", + "$@41", "sp_proc_stmt_continue_oracle", "$@42", "$@43", + "sp_proc_stmt_leave", "sp_proc_stmt_iterate", "sp_proc_stmt_goto_oracle", + "expr_lex", "@44", "assignment_source_lex", "assignment_source_expr", + "$@45", "for_loop_bound_expr", "$@46", "cursor_actual_parameters", + "opt_parenthesized_cursor_actual_parameters", "sp_proc_stmt_with_cursor", + "sp_proc_stmt_open", "sp_proc_stmt_fetch_head", "sp_proc_stmt_fetch", + "sp_proc_stmt_close", "sp_fetch_list", "sp_if", "$@47", "$@48", + "sp_elseifs", "case_stmt_specification", "$@49", "case_stmt_body", + "$@50", "simple_when_clause_list", "searched_when_clause_list", + "simple_when_clause", "$@51", "searched_when_clause", "$@52", + "else_clause_opt", "sp_opt_label", "opt_sp_for_loop_direction", + "sp_for_loop_index_and_bounds", "sp_for_loop_bounds", "loop_body", + "repeat_body", "pop_sp_loop_label", "sp_labeled_control", "$@53", "$@54", + "$@55", "$@56", "$@57", "$@58", "sp_unlabeled_control", "$@59", "$@60", + "$@61", "$@62", "$@63", "trg_action_time", "trg_event", "create_body", + "$@64", "create_like", "opt_create_select", + "create_select_query_expression", "opt_create_partitioning", + "opt_partitioning", "partitioning", "$@65", "have_partitioning", + "partition_entry", "$@66", "partition", "$@67", "part_type_def", "$@68", + "$@69", "$@70", "opt_linear", "opt_key_algo", "part_field_list", + "part_field_item_list", "part_field_item", "part_column_list", + "part_func", "sub_part_func", "opt_num_parts", "opt_sub_part", "$@71", + "$@72", "sub_part_field_list", "sub_part_field_item", "part_func_expr", + "opt_num_subparts", "part_defs", "part_def_list", "opt_partition", + "part_definition", "$@73", "part_name", "opt_part_values", "$@74", + "$@75", "part_func_max", "part_values_in", "part_value_list", + "part_value_item", "$@76", "$@77", "part_value_item_list", + "part_value_expr_item", "opt_sub_partition", "sub_part_list", + "sub_part_definition", "$@78", "sub_name", "opt_part_options", + "part_option_list", "part_option", "opt_subpart_options", + "subpart_option_list", "server_part_option", "opt_versioning_rotation", + "$@79", "opt_versioning_interval_start", "opt_vers_auto_part", "opt_as", + "opt_create_database_options", "create_database_options", + "create_database_option", "opt_if_not_exists_table_element", + "opt_if_not_exists", "create_or_replace", "opt_create_table_options", + "create_table_options_space_separated", "create_table_options", + "create_table_option", "$@80", "engine_defined_option", + "opt_versioning_option", "versioning_option", "default_charset", + "default_collation", "storage_engines", "known_storage_engines", + "row_types", "merge_insert_types", "udf_type", "create_field_list", + "create_field_list_parens", "field_list", "field_list_item", + "column_def", "key_def", "$@81", "$@82", "$@83", "$@84", "$@85", "$@86", + "$@87", "constraint_def", "period_for_system_time", + "period_for_application_time", "opt_check_constraint", + "check_constraint", "opt_constraint_no_id", "opt_constraint", + "constraint", "field_spec", "@88", "field_type_or_serial", "$@89", + "$@90", "opt_serial_attribute", "opt_serial_attribute_list", + "opt_asrow_attribute", "opt_asrow_attribute_list", "field_def", "$@91", + "opt_generated_always", "vcol_opt_specifier", "vcol_opt_attribute", + "vcol_opt_attribute_list", "vcol_attribute", "parse_vcol_expr", "$@92", + "parenthesized_expr", "virtual_column_func", "expr_or_literal", + "column_default_expr", "field_type", "qualified_field_type", "udt_name", + "field_type_all", "field_type_numeric", "opt_binary_and_compression", + "field_type_string", "field_type_temporal", "field_type_lob", + "field_type_misc", "char", "nchar", "varchar", "nvarchar", "int_type", + "real_type", "srid_option", "float_options", "precision", + "field_options", "last_field_options", "field_length_str", + "field_length", "field_scale", "opt_field_length", "opt_field_scale", + "opt_precision", "attribute_list", "attribute", "opt_compression_method", + "opt_compressed", "opt_enable", "compressed", + "compressed_deprecated_data_type_attribute", + "compressed_deprecated_column_attribute", "asrow_attribute", + "serial_attribute", "with_or_without_system", "charset", "charset_name", + "charset_name_or_default", "opt_load_data_charset", + "old_or_new_charset_name", "old_or_new_charset_name_or_default", + "collation_name", "collation_name_or_default", "opt_default", + "charset_or_alias", "opt_binary", "binary", "opt_bin_mod", "ws_nweights", + "$@93", "ws_level_flag_desc", "ws_level_flag_reverse", "ws_level_flags", + "ws_level_number", "ws_level_list_item", "ws_level_list", + "ws_level_range", "ws_level_list_or_range", "opt_ws_levels", + "opt_primary", "references", "opt_ref_list", "ref_list", + "opt_match_clause", "opt_on_update_delete", "delete_option", + "constraint_key_type", "key_or_index", "opt_key_or_index", + "keys_or_index", "fulltext", "spatial", "normal_key_options", + "fulltext_key_options", "spatial_key_options", "normal_key_opts", + "spatial_key_opts", "fulltext_key_opts", "opt_USING_key_algorithm", + "opt_key_algorithm_clause", "key_using_alg", "all_key_opt", + "normal_key_opt", "spatial_key_opt", "fulltext_key_opt", + "btree_or_rtree", "ignorability", "key_list", "opt_without_overlaps", + "key_part", "opt_ident", "string_list", "alter", "$@94", "$@95", "$@96", + "$@97", "$@98", "$@99", "$@100", "$@101", "$@102", "$@103", "$@104", + "$@105", "$@106", "account_locking_option", "opt_password_expire_option", + "opt_account_locking_and_opt_password_expiration", + "ev_alter_on_schedule_completion", "opt_ev_rename_to", "opt_ev_sql_stmt", + "ident_or_empty", "alter_commands", "$@107", "$@108", "$@109", "$@110", + "remove_partitioning", "all_or_alt_part_name_list", "add_partition_rule", + "$@111", "add_part_extra", "reorg_partition_rule", "$@112", + "reorg_parts_rule", "$@113", "alt_part_name_list", "alt_part_name_item", + "alter_list", "add_column", "alter_list_item", + "opt_index_lock_algorithm", "alter_algorithm_option", + "alter_lock_option", "opt_column", "opt_ignore", "alter_options", + "$@114", "alter_options_part2", "alter_option_list", "alter_option", + "opt_restrict", "opt_place", "opt_to", "slave", "$@115", "$@116", + "start", "opt_start_transaction_option_list", + "start_transaction_option_list", "start_transaction_option", + "slave_thread_opts", "$@117", "slave_thread_opt_list", + "slave_thread_opt", "slave_until", "slave_until_opts", "checksum", + "$@118", "opt_checksum_type", "repair_table_or_view", "$@119", "repair", + "$@120", "opt_mi_repair_type", "mi_repair_types", "mi_repair_type", + "opt_view_repair_type", "analyze", "$@121", "analyze_table_list", + "analyze_table_elem_spec", "opt_persistent_stat_clause", + "persistent_stat_spec", "persistent_column_stat_spec", "$@122", + "persistent_index_stat_spec", "$@123", "table_column_list", + "table_index_list", "table_index_name", "binlog_base64_event", + "check_view_or_table", "$@124", "check", "$@125", "opt_mi_check_type", + "mi_check_types", "mi_check_type", "opt_view_check_type", "optimize", + "$@126", "opt_no_write_to_binlog", "rename", "$@127", "rename_list", + "table_to_table_list", "table_to_table", "keycache", "$@128", + "keycache_list_or_parts", "keycache_list", "assign_to_keycache", + "assign_to_keycache_parts", "key_cache_name", "preload", "$@129", + "preload_list_or_parts", "preload_list", "preload_keys", + "preload_keys_parts", "adm_partition", "$@130", "cache_keys_spec", + "$@131", "cache_key_list_or_empty", "opt_ignore_leaves", "select", + "$@132", "$@133", "select_into", "$@134", "$@135", "simple_table", + "table_value_constructor", "$@136", "query_specification_start", "$@137", + "$@138", "query_specification", "select_into_query_specification", + "query_expression", "query_expression_no_with_clause", + "query_expression_body_ext", "$@139", "$@140", + "query_expression_body_ext_parens", "query_expression_body", "$@141", + "query_primary", "query_simple", "subselect", "subquery", + "opt_from_clause", "from_clause", "table_reference_list", + "select_options", "opt_history_unit", "history_point", + "for_portion_of_time_clause", "opt_for_portion_of_time_clause", + "opt_for_system_time_clause", "system_time_expr", "select_option_list", + "select_option", "select_lock_type", "opt_select_lock_type", + "opt_lock_wait_timeout_new", "select_item_list", "select_item", + "remember_tok_start", "remember_name", "remember_end", "select_alias", + "opt_default_time_precision", "opt_time_precision", "optional_braces", + "expr", "boolean_test", "predicate", "bit_expr", "or", "and", "not", + "not2", "comp_op", "all_or_any", "opt_dyncol_type", "dyncol_type", + "numeric_dyncol_type", "temporal_dyncol_type", "string_dyncol_type", + "dyncall_create_element", "dyncall_create_list", "plsql_cursor_attr", + "explicit_cursor_attr", "trim_operands", "trim_operands_regular", + "trim_operands_special", "column_default_non_parenthesized_expr", + "primary_expr", "string_factor_expr", "simple_expr", + "mysql_concatenation_expr", "function_call_keyword_timestamp", + "function_call_keyword", "substring_operands", + "substring_operands_regular", "substring_operands_special", + "function_call_nonkeyword", "function_call_conflict", + "function_call_generic", "@142", "fulltext_options", + "opt_natural_language_mode", "opt_query_expansion", "opt_udf_expr_list", + "udf_expr_list", "udf_expr", "sum_expr", "$@143", "$@144", "$@145", + "$@146", "$@147", "window_func_expr", "window_func", + "simple_window_func", "inverse_distribution_function", + "percentile_function", "$@148", "inverse_distribution_function_def", + "order_by_single_element_list", "window_name", "variable", "$@149", + "variable_aux", "opt_distinct", "opt_gconcat_separator", + "opt_gorder_clause", "gorder_list", "opt_glimit_clause", "glimit_clause", + "glimit_options", "in_sum_expr", "$@150", "cast_type", + "cast_type_numeric", "cast_type_temporal", "opt_expr_list", "expr_list", + "ident_list_arg", "ident_list", "when_list", "when_list_opt_else", + "table_ref", "json_text_literal", "json_text_literal_or_num", + "join_table_list", "json_table_columns_clause", + "json_table_columns_list", "json_table_column", "$@151", "$@152", + "json_table_column_type", "json_table_field_type", + "json_opt_on_empty_or_error", "json_on_response", + "json_on_error_response", "json_on_empty_response", "table_function", + "$@153", "$@154", "esc_table_ref", "derived_table_list", "join_table", + "$@155", "$@156", "$@157", "$@158", "$@159", "$@160", "inner_join", + "normal_join", "opt_use_partition", "use_partition", "table_factor", + "table_primary_ident_opt_parens", "table_primary_derived_opt_parens", + "table_reference_list_parens", "nested_table_reference_list", + "join_table_parens", "table_primary_ident", "table_primary_derived", + "opt_outer", "index_hint_clause", "index_hint_type", + "index_hint_definition", "$@161", "$@162", "index_hints_list", + "opt_index_hints_list", "$@163", "opt_key_definition", "$@164", + "opt_key_usage_list", "key_usage_element", "key_usage_list", + "using_list", "interval", "interval_time_stamp", "date_time_type", + "table_alias", "opt_table_alias_clause", "table_alias_clause", "opt_all", + "opt_where_clause", "$@165", "opt_having_clause", "$@166", + "opt_group_clause", "group_list", "olap_opt", "opt_window_clause", + "window_def_list", "window_def", "window_spec", "$@167", + "opt_window_ref", "opt_window_partition_clause", + "opt_window_order_clause", "opt_window_frame_clause", + "window_frame_units", "window_frame_extent", "window_frame_start", + "window_frame_bound", "opt_window_frame_exclusion", "alter_order_clause", + "alter_order_list", "alter_order_item", "opt_order_clause", + "order_clause", "$@168", "order_list", "order_dir", "opt_limit_clause", + "limit_clause", "fetch_first_clause", "first_or_next", "row_or_rows", + "only_or_with_ties", "opt_global_limit_clause", "limit_options", + "limit_option", "limit_rows_option", "delete_limit_clause", + "order_limit_lock", "opt_order_limit_lock", "query_expression_tail", + "opt_query_expression_tail", "opt_procedure_or_into", "order_or_limit", + "opt_plus", "int_num", "ulong_num", "real_ulong_num", "longlong_num", + "ulonglong_num", "real_ulonglong_num", "dec_num_error", "dec_num", + "choice", "bool", "procedure_clause", "$@169", "procedure_list", + "procedure_list2", "procedure_item", "select_var_list_init", "$@170", + "select_var_list", "select_var_ident", "select_outvar", "into", + "into_destination", "$@171", "$@172", "do", "$@173", "drop", "$@174", + "$@175", "$@176", "$@177", "table_list", "table_name", + "table_name_with_opt_use_partition", "table_alias_ref_list", + "table_alias_ref", "opt_if_exists_table_element", "opt_if_exists", + "opt_temporary", "insert", "$@178", "$@179", "replace", "$@180", "$@181", + "insert_start", "stmt_end", "insert_lock_option", "replace_lock_option", + "insert_replace_option", "opt_into", "insert_table", "$@182", + "insert_field_spec", "$@183", "insert_field_list", "opt_fields", + "fields", "insert_values", "values_list", "ident_eq_list", + "ident_eq_value", "equal", "opt_equal", "opt_with", "opt_by", + "no_braces", "$@184", "no_braces_with_names", "$@185", "opt_values", + "opt_values_with_names", "values", "values_with_names", "expr_or_ignore", + "expr_or_ignore_or_default", "opt_insert_update", "$@186", "$@187", + "update_table_list", "update", "$@188", "$@189", "$@190", "update_list", + "update_elem", "insert_update_list", "insert_update_elem", + "opt_low_priority", "delete", "$@191", "opt_delete_system_time", + "delete_part2", "delete_single_table", "delete_single_table_for_period", + "single_multi", "$@192", "$@193", "$@194", "$@195", "opt_returning", + "$@196", "table_wild_list", "table_wild_one", "opt_wild", + "opt_delete_options", "opt_delete_option", "truncate", "$@197", "$@198", + "opt_table_sym", "opt_profile_defs", "profile_defs", "profile_def", + "opt_profile_args", "show", "$@199", "show_param", "$@200", "$@201", + "show_engine_param", "master_or_binary", "opt_storage", "opt_db", + "opt_full", "from_or_in", "binlog_in", "binlog_from", "wild_and_where", + "describe", "$@202", "$@203", "explainable_command", "describe_command", + "analyze_stmt_command", "opt_extended_describe", "opt_format_json", + "opt_describe_column", "explain_for_connection", "flush", "$@204", + "flush_options", "$@205", "opt_flush_lock", "flush_lock", "$@206", + "flush_options_list", "flush_option", "opt_table_list", "backup", + "backup_statements", "$@207", "opt_delete_gtid_domain", + "delete_domain_id_list", "delete_domain_id", + "optional_flush_tables_arguments", "reset", "$@208", "reset_options", + "reset_option", "$@209", "$@210", "slave_reset_options", + "master_reset_options", "purge", "$@211", "kill", "$@212", "kill_type", + "kill_option", "opt_connection", "kill_expr", "shutdown", "$@213", + "shutdown_option", "use", "load", "$@214", "$@215", "$@216", "$@217", + "data_or_xml", "opt_local", "load_data_lock", "opt_duplicate", + "opt_field_term", "field_term_list", "field_term", "opt_line_term", + "line_term_list", "line_term", "opt_xml_rows_identified_by", + "opt_ignore_lines", "lines_or_rows", "opt_field_or_var_spec", + "fields_or_vars", "field_or_var", "opt_load_data_set_spec", + "load_data_set_list", "load_data_set_elem", "text_literal", + "text_string", "hex_or_bin_String", "param_marker", "signed_literal", + "literal", "NUM_literal", "temporal_literal", "with_clause", "$@218", + "opt_recursive", "with_list", "with_list_element", "opt_cycle", "$@219", + "opt_with_column_list", "with_column_list", "ident_sys_alloc", + "comma_separated_ident_list", "with_element_head", "insert_ident", + "table_wild", "select_sublist_qualified_asterisk", "order_ident", + "simple_ident", "simple_ident_nospvar", "field_ident", "table_ident", + "table_ident_opt_wild", "table_ident_nodb", "IDENT_cli", "ident_cli", + "IDENT_sys", "ident_cli_func", "ident_func", "TEXT_STRING_sys", + "TEXT_STRING_literal", "TEXT_STRING_filesystem", "ident_table_alias", + "ident_cli_set_usual_case", "ident_sysvar_name", "ident", "label_ident", + "ident_or_text", "user_maybe_role", "user_or_role", "user", + "keyword_table_alias", "keyword_ident", "keyword_sysvar_name", + "keyword_set_usual_case", "non_reserved_keyword_udt", + "keyword_sp_var_not_label", "keyword_sp_head", "keyword_verb_clause", + "keyword_set_special_case", "keyword_sysvar_type", "keyword_data_type", + "keyword_cast_type", "keyword_func_sp_var_and_label", + "keyword_func_sp_var_not_label", "keyword_sp_var_and_label", + "reserved_keyword_udt_not_param_type", "set", "$@220", "set_param", + "$@221", "$@222", "$@223", "set_stmt_option_list", + "start_option_value_list_following_option_type", "$@224", + "option_value_list", "option_value", "$@225", "option_type", + "opt_var_type", "opt_var_ident_type", "set_stmt_option", "$@226", + "$@227", "$@228", "option_value_following_option_type", "$@229", "$@230", + "$@231", "option_value_no_option_type", "$@232", "$@233", "$@234", + "$@235", "$@236", "$@237", "$@238", "$@239", "$@240", "$@241", + "transaction_characteristics", "transaction_access_mode", + "isolation_level", "transaction_access_mode_types", "isolation_types", + "text_or_password", "set_expr_or_default", "lock", "$@242", + "opt_lock_wait_timeout", "table_or_tables", "table_lock_list", + "table_lock", "lock_option", "unlock", "$@243", "handler", "$@244", + "handler_tail", "$@245", "handler_read_or_scan", "handler_scan_function", + "handler_rkey_function", "$@246", "handler_rkey_mode", "revoke", + "revoke_command", "admin_option_for_role", "grant", "grant_command", + "opt_with_admin", "opt_with_admin_option", "role_list", "current_role", + "role_name", "grant_role", "opt_table", "grant_privileges", + "opt_privileges", "object_privilege_list", "column_list_privilege", + "column_privilege", "object_privilege", "opt_and", "require_list", + "require_list_element", "grant_ident", "user_list", "grant_list", + "user_and_role_list", "via_or_with", "using_or_as", "grant_user", + "auth_expression", "auth_token", "opt_auth_str", "opt_require_clause", + "resource_option", "resource_option_list", "opt_resource_options", + "opt_grant_options", "opt_grant_option", "grant_option_list", + "grant_option", "begin_stmt_mariadb", "$@247", "compound_statement", + "opt_not", "opt_work", "opt_chain", "opt_release", "commit", "rollback", + "savepoint", "release", "unit_type_decl", "union_option", + "query_expression_option", "definer_opt", "no_definer", "definer", + "view_algorithm", "opt_view_suid", "view_suid", "view_list_opt", + "view_list", "view_select", "$@248", "view_check_option", + "trigger_action_order", "trigger_follows_precedes_clause", + "trigger_tail", "$@249", "$@250", "$@251", "$@252", "$@253", + "sf_return_type", "$@254", "xa", "opt_format_xid", "xid", + "begin_or_start", "opt_join_or_resume", "opt_one_phase", "opt_suspend", + "$@255", "opt_migrate", "install", "uninstall", "keep_gcc_happy", + "_empty", "statement", "sp_statement", "$@256", "$@257", "$@258", + "sp_if_then_statements", "sp_case_then_statements", + "reserved_keyword_udt", "keyword_sp_block_section", "keyword_label", + "keyword_sp_decl", "opt_truncate_table_storage_clause", + "ident_for_loop_index", "row_field_name", "while_body", "$@259", + "for_loop_statements", "sp_control_label", "sp_block_label", + "remember_end_opt", "sp_opt_default", "sp_opt_inout", + "sp_proc_stmts1_implicit_block", "$@260", "remember_lex", + "keyword_directly_assignable", "ident_directly_assignable", + "ident_cli_directly_assignable", "set_assign", "$@261", "$@262", "$@263", + "labels_declaration_oracle", "label_declaration_oracle", + "opt_exception_clause", "exception_handlers", "exception_handler", + "$@264", "sp_no_param", "opt_sp_parenthesized_fdparam_list", + "opt_sp_parenthesized_pdparam_list", "opt_sp_name", + "opt_package_routine_end_name", "sp_tail_is", "sp_instr_addr", "sp_body", + "$@265", "$@266", "$@267", "create_package_chistic", + "create_package_chistics", "opt_create_package_chistics", + "opt_create_package_chistics_init", "$@268", + "package_implementation_executable_section", + "package_implementation_declare_section", + "package_implementation_declare_section_list1", + "package_implementation_declare_section_list2", "package_routine_lex", + "package_specification_function", "$@269", + "package_specification_procedure", "$@270", + "package_implementation_routine_definition", + "package_implementation_function_body", "$@271", + "package_implementation_procedure_body", "$@272", + "package_implementation_item_declaration", + "opt_package_specification_element_list", + "package_specification_element_list", "package_specification_element", + "sp_decl_variable_list_anchored", "sp_param_name_and_mode", "sp_param", + "sp_param_anchored", "sf_c_chistics_and_body_standalone", "$@273", + "sp_tail_standalone", "$@274", "$@275", "drop_routine", "create_routine", + "$@276", "$@277", "$@278", "$@279", "$@280", "$@281", "$@282", + "opt_sp_decl_body_list", "sp_decl_body_list", "$@283", + "sp_decl_non_handler_list", "sp_decl_handler_list", + "opt_sp_decl_handler_list", "sp_decl_non_handler", "$@284", + "sp_proc_stmt", "sp_labelable_stmt", "sp_proc_stmt_compound_ok", + "sp_labeled_block", "$@285", "$@286", "$@287", "opt_not_atomic", + "sp_unlabeled_block", "$@288", "$@289", "$@290", + "sp_block_statements_and_exceptions", "$@291", YY_NULLPTR +}; + +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) +{ + return yytname[yysymbol]; +} +#endif + +#define YYPACT_NINF (-5620) + +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) + +#define YYTABLE_NINF (-3833) + +#define yytable_value_is_error(Yyn) \ + 0 + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const int yypact[] = +{ + 40187, -5620, -5620, 95170, -5620, -5620, 2648, 1295, 95170, -5620, + 156, -5620, 1258, -5620, -5620, -5620, -5620, -5620, 4411, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 155, 427, -5620, -5620, + 409, -5620, -5620, -5620, -5620, 691, 81091, 1202, 627, -5620, + 84796, -5620, -5620, -5620, -5620, 84796, -5620, -5620, 95170, -5620, + -5620, 1314, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 640, -5620, 1809, 2579, -5620, -5620, -5620, -5620, -5620, -5620, + 1887, -5620, -5620, -5620, -5620, -5620, -5620, 427, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 1366, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 1751, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 95911, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 395, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 1946, -5620, -5620, + -5620, -5620, -5620, 208, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 53, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 95170, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 409, -5620, -5620, -5620, 1702, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 1366, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 95170, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 238, -5620, + -5620, 268, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 71, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 2631, -5620, + -5620, 137, 2400, 2481, -5620, -5620, 1929, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 2997, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 2407, + -5620, -5620, -5620, -5620, 3803, 1923, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 48366, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 137, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 214, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 1735, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 96652, 95170, 1771, 1789, 95170, 2491, 81832, 2491, + -5620, 118, -5620, -5620, 2266, -5620, 1939, -5620, 427, 2443, + 1902, 2398, 2701, 969, 2409, 82573, 1275, 2491, -5620, 2133, + 2491, 2491, 2491, 2491, 2491, 2491, -5620, 2491, 2491, 1074, + 104062, 69976, -5620, -5620, 952, 2586, -5620, -5620, -5620, -5620, + -5620, -5620, 5802, 427, 24152, 2690, -5620, -5620, 2250, 4706, + 2041, -5620, 2512, -5620, -5620, 95170, -5620, 2491, 5802, -5620, + 2512, 70717, 3531, 52082, 7775, 2512, 427, 2606, -5620, 2037, + -5620, -5620, -5620, -5620, -5620, -5620, 95170, -5620, 1366, -5620, + -5620, 2489, -5620, -5620, 81832, -5620, -5620, -5620, -5620, -5620, + 2785, 24152, 252, 2547, -5620, -5620, 2442, 49107, 81832, 2736, + 2701, 2753, -5620, 1899, 530, -5620, 2153, 2245, 2701, 416, + 2264, 2701, 2669, 2491, 2491, -5620, -5620, 2759, 2759, 2759, + 2509, 2759, -5620, 2759, 2851, 2235, 353, -5620, -5620, 2217, + 95170, 2736, -5620, 2736, -5620, 2877, 2736, 2736, 2366, 2884, + 2889, 199, 2494, 1766, 1766, 2266, 43920, 398, 2711, -5620, + 2851, 1689, 2138, 2054, 2054, 2054, 1689, 137, 1689, -5620, + 3033, 1939, 2940, 95170, -5620, 2946, -5620, 2268, -5620, -5620, + -5620, 95170, 95170, 279, -5620, 2343, -5620, 2319, 62, 72199, + -5620, 2968, -5620, -5620, -5620, -5620, -5620, -5620, 2834, 351, + 2466, 2693, 2395, -5620, 2892, 81832, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 95170, 2360, -5620, -5620, 24152, 3038, + 2398, -5620, 2886, -5620, -5620, -5620, -5620, 49107, -5620, -5620, + -5620,104062, -5620, -5620, -5620, 1476, 67012, -5620, 2386, 2706, + -5620, 2399, 1506, 1544, -5620, -5620, 1582, 1640, 1659, -5620, + -5620, -5620, 1761, -5620, -5620, -5620,103321, 1649, 2391, -5620, + -5620, 3056, -5620, -5620, 85537, 358, 95170, 3054, 2491, 95170, + 95170, 95170, 95170, 95170, -5620, 81832, -5620, -5620, 2491, 2491, + -5620, -5620, 3055, -5620, 2611, 2565, 2084, 2444, 2777, -5620, + 2645, -5620, 2478, 2556, 2687, 2492, 2506, 2535, 224, -5620, + 2519, -5620, 1226, 2941, 332, 376, 2959, 378, 412, 3098, + 2969, 425, 174, 446, 2757, 482, -5620, -5620, -5620, -5620, + 2992, 3104, 2529, -5620, 2536, -5620, 3042, 2906, 344, -5620, + -5620, 198, 2983, 1370, 49107,106095,104803, 83314,106095,106095, + 106095, -5620, -5620, 280, 95170,105449, 95170, 7384, -5620, -5620, + 41697, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 95170, -5620, -5620, -5620, -5620, -5620, -5620, 1757, 1329, 8291, + -5620, 2560, -5620, -5620, -5620, -5620, -5620, 86278, -5620, 223, + 254, 3076, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 30304, 2576, 2602, 2603, 19538, 2615, 2619, + 2629, 2636, 2640, 2444, 2444, 2444, 2641, 2644, 2667, 2671, + 2704, 2712, 2713, -5620, 2721, 2733, 2738, 2739, 2749, 2760, + 24921, 2766, 2770, 2775, 37938, 2776, 2780, 2784, 2819, 24152, + 2641, 2823, 2827, -5620, 2830, 2855, 2860, 2866, 2882, 2890, + 2893, 2900, 3354, 2907, 2908, 2919, 2923, -5620, 2444, 2641, + 2641, 2932, 2938, 2444, 2949, 2955, 2960, 2973, 2978, 2989, + 2999, 3000, 3006, 3007, 3011, 3012, 308, 3013, 3020, 3025, + 3026, 3027, 3028, 3030, 2674, 3031, 3032, 3041, 2742, 3043, + 3046, 3049, 3050, 317, 3052, 3053, 318, 3058, 3064, 3065, + 3068, 3070, 3077, 3084, 31073, 31842, 30304, 17231, -5620, 95170, + 97393, -5620, -5620, 3307, 2189, 3138, 1725, 30304, -5620, -5620, + -5620, 3351, -5620, 3389, -5620, -5620, -5620, -5620, 3283, 3294, + -5620, 3311, -5620, -5620, 3320, 2813, -5620, 3505, -5620, -5620, + -5620, -5620, -5620, 2789, -5620, 3085, 3598, 3620, 3086, 3087, + -5620, -5620, 496, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 2980, 2903, -5620, 3505, + -5620, -5620, 75163, -5620, 5448, -5620, -5620, 2611, 3234, 3522, + -5620, 3689, -5620, 3618, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 3531, -5620, -5620, 53586, + 3612, 880, -5620, -5620, 339, -5620, 404, 475, 65530, -5620, + 389, 66271, 489, 87019, 1128, -5620, 72940, -5620, 517, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3089, + -5620, 3202, 3416, 3100, 2751, 1876, -5620, -5620, 236, 957, + 3189, 93, -5620, 1005, -5620, 1876, -5620, 75904, 356, 2279, + -5620, 981, -5620, 3764, -5620, -5620, 3204, 3191, 3217, -5620, + 3066, -5620, 2701, -5620, 375, -5620, 356, 1876, 2279, -5620, + 3392, 3470, 1076, 3416, -5620, -47, -5620, -5620, -5620, 3760, + -5620, 3122, -5620, 3728, -5620, 95170, 391, 49107, -5620, -5620, + -5620, -5620, 3124, 49107, 49107, 1159, 1160, 3307, 3125, 24152, + -5620, -5620, 4138, 55842, 3328, 1578, 7, -5620, -5620, 1809, + 95170, -5620, -5620, 1055, -5620, 3558, -5620, 3143, -5620, 98134, + 1160, 3796, -5620, -5620, -5620, 852, 3533, -5620, 3146, -5620, + -5620, -5620, -5620, 49107, 95170, 2701, -5620, -5620, -5620, -5620, + 3147, -5620, -5620, 3356, 3239, -5620, 3176, -5620, -5620, 230, + -5620, -5620, 3933, -5620, 95170, -5620, 2736, -5620, -5620, 2736, + -5620, -5620, -5620, 2736, 2736, 2237, 2736, -5620, -5620, 3203, + -5620, 3485, 3490, 2892, -5620, 3175, 43179, 95170, 3950, -5620, + 3969, -5620, -5620, -5620, 3180, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 3749, 3936, 3936, -5620, 54338, -5620, -5620, + 3839, 2711, 1052, 3681, 57346, 3827, 3916, 59602, -5620, 356, + -5620, -5620, -5620, -5620, 553, 95170, -5620, 553, 553, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 137, -5620, -5620, 2443, 3608, 73681, 95170, 1689, 2138, + 18769, 3962, 3964, -5620, -5620, -5620, 2701, 430, 3594, -5620, + 95170, -5620, -5620, -5620, 2444, 4004, -5620, -5620, -5620, -5620, + -5620, 49107, 3429, 72199, 2491, -5620, -5620, -5620, 351, -5620, + 1915, 95170, 49107, 3265, -5620, 49107, 3226, 24152, -5620, -5620, + 3703, 3307, -5620, 3588, -5620, -5620, 49107, 1840, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 3237, -5620, -5620, -5620, 3237, 925, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3238, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 3798, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3238, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 218, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 3635, 3093, 1220, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 3635, -5620, 1220, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3238, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 3248, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 3635, -5620, 1220, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 3237, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 3237, -5620, -5620, 1220, 3237, -5620, 3249, 3238, 3635, + 1359, 1900, 3238, -5620, -5620, 3237, 3251, 3237, 3237, 3237, + 3237, -5620, 3237, 4019, 3252, -5620, 3238, -5620, -5620, -5620, + -5620, -5620, -5620, 130, 3237, 3237, 3237, 3237, 3256, 222, + -5620, 229, 249, 250, 253, 264, 265, -5620, -5620, -5620, + -5620, 3909, 95170, 3911, -5620, 3692, 1649, 3255, 3259, -5620, + 49107, 3988, 49107, 3921, 2711, -5620, 3269, -5620, 3268, -5620, + -5620, 3938, 95170, 95170, -5620, -5620, -5620, -5620, 3273, 76645, + -5620, 75163, 49107, -5620, -5620, 3888, 3430, -5620, -5620, -5620, + -5620, -5620, -5620, 3371, -5620, -5620, 3296, -5620, -5620, -5620, + -5620, 3744, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 75163, -5620, -5620, 3746, 3747, -5620, 72199, 2129, 8165, 97393, + -5620, 3940, -5620, -5620, -5620, 3760, -5620, -5620, 25690, -5620, + 26459, -5620, -5620, -5620, 3577, 1363, 823, -5620, -5620, -5620, + -5620, -5620, -5620, 4040, -5620, -5620, -5620, -5620, -5620, -5620, + 3774, 95170, 3526, 3961, 3942, -5620, -5620, -5620, -5620, -5620, + 3779, 3315, 3920, 3313, -5620, -5620, 275, -5620, 3321, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 49107, + 55090, -5620, -5620, -5620, 3323, -5620, -5620, -5620, 3326, 30304, + 30304, -5620, 4064, 4064, 4064, 24152, 3016, 473, 3686, 24152, + 24152, 24152, 2309, 3335, -5620, -5620, -5620, 396, -5620, 24152, + 24152, 38685, 3338, 520, 5444, 24152, 4002, 4002, -5620, 24152, + 24152, 17231, 4773, 24152, 24152, 24152, 97393, 38685, 3778, 3337, + -5620, 3333, 2373, 24152, 2378, 24152, -5620, -5620, 24152, 24152, + 24152, 24152, 3341, 32611, 3343, 24152, 24152, 3345, 3480, 4064, + 4064, 2401, 436, -5620, -5620, -5620, 4064, 4064, -5620, 24152, + 24152, 18000, 24152, 24152, 2413, 24152, 24152, 24152, 24152, 24152, + 24152, -5620, 24152, 24152, 1611, 24152, 24152, 49107, 24152, 24152, + 4003, 49107, 24152, 24152, 4005, 24152, 24152, 49107, 24152, -5620, + 24152, 3626, 3626, -5620, 24152, 18000, 24152, 3349, 39432, 24152, + 24152, 24152, 24921, -5620, 24921, -5620, -5620, 3353, 2883, 545, + 137, 24152, 3350, -5620, -5620, -5620, -5620, 24152, 24152, 24152, + 32611, -5620, -5620, -5620, 670, -5620, -5620, -5620, 27228, 32611, + 3357, 32611, 32611, 3971, 2265, 32611, 32611, 32611, 32611, 32611, + 32611, 32611, 33380, 34149, 32611, 32611, 32611, 32611, -5620, 81832, + 30304, 51330, 3360, 4006, -5620, 77386, -5620, 1588, 1061, -5620, + 2701, 4706, 35687, -5620, 3359, -5620, 3856, 49107, -5620, 3362, + 4022, 75163, 72199, 2129, 3380, -5620, 1529, 276, -5620, 76645, + 95170, -5620, -5620, -5620, 4078, 24152, -5620, -5620, -5620, -5620, + -5620, 3365, 533, 3372, -5620, 1176, -5620, -5620, -5620, -5620, + -5620, 95170, -5620, 87760, 52834, 3467, 4029, 3397, 2736, 88501, + 95170, 49107, 95170, 98875, 95170, 95170, 49107, 75163, 49107, -5620, + -5620, -5620, 1020, 1876, 95170, 1876, 2279, 1036, 1876, 4008, + -5620, -5620, 1029, 1029, -5620, -5620, -5620, -5620, -5620, -5620, + 1876, 95170, 95170, 1876, 72199, -5620, 2279, 1847, -5620, 3683, + 3475, -5620, -5620, -5620, 3726, -5620, -5620, 4052, 3398, -5620, + 3750, -5620, 3493, -5620, -5620, 49107, -5620, -5620, 2279, -5620, + 2279, 2279, 4055, 1876, 1876, 1876, -5620, 44661, 3404, 3407, + -5620, 3405, -5620, 3409, -5620, 4035, -5620, -5620, -5620, 3765, + 4190, 4043, 3426, -5620, -5620, 3974, 63, -5620, 3851, -5620, + 3976, -5620, 24152, 3307, 20307, 3709, -5620, -5620, 3710, 3711, + 3712, -5620, -5620, -5620, -5620, 3857, 3713, -5620, 2701, 3714, + -5620, -5620, -5620, 3443, -5620, -5620, -5620, 81832, 35687, -5620, + 3444, -5620, 3464, -5620, 271, -5620, -5620, 4108, 3553, 24152, + -5620, -5620, 49107, 3945, -5620, 2701, 1899, 95170, -5620, -5620, + 4186, -5620, 1828, 4107, -5620, -5620, 3564, 416, -5620, 4107, + 1019, -5620, -5620, 2759, 3645, -5620, -5620, -5620, 81832, -5620, + -5620, -5620, -5620, -5620, -5620, 95170, -5620, 76645, 72199, 81832, + 2736, 2736, -5620, 49107, 2736, 95170, -5620, -5620, -5620, 2736, + 2736, 2736, 3507, -5620, 2186, 3482, 3483, 3486, 3487, 2014, + 3491, 45402, 2414, 4772, 4112, 4115, -5620, 4065, 3039, 4065, + -5620, -5620, 45402, 44661, 3497, 3950, -5620, -5620, -5620, -5620, + 81832, 3498, -5620, -5620, 3492, -5620, 24152, 4219, 4149, 3839, + -5620, -5620, 58098, 1518, 86278, -5620, -5620, -5620, 3848, 4037, + 993, -5620, 3502, 3630, -5620, 190, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 24152, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 30304, 2671, -5620, 3307, -5620, -5620, -5620, -5620, + -5620, 276, 260, -5620, -5620, -5620, 466, 3872, 1643, -5620, + -5620, 81832, 1643, -5620, 3516, 3817, -5620, 3819, 147, -5620, + 49107, -5620, -5620, -5620, -5620, -5620, 49107, 3518, -5620, 3715, + 95170, 2360, 3524, 3523, 3307, 4026, -5620, 3703, -5620, -5620, + -5620, 5802, 4243, 5776, 164, 3581, -5620, -5620, -5620, -5620, + -5620, 49107, -5620, -5620, 1857, 3549, 2897, -5620, -5620, -5620, + 3635, 276, 3635, -5620, -5620, 2931, 1086, -5620, -5620, -5620, + 1086, -5620, 435, 3612, 78127, 3635, -5620, -5620, -5620, -5620, + 4020, 1220, 1750, 78868, 2573, 3941, -5620, -5620, -5620, 1086, + 2759, -5620, -5620, 3635, -5620, -5620, -5620, 2759, 1086, -5620, + 4023, -5620, -5620, -5620, 1086, 3635,104062, 2023, 1220, -5620, + -5620, 1220, 1086, 534, 95170, 2023, 4097, -5620, 1750, 4279, + 1220, 3635, 1086, 4307, -5620, 1086, -5620, -5620, 220, -5620, + -5620, 1649, -5620, -5620, -5620, 3749, 3637, -5620, 3556, -5620, + -5620, 915, 4121, -5620, -5620, 4141, 95170, 4220, 61084, -5620, + -5620, 4146, -5620, 95170, 3569, -5620, -5620, 3570, 188, 49107, + 49107, 5802, -5620, -5620, 3574, -5620, -5620, -5620, 4068, -5620, + -5620, 85, 4293, -5620, -5620, -5620, 46143, 46143, 1226, 2941, + -5620, -5620, 2959, -5620, -5620, 2969, -5620, 174, -5620, 2757, + -5620, -5620, -5620, -5620, 2067, -5620, -5620, -5620, 4035, 24152, + 50589, 3307, -5620, -5620, 49107, -5620, 4211, -5620, -5620,101839, + 145, -5620, -5620, 256, 49107, -5620, -5620, -5620, -5620, 4206, + 3717, 95170, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 95170, + 2360, -5620, 95170,104062, 5802, 5802, -5620, 82573, -5620, 1305, + 1529, -5620, 4319, 97393, 24152, -5620, 3583, -5620, 3584, 3587, + 3029, 3943, 24152, 24152, -5620, 2810, 83, 452, -5620, 3589, + 3603, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3596, + -5620, -5620, 555, 560, 3602, -5620, -5620, -5620, 3604, 137, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 4240, -5620, 270, -5620, -5620, -5620, 24152, 567, 1171, 1172, + 3614, 406, 457, 1199, 3323, 2090, 3607, 38685, 97393, 4064, + 3610, 493, 4064, 3616, 1218, 1297, 602, 1522, 1696, -5620, + 1156, -5620, 1317, 1335, -5620, -5620, 3619, 3622, 4064, 3623, + -5620, 3624, 3627, 3631, 1430, 462, 3632, -5620, -5620, 21076, + 21845, 22614, 3141, 3633, -5620, -5620, 1466, 1838, 4064, 3636, + 1974, 1527, 1642, -5620, 2114, 1644, 1701, 3638, 3125, 2113, + 2273, -5620, -5620, -5620, -5620, 3640, 2296, 2318, 3643, 3646, + 2342, 2348, 49107, 3647, 3648, 2361, 49107, 1707, 2390, 3649, + 1708, 463, 3650, 3653, 2408, 3659, 1738, -5620, 97393, 95170, + 3661, 3655, 292, 3663, 2418, 4773, 4773, -5620, 24152, 3664, + 363, 97393, 2564, 1384, -5620, 3138, -5620, -5620, -5620, -5620, + 207, -5620, 3641, 3138, 3651, 3282, 17231, -5620, 1262, 1809, + 32611, 32611, 3666, 32611, 32611, 1524, 540, 540, 3678, 3678, + 1222, 620, 24921, 1524, 24921, 1524, 3678, 3678, 3678, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 4229, 3674, 3677, + 3684, 3687, -70, 3682, -5620, -5620, -5620, -5620, -5620, -5620, + 58, 4089, -5620, 3878, 1328, 24152, -5620, 3718, 4439, 4440, + 4441, -5620, -5620, -5620, -5620, 75163, 75163, 3693, -5620, 1019, + 4047, 4345, 76645, 4349, -5620, 3696, 46143, 46143, -5620, 3697, + -5620, 24152, 3695, 3702, 3704, 99616, -5620, 4357, 276, 79609, + 3307, 75163, 334, 18769, 95170, 95170, -5620, 87019, 4363, 868, + 3989, -5620, 3719, 3721, -5620, 276, 18769, 3720, 1229, 535, + -5620, 3722, 3727, -5620, -5620, -5620, -5620, 24152, 3731, 95170, + 95170, -5620, -5620, -5620, -5620, 95170, -5620, -5620, -5620, -5620, + -5620, -5620, 2701, 24152, 95170, 1876, -5620, -5620, -5620, 1876, + 95170, 1876, -5620, 2701, 4369, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 1876, -5620, -5620, -5620, -5620, + -5620, 3899, 356, 3066, 4008, 4107, 2279, 49107, 1876, 1876, + 24152, -5620, -5620, -5620, -5620, 4257, 3749, 20307, 3736, 3735, + -5620, -5620, 5802, 95170, 97393, 4465, -5620, -5620, 7227, -5620, + 81832, 89242, 49107, -5620, -5620, -5620, 2474, -5620, -5620, -5620, + -5620, -5620, 3307, 2547, 2671, -5620, 3738, 3307, -5620, -5620, + 4421, -5620, -5620, -5620, -5620, 2701, -5620, -5620, 4518, -5620, + 49107, -5620, -5620, 56594, 56594, 1926, -5620,100357, -5620, 2701, + 3307, 49107, 1537, 256, -5620, 4475, -5620, -5620, 3859, -5620, + -5620, -5620, 3751, -5620, 4161, -5620, -5620, -5620, -5620, -5620, + -5620, 3753, -5620, 4400, -5620, 2147, 200, 95170, 524, 147, + -5620, 95170, 95170, 49107, -5620, 95170, -5620, 95170, 2736, -5620, + -5620, 2736, 49107, 95170, 95170, 2736, 24152, 45402, -5620, -5620, + -5620, -5620, -5620, 45402, -5620, 2756, -5620, 3956, 2017, 2017, + -5620, -5620, -5620, -5620, -5620, 4382, 4065, 4065, 45402, 4384, + 4184, -5620, 95170, 4387, 490, -5620, 54338, 95170, 3307, 24152, + -5620, 3793, 4149, -5620, 211, 244, 190, -5620, 4039, 256, + -5620, -5620, 59602, 4105, 59602, 59602, 97393, 3998, 24152, -5620, + 4427, 3782, 3307, 18769, 18769, 2147, 2701, -5620, 276, 276, + 4001, 4296, 4297, 3906, 2701, 4298, 4299, 4301, -5620, -5620, + -5620, -5620, -5620, 3272, 2101, 227, 1204, 72199, 4259, 1019, + 4373, 3799, -5620, 49107, 4450, -5620, -5620, -5620, -5620, 24152, + -5620, -5620, -5620, 6955, -5620, 3824, 3825, 3826, 3828, 3829, + 3831, 3832, 3834, 3835, 3836, 3837, 3840, 3842, 3843, 3844, + 3846, 3847, 3849, 3853, 3855, 3860, 3863, 3864, 3865, 3867, + 298, -5620, -5620, 3852, -5620, -5620, -5620, -5620, 95170, 4426, + 3854, 3861, 3862, 3866, -5620, -5620, 95170, -5620, 2120, 4294, + 4324, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 80350, 276, -5620, -5620, 2151, -5620, + -5620, 2219, -5620, -5620, -5620, -5620, -5620, 2229, 69235, -5620, + 24152, 24152, -5620, -5620, -5620, -5620, -5620, 2023, 2023, 3833, + -5620, 3868, -5620, -5620, -5620, -5620, -5620, 4279, -5620, 3869, + -5620, 64789, -5620, -5620, -5620, -5620, 3586, -5620, 4187, -5620, + 2017, 95170, 4323, 61084, -5620, 4057, 4467, -5620, -5620, 44661, + -5620, 3870, 49107, -5620, 76645, 75163, -5620, -5620, -5620, 3873, + 1305, 9164, -5620, -5620, 4604, 72199, 4306, -5620, -5620, 3871, + -5620, 3874, 4353, 4356, -5620, 97393, -5620, -5620, -5620, 3307, + -5620, -5620, 3877, -5620, -5620, 3974, 3936, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 3889, 4150, 4260, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 4506, -5620, -5620, -5620, -5620, 2262, 284, -5620, + -5620, -5620,106095,106095,106095, -5620, 4235, -5620,102580, 24152, + -5620, 1820, -5620, 24152, -5620, -5620, 24152, -5620, 3307, 3334, + 106826, 78868, -5620, 78868,106826, 24152, -5620, 3885, -5620, 4514, + 4516, -5620, -5620, -5620, 24152, -5620, 24152, 24152, 1842, 24152, + 24152, 24152, 24152, -5620, 24152, -5620, 24152, 24152, -5620, 32611, + -5620, 3883, 3891, -5620, -5620, 3892, -5620, 24152, 24152, -5620, + -5620, -5620, 24152, 24152, 24152, -5620, -5620, 3893, -5620, -5620, + -5620, -5620, 24152, 24152, 24152, -5620, 24152, 3198, 24152, 3381, + 24152, 3579, 24152, -5620, 27997, -5620, 3894, -5620, -5620, 24152, + 24152, -5620, 24152, 24152, 24152, -5620, -5620, -5620, 24152, -5620, + 4463, 24152, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 24152, -5620, 492, 28766, -5620, 24152, 24152, 24152, -5620, -5620, + 24152, 3890, 3895, -5620, 95170, 2501, 3183, 256, 3898, -5620, + -5620, 3912, 3914, 3125, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 520, 32611, 499, 32611, 1809, 3318, 17231, -5620, 1379, + 1809, 4773, 4773, 95170, 4615, 3904, -5620, 24152, 24152, 18000, + 24152, 97393, 24152, 3908, 3907, -5620, 3917, 32611, -5620, -5620, + 3918, -5620, 2485, 3183, 4007, 4364, -5620, 3307, 35687, 4416, + -5620, 49107, 4419, 4466, 4125, -5620, 75163, 72199, 4583, 4584, + -5620, 3307, -5620, 3926, -5620, -5620, -5620, 3927, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 552, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 24152, 75163, -5620, -5620, -5620, + -5620, 276, -5620, 3939, 3944, -5620, -5620, 276, 276, 18769, + -5620, 40942, -5620, -5620, 195, 4223, 4485, -5620, -5620, 95170, + 1176, 95170, -5620, 52834, 52834, 89983, 3307, 12, -5620, -5620, + -5620, -5620, 3307, -5620, -5620, -5620, -5620, -5620, -5620, 3952, + -5620, -5620, -5620, 4689, -5620, -5620, 4369, -5620, 2711, 2279, + -5620, -5620, 3307, 39432, 1467, -5620, -5620, -5620, 20307, 9586, + -5620, 3946, 3947, 3948, -5620, 49107, 3949, 4401, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3951, -5620, + -5620, 20307, 3965, -5620, 4107, -5620, 3873, 1320, 3968, 3954, + -5620, -5620, -5620, -5620, -5620, -5620, 287, 291, 2762, 2711, + -5620, -5620, 381, -5620, -5620, -5620, -5620, -5620, 897, -5620, + -5620, 4107, -5620, 1828, 2701, 3991, 299, 256, 4180, -5620, + -5620, 2147, 1446, 1446, 4529, 200, 4404, -5620, 4259, 4607, + 4531, 4536, -5620, 3272, -5620, -5620, 364, -5620, -5620, -5620, + 95170, -5620, -5620, -25, -5620, 49107, 1922, 3969, 3969, -5620, + 2017, 333, -5620, 32611, 4691, -5620, 4453, 45402, 4587, 4589, + -5620, 45402, -5620, -5620, 2283, -5620, -5620, 74422, -5620, -5620, + -5620, 3307, 226, 2436, 24152, 95170, -5620, 3793, 4030, -5620, + -5620, 244, -5620, -5620, -5620, -5620, 59602, -5620, -5620, -5620, + 1518, 3967, 2436, 1052, 3970, -5620, -5620, -5620, -5620, 79609, + 74422, -5620, 4344, 4346, 1917, -5620, -5620, -5620, -5620, 276, + 276, -5620, 479, 276, -5620, -5620, 294, -5620, -5620, 1205, + 325, 3272, -5620, 2701, 2701, 2701, 2701, 256, 2701, 2701, + 2301, -5620, 326, -5620, -5620, 81832, -5620, 4722, 4724, -5620, + 4725, -5620, -5620, 1309, -5620, 3062, 1047, -5620, 1051, -5620, + 4517, 95170, 4705, 3799, -5620, 441, 2360, 3307, -5620, 4476, + 3984, 3985, 256, 3987, 256, 256, 2701, 2701, 3952, 2701, + 256, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 256, 2701, + 1545, 3690, 408, 2701, 256, 5776, -5620, -5620, 2312, 2367, + -5620, 67753, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 4737, -5620, -5620, -5620, -5620, -5620, 1750, 2759, 1750, -5620, + 104062, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 3307, 3307, -5620, -5620, 95170, 4738, -5620, -5620, -5620, -5620, + 3673, -5620, -5620, -5620, 4309, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 3986, 44661, 1004, -5620, 58850, 4532, + 2711, 4010, -5620, 1019, -5620, -5620, 1656, 4597, -5620, 3996, + 24152, -5620, 536, 4197, 4012, 61825, 72199, 72199, -5620, 2831, + -5620, 49107, -5620, 4640, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 24152, -5620, -5620, 95170, 2360, 3888, -5620, -5620, -5620, + -5620, -5620, 4433,106095, 4000, 3307, 24152, 3307, 3307, 24152, + 3237, 3237, 3238, 3256, -5620, 4694, -5620, 4631, 3237, 3237, + -5620, 3237, 4636, 3237, 3237, -5620, 4014, -5620, -5620, 4015, + 4016, 4017, 3125, -5620, 24152, 24152, 2473, 129, 129, 24152, + 1925, 1976, 505, -5620, 2495, 2513, 2533, 1509, 97393, -5620, + -5620, 2617, 2632, 2633, 2709, 2754, -5620, 1986, 3425, 1998, + 3307, 24152, 3307, 24152, 3307, 24152, 3307, 24921, 2767, -5620, + 2355, 3748, -5620, 2377, 3999, 2781, 2812, 2381, -5620, 3017, + 4768, 2410, 24921, 2817, 2828, 2033, 2047, 2856, 97393, 95170, + 4013, 4025, 4025, 349, -5620, 4027, -5620, -5620, -5620, 4033, + -5620, 24152, 24152, 4021, 3138, -5620, 24152, 1809, 32611, 515, + 32611, -5620, -5620, 4229, -5620, 24152, -5620, 4593, 4028, 3688, + 4031, 4032, 3141, 4038, 4041, 4044, 4048, 3307, -5620, -5620, + 95170, 4049, 1725, -5620, 3952, -5620, 4652, -5620, 4752, 4054, + 4069, 4058, 3918, -5620, 75163, -5620, 49107, -5620, 4692, 3570, + -5620, 72199, 72199, -5620, 84055, -5620, 60343, 95170, 95170, -5620, + 3307, -5620, 18769, 334, 4797, 4800, -5620, -5620, -5620, -5620, + 127, 4602, -5620, -5620, -5620, -5620, 18769, 276, -5620, 276, + 18769, 3727, -5620, -5620, -5620, -5620, 3745, -5620, 356, -5620, + -5620, -5620, 1876, 4056, -5620, 276, 1178, -5620, 20307, 4059, + 4062, -5620, 4659, -5620, 520, 316, -5620, 3749, -5620, 4530, + -5620, -5620, 4066, 90724, -5620, 4070, -5620, -5620, 4611, -5620, + -5620, 4053, 56594, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 356, 4114, 4300, -5620, -5620, -5620, + -5620, -5620, 3233, -5620, 4162, 4165, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 49107, 4648, 72199, 1047, 4448, + 49107, 49107, 7198, 9207, 3272, -5620, 2087, 2701, -5620, -5620, + -5620, 364, -5620, 4079, 95170, -5620, 3799, 4080, 472, 4080, + -5620, -5620, -5620, -5620, 1725, 2017, 2017, 4188, 4561, 45402, + 45402, 4231, 4562, 24152, 4083, -5620, 95170, -5620, 1200, -5620, + 4486, -5620, -5620, 24152, -5620, -5620, -5620, -5620, 3307, 4816, + 4090, -5620, -5620, -5620, -5620, -5620, -5620, 24152, -5620, 58098, + 24152, 4091, 4093, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 492, 492, -5620, -5620, 492, 492, -5620, -5620, -5620, -5620, + 492, 492, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 2101, -5620, 4842, 585, -5620, 4668, -5620, -5620, + -5620, -5620, 956, 256, 256, 256, 3690, 1977, -5620, 3062, + 439, 4431, -5620, 6672, 1809, 1596, 4591, 2223, -5620, 2419, + -5620, 4826, -5620, 205, -5620, -5620, -5620, 312, 324, -5620, + 371, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 95170, + -5620, 4669, -5620, -5620, -5620, -5620, 3251, 266, -5620, -5620, + 4102, -5620, -5620, -5620, -5620, -5620, -5620, 64789, -5620, -5620, + 61084, 2711, -5620, 95170, 4444, 4633, -5620, -5620, -5620, -5620, + -5620, -5620, 520, -5620, 3307, -5620, 4755, -5620, -5620, -5620, + -5620, 147, 147, -5620, -5620, -5620, -5620, 316, -5620, -5620, + 4640, 4386, -5620, 1483, 3307, -5620, -5620, -5620, -5620, -5620, + -5620, 95170, 505, 3307, -5620, 1750, -5620, -5620, 3237, -5620, + 1750, -5620, -5620, -5620, -5620, -5620, -5620, 1750, -5620, -5620, + -5620, -5620, 4109, 4773, 4773, -5620, 4827, 4637, 4726, 2885, + 24152, 24152, -5620, 24152, -5620, -5620, -5620, 1374, 4116, 4586, + -5620, -5620, -5620, -5620, -5620, -5620, 24152, 24152, 24152, 3307, + 3307, 3307, 4773, -5620, -5620, 3195, -5620, -5620,106826, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 408, 4773, -5620, -5620, + 24152, 24152, -5620, -5620, -5620, 95170, 3183, 4117, 4394, -5620, + -5620, -5620, 3183, 4258, -5620, -5620, 3183, 256, -5620, -5620, + -5620, 2500, 3138, -5620, 24152, 1809, 4696, 4122, 4838, 4127, + -5620, -5620, -5620, -5620, -5620, -5620, 24152, 84055, -5620, 4130, + 4132, -5620, -5620, -5620, 4569, 24152, 4748, 4701, -5620, 3183, + 95170, -5620, -5620, -5620, 72199, 3696, 3696, 91465, -5620, -5620, + -5620, -5620, 1891, 276, 276, 18769, -5620, -5620, 4140, 4142, + 18769, 18769, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 356, -5620, 39432, 2711, 23383, + -5620, -5620, -5620, 20307, -5620, 4143, 39432, 4613, -5620, -5620, + -5620, 4532, 228, -5620, -5620, -5620, 4530, -5620, 92206, -5620, + 4148, -5620, 4139, -5620, 1895, 4482, 4758, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 4153, -5620, -5620, -5620, 4170, -5620, 4155, + -5620, -5620, -5620, 49107, -5620, -5620, 4185, -5620, -5620, 42438, + 4774, 4201, 4525, 49107, 276, 276, 276, 276, 276, 276, + 276, 276, 276, 276, 4528, 276, 276, 276, 276, 276, + 276, 276, 276, 276, 276, 1624, 95170, 276, 276, -5620, + -5620, 4730, -5620, 6555, -5620, -5620, -5620, -5620, -5620, 276, + -5620, 2087, -5620, -5620, 1321, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 608, 4746, 4900, 4175, -5620, -5620, 4707, -5620, + -5620, -5620, -5620, 4282, 4712, 3799, 2745, -5620, -5620, -5620, + 4661, -5620, -5620, -5620, 4662, 3307, 95170, -5620, -5620, -5620, + 1324, 1987, 4796, 2436, 4191, 95170, 2436, 244, 190, 3307, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 354, -5620, 81832, -5620, -5620, -5620, -5620, + -5620, 4937, 4939, -5620, -5620, -5620, -5620, 4379, 420, 4269, + 1909, 4756, 4590, 4759, 2169, 3707, 276, 4760, 4914, -5620, + 688, 276, 4763, 4825, 4280, 4828, 4769, -5620, 4284, 4590, + 4775, 4398, 4777, 4779, 4780, -5620, -5620, 9207, -5620, -5620, + -5620, -5620, 166, 46884, -5620, -5620, -5620, -5620, -5620, 4388, + 24152, 24152, 4798, 95170, 4799, -5620, 4617, -5620, 95170, -5620, + 520, -5620, -5620, -5620, 4519, -5620, 2515, -5620, -5620, 2574, + -5620, -5620, 2582, -5620, -5620, -5620, -5620, -5620, 4747, 95170, + -5620, -5620, 3870, -5620, 4877, -5620, 4567, 3380, -5620, -5620, + 137, 4423, 4695, 4695, -5620, -5620, -5620, 4807, -5620, -5620, + -5620, -5620, 4858, 2360,106095, 4588, -5620, -5620, -5620, -5620, + -5620, -5620, 4234, 4236, 24152, 2759, 4726, 59602, 4238, -5620, + -5620, 2887, 2209, 2583, 4521, 4473, -5620, 4412, -5620, 2910, + 3307, 3307, 771, 3238, -5620, -5620, -5620, -5620, 4869, 3237, + -5620, 4956, -5620, 3237, 1750, -5620, -5620, -5620, -5620, -5620, + 4249, 2590, 1875, 2943, 2947, -5620, -5620, -5620, 4251, -5620, + -5620, 301, -5620, 4250, -5620, 2597, 4968, 1980, 24152, -5620, + 4254, -5620, -5620, 95170, -5620, -5620, 4773, 1330, -5620, 2598, + -5620, -5620, -5620, 4255, 3696, -5620, -5620, 62566, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 18769, 18769, 4107, -5620, 4141, + 2671, -5620, -5620, -5620, -5620, 4630, 4262, 4256, -5620, -5620, + -5620, 4252, 137, 39432, -5620, -5620, 64789, -5620, -5620, 4264, + 4263, -5620, -5620, -5620, 90724, -5620, 2622, -5620, -5620, 4987, + 20307, 2701, 2601, 4268, -5620, 81832, 4274, 4275, 49848, 1920, + 95170, 2625, -5620, -5620, -5620, -5620, -5620, 2125, -5620, 1356, + 2736, 2474, 2474, -5620, 4261, 49107, -5620, 276, -5620, 390, + 392, 428, 448, -5620, 3952, 256, 256, 2701, 2701, 276, + 256, 81832, 1868, 256, 3952, 3952, 458, 2701, 1173, 390, + -5620, -5620, -5620, 256, 390, 255, -5620, -5620, 9210, -5620, + 9207, 71458,107566, -5620, -5620, -5620, 4629, 1321, -5620, 95170, + 4061, -5620, -5620, 1781, 4405, -5620, 4281, 95170, -5620, 2701, + -5620, 5007, 5032, -5620, -5620, 4688, 24152, 4290, 24152, 4291, + 2658, -5620, 2474, -5620, 2474, -5620, 1324, 5010, 5012, 4955, + 5013, 1987, -5620, 2456, -5620, -5620, -5620, -5620, -5620, -5620, + 244, -5620, -5620, 4302, -5620, -5620, -5620, -5620, 4634, -5620, + 5049, -5620, 4754, 47625, 2736, -5620, 1810, 4342, -5620, -5620, + -5620, 4946, 3054, 3054, 409, 3054, 92206, 95170, 49107, 490, + 1283, 4930, 2491, 1991, 4351, 4868, 3054, 3054, 92947, 409, + 39432, -5620, -5620, -5620, 3054, -5620, 3054, 49107, 93688, 409, + -5620, -5620, -5620, 95170, -5620, 3054, 409, -5620, 409, 409, + 92206, -5620, 8027, -5620, -5620, 42438, 315, -5620, 3307, 4773, + 4704, -5620, -5620, 4428, 2701, 4673, -5620, -5620, 4782, -5620, + 95170, 297, -5620, 256, -5620, 256, -5620, 256, -5620, 281, + -5620, 32611, -5620, 3697, -5620, -5620, 2179, -5620, -5620, 4675, + 4532, 4819, -5620, -5620,106095, -5620, -5620, 4322, 2436, -5620, + 4325, -5620, -5620, -5620, -5620, 24152, -5620, 4557, -5620, 4663, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 3952, -5620, -5620, -5620, 4327, -5620, 256, -5620, 24152, -5620, + -5620, 4329, 3858, 2436, -5620, -5620, 4425, 4364, 4333, -5620, + 4701, 95170, -5620, -5620, 18769, 18769, -5620, -5620, -5620, 4467, + -5620, -5620, -5620, 39432, 63307, 4335, 4331, -5620, 276, -5620, + 109, -5620, 95170, -5620, -5620, 3952, 4697, -5620, 2663, -5620, + -5620, 95170, 4338, 4537, 95170, 95170, -5620, -5620, 4343, 95170, + -5620, -5620, -5620, 42438, 4348, 4961, 4963, 2474, -5620, 2736, + 4889, 49848, -5620, 2736, 2736, 68494, 95170, 4350, 2701, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 4354, -5620, + -5620, -5620, -5620, -5620, 2701, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 5075, + -5620, 4730, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 4352, -5620, -5620, -5620, -5620, -5620, -5620, + 107566, 1345, -5620, -5620, -5620, -5620, 4358, -5620, 4362, -5620, + -5620, 4355, 4347, -5620, -5620, -5620, 5027, 2087, -5620, -5620, + -5620, 4933, 1596, -5620, -5620, 4360, -5620, 69235, -5620, -5620, + -5620, -5620, 4361, 4359, 3307, 95170, 3307, 95170, -5620, 5022, + 5022, -5620, 2759, 2759, 5086, 2759, -5620, 5087, 5088, 2456, + -5620, -5620, 5125, 420, 4750, 439, 1809, 409, 1809, 5030, + -5620, -5620, 95170, 49848, 92206, 49848, -5620, 4871, -5620, 74422, + 49848, 3054, 95170, -5620, 5035, -5620, 4999, 49848, 49848, -5620, + -5620, 92206, 4381, -5620, 2436, 2690, 95170, 49848, -5620, -5620, + -5620, 3183, 4850, 49848, 92206, -5620, 92206, -5620, 4690, 4878, + 3708, -5620, 4391, 4393, 95170, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 1247, -5620, -5620, 2681, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 563, 95170, -5620, 1291, 4592, -5620, 2179, + -5620, -5620, -5620, 49107, -5620, 24152, -5620, -5620, 2957, -5620, + -5620, 4397, -5620, 4399, 3967, -5620, 4295, 4534, 4439, 4440, + 4441, 4577, 4745, -5620, 4585, -5620, 4174, 4569, 4409, 32611, + -5620, -5620, 2062, -5620, -5620, -5620, -5620, 97393, -5620, -5620, + 4402, -5620, 39432, 20307, -5620, -5620, -5620, 4829, -5620, 2682, + 2436, 4418, 95170, 4420, 2688, 2694, 95170, 4424, -5620, 24152, + 2736, -5620, -5620, 49848, 49107, -5620, 4903, -51, 49848, 49848, + -5620, 4417, 5136, -5620, -5620, 4422, -5620, -5620, 49107, -5620, + -5620, 228, 255, 210, 327, -5620, 285, 1345, -5620, -5620, + 95170, -5620, 95170, -5620, 95170, -5620, 95170, -5620, -5620, -5620, + 4798, 4061, 95170, -5620, 95170, -5620,101098, 6083, 2700, 2717, + 2463, -5620, -5620, -5620, -5620, 2759, -5620, 2759, 2759, -5620, + 4430, -5620, -5620, -5620, 5092, -5620, 5093, -5620, 2385, 508, + -5620, 49848, 1857, 4935, 4931, 5144, -5620, 49848, 4263, 95170, + -5620, -5620, 1656, -5620, 39432, -5620, -5620, 4932, 4936, -5620, + 4941, 315, -5620, 95170, -5620, -5620, -5620, 4539, -5620, 5802, + 4641, 5156, 5157, -5620, 95170, 94429, -5620, -5620, 5215, 32611, + -5620, -5620, 5071, -5620, 3749, 2436, -5620, -5620, -5620, 1382, + -5620, 5183, 1737, -5620, -5620, 1364, -5620, -5620, -5620, -5620, + 95170, 4455, 4540, -5620, -5620, 4527, -5620, -5620, 3716, -5620, + 116, 64048, -5620, -5620, -5620, -5620, 1019, 95170, -5620, 5209, + 4458, 2101, 1019, 1019, 4459, 95170, 2971, 49848, 4903, 1608, + 4464, 1446, -5620, 1446, -5620, -5620, 3149, 69235, -5620, -5620, + 3897, 95170, 4462, 5226, -5620, -5620, 4460, -5620, 4468, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 95170, 82573, + -5620, 2223, -5620, 2087, -5620, -5620, 5034, 2724, -5620, -5620, + -5620, -5620, -5620, 5180, -5620, 5185, 4469, 4474, -5620, -5620, + -5620, -5620, 49848, -15, -5620, -5620, 5111, -5620, 5158, 5159, + 315, -5620, 49107, 5039, 79609, -5620, -5620, -5620, 409, -5620, + 95170, 49848, 49107, -5620, -5620, 4263, 897, 24152, 4831, 5254, + -5620, 4680, 4681, -5620, -5620, 2728, -5620, -5620, 4543, 1725, + 4971, -5620, -5620, -5620, 4295, -5620, -5620, 4619, 1816, -5620, + 2768, -5620, -5620, -5620, 3183, -5620, 4490, -5620, 4852, 276, + 276, 4853, 276, 276, 276, 276, 4494, 3716, -5620, -5620, + -5620, 4844, -5620, -5620, -5620, 1350, 2436, 4495, 95170, 4497, + 2797, 1401, 1269, 95170, 4496, -5620, -5620, -5620, 1446, 95170, + 5099, -5620, 4501, -5620, 4502, 4503, -5620, -5620, 5123, 2701, + -5620, 4594, -5620, -5620, 3149, -5620, -5620, -5620, 4544, 5127, + 5089, -5620, 81832, 34918, -5620, 4992, -5620, 4952, 5193, -5620, + 5240, 3740, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 4867, -5620, 4079, 4080, -5620, -5620, 49107, 4617, + -5620, 2745, -5620,101098, 8917, -5620, -5620, 90724, 90724, 5136, + 3183, 4701, -5620, -5620, -5620, 34918, -5620, -5620, 4701, -5620, + -5620, -5620, -5620, -5620, 5141, -5620, 3307, 24152, -5620, -5620, + -5620, -5620, -5620, -5620, 94429, -5620, -5620, 490, -5620, -5620, + -5620, -5620, -5620, 95170, -5620, 4520, -5620, -5620, 152, 276, + 2701, 2701, 276, 3543, 3543, 3183, 81832, 4601, -5620, -5620, + 276, 1446, 2701, 276, 1446, -5620, -5620, 1574, 1350, -5620, + -5620, -5620, -5620, -5620, -5620, 750, 1019, -5620, 4711, 1574, + 1401, -5620, -5620, 1574, 1269, -5620, -5620, 4522, 95170, 4524, + 4526, -5620, 2805, -5620, 1680, 5098, 95170, 4533, 95170, 95170, + -5620, -5620, -5620, -5620, -5620, -5620, 4880, -5620, 4535, 4541, + 3690, 3690, 17231, -5620, -5620, -5620, -5620, -5620, -5620, 5109, + -5620, 4571, 1369, 276, -5620, 3200, -5620, -5620, -5620, 95170, + -5620, 5062, 4958, 5184, 4891, 5254, -5620, -5620, 5108, -5620, + -5620, -5620, -5620, -5620, 2191, 4542, 2839, -5620, -5620, 2848, + -5620, -5620, -5620, -5620, 4545, 3307, -5620, 39432, -5620, 4540, + -5620, -5620, 2858, -5620, 29535, -5620, -5620, -5620, 2701, -5620, + -5620, 2701, -5620, -5620, -5620, -5620, -5620, 2870, -5620, 81832, + -5620, -5620, 256, -5620, -5620, 5143, 4983, -5620, 4741, 1350, + 2695, -5620, -5620, -5620, -5620, -5620, 4547, 95170, 95170, 4549, + -5620, 95170, -5620, -5620, -5620, 1609, -5620, 2871, 95170, 2878, + 2917, -5620, -5620, -5620, -5620, 4552, 4550, -5620, 101, -5620, + -5620, 3200, 95170, 95170, -5620, 4061, -5620, -5620, -5620, -5620, + -5620, 4688, -5620, 5105, 2745, -5620, -5620, -5620, 4701, 4554, + -5620, 276, 5083, -5620, -5620, 4520, -5620, 4558, -5620, 1725, + -5620, -5620, 81832, -5620, 4601, -5620, -5620, -5620, -5620, -5620, + -5620, 1574, -5620, -5620, 2928, 4458, 95170, -5620, 1442, 1442, + 1350, 2944, 1401, 1269, -5620, 445, -5620, 3378, 3378, 1517, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 2745, + 1312, 2951, 39432, 20307, 4861, 4486, -5620, 29535, 4563, 3823, + -5620, -5620, -5620, 4889, 4564, 4458, -5620, -5620, 537, 5014, + 5139, 5147, -5620, 1350, -5620, -5620, -5620, 4573, -5620, 3378, + -5620, -5620, -5620, -5620, -5620, 1763, 4061, 4920, 5242, -5620, + 3960, -5620, -5620, -5620, 5152, 1312, 1312, -5620, -5620, -5620, + 5292, 4796, -5620, -5620, -5620, 3823, -5620, -5620, 1350, 4578, + -5620, -5620, -5620, 5063, 5261, -5620, -5620, -5620, -5620, 1763, + -5620, -5620, 4715, -5620, -5620, -5620, -5620, -5620, -5620, 1281, + 5162, -5620, 5163, -5620, 2759, 5224, -5620, -5620, 1350, 1442, + 1442, -5620, -5620, -5620, -5620, 5253, 4938, -5620, 5341, 4595, + -5620, -5620, -5620, 1726, 1982, 36439, 5114, -5620, -5620, 81832, + -5620, -5620, -5620, -5620, 81832, -5620, 2965, -5620, -5620, 39432, + -5620, -5620, 5802, -5620, -5620, 37191, 4596, -5620, 276, -5620, + 5254, -5620, 39432, -5620, -5620, -5620, 20307, -5620, -5620 +}; + +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_int16 yydefact[] = +{ + 0, 3619, 2, 0, 2503, 2504, 1016, 2296, 0, 430, + 0, 1243, 612, 2746, 3829, 2141, 2290, 2289, 2062, 2761, + 470, 220, 2809, 376, 2064, 2363, 0, 0, 466, 2862, + 1259, 2879, 754, 496, 2886, 0, 320, 0, 0, 473, + 318, 220, 1308, 3262, 2190, 0, 3368, 2128, 0, 1306, + 468, 2461, 2714, 2759, 2760, 2789, 2622, 2880, 2903, 2931, + 2067, 2699, 2698, 2700, 3002, 2701, 2702, 2703, 2704, 2705, + 3003, 2597, 2706, 2707, 2708, 2710, 2709, 2711, 2712, 3004, + 2598, 3524, 3620, 2599, 2671, 2713, 2673, 2672, 2715, 2600, + 2601, 2716, 2717, 2718, 2720, 2719, 2603, 2602, 2721, 2723, + 2722, 2674, 2675, 2724, 3005, 2725, 2727, 2604, 3000, 2605, + 2606, 2607, 2726, 2608, 2728, 3529, 2729, 2730, 2609, 2731, + 2732, 2733, 2734, 2736, 2735, 2737, 2738, 2740, 2741, 2742, + 2739, 2743, 2744, 2747, 2745, 2677, 2676, 3006, 2610, 2748, + 2749, 2750, 2751, 2753, 2754, 2752, 2755, 2034, 2756, 2757, + 2758, 2766, 2767, 2769, 2768, 2678, 2770, 2771, 2772, 2774, + 2773, 2775, 2777, 2611, 2612, 2613, 2776, 2778, 2762, 2763, + 2764, 2765, 2780, 2779, 2781, 2782, 2783, 2679, 1259, 2615, + 2999, 2784, 2785, 3677, 2786, 2787, 3007, 2616, 2668, 2788, + 3370, 2791, 2790, 85, 2792, 2618, 2793, 3008, 3009, 2794, + 2795, 2797, 2799, 2796, 2800, 2801, 2807, 2619, 2798, 2802, + 2803, 2804, 2805, 2806, 2808, 2680, 2810, 2811, 3010, 3011, + 2812, 2813, 2814, 2815, 2669, 2816, 2817, 2818, 2819, 2832, + 2833, 2823, 2824, 2826, 2827, 2830, 2825, 2831, 2836, 2835, + 2837, 2838, 2839, 2840, 2841, 2834, 2821, 2828, 2829, 2822, + 2842, 2843, 2820, 2844, 2846, 2845, 2847, 2681, 2848, 2849, + 2850, 2851, 2852, 3012, 2853, 2854, 2856, 2855, 2857, 3013, + 2858, 2859, 2860, 2665, 2861, 2682, 2683, 2863, 2864, 3014, + 2865, 2866, 2871, 2872, 2873, 2868, 2867, 2869, 2870, 2684, + 2685, 2686, 2874, 2875, 2876, 2878, 2877, 2621, 2620, 3015, + 2623, 2881, 2882, 2624, 2883, 2885, 2884, 2667, 2625, 2887, + 2888, 2890, 2889, 2626, 2627, 2628, 2891, 2892, 2893, 2894, + 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2687, 2688, + 2904, 2905, 2906, 2908, 2907, 2909, 2910, 2914, 2911, 2912, + 2913, 2915, 2629, 2916, 1259, 2917, 2918, 2919, 2630, 2921, + 2920, 2631, 2922, 2923, 2924, 2925, 2926, 2666, 3529, 2927, + 2928, 2930, 2689, 2929, 2932, 2933, 0, 2934, 2935, 3016, + 2632, 2936, 2937, 2690, 2670, 2633, 3017, 2939, 2375, 2697, + 2938, 2940, 2635, 2636, 2941, 2942, 2943, 2634, 2944, 2637, + 3018, 2945, 2947, 2946, 2948, 2949, 2950, 2951, 2638, 2952, + 2953, 2639, 2954, 2640, 2955, 2956, 3019, 2957, 2959, 2958, + 2960, 2961, 2962, 2963, 2964, 2965, 2967, 2969, 2968, 2966, + 2970, 2971, 2691, 2972, 2641, 2692, 3021, 3022, 2693, 2973, + 2974, 2975, 2976, 3020, 2170, 2977, 2978, 2644, 2979, 2980, + 2982, 2981, 2642, 2643, 2983, 2984, 2648, 3023, 2985, 3024, + 2694, 2695, 2986, 2987, 2997, 2988, 2990, 2989, 2992, 2991, + 2998, 3025, 3678, 2645, 2993, 2994, 2646, 2995, 2647, 2996, + 2696, 0, 0, 3, 3621, 22, 0, 45, 27, 33, + 17, 21, 16, 47, 60, 53, 30, 3816, 3817, 3819, + 43, 3560, 42, 11, 63, 64, 19, 50, 12, 15, + 18, 41, 49, 37, 44, 57, 58, 1329, 1305, 1333, + 1304, 1300, 1296, 1315, 1316, 1317, 1323, 25, 26, 34, + 51, 68, 23, 65, 61, 24, 2296, 13, 28, 29, + 14, 52, 46, 38, 62, 69, 39, 0, 3681, 3675, + 3673, 3676, 3671, 3672, 3001, 2596, 3674, 59, 40, 67, + 32, 54, 31, 9, 10, 20, 55, 56, 48, 70, + 35, 66, 36, 8, 3682, 0, 3622, 2050, 168, 3526, + 3818, 2561, 2560, 2598, 3633, 2599, 2601, 2652, 2602, 2655, + 2656, 2649, 2610, 2657, 3634, 2613, 2614, 2653, 2558, 2616, + 2658, 2617, 2619, 2650, 2651, 2659, 2654, 2628, 2660, 2630, + 2661, 2662, 2663, 2638, 2639, 2664, 2643, 2559, 2647, 2508, + 2524, 0, 2525, 2555, 2553, 2557, 2551, 2556, 2549, 2550, + 2554, 2552, 1060, 0, 0, 0, 0, 2060, 0, 2060, + 1151, 1374, 3558, 3559, 3560, 1260, 0, 1261, 0, 0, + 244, 400, 131, 0, 0, 3620, 2165, 2060, 2038, 2060, + 2060, 2060, 2060, 2060, 2060, 2060, 2063, 2060, 2060, 0, + 0, 0, 400, 2070, 2365, 0, 2385, 2386, 2380, 3358, + 3359, 3353, 378, 0, 0, 0, 2263, 2262, 0, 0, + 305, 317, 320, 313, 316, 0, 220, 2060, 378, 319, + 320, 0, 1338, 0, 2268, 320, 0, 2139, 2379, 0, + 400, 2462, 2459, 2070, 2336, 2338, 0, 2334, 3529, 1446, + 1445, 0, 3825, 3827, 0, 2514, 1238, 1270, 1195, 3530, + 3531, 0, 77, 80, 2302, 343, 0, 0, 0, 610, + 0, 0, 1203, 0, 3531, 3541, 2377, 0, 131, 1176, + 0, 131, 2173, 2060, 2060, 3602, 3603, 0, 0, 0, + 3597, 0, 3604, 0, 1333, 0, 1319, 1, 5, 0, + 0, 610, 970, 610, 971, 0, 610, 610, 0, 0, + 0, 0, 3565, 3558, 3559, 3560, 0, 2020, 1875, 1334, + 1333, 1967, 1971, 3546, 3546, 3546, 0, 0, 1967, 1324, + 2764, 2999, 2885, 0, 2281, 2295, 2279, 2497, 1302, 1298, + 3683, 0, 0, 2608, 1019, 1061, 1024, 228, 0, 0, + 1026, 0, 1037, 2530, 2529, 2528, 1034, 220, 0, 1153, + 0, 0, 0, 3566, 3565, 0, 1215, 2283, 2284, 2285, + 2286, 2287, 2288, 2291, 0, 250, 400, 432, 0, 443, + 434, 437, 0, 132, 133, 1241, 1244, 0, 613, 296, + 298, 0, 3650, 295, 297, 3649, 0, 3794, 0, 0, + 374, 283, 372, 3646, 3643, 3648, 3644, 3647, 3645, 3783, + 373, 3680, 0, 287, 3830, 3784, 3785, 3787, 0, 2169, + 2168, 0, 2167, 2142, 0, 2165, 0, 2058, 2060, 0, + 0, 0, 0, 0, 220, 0, 220, 2043, 2060, 2060, + 471, 3679, 0, 3654, 3418, 3436, 3437, 1387, 3433, 3438, + 0, 3435, 3430, 0, 0, 3432, 3429, 0, 0, 3457, + 3431, 3434, 2599, 2732, 2773, 2613, 2781, 2782, 2895, 2899, + 2904, 2915, 2919, 2663, 2635, 2960, 3411, 3399, 3413, 3412, + 0, 0, 3416, 3421, 0, 3420, 0, 0, 2072, 2366, + 2367, 2371, 0, 2389, 0, 0, 391, 0, 0, 0, + 0, 3815, 380, 381, 0, 385, 0, 378, 3813, 3805, + 0, 400, 3812, 3807, 3806, 3808, 3809, 3810, 3811, 411, + 0, 412, 413, 3814, 467, 3801, 3802, 0, 0, 378, + 3689, 0, 3803, 3799, 3800, 1257, 1679, 0, 2436, 2505, + 2506, 0, 2449, 2454, 2455, 2447, 2448, 2452, 2428, 2451, + 2427, 2453, 1448, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1387, 1387, 1387, 1384, 0, 0, 0, + 0, 0, 0, 2445, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1384, 0, 0, 2444, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1577, 2446, 1387, 1384, + 1384, 0, 0, 1387, 0, 0, 0, 3002, 2597, 3004, + 2652, 2604, 2605, 2606, 2607, 2649, 2676, 3006, 3007, 3008, + 3010, 3011, 3012, 3013, 2864, 3014, 3015, 2667, 2893, 2689, + 3016, 3017, 3019, 2692, 3021, 3022, 2693, 3020, 2664, 3023, + 3024, 3025, 2645, 2696, 0, 0, 0, 0, 1447, 0, + 0, 1331, 1523, 755, 1393, 1405, 1421, 0, 1521, 1520, + 1524, 1526, 1532, 1440, 1553, 1492, 1493, 1495, 1494, 1499, + 1500, 0, 1655, 1501, 0, 0, 1498, 2441, 1497, 1496, + 2442, 2443, 1491, 2483, 2513, 0, 0, 2507, 3001, 2596, + 498, 497, 0, 339, 332, 327, 335, 329, 331, 330, + 336, 337, 338, 333, 328, 334, 321, 0, 306, 0, + 314, 3542, 0, 1262, 378, 474, 340, 3418, 2700, 2899, + 3391, 0, 3398, 0, 3557, 3551, 3554, 3553, 3549, 3552, + 3550, 3555, 1359, 3556, 1358, 1309, 1339, 1356, 1357, 0, + 0, 0, 2586, 2585, 890, 2583, 3283, 3284, 0, 2587, + 0, 0, 3285, 2952, 2973, 2584, 0, 2519, 0, 2520, + 2580, 2578, 2582, 2581, 2575, 2576, 2579, 3263, 3268, 3264, + 2577, 0, 2296, 0, 0, 2276, 968, 967, 0, 0, + 0, 0, 2212, 0, 890, 2276, 2213, 0, 1932, 2266, + 2269, 0, 3287, 2226, 969, 3288, 2262, 0, 2198, 2214, + 2175, 2219, 131, 3289, 131, 2265, 1932, 2276, 0, 2191, + 0, 0, 0, 2296, 1373, 0, 315, 3369, 2140, 1149, + 2108, 1307, 2094, 0, 469, 0, 2075, 0, 2335, 3525, + 3826, 3709, 0, 0, 0, 0, 3534, 1721, 2035, 0, + 81, 76, 0, 0, 0, 0, 2502, 3371, 86, 0, + 0, 3616, 74, 0, 2353, 0, 2351, 2348, 2350, 0, + 3534, 0, 2376, 1183, 1183, 0, 0, 1175, 1177, 1178, + 1183, 1183, 2174, 0, 0, 0, 2435, 2433, 2434, 2515, + 3599, 2432, 2431, 3608, 3610, 3593, 0, 3596, 3595, 3605, + 1322, 1321, 6, 71, 0, 142, 610, 220, 220, 610, + 167, 148, 151, 610, 610, 610, 610, 160, 162, 0, + 222, 0, 0, 3565, 1337, 2809, 0, 0, 1349, 1335, + 1769, 1336, 1801, 1771, 1741, 1732, 1731, 1797, 1798, 1800, + 1799, 1802, 1804, 1794, 0, 0, 2033, 0, 2028, 1876, + 1881, 1875, 0, 0, 0, 0, 0, 0, 1966, 1932, + 1975, 1937, 1968, 1301, 1964, 0, 1297, 1362, 1362, 3548, + 3547, 3545, 3544, 3543, 1969, 1320, 1328, 1326, 1327, 1970, + 1318, 0, 2293, 2499, 0, 0, 2298, 0, 1967, 1971, + 0, 0, 0, 2099, 2098, 2101, 0, 904, 0, 229, + 0, 3563, 3564, 3562, 1387, 2531, 2534, 3561, 2535, 229, + 2061, 0, 0, 0, 2060, 1157, 1158, 1152, 1154, 1156, + 0, 0, 0, 0, 2297, 0, 246, 252, 245, 441, + 0, 401, 3668, 0, 438, 87, 0, 1245, 2051, 2053, + 3797, 3026, 3027, 3028, 3029, 3030, 3031, 3033, 3034, 3032, + 3035, 3036, 834, 857, 3037, 3038, 3039, 857, 874, 3040, + 3041, 3042, 3043, 3044, 3045, 3046, 3047, 820, 3048, 3049, + 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3060, + 3059, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 840, + 3069, 3070, 3071, 3072, 3073, 3074, 3076, 3075, 3077, 3078, + 3079, 3080, 836, 3081, 3082, 3083, 3085, 3084, 3086, 3087, + 3088, 3089, 3090, 3091, 3092, 3093, 3094, 840, 3095, 3096, + 3097, 3098, 3099, 3101, 3100, 3104, 3105, 3106, 3107, 3108, + 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, + 3119, 830, 3120, 3121, 3122, 3123, 3124, 3125, 3102, 3126, + 3103, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, + 874, 786, 786, 3136, 3137, 3138, 3139, 3140, 3141, 3142, + 874, 833, 786, 3145, 3146, 3143, 3144, 3147, 3148, 3149, + 3150, 3151, 3153, 3152, 3156, 3154, 3155, 840, 3157, 3158, + 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, + 3169, 3171, 3172, 3170, 3173, 3174, 3175, 3176, 3177, 3178, + 3179, 3180, 3181, 3182, 3183, 3184, 835, 3185, 3187, 3186, + 3188, 3189, 3190, 3191, 3193, 3194, 3195, 3196, 3197, 3198, + 3199, 3200, 3203, 3201, 3202, 3204, 3205, 3206, 3207, 3208, + 0, 3209, 3210, 832, 3211, 3212, 3216, 3213, 3217, 3214, + 3218, 3215, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, + 3228, 3229, 3230, 3231, 3232, 874, 831, 786, 3233, 3234, + 3235, 3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, + 3246, 3247, 3248, 3250, 3251, 3249, 857, 824, 3252, 3254, + 3253, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3192, 3227, + 3236, 857, 780, 781, 786, 857, 799, 0, 840, 874, + 0, 821, 840, 826, 2595, 857, 0, 857, 857, 857, + 857, 3649, 857, 0, 276, 284, 840, 764, 770, 772, + 771, 773, 774, 857, 857, 857, 857, 857, 861, 767, + 769, 2588, 2589, 2590, 2591, 2593, 2594, 3632, 768, 2592, + 3790, 0, 0, 0, 3796, 0, 3620, 0, 0, 3788, + 0, 2143, 0, 1347, 1875, 2145, 2150, 2159, 2163, 2166, + 2040, 0, 0, 0, 3768, 3767, 2046, 2045, 3766, 0, + 2047, 0, 0, 2048, 2036, 0, 447, 449, 3419, 3417, + 3454, 3453, 3458, 0, 3455, 3451, 0, 3410, 3459, 3444, + 3448, 0, 3460, 3445, 3452, 3466, 3465, 3467, 3462, 3461, + 0, 3464, 3450, 0, 3449, 3470, 0, 3414, 0, 0, + 423, 0, 2077, 2078, 2074, 1149, 2073, 2372, 0, 2364, + 0, 1280, 2391, 2390, 2387, 1867, 3355, 3360, 3642, 3641, + 3640, 3639, 2526, 0, 3636, 3638, 3635, 3637, 2527, 400, + 392, 0, 0, 2864, 0, 399, 398, 397, 420, 400, + 386, 409, 0, 0, 3623, 379, 3624, 382, 418, 421, + 460, 456, 464, 458, 3822, 3820, 3690, 3804, 274, 0, + 0, 2505, 2506, 2438, 2437, 2507, 2429, 2450, 0, 0, + 0, 1527, 1873, 1873, 1873, 0, 0, 1729, 0, 0, + 0, 0, 1873, 0, 1565, 1539, 1538, 0, 1566, 0, + 0, 0, 0, 0, 0, 0, 1685, 1685, 1651, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1723, + 1725, 2483, 1873, 0, 1873, 0, 1392, 1571, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1873, + 1873, 1873, 0, 1583, 1585, 1584, 1873, 1873, 1573, 0, + 0, 0, 0, 0, 1873, 0, 0, 0, 0, 0, + 1719, 2456, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1719, 0, 0, 0, 0, 0, 0, 2458, + 0, 0, 0, 2457, 0, 0, 0, 0, 0, 0, + 1719, 0, 0, 1529, 0, 1528, 1530, 0, 1331, 756, + 0, 0, 0, 1444, 1442, 1443, 1441, 0, 0, 0, + 0, 1450, 1452, 1454, 0, 1449, 1451, 1453, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1531, 0, + 0, 0, 0, 0, 2430, 0, 1604, 0, 510, 2361, + 0, 0, 0, 304, 1264, 2536, 0, 0, 400, 3417, + 0, 0, 0, 3414, 1374, 1355, 3290, 0, 889, 0, + 0, 892, 894, 893, 3322, 0, 891, 3331, 3329, 3327, + 3326, 0, 0, 3270, 3272, 0, 898, 900, 899, 3320, + 897, 0, 3306, 0, 0, 0, 0, 0, 610, 0, + 0, 0, 0, 0, 0, 0, 0, 2243, 0, 1373, + 1373, 2192, 0, 2276, 0, 2276, 2266, 0, 2276, 2272, + 2232, 2225, 0, 0, 667, 1949, 1933, 2218, 2270, 2271, + 2276, 0, 0, 2276, 0, 2233, 2266, 2276, 2187, 0, + 0, 2179, 2184, 2180, 0, 2186, 2185, 2188, 2176, 2177, + 0, 2205, 0, 2217, 2224, 0, 2204, 2211, 0, 2222, + 2266, 2266, 0, 2276, 2276, 2276, 1150, 0, 1374, 0, + 3656, 2460, 2463, 2469, 2475, 2079, 2076, 2337, 272, 0, + 0, 0, 1272, 1274, 1273, 1290, 1197, 3533, 0, 3535, + 0, 3537, 0, 78, 0, 0, 2329, 2327, 0, 0, + 0, 2321, 2323, 2326, 2322, 0, 0, 2328, 131, 0, + 2324, 2330, 2303, 2306, 2313, 1373, 2304, 0, 0, 341, + 344, 346, 0, 349, 1867, 3374, 3373, 0, 0, 0, + 1201, 1204, 0, 2358, 2355, 131, 0, 2662, 3540, 3538, + 0, 1171, 1187, 134, 1181, 1182, 0, 0, 1174, 134, + 3355, 3617, 3618, 0, 0, 3594, 3611, 3592, 0, 3606, + 3607, 3591, 7, 4, 154, 0, 145, 0, 0, 0, + 610, 610, 137, 0, 610, 0, 3770, 1374, 1374, 610, + 610, 610, 0, 1766, 0, 1732, 1797, 1798, 1800, 0, + 1799, 0, 0, 1867, 0, 0, 1789, 1815, 0, 1815, + 1791, 1792, 0, 0, 0, 1349, 1795, 2516, 2029, 2032, + 0, 2021, 2023, 2024, 2528, 2026, 0, 0, 1878, 1881, + 1943, 1944, 0, 1364, 0, 1957, 1958, 1956, 0, 1934, + 1950, 1955, 1953, 0, 1925, 0, 1974, 1965, 2013, 1363, + 1972, 1973, 1325, 2282, 0, 2280, 2299, 2300, 2498, 1303, + 1299, 3351, 3352, 3349, 3350, 3348, 3684, 3685, 3687, 1021, + 905, 2100, 904, 603, 606, 605, 0, 0, 2071, 227, + 2533, 0, 2071, 1038, 0, 2534, 3495, 0, 3502, 3484, + 0, 1155, 3567, 3568, 1032, 1030, 0, 1216, 1217, 1220, + 0, 250, 0, 253, 255, 0, 400, 433, 435, 444, + 3631, 378, 0, 0, 1255, 0, 1253, 1252, 1250, 1251, + 1249, 0, 1240, 1246, 1247, 290, 0, 855, 858, 792, + 874, 872, 874, 806, 875, 0, 844, 842, 841, 837, + 844, 808, 914, 820, 0, 874, 907, 911, 908, 816, + 0, 786, 909, 0, 912, 787, 814, 807, 813, 844, + 0, 803, 811, 874, 779, 815, 802, 0, 844, 817, + 822, 825, 827, 829, 844, 874, 0, 3620, 786, 801, + 800, 786, 844, 0, 0, 3620, 838, 823, 909, 920, + 786, 874, 844, 0, 862, 844, 288, 375, 1976, 3709, + 3792, 3793, 3786, 3789, 3791, 1794, 0, 2146, 2153, 2055, + 2057, 2497, 0, 1348, 2148, 1923, 0, 0, 0, 2161, + 2059, 0, 3769, 0, 2042, 3408, 3482, 2041, 1159, 0, + 0, 378, 472, 448, 402, 3447, 1388, 3463, 0, 3468, + 3469, 3406, 225, 224, 3415, 223, 0, 0, 0, 0, + 3456, 3439, 0, 3443, 3442, 0, 3440, 0, 3441, 0, + 3446, 3423, 3422, 2473, 0, 2472, 3668, 377, 2079, 3009, + 3023, 2373, 2369, 2368, 0, 2388, 0, 1868, 1869, 0, + 0, 1871, 3357, 1976, 0, 3354, 3691, 393, 400, 0, + 0, 0, 415, 387, 400, 402, 414, 453, 275, 0, + 250, 383, 0, 0, 378, 378, 400, 3620, 3709, 3355, + 3290, 1680, 1682, 0, 0, 1874, 0, 1697, 0, 0, + 0, 0, 0, 0, 1507, 0, 0, 0, 1634, 0, + 1697, 1662, 2006, 2007, 1987, 1988, 1986, 1989, 1385, 0, + 1990, 2005, 0, 0, 0, 1660, 1330, 1313, 0, 0, + 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, + 1853, 1854, 1856, 1861, 1857, 1858, 1859, 1860, 1855, 1862, + 0, 1842, 0, 1686, 1647, 1649, 0, 0, 0, 756, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1873, + 0, 0, 1873, 0, 0, 0, 0, 0, 0, 1661, + 0, 1659, 0, 0, 1658, 1551, 0, 0, 1873, 0, + 1578, 0, 0, 0, 0, 0, 0, 1557, 1558, 0, + 0, 0, 1483, 0, 1481, 1482, 0, 0, 1873, 0, + 0, 0, 0, 1474, 0, 0, 0, 0, 1720, 0, + 0, 1865, 1863, 1866, 1864, 0, 0, 1721, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1555, 0, 0, + 0, 2488, 938, 0, 0, 0, 0, 1522, 0, 0, + 0, 0, 1390, 1389, 1391, 1402, 1396, 1400, 1394, 1398, + 0, 1455, 3003, 1403, 0, 0, 0, 1406, 1415, 1419, + 0, 0, 0, 0, 0, 1426, 1424, 1425, 1437, 1438, + 1422, 1423, 0, 1428, 0, 1427, 1434, 1435, 1436, 1439, + 1525, 901, 1533, 1893, 1653, 1654, 1678, 1897, 0, 0, + 0, 0, 2484, 1374, 1477, 1476, 1478, 1479, 1480, 511, + 0, 505, 508, 522, 0, 0, 2360, 0, 2676, 2692, + 2693, 322, 325, 324, 326, 0, 0, 1263, 1267, 3355, + 0, 0, 0, 0, 3486, 3396, 0, 0, 1370, 1310, + 1369, 0, 0, 0, 0, 0, 3312, 3324, 0, 0, + 3321, 0, 0, 0, 0, 0, 3294, 0, 0, 0, + 0, 3267, 3333, 3334, 3337, 0, 0, 0, 2973, 0, + 3269, 3274, 3265, 3278, 3280, 3282, 2234, 0, 0, 0, + 0, 2239, 2236, 2229, 2242, 2714, 2238, 2255, 2237, 2231, + 2244, 2230, 0, 0, 0, 2276, 2248, 2251, 2245, 2276, + 0, 2276, 2247, 0, 2274, 2261, 2260, 2259, 2202, 2201, + 2195, 2267, 2252, 2246, 220, 2276, 2200, 2199, 2181, 2182, + 2183, 0, 1932, 0, 2272, 134, 2266, 0, 2276, 2276, + 0, 2258, 2221, 2223, 2127, 0, 1794, 0, 0, 2113, + 2106, 2093, 378, 0, 0, 0, 2080, 2081, 378, 3828, + 0, 0, 0, 495, 1290, 1276, 1292, 1199, 1198, 1196, + 3532, 3536, 1722, 80, 2121, 2119, 82, 2118, 2120, 83, + 2339, 2315, 2314, 2316, 2320, 131, 2325, 2317, 0, 2331, + 2332, 350, 354, 0, 0, 0, 3372, 0, 611, 0, + 75, 0, 1205, 1976, 2354, 2356, 2349, 3539, 0, 1172, + 1189, 1188, 1184, 1185, 0, 1169, 135, 1180, 1179, 1173, + 2171, 3600, 3609, 3613, 3598, 601, 986, 0, 3404, 3502, + 189, 0, 0, 0, 140, 0, 3720, 0, 610, 161, + 163, 610, 0, 0, 0, 610, 0, 0, 1811, 1803, + 1805, 1806, 1807, 0, 1810, 0, 1352, 0, 1340, 1340, + 1350, 1813, 1793, 1790, 1816, 0, 1815, 1815, 0, 0, + 1773, 1772, 0, 1867, 895, 2025, 0, 0, 1877, 0, + 1879, 1888, 1878, 1946, 2689, 0, 0, 1366, 0, 1976, + 1360, 2437, 0, 0, 0, 0, 0, 0, 0, 1945, + 1942, 0, 2301, 0, 0, 601, 0, 604, 2100, 2100, + 0, 0, 0, 0, 0, 0, 0, 0, 230, 239, + 1025, 2532, 1027, 0, 0, 0, 0, 0, 3514, 3355, + 1052, 3569, 1028, 0, 0, 1219, 248, 247, 251, 0, + 3668, 439, 436, 378, 431, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 134, 89, 110, 0, 1242, 1254, 2052, 1248, 0, 0, + 0, 0, 0, 0, 804, 878, 0, 805, 0, 846, + 847, 845, 850, 782, 778, 915, 919, 918, 809, 810, + 789, 910, 906, 913, 0, 872, 788, 784, 0, 1014, + 796, 0, 785, 828, 783, 797, 280, 0, 0, 3655, + 0, 0, 3662, 286, 812, 794, 798, 3620, 3620, 277, + 285, 0, 775, 790, 921, 791, 793, 920, 776, 0, + 777, 1976, 1981, 1977, 3795, 303, 0, 302, 0, 2147, + 1340, 0, 0, 0, 2500, 0, 1960, 1924, 2160, 0, + 2164, 2163, 0, 3765, 0, 0, 1161, 1160, 2044, 2049, + 3355, 378, 292, 405, 451, 0, 0, 3403, 226, 3478, + 3481, 2497, 0, 0, 3424, 0, 424, 3630, 2081, 2370, + 2374, 1281, 1283, 1284, 1282, 1290, 0, 2548, 2547, 2546, + 2517, 1872, 2518, 2543, 2541, 2545, 2539, 2544, 2537, 2538, + 2542, 2540, 0, 3363, 3364, 3362, 3356, 3361, 394, 395, + 416, 419, 0, 388, 389, 403, 407, 0, 3626, 3625, + 422, 461, 445, 445, 445, 3823, 0, 1258, 0, 0, + 2487, 0, 1629, 0, 1630, 1631, 0, 1508, 1730, 0, + 0, 0, 1536, 0, 0, 0, 1633, 0, 1386, 0, + 0, 1511, 1503, 1314, 0, 1664, 0, 0, 0, 0, + 0, 0, 0, 1669, 0, 1667, 0, 0, 1724, 0, + 1726, 2484, 0, 1639, 1674, 0, 1637, 0, 0, 1663, + 1675, 1676, 0, 0, 0, 1643, 1641, 0, 1645, 1579, + 1642, 1644, 0, 0, 0, 1576, 0, 0, 0, 0, + 0, 0, 0, 1554, 0, 1590, 0, 1627, 1591, 0, + 0, 1588, 0, 0, 0, 1606, 1540, 1541, 0, 1542, + 1593, 0, 1516, 1547, 1548, 1513, 1514, 1607, 1596, 1515, + 0, 1550, 1976, 0, 1534, 0, 0, 0, 1552, 1582, + 0, 0, 0, 1512, 0, 0, 0, 1976, 0, 1608, + 1556, 0, 0, 757, 1332, 1504, 2485, 1397, 1401, 1395, + 1399, 0, 0, 0, 0, 1414, 0, 0, 1407, 1417, + 1420, 0, 0, 1895, 0, 0, 1672, 1719, 1719, 1719, + 1719, 0, 0, 0, 1623, 1624, 0, 0, 504, 503, + 0, 507, 591, 0, 524, 512, 501, 2362, 0, 0, + 1265, 0, 0, 0, 0, 3397, 0, 0, 0, 0, + 1374, 1375, 1375, 2483, 3291, 3292, 3293, 0, 2573, 2572, + 2570, 2574, 2571, 2521, 2523, 0, 2522, 2568, 2566, 2569, + 2564, 2562, 2563, 2567, 2565, 0, 0, 3310, 903, 902, + 3323, 0, 3345, 0, 0, 3330, 3328, 0, 0, 0, + 3273, 0, 3339, 3340, 0, 0, 0, 3308, 3307, 0, + 0, 0, 3300, 0, 0, 0, 2257, 0, 2228, 2241, + 2240, 2277, 2278, 2254, 2250, 2196, 2253, 2249, 2273, 1976, + 2206, 2227, 2197, 0, 2220, 2178, 2274, 2235, 1875, 2266, + 2193, 2194, 2256, 0, 1349, 1375, 2109, 1374, 2110, 378, + 2464, 0, 2471, 0, 2068, 0, 0, 3620, 1239, 1279, + 1271, 1278, 1275, 1290, 1288, 1277, 964, 963, 0, 1291, + 79, 0, 0, 2318, 134, 2312, 2333, 2307, 0, 345, + 355, 347, 351, 352, 353, 348, 2783, 2864, 0, 1875, + 3376, 3615, 1212, 1210, 1209, 1211, 1200, 1206, 1207, 2359, + 2357, 134, 2378, 1187, 0, 1190, 3620, 1976, 0, 3612, + 155, 602, 0, 0, 0, 986, 0, 165, 3514, 0, + 0, 0, 138, 169, 3720, 3777, 3620, 3762, 3771, 3583, + 0, 156, 3774, 228, 3772, 0, 0, 1808, 1809, 1770, + 1340, 1342, 1341, 0, 0, 1344, 0, 0, 0, 0, + 1778, 0, 1774, 1776, 0, 1840, 1832, 0, 2030, 2022, + 2027, 2482, 1885, 1929, 0, 0, 1311, 1888, 0, 1947, + 1938, 0, 1367, 1365, 1959, 1936, 0, 1952, 1951, 1954, + 1364, 1926, 1929, 0, 1374, 3686, 3688, 1022, 607, 0, + 0, 1023, 0, 0, 0, 233, 236, 234, 235, 2100, + 2100, 183, 2100, 2100, 182, 184, 0, 178, 175, 185, + 2100, 1039, 171, 0, 0, 0, 0, 1976, 0, 0, + 0, 191, 0, 3489, 3488, 0, 3504, 0, 0, 3506, + 0, 3505, 3503, 3474, 3485, 0, 1047, 1017, 0, 1054, + 1056, 0, 0, 3569, 1218, 0, 250, 254, 442, 0, + 0, 0, 1976, 0, 1976, 1976, 0, 0, 1976, 0, + 1976, 0, 0, 0, 0, 0, 0, 0, 1976, 0, + 0, 0, 1976, 0, 1976, 0, 88, 1256, 0, 3620, + 261, 0, 260, 3755, 292, 853, 851, 854, 852, 873, + 0, 848, 849, 916, 917, 879, 909, 0, 909, 282, + 0, 3111, 279, 767, 2588, 2589, 2590, 2591, 2593, 2594, + 3664, 3663, 3751, 3750, 0, 0, 795, 312, 311, 309, + 378, 299, 307, 301, 0, 308, 1984, 1985, 1982, 1980, + 1983, 3831, 2144, 2056, 2163, 0, 2498, 1373, 0, 2156, + 1875, 0, 2162, 3355, 3409, 3483, 1159, 0, 293, 0, + 0, 402, 3518, 0, 0, 0, 0, 0, 2474, 426, + 2065, 0, 1290, 1294, 2381, 3366, 3367, 3365, 396, 417, + 390, 0, 410, 402, 0, 250, 0, 455, 457, 446, + 465, 459, 0, 445, 1683, 1681, 0, 1698, 1727, 0, + 857, 857, 840, 861, 1713, 3118, 1707, 1710, 0, 859, + 1715, 857, 1708, 859, 0, 1706, 0, 1704, 1705, 0, + 0, 0, 1635, 1632, 0, 0, 0, 1689, 1689, 0, + 0, 0, 0, 1431, 0, 0, 0, 1618, 0, 1640, + 1638, 0, 0, 0, 0, 0, 1646, 0, 1562, 1560, + 1489, 0, 1487, 0, 1488, 0, 1490, 0, 0, 1628, + 0, 1457, 1475, 0, 0, 0, 1722, 0, 1992, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2489, 0, 0, 927, 933, 936, 937, 939, 931, 0, + 1600, 0, 0, 0, 1412, 1408, 0, 1416, 0, 0, + 0, 1430, 1429, 1897, 1896, 0, 1671, 0, 0, 1721, + 0, 0, 1721, 0, 0, 0, 2486, 1375, 1605, 1374, + 514, 0, 532, 506, 1976, 509, 0, 523, 0, 535, + 0, 0, 0, 323, 0, 1268, 0, 454, 0, 3395, + 3487, 0, 0, 1368, 1376, 1371, 0, 0, 0, 3314, + 3313, 3325, 0, 0, 0, 0, 3298, 3296, 3295, 3271, + 0, 0, 3344, 3338, 3335, 3336, 0, 0, 3277, 0, + 0, 3275, 3279, 3281, 2216, 2215, 0, 2275, 1932, 2189, + 2208, 2210, 2276, 2129, 2133, 0, 1867, 2117, 0, 0, + 2111, 2115, 0, 2470, 0, 0, 2082, 1794, 273, 0, + 3692, 3833, 0, 1834, 84, 0, 2319, 2310, 0, 2305, + 2308, 0, 0, 3387, 3388, 3380, 3383, 3381, 3382, 3386, + 3389, 3390, 3377, 3384, 1932, 0, 0, 1202, 1208, 2352, + 1186, 136, 0, 1170, 0, 0, 3651, 2172, 3601, 3614, + 1001, 1003, 1002, 987, 988, 0, 0, 0, 1047, 0, + 0, 0, 614, 614, 170, 3779, 0, 0, 3715, 3718, + 3716, 3719, 3721, 3620, 0, 200, 3569, 3620, 0, 3620, + 158, 1767, 1351, 1343, 1345, 1340, 1340, 0, 1731, 0, + 0, 0, 1731, 0, 0, 495, 0, 1812, 1829, 896, + 2395, 1886, 1887, 0, 1882, 1930, 1931, 1884, 1880, 0, + 1889, 1891, 1312, 1948, 1940, 1935, 1361, 0, 1928, 0, + 0, 0, 2016, 2018, 665, 664, 238, 237, 242, 243, + 1976, 1976, 2105, 2104, 1976, 1976, 177, 174, 2103, 2102, + 1976, 1976, 172, 2071, 195, 194, 196, 197, 199, 198, + 193, 1035, 0, 3492, 0, 3499, 3494, 3497, 3477, 3476, + 3475, 3472, 0, 1976, 1976, 1976, 0, 1976, 3513, 3515, + 0, 0, 1036, 904, 3527, 0, 0, 205, 3571, 0, + 3573, 0, 1222, 0, 1221, 249, 3668, 1976, 1976, 103, + 1976, 95, 96, 91, 123, 124, 93, 94, 99, 98, + 100, 101, 104, 105, 102, 97, 92, 127, 129, 128, + 106, 2012, 2011, 2010, 130, 125, 126, 90, 291, 0, + 268, 266, 267, 3666, 3665, 3752, 0, 0, 3753, 3798, + 0, 819, 1015, 818, 281, 278, 839, 1976, 289, 310, + 0, 1875, 2501, 0, 0, 1961, 2157, 2149, 2151, 2039, + 2037, 3658, 0, 452, 406, 450, 0, 3402, 3407, 3480, + 3479, 3502, 3502, 400, 3668, 400, 425, 0, 1285, 1290, + 1294, 0, 1286, 2392, 404, 408, 3628, 3627, 462, 3709, + 3821, 0, 0, 1728, 1699, 909, 1712, 1714, 0, 1711, + 909, 856, 860, 1717, 1703, 1709, 1716, 909, 1506, 1537, + 1510, 1509, 0, 0, 0, 1569, 0, 1687, 1693, 0, + 0, 0, 1544, 0, 1670, 1668, 1546, 0, 0, 1620, + 2486, 1595, 1666, 1572, 1597, 1549, 0, 0, 0, 1486, + 1484, 1485, 0, 1563, 1586, 0, 1473, 1587, 0, 1570, + 1594, 1502, 1994, 1993, 1991, 1517, 1976, 0, 1574, 1535, + 0, 0, 1599, 2490, 2491, 0, 0, 0, 938, 924, + 925, 926, 0, 928, 930, 932, 0, 1976, 1433, 1432, + 1404, 0, 1413, 1410, 0, 1418, 1899, 1898, 0, 0, + 1611, 1613, 1612, 1615, 1614, 1609, 1719, 1376, 1625, 0, + 515, 516, 518, 520, 597, 0, 510, 539, 499, 0, + 514, 502, 1266, 1269, 0, 3393, 3392, 0, 1372, 1380, + 1379, 2480, 2484, 0, 0, 0, 3311, 3332, 0, 0, + 0, 0, 3342, 3341, 3343, 3309, 3304, 3302, 3301, 1998, + 1999, 1997, 1995, 1996, 2207, 1932, 2203, 0, 1875, 0, + 1832, 1375, 2107, 0, 3657, 0, 2088, 0, 2085, 2092, + 488, 2156, 0, 2083, 2054, 3696, 3693, 3694, 0, 1837, + 0, 1838, 1835, 1836, 1976, 0, 0, 371, 363, 358, + 366, 360, 362, 361, 367, 368, 369, 370, 364, 359, + 365, 357, 356, 0, 3375, 1213, 1214, 0, 1193, 1191, + 3652, 3653, 143, 0, 3405, 164, 0, 149, 152, 715, + 0, 0, 0, 0, 2100, 2100, 2100, 2100, 2100, 2100, + 2100, 2100, 2100, 2100, 0, 2100, 2100, 2100, 2100, 2100, + 2100, 2100, 2100, 2100, 2100, 0, 0, 2100, 2100, 139, + 483, 491, 615, 618, 654, 656, 643, 644, 480, 0, + 141, 0, 3708, 3707, 3620, 3714, 3717, 269, 3702, 3698, + 3701, 231, 0, 0, 0, 257, 3700, 3699, 0, 680, + 681, 679, 678, 0, 0, 3569, 0, 1354, 1353, 1779, + 0, 1783, 1788, 1784, 0, 1775, 0, 1796, 1841, 1833, + 0, 0, 2403, 1929, 0, 0, 1929, 0, 0, 1375, + 2014, 1374, 176, 181, 180, 173, 186, 179, 1040, 192, + 3493, 3491, 3490, 0, 3498, 0, 3473, 3509, 3507, 3508, + 3511, 0, 0, 3510, 3512, 1041, 1042, 1048, 1043, 1147, + 1147, 0, 1147, 0, 0, 1147, 2100, 0, 0, 495, + 1165, 2100, 0, 0, 0, 0, 0, 1130, 0, 1147, + 0, 0, 0, 0, 0, 1068, 1129, 616, 1018, 1067, + 1069, 1081, 491, 0, 1102, 1132, 1133, 1131, 3528, 0, + 0, 0, 1053, 0, 208, 206, 216, 3570, 0, 2071, + 0, 3573, 1224, 1225, 0, 440, 0, 116, 118, 0, + 120, 122, 0, 112, 114, 259, 3667, 3754, 0, 0, + 843, 300, 2163, 2154, 0, 1962, 0, 1374, 2071, 294, + 0, 0, 3516, 3516, 427, 429, 428, 2122, 1287, 1295, + 2394, 2393, 0, 250, 445, 0, 1684, 1700, 1718, 1701, + 1702, 1636, 0, 0, 0, 0, 1693, 0, 0, 1694, + 1652, 0, 0, 0, 0, 0, 1505, 0, 1616, 0, + 1561, 1559, 0, 840, 1464, 1466, 1462, 1465, 0, 859, + 1468, 0, 821, 859, 909, 1472, 1458, 1459, 1460, 1461, + 0, 0, 0, 0, 0, 2492, 922, 1602, 0, 935, + 929, 927, 934, 0, 1409, 0, 0, 1901, 0, 1673, + 0, 1626, 519, 0, 598, 594, 0, 0, 540, 0, + 541, 537, 513, 0, 3394, 1378, 1377, 0, 3318, 3316, + 3315, 3347, 3346, 3299, 3297, 0, 0, 134, 2132, 1923, + 2134, 2135, 2126, 2116, 2114, 2466, 0, 2089, 2091, 2477, + 2476, 2488, 0, 0, 2071, 2084, 1976, 3695, 1087, 0, + 1088, 1099, 1101, 1293, 0, 2344, 0, 2342, 2311, 2345, + 0, 0, 0, 0, 146, 0, 0, 0, 1012, 2625, + 0, 0, 684, 686, 687, 688, 689, 0, 716, 691, + 610, 965, 965, 718, 2493, 0, 663, 2100, 484, 1976, + 1976, 1976, 1976, 641, 1976, 1976, 1976, 0, 0, 2100, + 1976, 0, 0, 1976, 1976, 1976, 1976, 0, 0, 1976, + 649, 650, 648, 1976, 1976, 2392, 490, 492, 904, 619, + 614, 0, 0, 3670, 3670, 3744, 0, 3745, 3746, 262, + 3763, 475, 476, 0, 0, 3573, 0, 0, 3589, 0, + 3589, 0, 0, 1734, 1733, 0, 0, 0, 0, 0, + 0, 1822, 0, 1821, 0, 1827, 1831, 0, 0, 0, + 0, 2396, 2398, 0, 2031, 1883, 1892, 1890, 1927, 1939, + 0, 2019, 2017, 0, 3500, 3496, 1979, 1978, 0, 1045, + 0, 1044, 1049, 1012, 610, 1148, 608, 0, 1106, 1110, + 1107, 608, 2058, 2058, 1259, 2058, 0, 0, 0, 0, + 2058, 0, 2060, 2058, 0, 0, 2058, 2058, 0, 1259, + 0, 493, 1168, 1166, 2058, 1167, 2058, 0, 0, 1259, + 1119, 1063, 1120, 0, 1064, 2058, 1259, 1086, 1259, 1259, + 0, 617, 904, 1065, 1066, 715, 1162, 215, 204, 0, + 0, 1055, 1057, 0, 0, 1058, 3572, 1031, 3575, 2071, + 1230, 0, 108, 1976, 109, 1976, 107, 1976, 3758, 0, + 2071, 0, 1963, 2158, 2152, 3519, 0, 3401, 3400, 0, + 2156, 0, 3629, 463, 445, 1567, 1568, 1690, 1929, 1688, + 0, 1695, 1696, 1650, 1592, 0, 1545, 0, 1617, 0, + 1598, 1564, 1467, 1463, 1470, 822, 1469, 1471, 1589, 1518, + 1976, 1575, 1580, 1581, 0, 1601, 1976, 1411, 0, 1904, + 1903, 0, 0, 1929, 1610, 517, 595, 512, 0, 536, + 539, 0, 500, 2481, 0, 0, 3305, 3303, 2209, 1960, + 2467, 2465, 2087, 0, 0, 0, 2086, 2096, 0, 2069, + 0, 1289, 0, 1839, 2340, 1976, 0, 2309, 0, 1192, + 1194, 0, 0, 0, 0, 0, 717, 1013, 0, 0, + 690, 2496, 683, 715, 0, 0, 0, 965, 707, 610, + 0, 1012, 966, 610, 610, 0, 0, 0, 0, 2009, + 2008, 638, 631, 630, 633, 632, 635, 634, 0, 627, + 624, 636, 626, 651, 0, 639, 621, 676, 677, 675, + 645, 652, 622, 623, 629, 628, 625, 668, 673, 671, + 670, 669, 674, 672, 640, 655, 637, 653, 482, 599, + 620, 491, 2002, 2003, 2000, 2001, 660, 659, 2004, 657, + 658, 3670, 3670, 0, 372, 3646, 3644, 3647, 3645, 3780, + 3724, 3725, 3729, 3727, 3738, 3731, 0, 3731, 0, 3661, + 3747, 0, 263, 265, 240, 232, 0, 0, 479, 477, + 478, 0, 0, 157, 271, 258, 231, 0, 3776, 231, + 3573, 1735, 0, 0, 1780, 0, 1785, 0, 1777, 1817, + 1817, 1828, 0, 0, 0, 0, 2397, 0, 0, 2404, + 2406, 1941, 0, 1043, 0, 0, 0, 1259, 0, 0, + 1134, 1104, 0, 0, 0, 0, 1075, 0, 1084, 0, + 0, 2058, 0, 1136, 0, 1135, 0, 0, 0, 1145, + 1146, 0, 1919, 1921, 1929, 0, 0, 0, 1124, 1143, + 1144, 0, 0, 0, 0, 1094, 0, 1080, 1147, 0, + 1147, 1103, 0, 682, 0, 1164, 1105, 202, 207, 217, + 218, 1033, 0, 3574, 1029, 0, 1231, 1227, 1228, 1223, + 117, 121, 113, 0, 0, 2155, 0, 0, 3523, 3517, + 3521, 2123, 2071, 0, 3824, 0, 1692, 1648, 0, 1619, + 1621, 0, 923, 0, 1900, 1894, 0, 0, 0, 0, + 0, 0, 1913, 1905, 0, 1677, 0, 597, 0, 0, + 525, 538, 544, 543, 3319, 3317, 2130, 0, 2090, 2478, + 2489, 489, 0, 0, 3668, 1100, 2343, 0, 3385, 0, + 1929, 1010, 0, 0, 0, 0, 0, 0, 685, 0, + 610, 961, 962, 1012, 0, 692, 984, 2493, 1012, 1012, + 722, 0, 710, 720, 765, 2495, 485, 647, 2332, 646, + 600, 0, 2392, 0, 0, 3743, 0, 3726, 3728, 3730, + 0, 3749, 0, 3748, 3620, 270, 0, 241, 3710, 1374, + 213, 3760, 3620, 3590, 3620, 159, 0, 1867, 0, 0, + 0, 1825, 1823, 2401, 2402, 0, 2399, 0, 0, 2405, + 0, 1050, 1046, 1051, 0, 1089, 0, 1108, 0, 0, + 1074, 0, 1245, 0, 0, 1127, 1115, 0, 1070, 0, + 1117, 1118, 1159, 1072, 0, 1922, 494, 0, 0, 1079, + 0, 1162, 1071, 1096, 1077, 1109, 1163, 209, 1059, 378, + 0, 0, 0, 1226, 0, 1233, 3759, 3756, 0, 0, + 3522, 3520, 0, 2066, 1794, 1929, 1543, 1519, 1603, 0, + 1910, 0, 0, 1908, 1907, 0, 1902, 1909, 596, 593, + 0, 0, 533, 551, 547, 0, 549, 550, 572, 2071, + 0, 0, 2095, 2097, 3697, 2346, 3355, 0, 1007, 0, + 1008, 0, 3355, 3355, 0, 0, 0, 1012, 984, 2493, + 943, 0, 693, 0, 697, 699, 724, 0, 719, 711, + 732, 0, 0, 661, 481, 3670, 0, 3670, 0, 3709, + 3722, 3781, 3734, 3732, 3704, 3703, 3778, 264, 3620, 3620, + 3584, 205, 214, 0, 3775, 3773, 2862, 0, 1743, 1745, + 1768, 1782, 1787, 0, 1818, 0, 0, 0, 2400, 2408, + 2407, 3501, 0, 1091, 609, 1004, 0, 1122, 0, 0, + 1162, 1076, 0, 0, 0, 1116, 1137, 1114, 1259, 1920, + 0, 0, 0, 1113, 1095, 1097, 1205, 0, 211, 187, + 3576, 0, 0, 1232, 1237, 0, 1234, 1236, 0, 1346, + 0, 2382, 1691, 1911, 0, 1912, 1915, 0, 0, 1916, + 0, 529, 531, 521, 0, 526, 0, 545, 0, 2100, + 2100, 0, 2100, 2100, 2100, 2100, 565, 573, 575, 576, + 577, 0, 2131, 2468, 2479, 972, 1929, 0, 0, 0, + 0, 974, 976, 0, 0, 712, 705, 701, 0, 0, + 947, 985, 0, 695, 0, 0, 887, 941, 750, 0, + 753, 0, 885, 723, 725, 883, 884, 727, 0, 0, + 0, 766, 0, 0, 865, 0, 868, 0, 0, 721, + 0, 733, 864, 871, 2494, 642, 487, 662, 3741, 3737, + 3739, 3736, 0, 3661, 3620, 3620, 3764, 3711, 0, 216, + 3710, 0, 1742, 0, 0, 1820, 1819, 1834, 0, 0, + 0, 539, 1090, 1005, 1123, 0, 1112, 495, 539, 1128, + 1073, 1125, 1126, 495, 0, 1078, 210, 0, 203, 188, + 219, 3577, 3578, 1229, 0, 3757, 2124, 895, 1906, 1914, + 1918, 1917, 527, 0, 534, 558, 548, 554, 0, 2100, + 0, 0, 2100, 0, 0, 0, 0, 0, 542, 574, + 2100, 0, 0, 2100, 0, 993, 995, 1138, 973, 997, + 996, 978, 994, 1006, 1011, 1010, 3355, 190, 0, 1138, + 975, 999, 982, 1138, 977, 998, 980, 0, 0, 0, + 0, 703, 0, 946, 0, 951, 0, 0, 0, 0, + 751, 752, 888, 726, 886, 882, 876, 870, 2505, 2506, + 0, 0, 0, 762, 763, 866, 759, 760, 761, 0, + 741, 0, 0, 872, 863, 734, 3710, 3710, 3723, 3620, + 231, 0, 0, 0, 0, 187, 1747, 1744, 0, 1752, + 1754, 1753, 1755, 1746, 0, 0, 0, 1111, 1093, 0, + 1121, 1083, 1085, 1082, 0, 212, 1235, 0, 2383, 533, + 530, 558, 0, 556, 0, 552, 546, 553, 0, 590, + 584, 0, 586, 587, 585, 582, 569, 0, 567, 0, + 989, 992, 1976, 990, 144, 1140, 1139, 979, 0, 972, + 0, 150, 983, 153, 981, 708, 0, 0, 0, 0, + 944, 0, 948, 949, 950, 0, 942, 0, 0, 0, + 0, 877, 881, 2440, 2439, 0, 1381, 869, 0, 736, + 880, 735, 3620, 3620, 3782, 3735, 3589, 3709, 1374, 218, + 3761, 0, 1749, 0, 0, 1826, 1824, 1092, 539, 2125, + 2137, 0, 2409, 528, 555, 0, 563, 559, 561, 564, + 589, 588, 0, 566, 0, 583, 666, 991, 1142, 1141, + 1009, 1138, 1000, 709, 0, 1008, 0, 945, 0, 0, + 972, 0, 974, 976, 758, 0, 867, 728, 728, 742, + 3706, 3705, 3742, 3740, 231, 3712, 3585, 201, 1748, 0, + 1756, 0, 0, 0, 0, 2395, 557, 0, 0, 578, + 571, 568, 147, 0, 0, 1008, 957, 956, 0, 0, + 953, 952, 694, 972, 698, 700, 1382, 0, 739, 729, + 731, 738, 744, 745, 743, 746, 3733, 0, 0, 1751, + 0, 1762, 1761, 1750, 0, 1757, 1759, 1098, 2136, 2138, + 0, 2403, 562, 560, 570, 579, 581, 706, 972, 0, + 960, 958, 959, 0, 0, 696, 1383, 730, 737, 747, + 749, 3713, 0, 1739, 1740, 1738, 1737, 1736, 1763, 0, + 0, 1758, 0, 1760, 0, 2411, 580, 702, 972, 0, + 0, 748, 3586, 1765, 1764, 0, 0, 2410, 0, 2415, + 704, 955, 954, 3581, 0, 0, 2422, 3579, 3580, 0, + 3587, 2413, 2414, 2412, 0, 2417, 0, 2419, 2420, 0, + 2071, 3582, 378, 2421, 2416, 0, 2423, 2425, 0, 2384, + 187, 2418, 0, 1374, 3588, 2424, 0, 1375, 2426 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -5620, -5620, -5620, -5620, 1734, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 2323, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 1462, -5620, 122, -5620, 128, -5620, 125, -4030, -599, + -5620, -2250, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 1619, -3408, -5553, -5620, -5620, -397, 1014, -5620, + -5620, -74, -5620, -432, -5620, -5620, -5620, -4672, -589, -818, + -5620, 42, 4620, 3260, -585, 3928, -4607, 257, -5620, -3349, + -5620, -5620, -5620, -5620, -2390, -5620, -5620, -5620, -5620, 258, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -613, -5620, + 1460, -5620, 955, -5620, -4604, -5620, -737, -5620, -5620, -5620, + 1478, -5620, -5620, 357, 947, 2847, 2843, -5620, -5620, -5620, + -5620, 1823, -5620, 2011, -5620, -2116, 3285, -5620, -5620, -5620, + -5620, -5620, 2333, -2878, -5620, -5620, -5620, 1166, -5620, -850, + -5620, 40, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -504, -5620, -2481, + 1397, -5620, 1420, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -709, -5620, -5620, -5620, 44, -5620, -5620, -5620, + -5620, -5620, 2945, -5620, 4574, -5620, -5620, -3841, -5620, 2752, + -5620, 2755, 2758, -3243, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 47, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -236, -234, 0, 550, 1031, -5620, -4149, -5620, + -5620, -100, -5620, -5620, -5620, -5620, -5620, 810, 110, 808, + -5620, 440, 2530, -3237, -5620, -5620, -5620, -5620, -5620, -5620, + -593, -145, -684, -5620, -4536, -5620, -5036, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -3957, -5620, -5620, -5620, -819, + -5620, -5620, -775, -5620, -5620, -5620, -5620, -447, -5620, -5620, + -3892, -5620, -5620, -5620, -135, -5620, 2280, 4009, -2256, 277, + -679, -5620, -4077, 600, -4290, -4162, -5620, -3974, -5620, -333, + -1367, -1329, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 240, + 113, 604, -4395, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -4391, -4358, -26, -5620, -5127, -5620, 399, -5620, -4931, -5620, + -5620, -5620, -5620, -5620, -5620, -778, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5619, -5620, -5620, -611, -623, -5620, -513, + -3206, -5620, -3230, -4595, -501, -1396, -500, -499, -498, -5620, + -1563, 934, 3875, -5620, -5620, -5620, -5620, -1515, -1717, -5620, + 1445, -3832, -1393, 984, -1424, -3834, 1461, -612, -5401, -3221, + -1385, -5620, -1349, -5620, -5620, -3645, -3817, -5620, -680, -2297, + -3637, -522, -5620, -5620, -2097, -3720, -5620, 2996, -2410, -2421, + 2187, 1391, -5620, -5620, 922, -5620, -1752, 924, -5620, -5620, + -5620, 930, -5620, -772, -5620, -5620, -5620, -5620, -3812, -5620, + -2905, -3719, -5620, 5021, 5028, -3768, -732, -727, -5620, -5620, + -5620, -261, 1773, -5620, -3509, -514, -519, -518, -3668, -151, + -4993, -3696, -3705, -3394, 3021, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 55, + 69, 1273, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 681, -2629, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -4166, -3059, -5620, -5620, 331, -5437, -4259, -4264, -4105, 3679, + -5620, -5620, -5620, -5620, 4087, -3843, -4269, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 3250, 1432, -5620, -5620, 1825, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -300, 1831, + -5620, -5620, -5620, -5620, -5620, 2359, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -441, -5620, -5620, -5620, -5620, -5620, + -128, 3092, -5620, -5620, -5620, -5620, -28, -5620, -5620, -5620, + -5620, 1988, -5620, -5620, -5620, -5620, 2539, -5620, -5620, -5620, + -5620, -5620, -5620, 1576, -5620, 2210, -5620, -2883, -5620, -5620, + 1096, -615, -5620, -5620, -421, -5620, -5620, -5620, -5620, -5620, + 60, -5620, -5620, -5620, 5050, -1912, 16, -460, -5620, -5620, + 15, -5620, -5620, 4151, -485, 2039, -719, 4815, -5620, -5620, + -5620, -5620, -2954, 1912, -5620, 4209, -5620, -5620, 4392, 1396, + 4172, 1782, 686, 2004, -2034, -628, -3534, 999, -5620, 1641, + 896, 11402, -5620, -1911, -1984, -5620, -5620, -78, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 2105, 2109, -5620, -5620, + 3555, -5620, 2042, -3550, -5620, -5620, -826, -5620, -2940, -5620, + -5620, -5620, 2044, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 1469, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3510, -1974, -5620, + -5620, 3652, -5620, 1564, -5620, 678, -5620, -5620, -1559, -5620, + -3244, -5620, -5620, -1966, -682, -5620, 3639, -5620, 3672, -1282, + -4496, -5620, -2084, -574, -5620, -345, -5620, -5620, -5620, -5620, + -5620, -3460, -677, -675, -5620, -5620, -5620, 3270, -5620, 4265, + -5620, -5620, -5620, -5620, -5620, -5620, 3274, -5620, -2516, -5620, + -2936, 4266, 4270, 4272, -5620, 4276, -5620, -5620, -2135, 161, + -5620, 488, -5620, -5620, -5620, -5620, -5620, 986, -5620, -340, + 594, -338, -4501, -1915, 859, -5620, -5620, -2251, 3291, 3698, + -1375, -5620, 2493, -5620, 3275, 1530, -5620, 1861, -5620, 865, + 870, -5620, -5620, 1539, -5620, -5620, -5620, -5620, 365, -209, + -5620, -5620, -5620, -38, 649, -2502, -5620, 373, -3678, 4267, + -42, -5620, 1856, -2331, -3632, -1223, 735, -1331, 1867, 355, + 4899, -224, -5620, -5620, 4239, -5620, -2240, -5620, -2205, -1947, + -1549, -3475, -3094, -4904, -5620, -2429, 1121, -5620, -5620, -5620, + -5620, 879, -5620, -5620, -5620, 2537, -5620, 5182, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -693, -1210, + -5620, -5620, 2365, -1663, -552, 5201, -418, -5620, -5620, -417, + -5620, -5620, 4996, -2416, -5620, -5620, 4406, 3072, 2335, -5620, + 1214, -5620, -5620, -5620, -5620, 1033, -5620, -5620, 95, -1053, + 709, 1858, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 650, + -5620, 1050, -2242, -5620, -5620, -5620, -5620, -416, -5620, -5620, + -5620, -5620, 1056, -5620, -560, -5620, -409, -5620, -5620, -5620, + 4830, -5620, -5620, -5620, -5620, -5620, -5620, -4352, -5620, -5620, + 3139, -1776, 4832, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 2703, -5620, -5620, -5620, -5620, -5620, -5620, 3528, 5025, 5031, + -2003, -5620, -1073, 2710, 2050, -1125, -5620, -5620, -5620, 4283, + 5036, -5620, -5620, -252, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 2660, 81, -5620, -5620, -5620, -5620, + -5620, 388, -5620, -5620, -5620, -5620, 3428, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3845, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 1243, -538, -5620, 577, -582, -5620, 251, -5620, -5620, + -5620, -5620, -5620, -654, -5620, -5620, -660, -5620, -1429, 4742, + -1382, -5620, -2091, -3804, -5620, 1, -5620, -5620, -5620, 2714, + -5620, -5620, -5620, -5620, 2379, -2964, -5620, 415, -5620, -5620, + -3054, -965, -2030, -4307, 9922, -5620, -5620, 50, 4942, 3289, + -5620, -5620, 165, -488, -1274, -5620, -5620, 2331, -3, 2430, + -565, -755, -779, -1110, -5620, 4500, -5620, -5620, -5620, 21, + -637, -627, 213, 89, 59, 29, 6826, 9152, 23, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 2097, + 2098, -5620, 5058, -5620, 3083, 2807, -5620, -5620, -5620, 2100, + -5620, -5620, -5620, 5065, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 2106, 2116, 2118, -5620, -5620, 1581, + -2754, -5620, -5620, -2295, 150, -5620, 3115, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 3432, -583, 4546, -581, + 3644, 5074, 4579, -5620, 3900, -5620, 3901, -5620, 1388, -5620, + -1263, 2175, -1740, -3416, -5620, -5620, 2566, 951, -5620, -5620, + -2951, -3233, -5620, 2022, 849, -5620, -5620, 212, -5620, -5620, + -5620, 1389, 403, 5051, 4456, -5620, -5620, -5620, -5620, 5272, + 2211, -5620, 1010, 5297, 5298, 5299, -27, -5620, -3663, -5620, + -4504, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -4939, -5620, -5620, -5620, 2498, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -73, 4821, -5620, -5620, -5620, + -5620, 1308, -3034, -5620, -683, -5620, -5620, -5620, -5620, -5620, + 3127, -5620, 1778, -5620, -5620, -178, -2304, -5620, -2571, -5620, + -4848, 27, -626, 4833, -5620, -5620, -5620, -5620, -5620, 4808, + -5620, -5620, 1123, -5620, -4146, -4142, -173, -4138, -401, -4553, + -5620, -3789, -5620, -5620, -5620, 1513, -5620, -5620, 2043, -5620, + -5620, -5620, -5620, 366, 369, 379, -5620, 374, -5620, -4699, + -5620, -5620, -5620, -5620, 370, -5620, -5620, -4197, -5620, -5620, + -4280, -5620, 343, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -2616, -5620, -5620, -5620, + 4011, -5620, 4945, -5620, -960, 4834, -5620, -5620, -5620, -5620, + -5620, -5620, 48, -5620, -5620, -5620, -2513, -5620 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + 0, 472, 759, 2333, 473, 474, 475, 476, 477, 2299, + 478, 1309, 3053, 1311, 2264, 3056, 479, 728, 480, 2473, + 3250, 3251, 4902, 4903, 4896, 4897, 4899, 4900, 3252, 842, + 843, 3095, 3096, 481, 3113, 4282, 3763, 2335, 5063, 3107, + 5352, 2340, 5066, 2341, 5067, 3105, 4296, 4785, 2347, 2348, + 768, 4283, 3851, 3852, 6010, 1370, 3759, 3860, 3861, 3120, + 4773, 4882, 5727, 4886, 5868, 6008, 5821, 3879, 5245, 5728, + 5729, 661, 1381, 2606, 5814, 2438, 5671, 5454, 5455, 3199, + 482, 835, 2461, 3886, 1488, 2462, 2463, 5136, 5137, 3918, + 3919, 5451, 5452, 4443, 4768, 5129, 4776, 3038, 967, 1783, + 3296, 3297, 2537, 856, 857, 2545, 858, 3321, 3259, 3988, + 3989, 4472, 859, 3960, 3961, 3962, 3325, 1179, 3963, 483, + 484, 682, 690, 683, 1176, 2911, 1177, 485, 486, 726, + 2289, 2290, 2291, 2292, 3725, 3073, 3719, 3720, 4701, 860, + 861, 968, 662, 969, 970, 971, 972, 2661, 973, 3403, + 4010, 974, 3398, 4008, 975, 976, 977, 946, 838, 3353, + 3406, 4011, 3354, 3990, 3407, 2656, 978, 979, 980, 981, + 982, 1928, 947, 2626, 3999, 4486, 983, 641, 839, 1490, + 2467, 840, 2468, 3889, 841, 2465, 1493, 4017, 2594, 900, + 1847, 984, 1185, 4018, 985, 2664, 2666, 2663, 4016, 4934, + 2665, 986, 672, 700, 660, 1845, 688, 5133, 5461, 4749, + 5120, 4750, 5418, 4669, 5115, 5116, 5117, 5525, 3704, 490, + 675, 1161, 2118, 2903, 4162, 3580, 3582, 2904, 4161, 4609, + 4610, 4611, 3578, 3579, 5600, 3584, 4159, 5762, 6139, 5890, + 5891, 4151, 5895, 4618, 5009, 5010, 5011, 5321, 5602, 5768, + 6028, 5896, 6146, 6026, 6142, 6027, 6144, 6278, 6227, 6228, + 6038, 6157, 6158, 6232, 6279, 5906, 5907, 5908, 6324, 6325, + 5909, 4155, 4156, 5597, 5005, 5651, 3750, 3751, 2433, 5499, + 1320, 491, 4751, 4866, 4752, 4753, 5388, 6046, 5966, 4755, + 4756, 4757, 6235, 2193, 5414, 5400, 4783, 5542, 4758, 5071, + 5072, 5073, 5074, 5932, 6077, 5934, 5935, 6070, 6179, 6069, + 5075, 5076, 5360, 5798, 5368, 5205, 5077, 5078, 5079, 5375, + 5642, 5800, 5796, 5943, 5944, 6298, 6299, 5959, 6259, 5960, + 6305, 6338, 6339, 5945, 492, 674, 2067, 6093, 6094, 6095, + 1785, 5643, 1786, 1787, 1788, 2509, 1789, 1790, 1791, 1792, + 1793, 1794, 1795, 1796, 1797, 1798, 3312, 2496, 2497, 3272, + 3273, 2487, 2488, 4512, 2489, 4513, 2555, 5961, 5962, 3265, + 2493, 6192, 2494, 3286, 6105, 5946, 5963, 5948, 2513, 2143, + 2144, 3798, 2158, 2159, 3629, 3630, 2436, 2514, 3280, 2515, + 3315, 4577, 5304, 4583, 4584, 4585, 4113, 4114, 4115, 4116, + 4117, 3538, 5949, 5635, 5930, 6072, 6075, 6186, 6290, 5369, + 5080, 5373, 1278, 5081, 5082, 6047, 6059, 6063, 6048, 6064, + 6060, 5792, 3754, 6049, 6050, 6051, 6066, 6062, 4273, 6052, + 5619, 5919, 5620, 5356, 3288, 493, 630, 4393, 1457, 3185, + 1459, 1469, 3883, 3211, 3210, 1472, 1471, 3203, 4363, 4837, + 5182, 4392, 3880, 4397, 5551, 804, 4868, 5858, 5702, 5866, + 5704, 4869, 5049, 4870, 5843, 5992, 4871, 5723, 5864, 6004, + 5050, 5051, 4872, 4873, 4874, 6164, 6165, 6166, 5191, 2237, + 818, 819, 1477, 1478, 1479, 3348, 5546, 5217, 494, 3745, + 3089, 495, 1337, 1338, 1339, 2311, 2312, 3092, 3093, 4263, + 4709, 496, 1304, 3049, 2301, 3081, 497, 1323, 3736, 3737, + 3738, 4257, 498, 1485, 2457, 2458, 3215, 4404, 4894, 5250, + 5559, 5735, 5555, 5875, 5876, 499, 846, 1496, 500, 643, + 2482, 2483, 2484, 3254, 501, 1939, 638, 502, 2127, 2124, + 2917, 2918, 503, 1303, 2251, 2252, 2253, 2254, 3700, 504, + 2634, 3371, 3372, 3373, 3374, 3044, 4232, 3045, 3046, 3709, + 4492, 505, 782, 1449, 506, 781, 1448, 507, 508, 699, + 754, 692, 2134, 510, 511, 4670, 2707, 513, 788, 786, + 1121, 515, 1441, 1437, 516, 2708, 1122, 778, 779, 1389, + 1205, 3783, 3784, 2573, 2574, 3153, 3140, 1206, 1207, 1418, + 2410, 3170, 2929, 2930, 2233, 2931, 4174, 4628, 6256, 1968, + 1857, 1307, 1124, 1125, 1126, 2078, 2079, 2094, 1127, 2088, + 2854, 4556, 4976, 4977, 4978, 4979, 2793, 2794, 2898, 1128, + 2783, 2784, 2785, 1129, 1130, 1131, 1132, 1133, 1134, 1135, + 2776, 2777, 2778, 1136, 1137, 1138, 2893, 4538, 4539, 4958, + 3573, 3574, 3575, 1139, 3435, 4522, 3446, 3447, 2736, 1140, + 1141, 1142, 1143, 1144, 4137, 1145, 4599, 4329, 1146, 1940, + 2671, 2734, 4946, 4527, 5277, 4948, 4949, 5281, 2676, 3423, + 4046, 4047, 4048, 2797, 2798, 1988, 1989, 1957, 1958, 1390, + 5145, 6348, 1391, 5473, 5827, 5828, 5984, 6211, 6123, 6124, + 6313, 6314, 6315, 6316, 1392, 3126, 4786, 1393, 1394, 1395, + 4313, 4314, 5146, 4790, 5148, 4794, 2371, 2372, 2375, 2376, + 1396, 1397, 1398, 1399, 2359, 1400, 1401, 1402, 3145, 5681, + 5154, 5155, 5837, 5836, 5156, 4799, 4800, 4317, 4318, 4680, + 4681, 4682, 3794, 2730, 2731, 2805, 2639, 2640, 2641, 2677, + 1410, 2386, 3161, 3804, 2388, 3802, 4324, 3806, 4330, 4331, + 2885, 3563, 4133, 3565, 4997, 5311, 5312, 5592, 5750, 5751, + 5756, 4877, 5522, 5523, 3336, 1419, 3178, 3821, 4327, 2195, + 2196, 1421, 2392, 3165, 3810, 2197, 2399, 2400, 3815, 3979, + 1422, 1423, 1435, 1440, 1426, 1424, 3326, 4833, 3327, 4118, + 4101, 5055, 5427, 2700, 2701, 5381, 4434, 1427, 3181, 4341, + 4342, 4343, 1406, 1407, 2381, 2382, 2383, 1428, 1408, 3154, + 4320, 517, 721, 518, 2590, 887, 1842, 2589, 3716, 1498, + 4226, 2568, 2569, 1832, 812, 659, 519, 663, 4487, 520, + 703, 4225, 948, 3200, 1885, 2245, 1886, 3037, 3694, 3695, + 4671, 5043, 4672, 5036, 5037, 4673, 1291, 5336, 5337, 1455, + 4359, 4360, 4354, 3031, 3688, 1292, 2238, 4219, 3028, 4220, + 3029, 3058, 4221, 5270, 5742, 6137, 3025, 521, 697, 4658, + 5769, 4213, 4214, 6219, 6220, 1289, 522, 646, 2567, 883, + 1821, 1824, 1825, 2577, 4918, 3332, 5260, 4467, 4917, 1826, + 1827, 3334, 884, 885, 523, 742, 3746, 1343, 2217, 2218, + 2219, 3012, 524, 694, 1279, 4208, 4655, 2998, 678, 5911, + 2200, 1282, 2201, 2994, 3670, 2181, 525, 1446, 1444, 833, + 526, 527, 794, 639, 2415, 528, 529, 1312, 2282, 3070, + 4239, 4240, 4685, 2283, 2284, 3717, 530, 707, 1297, 3713, + 5056, 5057, 5347, 531, 733, 1327, 1328, 2305, 2303, 3741, + 3084, 532, 2905, 533, 664, 951, 1889, 1890, 2632, 534, + 736, 1332, 535, 536, 953, 4493, 6017, 6222, 668, 2636, + 1894, 5419, 4802, 5161, 5162, 5164, 5489, 5490, 6275, 6369, + 6383, 6376, 6386, 6387, 6390, 6396, 6397, 1147, 1350, 1351, + 1148, 6098, 1149, 1150, 1151, 2709, 1295, 702, 2241, 2242, + 5331, 5607, 3035, 3691, 2623, 2624, 2243, 5038, 5039, 3602, + 3803, 1152, 4215, 5357, 1499, 2570, 1315, 609, 1153, 610, + 1154, 1155, 814, 1352, 2378, 3381, 1228, 3615, 1156, 4019, + 1465, 2125, 2446, 2447, 3382, 612, 3616, 1229, 1800, 613, + 614, 615, 616, 617, 618, 619, 544, 545, 620, 1807, + 547, 693, 1237, 2155, 2163, 2948, 2153, 2960, 3650, 2962, + 2963, 3655, 2964, 1285, 2935, 2154, 3639, 4641, 4640, 2961, + 4200, 5026, 5025, 2965, 2956, 4196, 4182, 3625, 4635, 5325, + 5324, 2943, 2942, 2941, 2951, 2952, 2953, 2954, 4193, 3635, + 2426, 548, 954, 2645, 671, 1896, 1897, 3395, 549, 696, + 550, 727, 1317, 3077, 3729, 3730, 4252, 4703, 4253, 551, + 1190, 1191, 552, 937, 3757, 3357, 2584, 1468, 939, 2585, + 2607, 941, 1849, 942, 943, 944, 945, 4382, 3872, 3873, + 3362, 2587, 2448, 2925, 3865, 4823, 2449, 4376, 4377, 4824, + 3208, 5568, 4389, 3876, 5267, 4477, 5569, 5570, 553, 708, + 554, 5456, 720, 1306, 2261, 555, 556, 557, 558, 787, + 1431, 1208, 631, 632, 633, 634, 822, 823, 3882, 4399, + 4889, 4890, 5553, 6379, 6380, 3119, 4294, 5978, 6308, 6373, + 6392, 5466, 5467, 559, 1357, 1353, 753, 2331, 2325, 2327, + 3103, 3749, 560, 561, 562, 4769, 563, 1925, 2660, 4015, + 4933, 3366, 2469, 1808, 621, 1908, 870, 4267, 902, 3298, + 1294, 3032, 2592, 987, 988, 5664, 3303, 4445, 2470, 2471, + 5445, 871, 872, 565, 566, 1450, 3183, 3184, 989, 990, + 4231, 4676, 4677, 5046, 4777, 4778, 4771, 5816, 6262, 4764, + 2248, 5818, 5819, 6112, 6307, 4290, 4291, 4292, 3765, 3766, + 5811, 5439, 5440, 5441, 5660, 5448, 5975, 5446, 5974, 5442, + 5808, 6107, 5806, 6106, 5443, 5126, 5127, 5444, 873, 3921, + 3922, 3923, 5672, 5823, 3768, 4293, 5457, 567, 568, 3117, + 4299, 4297, 4286, 4761, 5656, 5973, 874, 875, 1816, 876, + 877, 2562, 878, 2485, 991, 992, 569, 993, 2668, 2667, + 4022, 713, 994, 1301, 645, 1815, 2249, 3697 +}; + +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int16 yytable[] = +{ + 611, 537, 673, 821, 711, 640, 1784, 1923, 864, 712, + 1240, 755, 2880, 1226, 1277, 514, 512, 2416, 865, 2760, + 2699, 539, 3059, 546, 827, 3100, 3202, 564, 2830, 543, + 1467, 2913, 2401, 684, 903, 2401, 2389, 684, 806, 1308, + 487, 810, 684, 3076, 488, 698, 3328, 489, 570, 3329, + 538, 3415, 2579, 2223, 1466, 3367, 1231, 1388, 2510, 542, + 509, 2706, 2500, 816, 3935, 2771, 1232, 2740, 4175, 3099, + 3692, 3217, 2126, 3337, 3180, 1184, 2814, 817, 938, 1990, + 940, 2554, 1364, 691, 1365, 4274, 2405, 1367, 1368, 541, + 2434, 3281, 3942, 2490, 2833, 886, 936, 889, 890, 891, + 892, 893, 894, 895, 2354, 896, 897, 4430, 938, 4344, + 1192, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2873, 2875, + 2876, 2877, 2878, 2879, 3822, 2492, 936, 3281, 2435, 4876, + 2191, 2379, 2519, 2320, 4875, 1183, 2601, 837, 3313, 1334, + 1818, 3708, 1341, 4470, 4338, 2982, 2983, 4770, 2912, 1302, + 724, 4217, 2224, 3024, 1497, 3416, 2498, 4784, 3758, 4905, + 4319, 3705, 723, 1318, 5130, 2145, 4797, 2148, 2149, 2845, + 4020, 4021, 3072, 1809, 3405, 2162, 3187, 2853, 2855, 4334, + 2858, 2859, 4500, 2989, 2498, 3786, 3888, 1951, 687, 3636, + 4051, 1344, 1345, 4345, 4207, 3718, 1293, 2913, 3785, 3785, + 4045, 5469, 3648, 3005, 4045, 2225, 4760, 4511, 5122, 4516, + 5241, 4511, 3790, 540, -2617, -2617, 3282, 5428, 828, 1802, + 4401, 829, 830, 831, 1923, 1500, 2516, 3018, 3019, 1803, + 832, 4867, 4708, -3650, 3149, 2501, 2518, -372, -2503, 864, + 4667, 3310, 4321, 4322, -3646, 2517, 3322, 718, 716, 865, + -2617, 3069, 4892, 2528, 2498, 3346, 800, 2534, -2797, -2797, + 1484, -486, -486, 4762, -3643, -3648, -1020, -1020, -3644, -2504, + 3409, 2546, 2512, 2512, 795, 2459, 5447, -1870, -1870, -3647, + -3645, 4908, 3322, 2512, 5601, 737, -384, -384, 2063, 2065, + 2066, 3253, 3862, -3378, -3378, 5150, 5563, -3379, -3379, 2182, + 665, 2108, 1438, 2073, 1834, 1835, 1836, 1837, 4754, 4754, + -2100, 2074, 731, 1863, 2912, 740, 732, 800, 1453, 5044, + 2075, 1453, 2523, 3392, 2637, 2073, 2427, 4666, 4667, 3547, + 1840, 2522, 1489, 2074, 6145, 4526, 1833, 2524, 3322, 2031, + 2521, 2526, 2075, 4153, 5557, 3535, 1843, 1844, 2049, 2053, + 3322, 2535, 4579, 2538, 2539, 2540, 2541, 4373, 2542, 2430, + 5913, 5624, 5625, 735, 4303, 3632, 4763, 1453, 2525, 2548, + 2549, 2550, 2551, 2552, 3417, 2498, 3972, 3393, 2512, 2498, + 4762, -2652, 3431, 4849, 2529, 715, 820, 5249, 2329, 3206, + 3785, 42, 5614, 2498, 2678, 2679, 2073, 3322, 4930, 3356, + 4579, -2614, -2614, 2689, 2074, 4580, 715, 3277, 3548, 4264, + -3378, 2187, 5083, 2075, -3379, 2512, 3322, 4288, 3322, 4754, + 2692, 2693, 2694, 4415, 2695, 3094, 2696, 4190, 2697, 3825, + 3826, 1453, 3347, 2750, 3322, 2753, 3576, -2614, 3396, 2073, + 2547, 3163, 49, 4362, 5188, 4204, -2668, 2074, 5189, 2575, + 2766, 2767, 2769, 4580, 3322, -3378, 2075, 2772, 2773, -3379, + 2692, 2693, 2694, 5119, 2695, 2789, 2696, 1927, 2697, 2692, + 2693, 2694, 783, 2695, 3322, 2696, 4356, 2697, 2076, 1412, + 1373, 5190, 42, 4763, 3322, 2073, 756, 680, 4402, 5379, + 2073, 5382, 4003, 2074, 1475, 2073, 2073, 3549, 2074, 3752, + 2076, 879, 2075, 2074, 2074, 784, 1210, 2075, 4255, 4256, + 3684, 3047, 2075, 2075, 4642, 5799, 2147, -2669, 5433, 5179, + 4098, 1453, 1882, 797, 1414, -1945, 2073, 5384, 6257, 2430, + 4431, -2670, 2073, 49, 2074, -3456, 880, 1210, 2073, 3188, + 2074, 3863, 51, 2075, 4352, 1872, 2074, 5386, 2073, 2075, + 2119, -2797, 514, 799, 2095, 2075, 2074, 5404, 3808, 1453, + 6104, 1210, 6210, 666, 1439, 2075, 5083, 5128, 4779, 1882, + 42, 2076, 869, 5180, 4668, 1453, 5990, 1453, 2073, -3439, + 1305, -3443, 4830, 4931, 5447, 2077, 2074, 2682, 2073, -2497, + 3483, 1887, 635, 2073, 1453, 2075, 2074, 509, 3109, -3378, + 2073, 2074, 5721, -3379, 1461, 2075, 635, 2077, 2074, 1404, + 2075, 2256, 4835, 4607, 2076, -3442, 4298, 2075, 5848, 805, + 807, 49, 6171, 807, 3592, 815, 6173, 4780, -3440, 5780, + 51, 5463, 3193, 4774, 2095, 2073, 6330, 5809, 4821, 4358, + 537, 2234, 4388, 2074, 2137, 785, 2431, 2098, 1335, -3441, + 5544, 729, 2075, 2146, 514, 512, 936, 755, 815, 2114, + 2076, 2160, 5131, 2096, 2097, 2076, 863, 1388, 868, 743, + 2076, 2076, 5793, 2220, 543, 2222, 4511, 3048, 2077, 4614, + 1413, 539, 1181, 546, 642, -3446, 6340, 2336, 815, 543, + 2339, 2123, 2194, 2235, 2342, 2343, 2345, 2346, 4432, 509, + 5211, 2076, 1873, 1298, 542, 4867, 4781, 2076, 669, 3570, + 709, 815, 5810, 2076, 1230, 4448, 1236, 3571, 2445, 542, + 6361, 2077, 1235, 2076, 1316, 815, 1415, 2098, 1182, 730, + 1336, 2586, 2099, 4836, 867, 5193, 5376, 5195, 6331, 1420, + 5207, 5212, 5659, 1227, 1420, 1379, 1420, 744, 676, 541, + 4287, 3433, 1234, 2076, 5225, 4625, 4626, 1363, 1883, 4205, + 2598, 734, 1460, 2076, 5991, 3677, 5849, 2077, 2076, 5545, + 5850, 1462, 2077, 797, 42, 2076, 2506, 2077, 2077, 4754, + 5644, 2188, 1233, 2120, 2683, 3685, 3307, 6258, 826, 1463, + 1443, -1945, 2846, 847, 1447, 4861, 3536, 1483, 1451, 1452, + 6104, 1254, 1436, 2474, 6282, 1883, 815, 844, 2077, 899, + 2076, 1888, 2099, 704, 2077, 5736, 2431, 1329, 1884, 4403, + 2077, 1405, 815, 995, 3809, 49, 4302, 4191, 5420, 827, + 2077, 1486, 1254, 3706, 51, 3811, 5433, 3577, 3756, 3179, + 3785, 4357, 2385, 1874, 797, 2481, 1287, 6404, 3707, 5453, + 4476, 4308, 2221, 4643, 4192, 4312, 1254, 1374, 866, 1473, + 2077, -3565, 6127, 3432, -3378, 2262, 710, 3207, -3379, 2330, + 2077, 2847, 539, 540, 546, 2077, 4362, 1801, 3739, 1806, + 543, 1828, 2077, 1830, 4822, 4188, 807, 807, 807, 807, + 1838, 4457, 815, 4754, 3101, 1321, 2454, 863, 3365, 868, + 3394, 637, 3796, 844, 5668, 543, 844, 738, 669, 2486, + 542, 2262, 3633, 667, 3877, 637, 471, 2077, 5572, 4374, + 3541, 3542, 2450, 3753, 2183, 4621, 755, 3634, 5083, 3207, + 5450, 6141, 1476, 1417, 705, 542, 1839, 741, 1841, 3550, + 541, 4265, 4288, 5132, 4581, 1805, 2481, 5173, 5232, 3555, + 3556, 797, 3559, 3560, 1914, 739, 1438, 5968, 5659, 5970, + 2848, 1918, 6132, 1921, 3813, 867, 5675, 1864, 4876, 3864, + 2481, 537, 882, 4875, 5678, 5213, 5679, 1929, 1907, 1907, + 5181, 1907, 1907, 1907, 4893, 514, 512, -2617, 1907, 3323, + 2166, 539, 4581, 546, -2617, -2617, 5661, 564, 5822, 543, + 3916, 801, -2509, 3952, 3953, -3650, 2704, 471, 4323, -372, + 2401, 3788, 3789, 3678, 1906, 1906, -3646, 1906, 1906, 1906, + 538, 2923, 1990, 828, 1906, 3323, 829, 830, 831, 542, + 509, 2232, 5350, -2510, 2638, 832, -3643, -3648, -2797, 1454, + -3644, -486, 1454, 5421, 1905, 1905, -1020, 1905, 1905, 1905, + 3445, -3647, -3645, 4909, 1905, 3986, 5083, -1870, 2986, 541, + 2988, 3166, 2659, 2992, 540, 2434, -384, 2980, 5564, 1804, + 4867, 4014, 5214, -3378, 3537, 3000, 5558, -3379, 3003, 3135, + 3915, 3323, 3006, 6187, 2936, 6189, 6190, 2032, 1454, 866, + 3150, 3289, -115, 3323, -115, 471, 2050, 2054, 3289, 2946, + 5805, 5807, -2652, 2435, -119, 3264, -119, 3267, 3021, 3022, + 3023, 1299, 2050, 5663, -3456, 3279, 2071, 4582, 2070, 4490, + 3278, 2445, 5141, 2063, 2065, 5165, -2652, 5033, 5168, 5428, + 5428, 670, 2068, 1361, 4049, 5294, 4050, 4511, 3290, 5296, + 3323, 4511, 3304, 5188, 4754, 3305, 4754, 5189, 3545, 2588, + 3295, -111, 1454, -111, 3316, 3017, 4834, 2914, -3439, 3323, + -3443, 3323, 2512, 2481, 4782, 2508, 3317, -2668, 1904, 1904, + 2095, 1904, 1904, 1904, -2614, 5169, 2698, 3323, 1904, 815, + 5190, -2614, -2614, 540, 6244, 6245, 3453, 3934, 3454, 2512, + 3462, -2668, 2512, 3465, -3442, 6251, 5699, 3323, 5701, 2096, + 2097, 2512, 5951, 5706, 2073, 2073, 815, -3440, 5014, 3477, + 5711, 5712, 2074, 2074, -2163, 815, 2770, 3323, 815, 677, + 5718, 2075, 2075, 815, 2419, 6296, 5083, 3323, -3441, 3496, + 2899, 2637, 2073, -2100, 3434, -2100, 2095, 3455, -2669, 3456, + 2074, 2297, 1454, 3524, 3484, 3525, 2669, 1453, 2582, 2075, + 669, 2073, -2670, 6285, 815, 3980, 938, 3308, 4754, 2074, + 4099, 3323, -2669, 2098, -3446, 2096, 2097, 6264, 2075, 4803, + 5980, 3256, 5407, 3464, 936, 5171, -2670, 2502, 2686, 4125, + 1454, 4126, 4100, 4806, 2882, 4532, 5737, 4533, 4, 5, + 2900, 1210, 2244, 2504, 797, 4593, 1454, 4594, 1454, 471, + 797, 797, 709, -2163, 2161, 2095, 3344, 3472, 2102, 2103, + 2104, 2105, 2106, 2107, 4980, 1454, 2491, 2298, 3207, 5730, + 2945, -1870, 3651, 2914, 706, 3867, 2308, 2838, 4045, 2098, + 2073, 670, 4119, 2184, 2096, 2097, 669, 3439, 2074, 4178, + 797, 2321, 3440, -1830, 3363, 3733, 5708, 2075, 2099, 3449, + 2073, 4787, 4788, 2924, 2808, 669, 2352, 2202, 2074, 4381, + -3266, 2334, 686, 5374, 3718, 3785, 3785, 2075, 2073, 4, + 5, 2857, 4895, 4791, 4792, 2672, 2074, 1466, 4390, 2076, + 2076, 3269, 3469, 797, 2361, 2075, 5817, 2070, 2102, 2103, + 2104, 2105, 2106, 2107, 5083, 2642, 2984, 6363, 2098, 2259, + 5855, 2068, 2849, 3270, 2384, 2647, 1420, 2076, 2949, 2337, + 2338, 6310, 2990, 5845, 2099, 2653, 2637, 2073, 879, 709, + 4, 5, 2408, 949, 1831, 3004, 2076, 1934, 4636, 4206, + 2530, 5068, 2314, 5574, 2075, 5207, -1870, 844, 3266, 844, + 2189, 4394, 4645, 2417, 2418, 537, 4648, 4237, 3642, 1466, + 3868, 5215, 5863, 880, 2228, 6129, 1436, 2439, 710, 514, + 512, -3276, 2286, 2073, 4236, 5846, 644, 5151, 797, 4234, + 815, 2074, 4163, 2302, 3866, 4067, -1870, 2362, 807, 797, + 2075, 1240, 797, 2099, 1226, 6116, 2077, 2077, 3585, 2969, + 5317, 4259, 635, 797, 5845, 3187, 4405, 2913, -1830, 2073, + 5886, 772, 6168, 6205, 509, 2076, 2390, 2074, -714, 6286, + 2322, 3734, 1456, 6311, 2077, 3281, 2075, 3281, 1388, 4358, + 3370, 755, 2257, 2095, 2139, 2076, 4451, 1231, 4453, 5779, + 4922, 4923, 3405, 2077, 5824, 5989, 5825, 1232, 5491, 2995, + 3452, -1870, 4268, 2076, 2881, 5845, 5846, 5123, 1892, 701, + -3678, 5291, 2096, 2097, 6002, 2073, 938, 5865, 2937, 1865, + 2073, 2506, 5408, 2074, 5409, 3982, 2901, 4954, 2074, 2643, + 3174, 5431, 2075, 3867, 936, 710, -1259, 2075, 5739, 2507, + -3679, 5996, 2996, 2445, 2971, 2972, 1254, 2974, 2976, 2977, + 2978, 2642, -715, 4152, 2572, -1870, 1951, 5846, 5410, 2987, + 5576, 4138, 4141, 4144, 4145, 2644, 4003, 2315, 5731, 3082, + 3027, 2491, 2077, 2391, 2912, 3992, 2098, 3002, -3675, 5389, + -3266, 2429, 5152, 3643, 2920, 4497, 4930, 950, 5411, 5402, + 5403, 2098, 2077, 3735, 4238, 5595, 4157, -1870, 2076, 2706, + 4391, 4124, 1388, 4127, 824, 2185, 4131, 4132, 5632, 6041, + 2077, 3870, 4368, 1388, 1388, 6042, -3673, 6306, 4206, -1830, + 4537, 3111, 3112, 3598, 3599, 3115, 2531, 2140, 2950, 2203, + 3122, 3123, 3124, 670, 2076, 2073, 4212, 2073, -3471, 3066, + 5976, 1935, 6271, 2074, 2229, 2074, 6287, 4409, 4469, 4411, + 4412, 5273, 2075, 2190, 2075, 4417, 3554, -2163, 3868, 2077, + 6288, 2099, 3333, 4425, 2486, 4395, 3085, 4433, 2985, 4436, + 6248, 4674, 845, 6364, -3676, 6058, 2099, 2997, 6270, 3118, + 3121, -3276, 3071, 3346, 2991, 849, 850, 2258, 2260, 2073, + 2076, 4955, 898, -3674, 2073, 2076, 6042, 2074, 2434, 2095, + 2073, 2073, 2074, 2560, 6312, 2077, 2075, 4846, 2074, 2074, + 881, 2075, 3271, 5732, 938, 636, 3189, 2075, 2075, 670, + 3116, 5412, 1893, 3104, 2902, 2643, 6043, 5887, 2096, 2097, + 3869, 2073, 936, 6309, 3110, 3175, 2435, 1866, 670, 2074, + 2230, 2077, 3460, 5153, 5124, 1383, -2163, 6042, 2075, 3674, + 2401, 3981, 2401, 2401, 5910, 5413, 2231, -3678, 2300, 4304, + 3586, 637, 5318, -3471, 4270, 3589, 3590, 2502, 5432, 2557, + 2295, 4931, 1412, 4130, 6347, 3155, 1413, 797, 2434, 2571, + 5358, 1210, 5942, 2504, 1818, 5581, 5942, -3679, 4770, 2581, + 807, 3631, 2098, 6111, 3191, 1813, 815, 2077, 815, 797, + 5883, 3814, 2077, 3817, 3818, 3777, 5715, 6043, 6131, 709, + 2076, 3778, 2076, 2073, 6133, 685, 2435, 1414, 3223, 1867, + 3664, 2074, 1415, 689, 3665, -3675, 3667, 815, 695, 5857, + 2075, 2073, 5705, 815, 3192, 2073, 3201, 2642, 715, 2074, + 3672, 5020, 5458, 2074, 1930, 3627, 5023, 5024, 2075, 882, + 5278, 4461, 2075, 3680, 3681, 1416, 3349, 3350, 6043, 3870, + 3347, 6238, 3647, -3673, 2076, 6249, 3652, 6239, 2649, 2076, + 3299, 3193, 4851, 3367, 4206, 2076, 2076, 2099, 4271, 1964, + 1965, 1966, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, + 5358, 5459, 5888, 5910, 1931, 5192, 797, 815, 4880, 2881, + 5206, 2638, 5778, 4463, 5313, 5216, 2076, 4818, 2146, 4427, + 2508, 5498, 2296, 3450, 3451, 2073, 3391, 2077, 2073, 2077, + 3871, -3676, 3221, 2074, 2013, 4660, 2074, 2475, 1454, 2018, + 5942, 6204, 2075, -2100, -2100, 2075, 4661, 5636, 3351, 5947, + -3674, 3457, 2070, 5754, 2475, 3733, 4935, 5942, 514, 2101, + 2102, 2103, 2104, 2105, 2106, 2107, 2068, 2932, 1932, -1259, + 3467, 5513, 3384, 2459, -3471, 710, 2850, 2073, 4807, 2073, + 6289, 2077, 3385, 6045, 2179, 2074, 2077, 2074, 6198, 2073, + 2801, 2802, 2077, 2077, 2075, 6020, 2075, 2074, 2076, 3194, + 864, 2073, 717, 4881, 797, 2933, 2075, 903, 797, 2074, + 865, 3195, 783, 2179, 797, 5110, 2076, 5359, 2075, 2894, + 2076, 2643, 1184, 2077, 3706, 2831, 5938, 2100, 2101, 2102, + 2103, 2104, 2105, 2106, 2107, 3300, 2073, 5882, 6143, 3707, + 1933, 6147, 5916, 6044, 2074, 784, 5889, 5460, 3696, 3468, + 2073, 2895, 1814, 2075, 3281, 514, 2839, 2481, 2074, 3281, + 3167, 2506, 853, 854, 6045, 4937, 3281, 2075, 4272, 3473, + 4939, 1429, 4004, 1380, 5157, 5158, 815, 4940, 2886, 2507, + 4100, 4100, 6302, 4428, 4100, 4100, 1254, 3474, -1870, 719, + 4100, 4100, 3301, 5931, 797, 5933, 2638, 6083, 815, 815, + 2076, 5942, 1831, 2076, 5999, 2077, 815, 2938, 5507, 6021, + 4762, 3196, 6182, 3558, 3399, 6045, 2073, 4832, 6092, 5939, + 3404, 3734, 6381, 2077, 2074, 2896, 3543, 2077, 2955, 2180, + 1430, 5763, 1293, 2075, 5532, 5111, 807, 807, 797, 807, + 807, 807, 807, 797, 815, 797, 5372, 5372, 4827, 4828, + 4829, 807, 2076, 6377, 2076, 1230, 3168, 1236, 2180, 3853, + 2934, 6115, 5159, 1235, 2076, 5885, 888, 5364, 3001, 807, + 4462, 815, 4898, 4901, 2476, 4904, 2076, 2532, 6303, 5309, + 2533, 3197, 3482, 5916, 1227, 785, 4429, 4592, -904, 4595, + -904, 2476, 797, 1234, 2080, 2081, 2082, 5942, 2083, -221, + -2347, 5310, 3266, 6382, 797, 3985, 2897, 2077, 6053, 5788, + 2077, 2076, 2073, 4763, 5794, 5795, 2430, 5479, 3494, 5480, + 2074, 5365, 3624, 1233, 3822, 2076, 4481, 4482, 5940, 2075, + 6071, 5673, 6304, 1923, 3169, 3572, 1417, 2364, 6276, 5160, + 6183, 5326, 5327, 3735, 811, 2100, 2101, 2102, 2103, 2104, + 2105, 2106, 2107, 5615, 815, 2906, 6193, 6194, 2477, 2077, + 2478, 2077, 777, 5185, 2104, 2105, 2106, 2107, 3618, 797, + 2344, 2077, 3470, 4211, 3087, 2477, 2073, 2478, 3619, 3499, + 5567, 6213, 4665, 2077, 2074, -2347, 2554, 6202, 6203, 2481, + 2861, 2076, 5397, 2075, 2803, 815, 6378, 2804, 2452, 2073, + 4348, 5928, 3106, 2365, 815, 815, 815, 2074, 5757, 938, + 797, 3595, 807, 2602, 2366, 2084, 2075, 6184, 2077, 725, + 5366, 2073, 2367, -72, 4254, 2603, 2675, 936, 797, 2074, + 2440, 4433, 2077, -342, 1425, 5764, 5765, 5398, 2075, 797, + 797, -2347, 3007, 6160, 2881, 2073, 6163, 815, 1319, 2368, + 2479, 2073, 4993, 2074, 2434, 3659, 5197, 6326, 3732, 2074, + 3660, 1923, 2075, 5926, 2073, 5376, 755, 2479, 2075, 3663, + 757, 6241, 2074, 6097, 2453, 3666, 4349, 2198, 1388, 6214, + 2604, 2075, 6061, 6065, 1388, 2688, 2862, 2076, 5367, 3689, + 2675, 5034, 2435, 2073, 3500, 2675, 3503, 1324, 2077, 1388, + 2199, 2074, 2863, 6356, 2401, 2369, 5399, 6291, 815, 3769, + 2075, 2073, 3770, 844, 4206, 6097, 3775, 797, 2675, 2074, + 5198, 2073, 2445, 797, 2480, 3090, 5199, 3216, 2075, 2074, + 2675, 3136, 5372, 2370, 3302, 5766, 3714, 3137, 2075, 3138, + 844, 2480, 3302, 5247, 3797, 3698, 3471, 5170, 797, 2749, + 2508, 2076, 6292, 3504, 2752, 3814, 2586, 4325, 758, 3520, + 3523, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 3722, + 3723, 815, 5264, 2864, 2076, 4307, 2073, 2768, 4452, 4311, + 815, 3091, 1325, -904, 2074, 4440, 4181, 4506, 4441, 2788, + 3530, 5745, 802, 2075, 2077, 6335, 2076, 3337, 2073, 5845, + 3764, 760, 3767, 2431, 808, 776, 2074, 5767, 3772, 3774, + 4326, 3309, 3139, 5272, 15, 2075, 2073, 6371, 6372, 6284, + 2076, 6061, 809, 3281, 2074, 6065, 2076, 539, 4111, 546, + 6357, 777, 4179, 2075, 5297, 543, 2073, 5506, 1326, 2076, + 5604, 5605, 4112, 1828, 2074, 3341, 3724, 3854, 4183, 4442, + 3343, 5846, 714, 2075, 4186, 4187, 797, 797, 2077, 6329, + 6370, 2385, 2605, 24, 869, 542, 2401, 2073, 2076, 5833, + 2445, 5537, 4026, 3361, 3361, 4468, 4504, 4505, 4942, 4943, + 715, 2077, 6300, 6300, 2075, 1809, 2076, 4514, 3495, 3706, + 1388, 5834, 2481, 2914, 4059, 541, 2076, 815, 5339, 4986, + 3283, 797, 811, 2077, 3707, 5206, 5040, 4962, -592, 2498, + 5000, 797, 4884, 5770, 3452, 4510, 3284, 4465, 3402, 4885, + 2073, 4517, 4982, 4154, 6337, 5301, 3408, 2077, 2074, 3410, + 3383, 3945, 3390, 2077, 3323, 2073, 2073, 2075, 3389, 5835, + 3570, 3946, 5012, 2074, 2074, -2341, 2077, -2341, 5017, 625, + 5415, 2076, 2075, 2075, 539, 5417, 546, 3855, 863, 834, + 868, 1997, 543, 1180, 3856, 3198, 543, 42, 3388, 3198, + 3857, 1186, 825, 2076, 4301, 2077, 1286, 4530, 1375, 836, + 2014, 2015, 4383, 4384, 4, 5, 4385, 4386, 4387, 2881, + 1376, 2076, 542, 2077, 514, 3443, 542, 5487, 3387, 1923, + 3781, 1851, 715, 2077, 3782, 3624, 622, 848, 5488, 47, + 952, 2076, 2073, 6061, 6065, 4831, 3323, 1809, 49, 540, + 2074, 1809, 541, 4052, 3498, 1160, 867, 51, 4531, 2075, + 1162, 938, 820, 3984, 4057, 4058, 2313, 5142, 4546, 3543, + 679, 60, 2318, 2319, 5143, 3858, 5144, 5328, 1178, 936, + 4548, 3618, 1346, 1377, 1288, 1347, 1348, 2073, 2077, 1852, + 1349, 3619, 1853, 3945, 3132, 2074, 3133, 3945, 4243, 4244, + 2073, 4812, 4813, 3946, 2075, 4814, 4815, 3946, 2074, 797, + 2077, 4816, 4817, 797, 2073, 4570, 1290, 2075, 4170, 1854, + 2407, 4093, 2074, 2409, 2409, 2076, 3532, 1855, 2077, 4571, + 4989, 2075, 1300, 5554, 4991, 1305, 3859, 2364, 4097, 2168, + 2076, 2076, 1466, 2073, 5565, 2073, 1310, 3364, 2077, 3365, + 2073, 2074, 3386, 2074, 4206, 6350, 6352, 2070, 2074, 1313, + 2075, 2073, 2075, 3430, 4206, 4206, 2146, 2075, 2146, 2074, + 3458, 2068, 2747, 6408, 623, 5700, 540, 1319, 2075, 681, + 866, 1322, 6200, 681, 5380, 5383, 5385, 5387, 681, 2073, + 5390, 5391, 5713, 3506, 3501, 5395, 3502, 2074, 5401, 1331, + 3927, 5405, 3930, 2365, 5380, 5722, 2075, 5724, 5416, 5380, + 2822, 2823, 815, 815, 2366, 1333, -3560, 2076, 2073, 815, + 2073, 3260, 2367, 3361, 3361, 3261, 2074, 3262, 2074, 3263, + 1378, 3936, 2077, 3937, 1340, 2075, 815, 2075, 815, 6152, + 6153, 3637, 3638, 2073, 4483, 4484, 4485, 2077, 2077, 2368, + 1342, 2074, 2085, 2086, 2087, 3260, 3617, 2401, 3623, 3261, + 2075, 3268, 2076, 3263, 3622, 2169, 3658, 807, 3127, 1356, + 1240, 1240, 807, 1226, 1226, 2076, 2073, 2170, 5248, 776, + 2073, 807, 745, 746, 2074, 4654, 624, 807, 2074, 2076, + 2073, 5285, 4974, 2075, 3621, 1432, 1433, 2075, 2074, 3938, + 4458, 3937, 783, 1362, 2073, 2369, -1319, 2075, 4808, 3939, + -1319, 3940, 2074, 5338, 797, 1360, 1231, 1231, 2076, 747, + 2076, 2075, 1366, 1409, 2077, 2076, 1232, 1232, 1369, 1371, + 2244, 4704, 2171, 2370, 1372, 784, 2076, 815, 3701, 797, + 2172, -2294, 4012, 5774, 4013, 4562, 3671, 4563, 4898, 2073, + 4901, -1319, 4904, 3507, 4622, 1447, -1319, 2074, 748, 4218, + 4206, 625, 2073, 4315, 2076, 4316, 2075, 797, 1388, 2077, + 2074, 4447, 1388, 1445, 3728, 2173, 3509, 1458, 797, 2075, + 1442, 4371, 2077, 4372, -3560, 761, 4913, 4656, 1470, -1319, + -2294, 5316, 4438, 2076, 4439, 2076, 2077, 755, 3510, 1346, + 3614, 5583, 1347, 1348, 3755, 4206, 1460, 1946, 3760, 3761, + 797, 626, 807, 2208, 807, 1474, 3232, 3233, 2076, 797, + 3773, 807, 3513, 1480, 797, 2077, 762, 2077, 3514, 1481, + 797, 3245, 2077, 3247, -2292, 4554, 4462, 3502, 1482, 1487, + 3186, 3518, 763, 2077, 4646, 797, 4647, 3661, 3620, 3795, + 2502, 2076, 1492, 2384, 3800, 2076, 5743, 4557, 3668, 2262, + 820, 4561, 4659, 2262, 2503, 2076, 2504, 5936, 4, 5, + 3521, 2077, 1810, 1495, 2073, 785, 1811, 1819, 709, 2076, + 5524, 1812, 2074, -2292, 1820, 4295, 2365, 2174, 3528, 709, + 4565, 2075, 4566, 2089, -2294, 1831, 4340, 2366, 3540, 4887, + 2077, 4888, 2077, 5977, 815, 3146, 1846, 2692, 2693, 2694, + 797, 2695, 1850, 2696, 2175, 2697, 4245, 1848, 5936, 4, + 5, 5594, 471, 1856, 2076, 2077, 3248, 3249, 5881, 1859, + 844, 2073, 2146, 749, 3302, 3302, -2294, 2076, 1809, 2074, + 709, 2445, 2445, 3964, 3731, -2294, 1354, 1355, 2075, 1358, + 750, 1359, 1858, 4525, -2294, 3920, 1388, -3426, 2077, 764, + 1860, 4246, 2077, 3929, 2881, 2146, 1527, 1861, -2294, 3492, + 1862, -3428, 2077, 5952, 1868, 4534, 751, 5566, -2062, 1876, + 4994, 815, 2262, 5029, 1802, -3425, 2077, -2292, 3147, 2090, + 765, 4963, 1869, 4535, 1803, 5252, 5972, 5253, -3427, 5953, + 4375, 1870, 1871, 5040, 4964, 2091, 627, 1877, 1875, -940, + 628, 1878, 3426, 4536, 3299, 1879, 2370, 752, 3965, 3944, + 4965, 3949, 709, 4247, 5547, 1880, 4081, 1955, 3974, -2292, + 3976, 2077, 3552, 1881, 710, 624, 797, 2089, -2292, 797, + 2073, 815, 815, 1891, 2077, 710, 1938, -2292, 2074, 2076, + 4966, 3828, 815, 5912, 5254, 1952, 5255, 2075, 709, 3835, + -940, -2292, 5256, 5286, 5257, 2262, 4248, 2073, 4128, 2008, + 5299, 5773, 5300, 2089, 5937, 2074, 2092, 5307, 5319, 2262, + 5320, 1953, 1954, 629, 2075, 1903, 1910, 3948, 1915, 1916, + 1917, -3560, 2924, 2924, 1959, 1920, 710, 4541, 1960, 2505, + 1747, 5954, 5344, 5955, 5345, 5362, 2076, 5363, 1961, 2176, + 625, 2040, 4542, 4543, 2073, 1962, 1466, 1466, 709, 1963, + 1967, 2209, 2074, 1969, 2109, 5937, 5830, 2110, 815, 4967, + 815, 2075, 5027, 2090, 2506, 1907, 1907, 1907, 5478, 3617, + 4316, 3623, 5938, 5618, 4591, 4663, 1970, 3622, 5292, 2091, + 1971, 3944, 2507, 3949, 3839, 3944, 2077, 3949, 2073, 1254, + -1319, 5733, 5776, 5734, 5777, 2210, 2074, 2211, 5782, 2090, + 5777, 1906, 1906, 1906, 5783, 2075, 5777, 3621, 710, 2044, + 5831, 5915, 4316, 1972, 2491, 2091, 2177, 5921, 5922, 4544, + 4968, 1973, 1974, 5938, 2178, 5752, -1657, 5832, 4714, 4316, + 1975, 1905, 1905, 1905, 5982, 5758, 5983, -1656, 6013, 4083, + 6014, 3947, 1976, 2077, 710, 2076, 5279, 1977, 1978, 3948, + 2092, 3572, 1466, 3948, 2111, 4249, 4250, 4251, 1979, 5502, + 5503, 4110, 5505, 2112, 4545, 5939, 1349, 5510, -940, 1980, + 5514, 3779, 2076, 5517, 5518, 1983, 5956, 4553, 6022, 1984, + 6023, 5526, 4547, 5527, 1985, 1992, 2092, 2212, 2070, 1993, + 4134, 4559, 5533, 1994, 2113, 2401, 514, 2692, 2693, 5422, + 2498, 5423, 2068, 5424, 710, 5425, 2115, 6057, 1194, 4372, + 5018, 5019, 5338, 3614, 5719, 6180, 5939, 6181, 797, 2076, + 1388, 1388, 4560, 815, 815, 4383, 4384, 4568, 1995, 4385, + 4386, 4387, 1998, 5937, 4969, 4970, 1999, 2213, 4569, 2000, + 3966, 3967, 2073, 2117, 3968, 4152, 3969, 4029, 3970, 6216, + 2074, 5054, 2077, 815, 4230, 1904, 1904, 1904, 6217, 2075, + 5320, 3620, 3840, 2076, 2001, -2525, 4572, 1195, 6224, 2002, + 6225, 766, 537, 3947, 5940, 2003, 4197, 3947, 4199, 2077, + 6233, 6250, 6234, 5777, 2214, -2062, 514, 512, 6252, -166, + 5777, 2004, 539, 1361, 546, 4950, 2122, 5284, 564, 2005, + 543, 5938, 2006, 4266, 1230, 1230, 1236, 1236, 3841, 2007, + 2831, 487, 1235, 1235, 5524, 488, 2009, 2010, 489, 570, + 5290, 538, 797, 4289, 6265, 5940, 2077, 6253, 2011, 5777, + 542, 509, 2012, 1227, 1227, 656, 5121, 4085, 6283, 4772, + 5777, 2016, 1234, 1234, 1003, 1004, 955, 2017, 1007, -2294, + 1009, 2073, 1011, 5302, 6293, 2131, 5777, 5303, 2019, 2074, + 541, 6317, 767, 5320, 2020, 4, 5, 5746, 2075, 2021, + 2077, 9, 1233, 1233, 2215, 6394, 4707, 6395, 3232, 3233, + 956, 5925, 2022, 4971, 4972, 5879, 3842, 2023, 5936, 4, + 5, 6169, 2121, 3245, 5939, 3247, 2216, 807, 2024, 4649, + 4650, 14, 797, 4651, 4924, 4652, 4926, 4653, 2025, 2026, + 709, 2073, 5200, 5200, 797, 2027, 2028, 2076, 797, 2074, + 2029, 2030, 2033, 5752, 815, 1196, 957, 1197, 2075, 2034, + 20, 4555, 2886, 958, 2035, 2036, 2037, 2038, 1198, 2039, + 2041, 2042, -2292, 5952, 23, 2093, 3483, 2132, 2130, 3843, + 2043, 2133, 2045, 2508, 1199, 2046, 815, 815, 2047, 2048, + 959, 2051, 2052, 5201, 5201, 3844, 3845, 2055, 960, 5953, + 3846, 3847, 3848, 2056, 2057, 2924, 4444, 2058, 5707, 2059, + 28, 4953, 3706, 3706, 540, 6087, 2060, 4919, 3248, 3249, + 5958, 5898, 815, 2061, 2116, -2511, -2512, 3707, 3707, 1466, + 2138, 2164, 2165, 5940, 961, 1809, 636, 2186, 4398, 2167, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 2204, 2205, 2207, 2077, 2206, 2076, 3829, 3830, 2227, + -940, 5941, 2226, 2236, 2239, 2240, 2250, 2262, 3849, 4261, + 2294, 4973, 4995, 5586, 39, 5936, 4, 5, 2304, 962, + 963, 3945, 783, 2310, 5202, 2306, -1319, 2316, 2317, 2323, + -1319, 3946, -713, -713, 862, 2324, 710, 709, 2326, 2328, + 2332, 5954, 1801, 5955, 1806, 3274, 2349, 6024, 2350, 901, + -740, 4455, 5941, 2351, 2353, 784, 2076, 6237, 3850, 2093, + 2362, 539, 2373, 546, 3287, 5937, 2374, 2377, 5898, 543, + 5952, -1319, 797, 3292, 6399, 2387, -1319, 2393, 2403, 3294, + 1033, 2404, 5142, 1284, 6343, 6344, 50, 3306, 6345, 5143, + 6346, 5144, 2418, 815, 815, 2093, 5953, 3318, 797, 542, + 3320, 2414, 2437, 2077, 2427, 1200, 2428, 2441, 2456, -1319, + 1805, 4496, 2444, 2460, 2466, 2472, 2486, 2495, 4364, 4365, + 4366, 4367, 2499, 4369, 4370, 82, 2491, 2520, 2527, 541, + 2536, 6319, 2073, 5938, 2543, 2553, 2556, 2721, 2558, 2544, + 2074, 2563, 2566, 6128, 2559, 2564, 1907, 964, 2572, 2075, + 2364, 2576, 4558, 5683, 5684, 2578, 5686, -940, 2580, 1053, + 2583, 4413, 4414, 2077, 4416, 2591, 4418, 4419, 4420, 4421, + 4422, 4423, 4424, 2593, 4426, 2595, 2596, 2597, 4435, 2599, + 2600, 2627, 1906, 2635, 2646, 2648, 5956, 2650, 6154, 2651, + 2654, 5185, 5185, 710, 2655, 785, 2652, 2657, 5954, 2658, + 5955, 709, 5899, 2662, 2722, 2674, 4574, 6221, 2733, 5900, + 2673, 2675, 1905, 2684, 2746, 2691, 2365, 965, 2705, 2747, + 2748, 2759, 5937, 2761, 5901, 2764, 5939, 2366, 2765, 2827, + 2812, 6103, 2816, 2837, 1804, 2367, 2856, 2841, 2860, 2887, + 901, 2915, 2888, 2916, 2921, 1799, -2264, 4612, 1067, 2922, + 2928, 2939, 2944, 540, 2947, 2966, 2967, 4, 5, 2993, + 6229, 815, 2368, 797, 6407, 862, -3527, 2968, 815, 815, + 2723, 4630, 2724, 3008, 4633, 4634, 3009, 3010, 2725, 3011, + 3013, 3015, 3020, 4340, -2112, 3014, 3030, 3033, 3034, 3036, + 5938, 3043, 3039, 3040, 3041, 2265, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 2076, 3042, 5899, + 1201, 1202, 1203, 1204, 3050, 3051, 5900, 3064, 2369, 3060, + 3061, 3062, 3063, 3065, 3067, 3068, 3074, 3075, 3078, 3079, + 4683, 5901, 3083, 3088, 3094, 5940, 1904, 3097, 2726, 514, + 514, 3102, 6221, 5956, 1902, 1902, 2370, 1902, 1902, 1902, + 3125, 5902, 3191, -2264, 1902, 966, 5838, 710, 5839, 5840, + 4375, 5587, 3128, 3129, 5903, 2364, 3130, 3131, 5588, 2364, + 3142, 3134, 797, 3143, 815, 3144, 3152, 797, 797, 3157, + 3156, 5904, 2727, 5939, 3159, 5613, 3160, 3172, 3173, 3176, + 3190, 807, 3192, 6229, 3177, 3204, 1033, -2536, 5242, 3205, + 3213, 5203, 5203, 4687, 3218, 3219, 797, 797, 6297, 3220, + 3214, 3224, 2364, 4798, 2077, 3255, 4878, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 3258, 3193, + 2547, 2365, 3285, 3293, 3311, 2365, 3314, 3319, 3331, 4629, + 3330, -715, 2366, 3335, 5183, 6388, 2366, 1416, 3339, 3342, + 2367, 3344, 3345, 3352, 2367, 3355, 3358, 3376, 5902, 6398, + 3400, 3419, 5957, 3422, 3424, 6388, 3401, 3425, 3444, 3436, + 3427, 5903, 6398, 3437, 2728, 1053, 3438, 2368, 2365, 3964, + -1319, 2368, 3441, 3452, 3442, 2729, 3459, 3792, 5904, 2366, + 3463, 4789, 5940, -1870, -1870, -715, 3466, 2367, 762, 3475, + 5958, 5371, 3476, 3478, 3479, -1870, 1275, 3480, 2266, 5204, + 5204, 3481, 3485, 3493, 3706, 4688, 3497, 1033, 3505, 669, + -1456, 5905, 3508, 4689, 2368, 3511, 3512, 3516, 3517, 3707, + 3551, 3522, 3526, 2369, 4793, 3527, 3920, 2369, 4690, 3529, + 2637, 3533, 3534, 3539, 3544, 3557, 3564, 3194, 4691, 4692, + 4693, 2107, 4765, 3566, 3965, 4457, 3567, 4912, 4694, 3195, + 4914, 2370, -1622, 3568, 1067, 2370, 3569, 3576, -1870, 3583, + 2031, 2049, 2053, 4920, 3593, 3591, 3594, 3596, 3597, 3600, + 2369, 3588, 3604, 3793, 3626, 864, 5184, 514, 512, 3605, + 3641, 3606, 5941, 3644, -715, 865, 1053, 3669, 4936, 647, + 5353, 3645, 514, 3646, 3653, 5497, -1870, 3649, 2370, 3654, + -1870, 3657, 3673, 1275, -1870, 3683, 3686, 3687, 3693, 5509, + 3711, 3712, 3740, -1870, -1870, 5641, 3744, 3748, 5905, 3742, + -1870, 764, 3780, 3743, -1870, 3747, 5396, 4, 5, -1870, + 3787, -1870, 3791, 3805, 3816, -1870, 3812, 3820, 4350, 4351, + 3823, 4353, 4355, -1870, 2267, -1870, 648, 5958, 3831, 3196, + -1870, 3824, -715, 3834, 3832, 3833, 3836, 3837, 2268, 3838, + 2269, 5589, 4985, 3875, 5590, 2265, 3878, 3885, 3881, 3944, + -1870, 3949, 3924, 5591, 5588, 1067, 3917, 3890, 3891, 3892, + -1870, 3893, 3894, -1870, 3895, 3896, 4695, 3897, 3898, 3899, + 3900, 2285, 2270, 3901, 4630, 3902, 3903, 3904, 4696, 3905, + 3906, 3931, 3907, -1870, 3971, 2271, 3908, 4612, 3909, 3932, + 3954, 815, 3975, 3910, 5016, 649, 3911, 3912, 3913, 3197, + 3914, 3955, -1870, 3977, 3925, 3978, -1870, 650, 3991, 3993, + 3996, 3926, 3927, 3997, 4005, -1870, 3928, 3948, 2272, 5941, + 5512, 3930, 4007, 5185, 2831, 2481, 4006, 3981, 3994, 4001, + 4009, 3995, 4023, 5041, -1870, 4053, 2273, 4054, 5042, 4055, + 4068, 4069, 4070, 4076, 4089, 5052, -1665, 4108, 4120, -1870, + 4135, 4121, 4109, 4122, 4136, -1870, -1870, 514, 4148, 4149, + 5633, 5125, 1809, 4697, 5638, 5639, 4150, 3577, 5587, -1870, + 651, -1870, 4160, 4164, 4158, 5588, 4166, 4167, 4698, 4168, + 797, 4171, 4172, 4176, 4177, 2950, 5084, 2949, 4184, 4209, + 797, 3323, 4229, 4185, 4262, 4269, 4223, 4224, 4235, 3365, + 4233, 4241, 4275, 4279, 4280, 4228, 4242, 4277, 1802, 4281, + 4306, 4305, 4333, 5112, 2274, 4309, 4699, 4310, 1803, 4337, + -2015, 2275, 4346, 4378, 4347, 4379, 4380, 4396, 4400, 4406, + 4700, 2276, -715, 4407, 4408, 5183, 4410, 4450, 4456, 5869, + 4459, 3947, 4629, 4460, 4471, 2277, 4473, 4466, -1814, -1814, + 3340, 4478, 4479, 4491, 1809, 4499, 4509, 4501, 2266, 4508, + -1814, 4515, 5015, 3795, 4518, 4519, 4520, 4521, 4564, 4598, + 4575, 4590, 2886, 864, 4576, 4615, 2073, 2278, 4600, 4586, + 2279, 4601, 4602, 865, 2074, 4587, -715, 4616, 4603, 762, + 4624, 4604, 815, 2075, 4605, 2637, 2280, 4606, 4638, 4613, + 3945, 4639, 4619, 4617, 4644, 3706, 4664, 4620, 4657, 4662, + 3946, 4675, 670, 4686, 4663, 4678, -1870, 652, 4705, 4684, + 3707, 4713, 4710, -1814, 4706, 4711, 4716, 2281, 4767, 4775, + -1781, -1786, 4796, 5186, 4801, 2710, 2711, 2712, 2713, 4804, + 5084, 4810, 4805, 4820, 653, 4811, 4825, 4838, 4883, 4891, + 807, 4906, 4910, 4915, 4916, 5246, 4921, 5589, 4929, 4941, + 5590, -1814, 4944, 4945, 4947, -1814, 4956, 4987, 3536, -1814, + 4957, 4581, 4996, 4998, 4323, 514, 5259, 4999, -1814, -1814, + 5002, 2714, 2715, 2716, 5003, -715, 5004, 2899, 5008, -1814, + 5021, 5054, 5022, 5035, -1814, 6367, -1814, 51, 5053, 5058, + -1814, 5059, 5060, 5061, 2267, 514, 799, 5062, -1814, 5065, + -1814, 5085, 5086, 5087, 2146, -1814, 5099, 4849, 2268, 5134, + 2269, 5787, 764, 5135, 5138, -256, 1163, 1907, 5139, 5140, + 5147, 5149, 2717, 2718, -1870, -1814, 5163, 5176, 3964, 5177, + 2883, 5187, 5178, 5194, 5185, -1814, 5196, 5209, -1814, 5210, + 5219, 2076, 2270, -715, 5220, 5221, 5223, 5222, 5174, 5224, + 5227, 5237, 5226, 1906, 5228, 2271, 5229, 5230, -1814, 5258, + 4612, 5240, 5243, 5244, 5251, 5261, 5262, 5265, 5589, 5266, + 5269, 5590, 5271, -73, 5275, 5274, 5276, -1814, 5283, 5287, + 5749, -1814, 5288, 1905, 5293, 5289, 2719, 5295, 2272, 5298, + -1814, 5305, 5306, 5308, 5314, 5322, 5330, 5346, 5333, 5334, + 2831, 5820, 5332, 3965, 5341, 5342, 2273, 5351, 5376, -1814, + 3266, 4683, 4878, 5354, 5355, 654, 5449, 514, 5335, 5462, + 5470, 5464, 815, 5471, -1814, 5084, 5472, 5361, 1164, 5475, + 5477, -1814, 5484, 655, 5185, 5482, 1165, 5483, 5485, 5494, + 5493, 5492, 797, 5500, -1814, 5495, -1814, 5498, 2077, 2720, + 5511, 1166, 5515, 5516, 4394, 5550, 5552, 5548, 815, 5571, + 5573, 1167, 1168, 1169, 5575, 5577, 5579, 5582, 5580, 5585, + 5596, 1170, 5599, 5612, 1809, 5611, 5617, 5622, 5430, 656, + 5623, 5630, 5626, 5631, 2274, 5634, 3920, 5629, 5650, 5666, + 5646, 2275, 5667, 5648, 3920, 5665, 5669, -1870, 5655, 5677, + 5676, 2276, 4439, 5435, 5661, 5438, 657, 1904, 5663, 5680, + 2638, 5685, 5687, 5688, 658, 2277, 5690, 5359, 5703, 5710, + 3945, 5692, 5709, 5714, 5720, 5199, 5504, -1870, 6273, -1870, + 3946, 5725, -1870, -1870, 1157, 5363, 5740, 5747, 5754, 5748, + 5084, 5521, 864, 5753, 2721, 5755, 5757, 2278, 5760, 5771, + 2279, 5531, 865, 5052, 5052, 797, 5775, 5779, 5534, 5781, + 5535, 5536, 5791, 5785, 5797, 5520, 2280, 2831, 5364, 5801, + 5841, 5437, 5842, 5844, 797, 5530, 5852, 5854, 5853, 5860, + 5052, 1157, 5862, 5861, 5867, 5870, 5349, 5052, 5871, 5872, + 5878, 5880, 5084, 5884, 6096, 5893, 5894, 2281, 5897, 5917, + 5918, 5923, 5965, 5929, 4721, 5985, 5969, 5556, 5987, 1171, + 5986, 2722, 5981, 5988, 5971, 5993, 5998, 5994, 5995, 6007, + 6009, 1172, 5392, 5393, 6011, 6012, 6015, 6016, 6019, 6025, + 6029, 6032, 5406, 6037, 6040, 6054, 6096, 6056, 6068, 6074, + 6076, 6078, 6079, 6080, 5186, 6084, 5429, 6085, 6099, 2881, + 6086, 6100, 6101, 6102, 6108, 6134, 6082, 1907, 6156, 6141, + 6170, 6185, 6175, 6177, 5468, 6178, 6191, 6196, 6197, 6206, + 6207, 6208, 6188, 6209, -2509, 6212, 4846, 2723, 5603, 2724, + -2510, 4851, 6215, 6269, 6218, 2725, 6240, 6243, 6246, 6255, + 5041, 5610, 6254, 1906, 6274, 5436, 6272, 3797, 1157, 5052, + 6277, 6320, 6333, 6323, 6328, 6403, 6332, 6341, 5621, -1814, + 6334, 5621, 5621, 6336, 6342, 6349, 5627, 6354, 6358, 6359, + 5084, 1173, 6360, 1905, 6362, 6365, 6366, 6368, 5637, 6363, + 6364, 6374, 6389, 5645, 6375, 4189, 3710, 4437, 6402, 5562, + 5561, 5560, 4284, 6096, 5920, 2726, 4819, 2881, 5670, 5979, + 6114, 6267, 5187, 2926, 1382, 5465, 1801, 2442, 1806, 1174, + 4454, 4907, 4449, 5340, 4911, 3324, 2907, 3721, 4702, 5549, + 4495, 4475, 3222, 1175, 1494, 3411, 5804, 5803, 5694, 3412, + 5696, 5652, 5233, 3413, 4865, 5716, 5007, 5598, 5013, 2727, + 6140, 3581, 6400, 5089, 5090, 5091, 5092, 5093, 5094, 5095, + 5096, 5097, 5098, 5315, 5100, 5101, 5102, 5103, 5104, 5105, + 5106, 5107, 5108, 5109, 5761, 6223, 5113, 5114, 6322, 6281, + 6039, 5435, 5759, 5438, 1805, 3827, 2432, 5231, 5501, 5695, + 5967, 6155, 3795, 5697, 3795, 5543, 5628, 5236, 5370, 6199, + 6301, 6195, 6130, 6119, 6120, 6121, 6122, 1904, 3944, 4975, + 3949, 955, 4938, 6201, 4507, 6138, 2511, 1945, 3275, 5698, + 5084, 5052, 5084, 4578, 3956, 4990, 815, 5084, 4988, 5052, + 4992, 6327, 769, 1157, 5084, 5084, 9, 1157, 5052, 770, + 6294, 2728, -1814, 5717, 5084, 956, 6295, 5927, 4276, 5437, + 5084, 5052, 2729, 5052, 6167, 2638, 2710, 2711, 2712, 2713, + 1157, 5726, 6172, 5647, 1945, 6174, 14, 5847, 3291, 1157, + 5693, 4715, -1814, 5234, -1814, 5208, 3948, -1814, -1814, 5649, + 5218, 5738, 5691, 5541, 2628, 2451, 6005, 3098, 4260, 4258, + 797, 957, 3884, 6136, 5851, 20, 3257, 4488, 958, 4165, + 6266, 3702, 2714, 2715, 2716, 4002, 4928, 798, 1804, 23, + 4123, 5815, 2412, 4878, 6236, 1411, 4216, 2363, 2135, 5815, + 2411, 5815, 4336, 5263, 4173, 959, 5001, 4092, 4090, 2831, + 2825, 4143, 4140, 960, 1157, 1157, 1157, 1157, 4608, 5621, + 1945, 2884, 4528, 5784, 5280, 28, 2745, 1157, 2681, 2735, + 5789, 797, 755, 2717, 2718, 5084, 5084, 6268, 6117, 6353, + 6351, 5682, 3148, 3151, 5481, 797, 5032, 6125, 5343, 961, + 6126, 2355, 2356, 5436, 3141, 3807, 2357, 5812, 2358, 5813, + 2690, 807, 2360, 3920, 3162, 4597, 514, 6280, 4332, 807, + 5167, 807, 4596, 5829, 5166, 6018, 5859, 5593, 5329, 4339, + 3947, 5584, 5282, 4335, 5606, 1434, 2406, 4981, 2420, 39, + 5172, 780, 771, 3799, 962, 963, 3973, 2719, 5084, 1296, + 3368, 4927, 2246, 4000, 5084, 5045, 5856, 5772, 4361, 5031, + 5348, 2831, 6318, 5028, 1823, 3338, 3675, 1829, 5950, 1280, + 5052, 2999, 5950, 1945, 3676, 1281, 4210, 2413, 3715, 5802, + 1283, 5873, 5877, 5616, 3086, 2633, 4932, 6321, 5486, 6355, + 5689, 6401, 6405, 1947, 3998, 5815, 869, 3690, 5608, 4024, + 4201, 1238, 4202, 3418, 3640, 4203, 4198, 5892, 1239, 3397, + 2720, 50, 4195, 4194, 4637, 1193, 2129, 2150, 4985, 3108, + 4826, 4169, 5268, 3874, 5621, 6406, 5175, 2927, 2621, 2622, + 4278, 5741, 5924, 4879, 5084, 1330, 2309, 789, 773, 774, + 775, 1924, 4925, 3414, 4498, 6109, 5378, 1936, 5964, 5047, + 82, 6110, 6263, 1926, 4766, 5653, 5657, 4285, 5394, 1157, + 5658, 5654, 5674, 1945, 6391, 807, 5662, 0, 3944, 6393, + 3949, 1817, 964, 1937, 0, 901, 0, 2561, 0, 0, + 6000, 0, 0, 0, 0, 0, 0, 0, 0, 5084, + 863, 0, 868, 0, 0, 955, 0, 0, 543, 797, + 0, 815, 0, 0, 0, 2721, 0, 6001, 5084, 797, + 0, 0, 0, 0, 0, 0, 5950, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 542, 956, + 0, 0, 0, 5950, 3225, 0, 3948, 0, 0, 0, + 0, 0, 965, 0, 0, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 0, 0, 0, 0, 867, 0, + 0, 0, 0, 0, 1945, 6055, 0, 1945, 3226, 0, + 6067, 0, 2722, 0, 0, 957, 6073, 0, 3380, 20, + 0, 0, 958, 0, 0, 0, 0, 0, 0, 1944, + 0, 0, 0, 23, 0, 0, 0, 0, 0, 815, + 1157, 0, 901, 0, 0, 3227, 862, 0, 0, 959, + 0, 0, 0, 0, 0, 0, 0, 960, 0, 0, + 0, 0, 0, 0, 0, 797, 0, 0, 0, 28, + 5829, 0, 0, 0, 4683, 4683, 1991, 1157, 2723, 0, + 2724, 0, 0, 0, 0, 0, 2725, 0, 0, 0, + 0, 0, 0, 961, 0, 0, 0, 0, 0, 0, + 3947, 5877, 0, 0, 0, 0, 0, 0, 0, 0, + 5892, 0, 0, 0, 0, 0, 0, 5950, 0, 0, + 966, 0, 866, 815, 0, 0, 5815, 0, 0, 0, + 0, 0, 0, 39, 0, 0, 0, 0, 962, 963, + 0, 0, 0, 0, 0, 0, 2726, 0, 0, 0, + 0, 0, 2072, 0, 0, 6176, 0, 0, 0, 0, + 0, 0, 0, 5621, 0, 5621, 5621, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -1870, + -1870, 0, 0, 2070, 0, 0, 0, 0, 0, 0, + 2727, -1870, 0, 0, 6081, 0, 807, 2068, 0, 0, + 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, + 0, 0, 0, 5950, 0, 0, 0, 4878, 0, 6261, + 6261, 0, 0, 0, 2831, 0, 2637, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 0, 815, 0, 0, 0, + 0, 0, 0, 0, -1870, 2152, 0, 0, 0, 0, + 0, 0, 0, 0, 5621, 5621, 964, 0, 6247, 5950, + 5950, 2128, 0, 0, 0, 5621, 0, 0, 0, 0, + 0, 0, 2728, 0, 0, 6149, 6150, 0, 0, 6260, + 6260, 0, -1870, 2729, 0, 0, -1870, 6161, 0, 0, + -1870, 0, 0, 0, 0, 0, 0, 0, 0, -1870, + -1870, 5950, 0, 0, 3613, 0, 0, 0, 4878, 815, + -1870, 0, 0, 0, 0, -1870, 0, -1870, 0, 0, + 0, -1870, 0, 5621, 0, 0, 965, 0, 0, -1870, + 0, -1870, 0, 0, 0, 2293, -1870, 3228, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2831, + 0, 0, 0, 0, 0, 0, -1870, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1870, 3229, 3230, -1870, + 3231, 3232, 3233, 3234, 3235, 0, 3236, 3237, 3238, 3239, + 3240, 3241, 3242, 3243, 0, 3244, 3245, 3246, 3247, -1870, + 0, 0, 0, 6230, 0, 0, 6231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -1870, 0, + 0, 0, -1870, 0, 0, 0, 0, 0, 0, 0, + 0, -1870, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2402, 2285, 0, 2402, + -1870, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2831, 0, 0, -1870, 815, 0, 0, 1945, + 0, 815, -1870, 0, 966, 0, 2831, 0, 1157, 0, + 1157, 0, 2831, 0, 0, -1870, 0, -1870, 0, 2831, + 0, 3248, 3249, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 1157, 0, 0, 0, 0, 1157, 0, 0, 0, 1157, + 1157, 1157, 0, 0, 0, 0, 0, 0, 0, 1157, + 1157, 1945, 0, 0, 0, 1157, 0, 0, 0, 1157, + 1157, 1157, 0, 1157, 1157, 1157, 1945, 1945, 0, 0, + 0, 0, 0, 1157, 0, 1157, 0, 0, 1157, 1157, + 1157, 1157, 0, 1157, 0, 1157, 1157, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 1157, 1157, 1157, 1157, 0, 1157, 1157, 1157, 1157, 1157, + 1157, 0, 1157, 1157, 0, 1157, 1157, 0, 1157, 1157, + 0, 0, 1157, 1157, 0, 1157, 1157, 0, 1157, 0, + 1157, 0, 0, 0, 1157, 1157, 1157, 0, 0, 1157, + 1157, 1157, 1157, 0, 1157, 0, 0, 0, 0, 0, + 0, 1157, 0, 4721, 4, 5, 0, 1157, 1157, 1157, + 1157, 0, 0, 0, 0, 0, 0, 3943, 1157, 1157, + 0, 1157, 1157, 0, 0, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 6030, 6031, + 1157, 6033, 6034, 6035, 6036, 1945, 0, 0, 0, 0, + 0, 0, 1945, 0, 0, 0, -904, 0, -904, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1157, 0, 0, 0, 0, + 0, 0, 0, 0, 2430, 0, 0, 0, 0, 0, + -1870, 0, 0, 1945, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -1062, -1062, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4721, 4, 5, 0, 0, 0, 0, 0, 0, 0, + 4722, 1902, 1902, 1902, 0, 0, 0, 3613, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4839, 3943, + 4840, 4841, 0, 3943, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6148, 0, + 0, 6151, 4842, 0, 4843, 0, 0, 0, 0, 6159, + 4844, 0, 6162, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1157, 0, 1157, 0, 0, 0, 0, 0, + 4724, 2430, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4845, 0, 0, 0, 0, 0, 1945, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4722, 0, 0, + 0, 2625, 0, 0, 0, 0, 0, 4725, 4726, 4727, + 0, 0, 0, -1870, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4846, 2638, 4728, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1870, 0, -1870, 0, 0, -1870, -1870, + 0, 0, 0, 0, 0, 0, 4847, 0, 4848, 0, + 0, 0, 0, 0, 0, 0, 1157, 4724, 0, 4849, + 0, 0, 1945, 0, 1945, 0, 0, 0, 0, 0, + 0, 4729, 0, 4730, 0, 0, 0, 0, 0, 0, + 0, 0, 4850, 1991, 1157, 0, 0, 0, 0, 0, + 0, -904, 1157, 4731, 0, 0, 0, 0, 2744, 1991, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4732, 0, 0, 4725, 4726, 4727, 0, 4733, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4734, 4728, 0, 0, 0, 0, 0, + 4735, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4736, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 955, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4851, 0, 0, 0, 0, 0, 0, 0, 4729, 0, + 4730, 0, 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 956, 0, 0, 0, 0, 0, 0, 0, + 4731, 0, 4737, 0, 0, 0, 0, 4852, 0, 0, + 0, 0, 4738, 14, 0, 0, 0, 2892, 4732, 0, + 0, 0, 0, 0, 1991, 4733, 0, 0, -3669, -3669, + -3669, 0, 0, 0, 0, 0, 0, 0, 957, 0, + 4734, 0, 20, 0, 0, 958, 0, 4735, 0, 0, + 4739, 4853, 4854, 0, 0, 0, 23, 0, 4855, 0, + 0, 0, 4736, 4740, 0, 2959, 0, 0, 0, 0, + 4856, 0, 959, 0, 0, 0, 0, 0, 0, 0, + 960, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 4857, 28, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4741, 0, 0, 0, 0, 0, 4742, 0, + 0, 0, 0, 0, 0, 4858, 961, 0, 0, 4737, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4738, + 0, 0, 0, 1945, 1157, 0, 0, 0, 0, 0, + 0, 0, 1157, 1157, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 962, 963, 0, 0, 0, 4743, 4739, 0, 4719, + 1799, 4720, 0, 4744, 0, 0, 4721, 4, 5, 0, + 4740, 0, 4859, 0, 0, 0, 0, 0, 0, 901, + 1991, 0, 0, 0, 0, 0, 1157, 0, 0, 0, + 0, 0, 0, 0, 0, 4745, 0, 1945, 1945, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4741, + 4746, 4747, 0, 0, 0, 4742, -3669, 0, 50, -904, + 955, -904, 0, 4748, 0, 0, 0, 0, 0, 1157, + 1157, 1157, 0, 0, 0, 0, 0, 0, 0, 0, + 4860, 0, 0, 0, 0, 9, 0, 2430, 0, 0, + 0, 4861, 4862, 4863, 956, 0, 0, 82, 0, 0, + 0, 0, 1902, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4743, 0, 14, 0, 0, 1945, 964, + 4744, 0, 0, 0, 2402, 0, 3171, 5118, 1157, 0, + 0, 1945, 0, 4722, 0, 0, 0, 0, 0, 0, + 957, 0, 0, 0, 20, 0, 1157, 958, 0, 0, + 1157, 1157, 4745, 1157, 1157, 4723, 0, 0, 23, 0, + 0, 0, 1157, 0, 1157, 0, 0, 4746, 4747, 0, + 0, 0, -3669, 0, 959, 0, 0, 0, 0, 0, + 4748, 0, 960, 0, 4864, 0, 0, 0, 0, 965, + 0, 0, 0, 0, 28, 1157, 0, 0, 0, 0, + 0, 0, 0, 4724, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 955, 961, 0, + 0, 1157, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1157, 0, 0, 0, 1945, 0, 0, + 0, 0, 9, 0, 0, 0, 1157, 0, -1062, 0, + 0, 956, 0, 0, 0, 0, 0, 1157, 39, 0, + 4725, 4726, 4727, 962, 963, 0, 0, 0, 0, 0, + 0, 0, 14, 1157, 0, 0, 0, 0, 0, 0, + 4728, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1158, 0, 0, 0, 0, 0, 0, 957, 0, 0, + 0, 20, 0, 0, 958, 0, 0, 0, 0, 0, + 1157, 0, 0, 0, 0, 23, 0, 1157, 0, 0, + 0, 0, 0, 0, 1945, 0, 0, 966, 0, 0, + 50, 959, 0, 0, 4729, 0, 4730, 1158, -3832, 960, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 28, 0, 0, -904, 0, 4731, 0, 0, 0, + 0, 4759, 4759, 1945, 1945, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 4732, 961, 0, 0, 0, 0, + 0, 4733, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 964, 0, 0, 0, 0, 4734, 0, 0, 0, + 0, 0, 0, 4735, 0, 3420, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 1157, 0, 4736, 0, + 962, 963, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3832, 0, 0, 0, 0, 1157, + 0, 0, 0, 0, 1158, 0, 0, 0, 0, 0, + 0, 965, 1945, 0, 1945, 1945, 1945, 0, 1157, 0, + 0, 0, 4759, 1157, 1157, 4737, 0, 0, 0, 1991, + 3461, 0, 0, 0, 0, 4738, 0, 50, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4739, 0, 0, 82, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4740, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 964, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3531, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3546, 0, 4741, 0, 0, 0, 0, + 0, 4742, 0, 0, 4, 5, 0, 0, 0, 0, + 1157, 1157, 0, 0, 0, 0, 0, 0, 0, 966, + 0, 1922, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1241, 0, 1242, 0, 0, 0, 965, 0, + 0, 0, 676, 0, 0, 0, 0, 0, 0, 1158, + 0, 0, 0, 1158, 0, 0, 1210, 3943, 0, 4743, + 0, 0, 0, 0, 1243, 1244, 4744, 0, 0, 0, + 0, 0, 0, 0, 1245, 1945, 1158, 0, 0, 0, + 0, 0, 0, 3603, 0, 1158, 0, 0, 16, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 4745, 2152, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4746, 4747, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4748, 0, 0, 1157, + 1246, 0, 0, 1157, 0, 0, 1157, 0, 0, 0, + 0, 0, 0, 0, 1247, 1157, 0, 0, 0, 0, + 1158, 1158, 1158, 1158, 1157, 0, 1157, 1157, 0, 1157, + 1157, 1157, 1157, 1158, 1157, 0, 1157, 1157, 0, 1157, + 0, 0, 0, 0, 0, 0, 966, 1157, 1157, 0, + 0, 0, 1157, 1157, 1157, 0, 2625, 0, 0, 0, + 0, 0, 1157, 1157, 1157, 0, 1157, 0, 1157, 1248, + 1157, 0, 1157, 0, 1157, 0, 0, 0, 0, 1157, + 1157, 1249, 1157, 1157, 1157, 0, 0, 0, 1157, 0, + 0, 1157, 0, 0, 0, 2293, 2293, 0, 0, 0, + 1157, 0, 0, 1157, 0, 1157, 1157, 1157, 0, 0, + 1157, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4759, 0, 0, 4721, 4, 5, 0, 0, + 0, 0, 1157, 0, 1157, 0, 1250, 1157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1157, 1157, 1157, + 1157, 1945, 1157, 5538, 0, 4840, 0, 1157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1945, 0, + 0, 0, 0, 0, 0, 0, 0, 4842, 0, 1251, + 0, 0, 0, 0, 0, 5539, 0, 0, 0, 0, + 0, 0, 0, 0, 2402, 0, 2402, 2402, 3819, 1252, + 0, 0, 0, 0, 0, 1157, 2430, 0, 1253, 0, + 0, 0, 0, 0, 0, 1158, 0, 5540, 0, 1157, + 0, 1254, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1255, 0, 0, 1945, 4759, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4722, 0, 0, 1256, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1157, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4846, 0, 0, 0, -2264, 1257, 0, 0, 1258, 0, + 1259, 1157, 0, 905, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1902, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4848, 0, 0, 0, 1260, 1261, 0, + 0, 0, 4724, 1262, 1263, 906, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1264, 0, 0, 0, 0, 0, 908, 4850, 0, 0, + 0, 0, 0, 0, 0, 909, 1158, 0, 0, 0, + 0, 1265, 0, 1157, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 910, 0, 0, 4725, + 4726, 4727, 0, 1266, 1157, 0, 0, 2625, 0, 0, + 911, 0, 0, 1158, 0, 912, 1945, 0, 0, 4728, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 955, 0, 0, 0, 913, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1267, 0, 9, + 0, 0, 0, 0, 0, 4851, 0, 0, 956, 0, + 0, 0, 1268, 4729, 0, 4730, 0, 0, 0, 0, + 0, 1269, 0, 0, 1270, 1271, 0, 0, 0, -3660, + 0, 0, 0, 0, 0, 4731, 0, 914, 0, 1272, + 0, 915, 0, 0, 0, 0, 0, 4759, 0, 4759, + 0, 5434, 0, 4732, 957, 0, 0, 0, -3659, 916, + 4733, 958, 0, 917, 918, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 4734, 1273, 0, 0, 0, + 0, 0, 4735, 0, 1274, 0, 4853, 0, 959, 0, + 0, 0, 0, 4855, 919, 0, 960, 4736, 0, 0, + 0, 920, 921, -3286, 0, 1275, 0, 0, -3659, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1945, 0, + 0, 0, 0, 0, 0, 0, 4857, 0, 0, 0, + 1157, 0, 961, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1157, 0, 4146, 4737, -3286, 0, 0, 2608, 0, + 0, 4759, 1276, 0, 4738, 0, 1157, 0, 0, 1157, + 1991, 0, -3659, 0, 0, 0, 0, 962, 963, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1157, 1157, 0, 0, 2609, 1157, + 0, 0, 4739, 1902, 0, 0, 0, 0, 1945, 0, + 0, 0, 0, 0, 0, 4740, 0, 4859, 0, 0, + 0, 1157, 0, 1157, 0, 1157, 0, 1157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2959, 0, 0, + 0, 2610, 1157, 0, -3659, 0, 2611, 0, 1945, 0, + 0, 0, 0, 0, 4741, 0, 0, 2612, 2613, 0, + 4742, 1157, 1157, 0, 0, 0, 1157, 0, 1157, 0, + 1157, 0, 0, 0, 0, 1157, 0, 0, 0, 0, + 0, 0, 0, -3660, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1799, 964, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1945, 0, 4743, 0, + 0, 0, 1157, 0, 0, 4744, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1157, 0, 0, 0, + 1157, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1158, 0, 1158, 4745, 1157, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5434, + 0, 0, 4746, 4747, 0, 965, 0, 0, 0, 0, + 0, 0, 1945, 0, 0, 4748, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3943, 0, 2402, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2614, 0, 0, 1158, 1158, 0, 0, 0, + 0, 1158, 2615, 0, 0, 1158, 1158, 1158, 0, 0, + 0, 0, 0, 2616, 0, 1158, 1158, 0, 0, 2617, + 0, 1158, 0, 0, 0, 1158, 1158, 1158, 0, 1158, + 1158, 1158, 0, 1157, 0, 0, 0, 0, 0, 1158, + 0, 1158, 0, 1157, 1158, 1158, 1158, 1158, 0, 1158, + 2618, 1158, 1158, 0, 2619, 0, 0, 1157, 0, 1945, + 1157, 0, 0, 0, 0, 1158, 1158, 1158, 1158, 1158, + 0, 1158, 1158, 1158, 1158, 1158, 1158, 0, 1158, 1158, + 0, 1158, 1158, 2620, 1158, 1158, 0, 0, 1158, 1158, + 0, 1158, 1158, 966, 1158, 0, 1158, 0, 0, 0, + 1158, 1158, 1158, 0, 0, 1158, 1158, 1158, 1158, 0, + 1158, 0, 0, 0, 0, 0, 0, 1158, 0, 0, + 0, 0, 0, 1158, 1158, 1158, 1158, 0, 0, 0, + 0, 0, 0, 0, 1158, 1158, 0, 1158, 1158, 0, + 2402, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + 1158, 1158, 1158, 1158, 0, 0, 1158, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 0, 1512, 1513, 0, 0, 0, 1517, 1518, + 0, 0, 0, 0, 0, 0, 0, 0, 1527, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4540, 0, 0, 1549, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1562, 0, 0, 0, + 1157, 1157, 0, 1157, 0, 0, 0, 0, 0, 0, + 0, 0, 1577, 0, 6118, 0, 1157, 1157, 1157, 0, + 4573, 0, 0, 0, 0, 0, 0, 4759, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1157, 1157, 1601, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4759, 3943, 0, 1158, 4759, + 1158, 1620, 1621, 1622, 1157, 0, 0, 0, 0, 0, + 0, 1630, 1631, 1632, 0, 0, 1157, 0, 862, 0, + 0, 0, 0, 0, 0, 1157, 0, 0, 4632, 1647, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1157, 0, 0, 0, 0, + 1157, 1157, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1676, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 0, 0, 1157, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1703, 0, + 0, 0, 0, 0, 2293, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4759, 0, 0, 0, + 0, 1725, 1726, 1727, 4759, 0, 0, 955, 0, 0, + 4759, 4759, 1158, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1746, 1747, 4721, 4, 5, 4721, 4, + 5, 0, 9, 4759, 0, 0, 0, 0, 0, 0, + 1158, 956, 0, 0, 0, 0, 0, 0, 1158, 0, + 4759, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 1761, 0, 1762, 1763, 0, 0, 0, -904, 0, + -904, 2402, 0, 0, 0, 0, 0, 957, 0, 0, + 1764, 20, 0, 0, 958, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 23, 2430, 0, 0, 2430, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 959, 0, 0, 0, 0, 1765, 1766, 0, 960, + 0, 0, 0, 0, 0, 0, 0, 4759, 0, 0, + 0, 28, 0, 0, 0, 0, 0, 0, 0, 4759, + 0, 0, 4722, 4759, 0, 4722, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 961, 0, 0, 0, 0, + 0, 0, 1768, 0, 0, 0, 0, 0, 0, 0, + 1157, 1157, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4759, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, + 962, 963, 0, 1769, 0, 0, 0, 0, 0, 0, + 0, 0, 4724, 0, 0, 4724, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1157, 0, 0, 1945, 0, 0, + 0, 0, 0, 0, 0, 1158, 0, 0, 4759, 6242, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1770, 1771, 50, 0, 4725, + 4726, 4727, 4725, 4726, 4727, 0, 0, 0, 0, 0, + 4759, 1772, 1773, 0, 0, 0, 0, 0, 1157, 4728, + 1158, 0, 4728, 0, 0, 0, 0, 0, 1158, 1158, + 0, 0, 0, 0, 0, 0, 82, 1945, 0, 0, + 0, 0, 0, 0, 0, 1157, 1157, 0, 0, 0, + 0, 0, 0, 1775, 0, 0, 0, 0, 964, 4759, + 0, 4759, 4759, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4729, 0, 4730, 4729, 0, 4730, 0, + 1157, 0, 1158, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -904, 0, 4731, 0, 0, 4731, 0, + 0, 0, 4759, 0, 0, 0, 0, 0, 0, 0, + 0, 3987, 0, 4732, 0, 0, 4732, 0, 0, 0, + 4733, 0, 0, 4733, 0, 1158, 1158, 1158, 965, 0, + 0, 0, 0, 0, 0, 4734, 0, 4759, 4734, 0, + 0, 0, 4735, 0, 0, 4735, 0, 1777, 0, 955, + 1778, 0, 0, 1779, 0, 0, 0, 4736, 0, 0, + 4736, 0, 0, 0, 0, 0, 1157, 4759, 1157, 0, + 0, 0, 0, 0, 9, 0, 1780, 0, 0, 0, + 0, 0, 0, 956, 1158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1782, 0, 0, 0, + 0, 0, 1158, 0, 14, 0, 1158, 1158, 0, 1158, + 1158, 0, 0, 0, 4737, 0, 0, 4737, 1158, 0, + 1158, 0, 0, 0, 4738, 0, 0, 4738, 0, 957, + 0, 0, 0, 20, 0, 0, 958, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, + 0, 1158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4739, 959, 0, 4739, 966, 0, 0, 0, + 0, 960, 0, 0, 0, 4740, 0, 1158, 4740, 0, + 0, 1157, 0, 28, 0, 0, 0, 0, 0, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 0, 0, 1157, 0, 961, 0, 0, + 0, 0, 0, 1158, 4741, 0, 0, 4741, 0, 0, + 4742, 0, 0, 4742, 0, 0, 0, 0, 1157, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1157, 1157, 1159, 39, 0, 0, + 0, 0, 962, 963, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1158, 0, 0, 0, + 0, 0, 0, 1158, 0, 0, 0, 0, 4743, 0, + 0, 4743, 0, 0, 0, 4744, 0, 0, 4744, 0, + 0, 0, 0, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2402, + 0, 0, 0, 0, 0, 0, 0, 4745, 0, 50, + 4745, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4746, 4747, 0, 4746, 4747, 0, 0, 0, + 0, 0, 0, 0, 0, 4748, 0, 0, 4748, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 0, 0, 0, 0, 0, 0, 4146, + 964, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1158, 0, 0, 0, 0, 1158, + 1158, 0, 0, 4222, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1157, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 0, 0, 0, 0, 0, 0, 1945, 0, 0, + 0, 0, 0, 1157, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1158, 1158, 0, 1157, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1159, 0, 0, 966, 1159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 1158, + 0, 0, 1158, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 0, 0, 0, 0, 1159, 1159, 1159, 1159, + 1158, 0, 1158, 1158, 0, 1158, 1158, 1158, 1158, 1159, + 1158, 0, 1158, 1158, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 1158, 1158, 0, 0, 0, 1158, 1158, + 1158, 0, 0, 0, 0, 0, 0, 0, 1158, 1158, + 1158, 0, 1158, 0, 1158, 0, 1158, 0, 1158, 0, + 1158, 0, 0, 0, 0, 1158, 1158, 0, 1158, 1158, + 1158, 0, 0, 0, 1158, 0, 0, 1158, 0, 0, + 0, 0, 0, 0, 0, 0, 1158, 0, 0, 1158, + 0, 1158, 1158, 1158, 0, 0, 1158, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1158, 0, + 1158, 0, 0, 1158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1158, 1158, 1158, 1158, 0, 1158, 0, + 0, 0, 0, 1158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 796, 0, + 0, 1158, 0, 1945, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1945, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1157, 0, 0, + 0, 0, 0, 0, 1158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1158, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1157, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1158, 0, 0, 0, 0, 0, 0, 0, 0, 1159, + 0, 0, 0, 0, 1157, 0, 0, 0, 0, 1314, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1403, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1157, 0, 0, 0, 1157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1158, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1158, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 0, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1895, 0, 0, 0, + 1158, 1158, 0, 0, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1157, 1158, 0, 1158, + 0, 1158, 0, 1158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1158, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1158, 1158, 0, + 0, 0, 1158, 0, 1158, 0, 1158, 0, 0, 0, + 0, 1158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1158, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 0, 0, 0, 1158, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1159, 0, 1159, 0, 1158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 1159, 0, 0, 0, 0, 1159, 0, 0, + 0, 1159, 1159, 1159, 0, 0, 0, 0, 0, 0, + 0, 1159, 1159, 0, 0, 0, 0, 1159, 0, 0, + 0, 1159, 1159, 1159, 0, 1159, 1159, 1159, 0, 1158, + 0, 0, 0, 0, 0, 1159, 0, 1159, 0, 1158, + 1159, 1159, 1159, 1159, 0, 1159, 0, 1159, 1159, 0, + 0, 0, 0, 1158, 0, 0, 1158, 0, 0, 0, + 0, 1159, 1159, 1159, 1159, 1159, 0, 1159, 1159, 1159, + 1159, 1159, 1159, 0, 1159, 1159, 0, 1159, 1159, 0, + 1159, 1159, 0, 0, 1159, 1159, 0, 1159, 1159, 0, + 1159, 0, 1159, 0, 0, 0, 1159, 1159, 1159, 0, + 0, 1159, 1159, 1159, 1159, 0, 1159, 0, 0, 2247, + 0, 0, 0, 1159, 0, 2255, 0, 0, 0, 1159, + 1159, 1159, 1159, 0, 0, 0, 0, 0, 0, 0, + 1159, 1159, 0, 1159, 1159, 0, 0, 1159, 1159, 1159, + 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1403, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1158, 1158, 0, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 1158, 1158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2443, 0, 0, 1158, 1158, 0, 0, + 0, 0, 0, 0, 2455, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 1159, 0, 0, 0, + 1158, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 0, 0, 0, 0, 1158, 1158, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1158, 1158, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2565, 0, 2565, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1158, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1158, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 1159, 1159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 1158, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1158, 0, 1159, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 1159, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2809, + 0, 0, 0, 2813, 0, 0, 0, 0, 0, 2819, + 0, 0, 1158, 0, 1158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 0, 1159, 1159, 0, 1159, 1159, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2919, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1123, 0, 0, 0, + 0, 0, 0, 1159, 0, 0, 0, 1158, 0, 0, + 0, 0, 0, 2973, 0, 1159, 0, 0, 2979, 0, + 2981, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 1158, 0, 0, 0, 0, 0, 0, 0, 1159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1158, 1159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3016, 0, 0, + 1158, 1158, 0, 0, 0, 0, 0, 0, 0, 3026, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 1159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1491, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3114, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 0, 0, 1403, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1403, 1403, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 1159, 1159, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 3209, 0, 0, 0, 0, 0, 3212, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1956, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1158, + 0, 0, 1982, 0, 0, 0, 0, 0, 0, 0, + 0, 1996, 1159, 1159, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2069, + 0, 0, 0, 0, 0, 0, 0, 0, 3360, 3360, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3375, 0, 0, 0, + 0, 0, 0, 0, 0, 1158, 1895, 0, 0, 0, + 0, 1159, 0, 0, 0, 1159, 0, 0, 1159, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 0, 1159, 1159, + 0, 1159, 1159, 1159, 1159, 0, 1159, 0, 1159, 1159, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 1159, + 1159, 0, 0, 0, 1159, 1159, 1159, 0, 0, 0, + 0, 0, 0, 0, 1159, 1159, 1159, 0, 1159, 0, + 1159, 0, 1159, 0, 1159, 0, 1159, 0, 0, 0, + 0, 1159, 1159, 0, 1159, 1159, 1159, 0, 0, 0, + 1159, 0, 0, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 1159, 0, 1159, 1159, 1159, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 1159, 0, 0, 1159, + 0, 2263, 0, 0, 0, 0, 0, 0, 0, 1159, + 1159, 1159, 1159, 0, 1159, 0, 0, 0, 0, 1159, + 0, 0, 0, 0, 3515, 0, 0, 0, 3519, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1158, 0, 0, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 0, 0, 0, 3360, 3360, + 0, 0, 2425, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2464, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1158, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1159, 0, 0, 0, 3679, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 3703, 0, 0, 0, 0, 0, + 1158, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3762, 0, 0, 0, 0, + 0, 0, 0, 0, 3771, 0, 0, 0, 0, 1403, + 0, 0, 0, 0, 0, 1403, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1403, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1158, + 0, 0, 0, 1158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 1159, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 1159, 0, 1159, 0, 1159, 0, 1159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 0, 0, 0, 0, + 0, 1403, 0, 0, 3983, 0, 0, 0, 0, 0, + 0, 0, 0, 1159, 1159, 0, 0, 0, 1159, 0, + 1159, 0, 1159, 0, 0, 0, 0, 1159, 0, 0, + 2631, 0, 2631, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 0, 1159, 0, 0, 0, 0, 2680, 0, 0, + 0, 2685, 0, 2687, 0, 0, 0, 0, 0, 0, + 1159, 2702, 2703, 0, 0, 0, 0, 2732, 0, 0, + 0, 2737, 2738, 2739, 0, 2741, 2742, 2743, 0, 0, + 0, 0, 0, 0, 0, 2751, 0, 2754, 0, 0, + 2755, 2756, 2757, 2758, 0, 0, 0, 2762, 2763, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2774, 2775, 2782, 2786, 2787, 0, 2790, 2791, 2792, + 2795, 2796, 0, 0, 2799, 2800, 0, 2806, 2807, 0, + 2810, 2811, 0, 0, 0, 2815, 0, 2817, 2818, 0, + 2820, 0, 2821, 0, 0, 0, 2824, 2782, 2826, 0, + 0, 2832, 0, 2834, 2835, 1159, 2836, 0, 0, 0, + 0, 0, 0, 2840, 0, 1159, 0, 0, 0, 2842, + 2843, 2844, 0, 0, 0, 0, 0, 0, 0, 1159, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2919, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2940, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4227, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3052, 0, 3057, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 1159, 0, 1159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4300, 1159, 1159, + 1159, 3080, 0, 0, 0, 0, 0, 0, 0, 1403, + 0, 0, 0, 1403, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 3158, 0, + 0, 0, 1159, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 1159, 3182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1403, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4489, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3369, 1159, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3421, 0, 0, 0, + 0, 0, 0, 0, 3428, 3429, 0, 0, 4623, 0, + 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3448, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 1159, 0, + 0, 3487, 3489, 3491, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4712, 0, 0, + 0, 0, 4717, 4718, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1403, 1403, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3553, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3561, 0, 3562, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 1159, 0, 0, 0, 0, 0, 0, 3587, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3601, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2425, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2425, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3656, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3662, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 3682, 0, 0, 0, 0, 0, 0, 3057, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3776, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3801, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3801, 0, 0, 0, 0, 2425, 2425, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3887, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5064, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5088, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3950, 3951, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4025, 0, 0, 0, 4027, 0, 0, 4028, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4056, 0, 0, 0, + 0, 4060, 4061, 4062, 4063, 0, 4064, 0, 4065, 4066, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4071, + 4072, 0, 0, 0, 4073, 4074, 4075, 0, 0, 0, + 0, 0, 0, 0, 4077, 4078, 4079, 0, 4080, 0, + 4082, 1159, 4084, 0, 4086, 0, 4088, 0, 0, 0, + 0, 2792, 4091, 0, 2792, 0, 4094, 0, 0, 0, + 4095, 0, 0, 4096, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4103, 0, 4104, 4105, 4106, + 0, 0, 4107, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4129, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4139, 4142, 0, 0, 4147, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5377, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159, + 0, 0, 0, 0, 0, 0, 0, 4180, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2425, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3057, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1159, 0, 0, 0, 0, + 0, 0, 0, 3057, 0, 0, 0, 0, 0, 0, + 5508, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5528, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4328, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4474, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4494, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1159, 0, 0, 4502, 1159, + 0, 4503, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4523, 4524, 0, 0, + 0, 4529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4549, 0, 4550, 0, 4551, 0, 4552, + 0, 0, 0, 0, 0, 5744, 0, 0, 0, 0, + 0, 0, 0, 0, 4567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4588, 4589, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3801, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5790, 0, 1159, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2425, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2425, 0, + 0, 0, 2425, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3057, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4795, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3801, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3801, + 0, 0, 4809, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5997, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6003, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6113, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4951, 4952, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4959, 4960, + 4961, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4983, 4984, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5006, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2425, 0, 0, + 0, 0, 2425, 2425, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3057, 0, 0, 0, 3057, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5238, 5239, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3801, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3801, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2425, 2425, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3057, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5474, 0, + 5476, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5578, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3801, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2425, 2425, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3801, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3057, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5786, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 996, 0, 0, 0, 0, 997, + 998, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 0, 0, 0, 0, 0, 6006, + 0, 1012, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1013, 1014, + 1015, 1016, 0, 0, 0, 0, 0, 0, 0, 1017, + 1018, 0, 1019, 0, 0, 0, 0, 0, 0, 1020, + 1021, 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, + 0, 1027, 1028, 0, 0, 0, 0, 0, 0, 0, + 1029, 0, 0, 1030, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, + 0, 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, + 0, 0, 1038, 0, 0, 571, 0, 0, 0, 0, + 0, 1039, 0, 0, 1040, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 1042, 0, 1043, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6135, + 0, 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, + 0, 0, 0, 1048, 0, 0, 29, 1049, 0, 1050, + 1051, 1052, 1053, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 1054, 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, + 0, 1058, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1059, 0, 0, 0, 0, 0, 0, 0, + 1060, 1061, 0, 0, 0, 42, 0, 0, 0, 0, + 0, 0, 0, 0, 2069, 0, 0, 0, 0, 1062, + 0, 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, + 1066, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1067, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1068, 1069, 1070, 0, 0, 49, 0, 0, 1071, + 1072, 0, 0, 0, 0, 51, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 1073, 1074, + 1075, 1076, 61, 62, 63, 1077, 65, 66, 67, 68, + 69, 70, 1078, 72, 73, 74, 75, 76, 77, 78, + 1079, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 1080, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 1081, 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 1085, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 1086, 1087, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 3057, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 1088, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 1089, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 1090, 1091, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 1092, 264, 265, + 266, 267, 268, 1093, 270, 271, 272, 273, 274, 275, + 276, 277, 1094, 1095, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 3057, 293, + 294, 295, 296, 595, 297, 298, 1096, 300, 301, 302, + 303, 304, 305, 306, 1097, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 1098, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 1099, 363, 364, 365, 601, 367, 368, 1100, 370, 371, + 372, 373, 374, 375, 1101, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 1102, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, + 431, 432, 1107, 1108, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 1109, 448, 1110, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 1111, 607, 1112, 464, 465, 466, 0, 467, 608, 469, + 1113, 0, 0, 0, 0, 0, 0, 0, 0, 1114, + 1115, 0, 0, 996, 0, 1116, 0, 0, 997, 998, + 1117, 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, + 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 0, 0, 0, 0, 0, 0, 0, + 1012, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 1015, + 1016, 0, 0, 0, 2779, 0, 0, 0, 1017, 1018, + 0, 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, + 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, + 1027, 1028, 0, 0, 0, 0, 0, 0, 0, 1029, + 0, 0, 1030, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, + 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, + 0, 1038, 0, 0, 571, 0, 0, 0, 0, 0, + 1039, 0, 0, 1040, 0, 0, 0, 0, 0, 0, + 0, 0, 1041, 2780, 1042, 0, 1043, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, + 0, 0, 1048, 0, 0, 29, 1049, 0, 1050, 1051, + 1052, 1053, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 1054, + 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, 0, + 1058, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1059, 0, 0, 0, 0, 0, 0, 0, 1060, + 1061, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1062, 0, + 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, + 0, 0, 0, 0, 0, 0, 0, 0, 2781, 0, + 1067, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1068, 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, + 1076, 61, 62, 63, 1077, 65, 66, 67, 68, 69, + 70, 1078, 72, 73, 74, 75, 76, 77, 78, 1079, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 1080, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 1081, + 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 1085, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 1086, 1087, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 1088, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 1089, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 1090, 1091, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 1092, 264, 265, 266, + 267, 268, 1093, 270, 271, 272, 273, 274, 275, 276, + 277, 1094, 1095, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 1096, 300, 301, 302, 303, + 304, 305, 306, 1097, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 1098, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 1099, + 363, 364, 365, 601, 367, 368, 1100, 370, 371, 372, + 373, 374, 375, 1101, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 1102, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, + 432, 1107, 1108, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 1109, 448, 1110, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 1111, + 607, 1112, 464, 465, 466, 0, 467, 608, 469, 1113, + 0, 0, 0, 0, 0, 0, 0, 0, 1114, 1115, + 0, 0, 996, 0, 1116, 0, 0, 997, 998, 1117, + 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, 1000, + 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 0, 0, 0, 0, 0, 0, 0, 1012, + 0, 0, 0, 0, 0, 0, 2421, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2422, 1014, 1015, 1016, + 0, 0, 0, 0, 0, 0, 0, 1017, 1018, 0, + 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, 0, + 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, + 1028, 0, 0, 0, 0, 0, 0, 0, 2423, 0, + 0, 1030, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 1031, + 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, 0, + 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, + 1038, 0, 0, 571, 0, 0, 0, 0, 0, 1039, + 0, 0, 1040, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1044, + 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, 0, + 0, 1048, 0, 0, 29, 1049, 0, 1050, 1051, 1052, + 1053, 0, 2424, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 1054, 1055, + 1056, 0, 1057, 0, 0, 0, 0, 0, 0, 1058, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1059, 0, 0, 0, 0, 0, 0, 0, 1060, 1061, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1062, 0, 0, + 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1067, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1068, + 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, + 61, 62, 63, 1077, 65, 66, 67, 68, 69, 70, + 1078, 72, 73, 74, 75, 76, 77, 78, 1079, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 1080, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 1081, 108, + 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 1085, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 1086, + 1087, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 1088, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 1089, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 1090, + 1091, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 1092, 264, 265, 266, 267, + 268, 1093, 270, 271, 272, 273, 274, 275, 276, 277, + 1094, 1095, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 1096, 300, 301, 302, 303, 304, + 305, 306, 1097, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 1098, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 1099, 363, + 364, 365, 601, 367, 368, 1100, 370, 371, 372, 373, + 374, 375, 1101, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 1102, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, + 1107, 1108, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 1109, 448, 1110, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 1111, 607, + 1112, 464, 465, 466, 0, 467, 608, 469, 1113, 0, + 0, 0, 0, 0, 0, 0, 0, 1114, 1115, 0, + 0, 996, 0, 1116, 0, 0, 997, 998, 1117, 0, + 0, 0, 1118, 1119, 0, 0, 1120, 999, 1000, 0, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 0, 0, 0, 0, 0, 0, 0, 1012, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1013, 1014, 1015, 1016, 0, + 0, 0, 0, 0, 0, 0, 1017, 1018, 0, 1019, + 0, 0, 0, 0, 0, 0, 1020, 1021, 0, 0, + 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, 1028, + 0, 0, 0, 0, 0, 0, 0, 1029, 0, 0, + 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 1031, 1032, + 1033, 0, 1034, 0, 0, 0, 0, 0, 0, 0, + 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, 1038, + 0, 0, 571, 0, 0, 0, 0, 0, 1039, 0, + 0, 1040, 0, 0, 0, 0, 0, 0, 0, 0, + 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1044, 1045, + 0, 1046, 0, 0, 0, 1047, 0, 0, 0, 0, + 1048, 0, 0, 29, 1049, 0, 1050, 1051, 1052, 1053, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 1054, 1055, 1056, + 0, 1057, 0, 0, 0, 0, 0, 0, 1058, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1059, + 0, 0, 0, 0, 0, 0, 0, 1060, 1061, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1062, 0, 0, 0, + 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1068, 1069, + 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, 1955, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, 61, + 62, 63, 1077, 65, 66, 67, 68, 69, 70, 1078, + 72, 73, 74, 75, 76, 77, 78, 1079, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 1080, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 1081, 108, 1082, + 1083, 1084, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 1085, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 1086, 1087, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 1088, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 1089, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 1090, 1091, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 1092, 264, 265, 266, 267, 268, + 1093, 270, 271, 272, 273, 274, 275, 276, 277, 1094, + 1095, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 1096, 300, 301, 302, 303, 304, 305, + 306, 1097, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 1098, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 1099, 363, 364, + 365, 601, 367, 368, 1100, 370, 371, 372, 373, 374, + 375, 1101, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 1102, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, 1107, + 1108, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 1109, 448, 1110, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 1111, 607, 1112, + 464, 465, 466, 0, 467, 608, 469, 1113, 0, 0, + 0, 0, 0, 0, 0, 0, 1114, 1115, 0, 0, + 996, 0, 1116, 0, 0, 997, 998, 1117, 0, 0, + 0, 1118, 1119, 0, 0, 1120, 999, 1000, 0, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1013, 1014, 1015, 1016, 0, 0, + 0, 0, 0, 0, 0, 1017, 1018, 0, 1019, 0, + 0, 0, 0, 0, 0, 1020, 1021, 0, 0, 1022, + 1023, 1024, 1025, 0, 1026, 13, 0, 1027, 1028, 0, + 0, 0, 0, 0, 0, 0, 3054, 0, 0, 1030, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 1031, 1032, 1033, + 0, 1034, 0, 0, 0, 0, 0, 0, 0, 1035, + 1036, 1037, 22, 0, 0, 0, 0, 0, 1038, 0, + 3055, 571, 0, 0, 0, 0, 0, 1039, 0, 0, + 1040, 0, 0, 0, 0, 0, 0, 0, 0, 1041, + 0, 1042, 0, 1043, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1044, 1045, 0, + 1046, 0, 0, 0, 1047, 0, 0, 0, 0, 1048, + 0, 0, 29, 1049, 0, 1050, 1051, 1052, 1053, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 1054, 1055, 1056, 0, + 1057, 0, 0, 0, 0, 0, 0, 1058, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1059, 0, + 0, 0, 0, 0, 0, 0, 1060, 1061, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1062, 0, 0, 0, 0, + 0, 0, 1063, 1064, 0, 1065, 1066, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1067, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1068, 1069, 1070, + 0, 0, 0, 0, 0, 1071, 1072, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 1073, 1074, 1075, 1076, 61, 62, + 63, 1077, 65, 66, 67, 68, 69, 70, 1078, 72, + 73, 74, 75, 76, 77, 78, 1079, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 1080, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 1081, 108, 1082, 1083, + 1084, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 1085, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 1086, 1087, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 1088, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 1089, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 1090, 1091, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 1092, 264, 265, 266, 267, 268, 1093, + 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 1096, 300, 301, 302, 303, 304, 305, 306, + 1097, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 1098, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 1099, 363, 364, 365, + 601, 367, 368, 1100, 370, 371, 372, 373, 374, 375, + 1101, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 1102, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 1103, 1104, 1105, 1106, 429, 430, 431, 432, 1107, 1108, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 1109, 448, 1110, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 1111, 607, 1112, 464, + 465, 466, 0, 467, 608, 469, 1113, 0, 0, 0, + 0, 0, 0, 0, 0, 1114, 1115, 0, 0, 996, + 0, 1116, 0, 0, 997, 998, 1117, 0, 0, 0, + 1118, 1119, 0, 0, 1120, 999, 1000, 0, 1001, 1002, + 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, + 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1013, 1014, 1015, 1016, 0, 0, 0, + 0, 0, 0, 0, 1017, 1018, 0, 1019, 0, 0, + 0, 0, 0, 0, 1020, 1021, 0, 0, 1022, 1023, + 1024, 1025, 0, 1026, 13, 0, 1027, 1028, 0, 0, + 0, 0, 0, 0, 0, 1029, 0, 0, 1030, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 1031, 1032, 1033, 0, + 1034, 0, 0, 0, 3486, 0, 0, 0, 1035, 1036, + 1037, 22, 0, 0, 0, 0, 0, 1038, 0, 0, + 571, 0, 0, 0, 0, 0, 1039, 0, 0, 1040, + 0, 0, 0, 0, 0, 0, 0, 0, 1041, 0, + 1042, 0, 1043, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1044, 1045, 0, 1046, + 0, 0, 0, 1047, 0, 0, 0, 0, 1048, 0, + 0, 29, 1049, 0, 1050, 1051, 1052, 1053, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 1054, 1055, 1056, 0, 1057, + 0, 0, 0, 0, 0, 0, 1058, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1059, 0, 0, + 0, 0, 0, 0, 0, 1060, 1061, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1062, 0, 0, 0, 0, 0, + 0, 1063, 1064, 0, 1065, 1066, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1067, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1068, 1069, 1070, 0, + 0, 0, 0, 0, 1071, 1072, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 1073, 1074, 1075, 1076, 61, 62, 63, + 1077, 65, 66, 67, 68, 69, 70, 1078, 72, 73, + 74, 75, 76, 77, 78, 1079, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 1080, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 1081, 108, 1082, 1083, 1084, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 1085, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 1086, 1087, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 1088, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 1089, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 1090, 1091, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 1092, 264, 265, 266, 267, 268, 1093, 270, + 271, 272, 273, 274, 275, 276, 277, 1094, 1095, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 1096, 300, 301, 302, 303, 304, 305, 306, 1097, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 1098, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 1099, 363, 364, 365, 601, + 367, 368, 1100, 370, 371, 372, 373, 374, 375, 1101, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 1102, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 1103, + 1104, 1105, 1106, 429, 430, 431, 432, 1107, 1108, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 1109, 448, 1110, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 1111, 607, 1112, 464, 465, + 466, 0, 467, 608, 469, 1113, 0, 0, 0, 0, + 0, 0, 0, 0, 1114, 1115, 0, 0, 996, 0, + 1116, 0, 0, 997, 998, 1117, 0, 0, 0, 1118, + 1119, 0, 0, 1120, 999, 1000, 0, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, + 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1013, 1014, 1015, 1016, 0, 0, 0, 0, + 0, 0, 0, 1017, 1018, 0, 1019, 0, 0, 0, + 0, 0, 0, 1020, 1021, 0, 0, 1022, 1023, 1024, + 1025, 0, 1026, 13, 0, 1027, 1028, 0, 0, 0, + 0, 0, 0, 0, 1029, 0, 0, 1030, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 1031, 1032, 1033, 0, 1034, + 0, 0, 0, 3488, 0, 0, 0, 1035, 1036, 1037, + 22, 0, 0, 0, 0, 0, 1038, 0, 0, 571, + 0, 0, 0, 0, 0, 1039, 0, 0, 1040, 0, + 0, 0, 0, 0, 0, 0, 0, 1041, 0, 1042, + 0, 1043, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1044, 1045, 0, 1046, 0, + 0, 0, 1047, 0, 0, 0, 0, 1048, 0, 0, + 29, 1049, 0, 1050, 1051, 1052, 1053, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 1054, 1055, 1056, 0, 1057, 0, + 0, 0, 0, 0, 0, 1058, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1059, 0, 0, 0, + 0, 0, 0, 0, 1060, 1061, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1062, 0, 0, 0, 0, 0, 0, + 1063, 1064, 0, 1065, 1066, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1067, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1068, 1069, 1070, 0, 0, + 0, 0, 0, 1071, 1072, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 1073, 1074, 1075, 1076, 61, 62, 63, 1077, + 65, 66, 67, 68, 69, 70, 1078, 72, 73, 74, + 75, 76, 77, 78, 1079, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 1080, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 1081, 108, 1082, 1083, 1084, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 1085, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 1086, 1087, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 1088, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 1089, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 1090, 1091, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 1092, 264, 265, 266, 267, 268, 1093, 270, 271, + 272, 273, 274, 275, 276, 277, 1094, 1095, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 1096, 300, 301, 302, 303, 304, 305, 306, 1097, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 1098, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 1099, 363, 364, 365, 601, 367, + 368, 1100, 370, 371, 372, 373, 374, 375, 1101, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 1102, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 1103, 1104, + 1105, 1106, 429, 430, 431, 432, 1107, 1108, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 1109, 448, 1110, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 1111, 607, 1112, 464, 465, 466, + 0, 467, 608, 469, 1113, 0, 0, 0, 0, 0, + 0, 0, 0, 1114, 1115, 0, 0, 996, 0, 1116, + 0, 0, 997, 998, 1117, 0, 0, 0, 1118, 1119, + 0, 0, 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, 0, + 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1013, 1014, 1015, 1016, 0, 0, 0, 0, 0, + 0, 0, 1017, 1018, 0, 1019, 0, 0, 0, 0, + 0, 0, 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, + 0, 1026, 13, 0, 1027, 1028, 0, 0, 0, 0, + 0, 0, 0, 1029, 0, 0, 1030, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 1031, 1032, 1033, 0, 1034, 0, + 0, 0, 3490, 0, 0, 0, 1035, 1036, 1037, 22, + 0, 0, 0, 0, 0, 1038, 0, 0, 571, 0, + 0, 0, 0, 0, 1039, 0, 0, 1040, 0, 0, + 0, 0, 0, 0, 0, 0, 1041, 0, 1042, 0, + 1043, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1044, 1045, 0, 1046, 0, 0, + 0, 1047, 0, 0, 0, 0, 1048, 0, 0, 29, + 1049, 0, 1050, 1051, 1052, 1053, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 1054, 1055, 1056, 0, 1057, 0, 0, + 0, 0, 0, 0, 1058, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1059, 0, 0, 0, 0, + 0, 0, 0, 1060, 1061, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1062, 0, 0, 0, 0, 0, 0, 1063, + 1064, 0, 1065, 1066, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1067, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1068, 1069, 1070, 0, 0, 0, + 0, 0, 1071, 1072, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 1073, 1074, 1075, 1076, 61, 62, 63, 1077, 65, + 66, 67, 68, 69, 70, 1078, 72, 73, 74, 75, + 76, 77, 78, 1079, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 1080, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 1081, 108, 1082, 1083, 1084, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 1085, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 1086, 1087, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 1088, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 1089, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 1090, 1091, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 1092, 264, 265, 266, 267, 268, 1093, 270, 271, 272, + 273, 274, 275, 276, 277, 1094, 1095, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 1096, + 300, 301, 302, 303, 304, 305, 306, 1097, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 1098, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 1099, 363, 364, 365, 601, 367, 368, + 1100, 370, 371, 372, 373, 374, 375, 1101, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 1102, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 1103, 1104, 1105, + 1106, 429, 430, 431, 432, 1107, 1108, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 1109, + 448, 1110, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 1111, 607, 1112, 464, 465, 466, 0, + 467, 608, 469, 1113, 0, 0, 0, 0, 0, 0, + 0, 0, 1114, 1115, 0, 0, 996, 0, 1116, 0, + 0, 997, 998, 1117, 0, 0, 0, 1118, 1119, 0, + 0, 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, 0, 0, + 0, 0, 0, 1012, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1013, 1014, 1015, 1016, 0, 0, 0, 0, 0, 0, + 0, 1017, 1018, 0, 1019, 0, 0, 0, 0, 0, + 0, 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, 0, + 1026, 13, 0, 1027, 1028, 0, 0, 0, 0, 0, + 0, 0, 5030, 0, 0, 1030, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 1031, 1032, 1033, 0, 1034, 0, 0, + 0, 0, 0, 0, 0, 1035, 1036, 1037, 22, 0, + 0, 0, 0, 0, 1038, 0, 3055, 571, 0, 0, + 0, 0, 0, 1039, 0, 0, 1040, 0, 0, 0, + 0, 0, 0, 0, 0, 1041, 0, 1042, 0, 1043, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1044, 1045, 0, 1046, 0, 0, 0, + 1047, 0, 0, 0, 0, 1048, 0, 0, 29, 1049, + 0, 1050, 1051, 1052, 1053, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 1054, 1055, 1056, 0, 1057, 0, 0, 0, + 0, 0, 0, 1058, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1059, 0, 0, 0, 0, 0, + 0, 0, 1060, 1061, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1062, 0, 0, 0, 0, 0, 0, 1063, 1064, + 0, 1065, 1066, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1067, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1068, 1069, 1070, 0, 0, 0, 0, + 0, 1071, 1072, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 1073, 1074, 1075, 1076, 61, 62, 63, 1077, 65, 66, + 67, 68, 69, 70, 1078, 72, 73, 74, 75, 76, + 77, 78, 1079, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 1080, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 1081, 108, 1082, 1083, 1084, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 1085, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 1086, 1087, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 1088, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 1089, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 1090, 1091, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 1092, + 264, 265, 266, 267, 268, 1093, 270, 271, 272, 273, + 274, 275, 276, 277, 1094, 1095, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 1096, 300, + 301, 302, 303, 304, 305, 306, 1097, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 1098, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 1099, 363, 364, 365, 601, 367, 368, 1100, + 370, 371, 372, 373, 374, 375, 1101, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 1102, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 1103, 1104, 1105, 1106, + 429, 430, 431, 432, 1107, 1108, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 1109, 448, + 1110, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 1111, 607, 1112, 464, 465, 466, 0, 467, + 608, 469, 1113, 0, 0, 0, 0, 0, 0, 0, + 0, 1114, 1115, 0, 0, 996, 0, 1116, 0, 0, + 997, 998, 1117, 0, 0, 0, 1118, 1119, 0, 0, + 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, + 1007, 1008, 1009, 1010, 1011, 0, 0, 0, 0, 0, + 0, 0, 1012, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1013, + 1014, 1015, 1016, 0, 0, 0, 0, 0, 0, 0, + 1017, 1018, 0, 1019, 0, 0, 0, 0, 0, 0, + 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, 0, 1026, + 13, 0, 1027, 1028, 0, 0, 0, 0, 0, 0, + 0, 1029, 0, 0, 1030, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 1031, 1032, 1033, 0, 1034, 0, 0, 0, + 0, 0, 0, 0, 1035, 1036, 1037, 22, 0, 0, + 0, 0, 0, 1038, 0, 0, 571, 0, 0, 0, + 0, 0, 1039, 0, 0, 1040, 0, 0, 0, 0, + 0, 0, 0, 0, 1041, 0, 1042, 0, 1043, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1044, 1045, 0, 1046, 0, 0, 0, 1047, + 0, 0, 0, 0, 1048, 0, 0, 29, 1049, 0, + 1050, 1051, 1052, 1053, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 1054, 1055, 1056, 0, 1057, 0, 0, 0, 0, + 0, 0, 1058, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1059, 0, 0, 0, 0, 0, 0, + 0, 1060, 1061, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1062, 0, 0, 0, 0, 0, 0, 1063, 1064, 0, + 1065, 1066, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1067, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1068, 1069, 1070, 0, 0, 0, 0, 0, + 1071, 1072, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 1073, + 1074, 1075, 1076, 61, 62, 63, 1077, 65, 66, 67, + 68, 69, 70, 1078, 72, 73, 74, 75, 76, 77, + 78, 1079, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 1080, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 1081, 108, 1082, 1083, 1084, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 1085, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 1086, 1087, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 1088, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 1089, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 1090, 1091, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 1092, 264, + 265, 266, 267, 268, 1093, 270, 271, 272, 273, 274, + 275, 276, 277, 1094, 1095, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 1096, 300, 301, + 302, 303, 304, 305, 306, 1097, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 1098, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 1099, 363, 364, 365, 601, 367, 368, 1100, 370, + 371, 372, 373, 374, 375, 1101, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 1102, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 1103, 1104, 1105, 1106, 429, + 430, 431, 432, 1107, 1108, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 1109, 448, 1110, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 1111, 607, 1112, 464, 465, 466, 0, 467, 608, + 469, 1113, 0, 0, 0, 0, 0, 0, 0, 0, + 1114, 1115, 0, 0, 996, 0, 1116, 0, 0, 997, + 998, 1117, 0, 0, 0, 1118, 1119, 0, 0, 1120, + 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 0, 0, 0, 0, 0, 0, + 0, 1012, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1013, 1014, + 1015, 1016, 0, 0, 0, 0, 0, 0, 0, 1017, + 1018, 0, 1019, 0, 0, 0, 0, 0, 0, 1020, + 1021, 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, + 0, 1027, 1028, 0, 0, 0, 0, 0, 0, 0, + 1029, 0, 0, 1030, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, + 0, 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, + 0, 0, 1038, 0, 0, 571, 0, 0, 0, 0, + 0, 1039, 0, 0, 1040, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 1042, 0, 1043, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, + 0, 0, 0, 1048, 0, 0, 29, 1049, 0, 1050, + 1051, 1052, 1053, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 1054, 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, + 0, 1058, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1059, 0, 0, 0, 0, 0, 0, 0, + 1060, 1061, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1062, + 0, 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, + 1066, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1067, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1068, 1069, 1070, 0, 0, 0, 0, 0, 1071, + 1072, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 1073, 1074, + 1075, 1076, 61, 62, 63, 1077, 65, 66, 67, 68, + 69, 70, 1078, 72, 73, 74, 75, 76, 77, 78, + 1079, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 1080, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 1081, 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 1085, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 1086, 1087, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 1088, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 1089, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 1090, 1091, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 1092, 264, 265, + 266, 267, 268, 1093, 270, 271, 272, 273, 274, 275, + 276, 277, 1094, 1095, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 1096, 300, 301, 302, + 303, 304, 305, 306, 1097, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 1098, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 1099, 363, 364, 365, 601, 367, 368, 1100, 370, 371, + 372, 373, 374, 375, 1101, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 1102, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, + 431, 432, 1107, 1108, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 1109, 448, 1110, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 1111, 607, 1112, 464, 465, 466, 0, 467, 608, 469, + 1113, 0, 0, 0, 0, 0, 0, 0, 0, 1114, + 1115, 0, 0, 996, 0, 1116, 0, 0, 997, 998, + 1981, 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, + 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 0, 0, 0, 0, 0, 0, 0, + 1012, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 1015, + 1016, 0, 0, 0, 0, 0, 0, 0, 1017, 1018, + 0, 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, + 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, + 1027, 1028, 0, 0, 0, 0, 0, 0, 0, 1029, + 0, 0, 1030, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, + 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, + 0, 1038, 0, 0, 571, 0, 0, 0, 0, 0, + 1039, 0, 0, 1040, 0, 0, 0, 0, 0, 0, + 0, 0, 1041, 0, 1042, 0, 1043, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, + 0, 0, 1048, 0, 0, 29, 1049, 0, 1050, 1051, + 1052, 1053, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 1054, + 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, 0, + 1058, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1059, 0, 0, 0, 0, 0, 0, 0, 1060, + 1061, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1062, 0, + 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1067, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1068, 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, + 1076, 61, 62, 63, 1077, 65, 66, 67, 68, 69, + 70, 1078, 72, 73, 74, 75, 76, 77, 78, 1079, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 1080, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 1081, + 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 1085, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 1086, 1087, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 1088, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 1089, 2629, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 1090, 1091, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 1092, 264, 265, 266, + 267, 268, 1093, 270, 271, 272, 273, 274, 275, 276, + 277, 1094, 1095, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 1096, 300, 301, 302, 303, + 304, 305, 306, 1097, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 1098, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 1099, + 363, 364, 365, 601, 367, 368, 1100, 370, 371, 372, + 373, 374, 375, 1101, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 1102, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, + 432, 1107, 1108, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 2630, 448, 1110, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 1111, + 607, 1112, 464, 465, 466, 0, 467, 608, 469, 1113, + 0, 0, 0, 0, 0, 0, 0, 0, 1114, 1115, + 0, 0, 996, 0, 1116, 0, 0, 997, 998, 1117, + 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, 1000, + 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 0, 0, 0, 0, 0, 0, 0, 1012, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1013, 1014, 1015, 1016, + 0, 0, 0, 0, 0, 0, 0, 1017, 1018, 0, + 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, 0, + 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, + 1028, 0, 0, 0, 0, 0, 0, 0, 1029, 0, + 0, 1030, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 1031, + 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, 0, + 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, + 1038, 0, 0, 571, 0, 0, 0, 0, 0, 1039, + 0, 0, 1040, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1044, + 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, 0, + 0, 1048, 0, 0, 29, 1049, 0, 1050, 1051, 1052, + 1053, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 1054, 1055, + 1056, 0, 1057, 0, 0, 0, 0, 0, 0, 1058, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1059, 0, 0, 0, 0, 0, 0, 0, 1060, 1061, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1062, 0, 0, + 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1067, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1068, + 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, + 61, 62, 63, 1077, 65, 66, 67, 68, 69, 70, + 1078, 72, 73, 74, 75, 76, 77, 78, 1079, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 1080, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 1081, 108, + 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 1085, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 1086, + 1087, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 1088, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 1089, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 1090, + 1091, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 1092, 264, 265, 266, 267, + 268, 1093, 270, 271, 272, 273, 274, 275, 276, 277, + 1094, 1095, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 1096, 300, 301, 302, 303, 304, + 305, 306, 1097, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 1098, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 1099, 363, + 364, 365, 601, 367, 368, 1100, 370, 371, 372, 373, + 374, 375, 1101, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 1102, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, + 1107, 1108, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 2630, 448, 1110, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 1111, 607, + 1112, 464, 465, 466, 0, 467, 608, 469, 1113, 0, + 0, 0, 0, 0, 0, 0, 0, 1114, 1115, 0, + 0, 996, 0, 1116, 0, 0, 997, 998, 1117, 0, + 0, 0, 1118, 1119, 0, 0, 1120, 999, 1000, 0, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 0, 0, 0, 0, 0, 0, 0, 1012, 0, + 0, 0, 0, 0, 0, 2851, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1013, 1014, 1015, 1016, 0, + 0, 0, 0, 0, 0, 0, 1017, 1018, 0, 1019, + 0, 0, 0, 0, 0, 0, 1020, 1021, 0, 0, + 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, 1028, + 0, 0, 0, 0, 0, 0, 0, 1029, 0, 0, + 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 1031, 1032, + 1033, 0, 1034, 0, 0, 0, 0, 0, 0, 0, + 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, 1038, + 0, 0, 571, 0, 0, 0, 0, 0, 1039, 0, + 0, 1040, 0, 0, 0, 0, 0, 0, 0, 0, + 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1044, 1045, + 0, 1046, 0, 0, 0, 1047, 0, 0, 0, 0, + 1048, 0, 0, 29, 0, 0, 1050, 1051, 1052, 1053, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 1054, 1055, 1056, + 0, 1057, 0, 0, 0, 0, 0, 0, 1058, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1059, + 0, 0, 0, 0, 0, 0, 0, 1060, 1061, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1062, 0, 0, 0, + 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1068, 1069, + 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, 61, + 62, 63, 1077, 65, 66, 67, 68, 69, 2852, 1078, + 72, 73, 74, 75, 76, 77, 78, 1079, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 1080, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 1081, 108, 1082, + 1083, 1084, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 1085, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 1086, 1087, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 1088, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 1089, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 1090, 1091, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 1092, 264, 265, 266, 267, 268, + 1093, 270, 271, 272, 273, 274, 275, 276, 277, 1094, + 1095, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 1096, 300, 301, 302, 303, 304, 305, + 306, 1097, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 1098, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 1099, 363, 364, + 365, 601, 367, 368, 1100, 370, 371, 372, 373, 374, + 375, 1101, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 1102, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, 1107, + 1108, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 1109, 448, 1110, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 1111, 607, 1112, + 464, 465, 466, 0, 467, 608, 469, 1113, 0, 0, + 0, 0, 0, 0, 0, 0, 1114, 1115, 0, 0, + 996, 0, 1116, 0, 0, 997, 998, 1117, 0, 0, + 0, 1118, 1119, 0, 0, 1120, 999, 1000, 0, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1013, 1014, 1015, 1016, 0, 0, + 0, 0, 0, 0, 0, 1017, 1018, 0, 1019, 0, + 0, 0, 0, 0, 0, 1020, 1021, 0, 0, 1022, + 1023, 1024, 1025, 0, 1026, 13, 0, 1027, 1028, 0, + 0, 0, 0, 0, 0, 0, 1029, 0, 0, 1030, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 1031, 1032, 1033, + 0, 1034, 0, 0, 0, 0, 0, 0, 0, 1035, + 1036, 1037, 22, 0, 0, 0, 0, 0, 1038, 0, + 0, 571, 0, 0, 0, 0, 0, 1039, 0, 0, + 4087, 0, 0, 0, 0, 0, 0, 0, 0, 1041, + 0, 1042, 0, 1043, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1044, 1045, 0, + 1046, 0, 0, 0, 1047, 0, 0, 0, 0, 1048, + 0, 0, 29, 1049, 0, 1050, 1051, 1052, 1053, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 1054, 1055, 1056, 0, + 1057, 0, 0, 0, 0, 0, 0, 1058, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1059, 0, + 0, 0, 0, 0, 0, 0, 1060, 1061, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1062, 0, 0, 0, 0, + 0, 0, 1063, 1064, 0, 1065, 1066, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1067, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1068, 1069, 1070, + 0, 0, 0, 0, 0, 1071, 1072, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 1073, 1074, 1075, 1076, 61, 62, + 63, 1077, 65, 66, 67, 68, 69, 70, 1078, 72, + 73, 74, 75, 76, 77, 78, 1079, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 1080, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 1081, 108, 1082, 1083, + 1084, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 1085, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 1086, 1087, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 1088, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 1089, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 1090, 1091, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 1092, 264, 265, 266, 267, 268, 1093, + 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 1096, 300, 301, 302, 303, 304, 305, 306, + 1097, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 1098, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 1099, 363, 364, 365, + 601, 367, 368, 1100, 370, 371, 372, 373, 374, 375, + 1101, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 1102, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 1103, 1104, 1105, 1106, 429, 430, 431, 432, 1107, 1108, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 1109, 448, 1110, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 1111, 607, 1112, 464, + 465, 466, 0, 467, 608, 469, 1113, 0, 0, 0, + 0, 0, 0, 0, 0, 1114, 1115, 0, 0, 996, + 0, 1116, 0, 0, 997, 998, 1117, 0, 0, 0, + 1118, 1119, 0, 0, 1120, 999, 1000, 0, 1001, 1002, + 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, + 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1013, 1014, 1015, 1016, 0, 0, 0, + 0, 0, 0, 0, 1017, 1018, 0, 1019, 0, 0, + 0, 0, 0, 0, 1020, 1021, 0, 0, 1022, 1023, + 1024, 1025, 0, 1026, 13, 0, 1027, 1028, 0, 0, + 0, 0, 0, 0, 0, 1029, 0, 0, 1030, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 1031, 1032, 1033, 0, + 1034, 0, 0, 0, 0, 0, 0, 0, 1035, 1036, + 1037, 22, 0, 0, 0, 0, 0, 1038, 0, 0, + 571, 0, 0, 0, 0, 0, 1039, 0, 0, 4102, + 0, 0, 0, 0, 0, 0, 0, 0, 1041, 0, + 1042, 0, 1043, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1044, 1045, 0, 1046, + 0, 0, 0, 1047, 0, 0, 0, 0, 1048, 0, + 0, 29, 1049, 0, 1050, 1051, 1052, 1053, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 1054, 1055, 1056, 0, 1057, + 0, 0, 0, 0, 0, 0, 1058, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1059, 0, 0, + 0, 0, 0, 0, 0, 1060, 1061, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1062, 0, 0, 0, 0, 0, + 0, 1063, 1064, 0, 1065, 1066, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1067, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1068, 1069, 1070, 0, + 0, 0, 0, 0, 1071, 1072, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 1073, 1074, 1075, 1076, 61, 62, 63, + 1077, 65, 66, 67, 68, 69, 70, 1078, 72, 73, + 74, 75, 76, 77, 78, 1079, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 1080, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 1081, 108, 1082, 1083, 1084, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 1085, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 1086, 1087, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 1088, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 1089, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 1090, 1091, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 1092, 264, 265, 266, 267, 268, 1093, 270, + 271, 272, 273, 274, 275, 276, 277, 1094, 1095, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 1096, 300, 301, 302, 303, 304, 305, 306, 1097, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 1098, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 1099, 363, 364, 365, 601, + 367, 368, 1100, 370, 371, 372, 373, 374, 375, 1101, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 1102, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 1103, + 1104, 1105, 1106, 429, 430, 431, 432, 1107, 1108, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 1109, 448, 1110, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 1111, 607, 1112, 464, 465, + 466, 0, 467, 608, 469, 1113, 0, 0, 0, 0, + 0, 0, 0, 0, 1114, 1115, 0, 0, 996, 0, + 1116, 0, 0, 997, 998, 1117, 0, 0, 0, 1118, + 1119, 0, 0, 1120, 999, 1000, 0, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, + 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1013, 1014, 1015, 1016, 0, 0, 0, 0, + 0, 0, 0, 1017, 1018, 0, 1019, 0, 0, 0, + 0, 0, 0, 1020, 1021, 0, 0, 1022, 1023, 1024, + 1025, 0, 1026, 13, 0, 1027, 1028, 0, 0, 0, + 0, 0, 0, 0, 1029, 0, 0, 1030, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 1031, 1032, 1033, 0, 1034, + 0, 0, 0, 0, 0, 0, 0, 1035, 1036, 1037, + 22, 0, 0, 0, 0, 0, 1038, 0, 0, 571, + 0, 0, 0, 0, 0, 1039, 0, 0, 1040, 0, + 0, 0, 0, 0, 0, 0, 0, 1041, 0, 1042, + 0, 1043, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1044, 1045, 6226, 1046, 0, + 0, 0, 1047, 0, 0, 0, 0, 1048, 0, 0, + 29, 0, 0, 1050, 1051, 1052, 1053, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 1054, 1055, 1056, 0, 1057, 0, + 0, 0, 0, 0, 0, 1058, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1059, 0, 0, 0, + 0, 0, 0, 0, 1060, 1061, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1062, 0, 0, 0, 0, 0, 0, + 1063, 1064, 0, 1065, 1066, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1067, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1068, 1069, 1070, 0, 0, + 0, 0, 0, 1071, 1072, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 1073, 1074, 1075, 1076, 61, 62, 63, 1077, + 65, 66, 67, 68, 69, 70, 1078, 72, 73, 74, + 75, 76, 77, 78, 1079, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 1080, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 1081, 108, 1082, 1083, 1084, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 1085, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 1086, 1087, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 1088, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 1089, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 1090, 1091, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 1092, 264, 265, 266, 267, 268, 1093, 270, 271, + 272, 273, 274, 275, 276, 277, 1094, 1095, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 1096, 300, 301, 302, 303, 304, 305, 306, 1097, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 1098, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 1099, 363, 364, 365, 601, 367, + 368, 1100, 370, 371, 372, 373, 374, 375, 1101, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 1102, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 1103, 1104, + 1105, 1106, 429, 430, 431, 432, 1107, 1108, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 1109, 448, 1110, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 1111, 607, 1112, 464, 465, 466, + 0, 467, 608, 469, 1113, 0, 0, 0, 0, 0, + 0, 0, 0, 1114, 1115, 0, 0, 996, 0, 1116, + 0, 0, 997, 998, 1117, 0, 0, 0, 1118, 1119, + 0, 0, 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, 0, + 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1013, 1014, 1015, 1016, 0, 0, 0, 0, 0, + 0, 0, 1017, 1018, 0, 1019, 0, 0, 0, 0, + 0, 0, 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, + 0, 1026, 13, 0, 1027, 1028, 0, 0, 0, 0, + 0, 0, 0, 1029, 0, 0, 1030, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 1031, 1032, 1033, 0, 1034, 0, + 0, 0, 0, 0, 0, 0, 1035, 1036, 1037, 22, + 0, 0, 0, 0, 0, 1038, 0, 0, 571, 0, + 0, 0, 0, 0, 1039, 0, 0, 1948, 0, 0, + 0, 0, 0, 0, 0, 0, 1041, 0, 1042, 0, + 1043, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1044, 1045, 0, 1046, 0, 0, + 0, 1047, 0, 0, 0, 0, 1048, 0, 0, 29, + 0, 0, 1050, 1051, 1052, 1053, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 1054, 1055, 1056, 0, 1057, 0, 0, + 0, 0, 0, 0, 1058, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1059, 0, 0, 0, 0, + 0, 0, 0, 1060, 1061, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1062, 0, 0, 0, 0, 0, 0, 1063, + 1064, 0, 1065, 1066, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1067, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1068, 1069, 1070, 0, 0, 0, + 0, 0, 1071, 1072, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 1073, 1074, 1075, 1076, 61, 62, 63, 1077, 65, + 66, 67, 68, 69, 70, 1078, 72, 73, 74, 75, + 76, 77, 78, 1079, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 1080, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 1081, 108, 1082, 1083, 1084, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 1085, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 1086, 1087, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 1088, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 1089, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 1090, 1091, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 1092, 264, 265, 266, 267, 268, 1093, 270, 271, 272, + 273, 274, 275, 276, 277, 1094, 1095, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 1096, + 300, 301, 302, 303, 304, 305, 306, 1097, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 1098, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 1099, 363, 364, 365, 601, 367, 368, + 1100, 370, 371, 372, 373, 374, 375, 1101, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 1102, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 1103, 1104, 1105, + 1106, 429, 430, 431, 432, 1107, 1108, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 1109, + 448, 1110, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 1111, 607, 1112, 464, 465, 466, 0, + 467, 608, 469, 1113, 0, 0, 0, 0, 0, 0, + 0, 0, 1949, 1950, 0, 0, 996, 0, 1116, 0, + 0, 997, 998, 1117, 0, 0, 0, 1118, 1119, 0, + 0, 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, 0, 0, + 0, 0, 0, 1012, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1013, 1014, 1015, 1016, 0, 0, 0, 0, 0, 0, + 0, 1017, 1018, 0, 1019, 0, 0, 0, 0, 0, + 0, 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, 0, + 1026, 13, 0, 1027, 1028, 0, 0, 0, 0, 0, + 0, 0, 1029, 0, 0, 1030, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 1031, 1032, 1033, 0, 1034, 0, 0, + 0, 0, 0, 0, 0, 1035, 1036, 1037, 22, 0, + 0, 0, 0, 0, 1038, 0, 0, 571, 0, 0, + 0, 0, 0, 1039, 0, 0, 2062, 0, 0, 0, + 0, 0, 0, 0, 0, 1041, 0, 1042, 0, 1043, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1044, 1045, 0, 1046, 0, 0, 0, + 1047, 0, 0, 0, 0, 1048, 0, 0, 29, 0, + 0, 1050, 1051, 1052, 1053, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 1054, 1055, 1056, 0, 1057, 0, 0, 0, + 0, 0, 0, 1058, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1059, 0, 0, 0, 0, 0, + 0, 0, 1060, 1061, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1062, 0, 0, 0, 0, 0, 0, 1063, 1064, + 0, 1065, 1066, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1067, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1068, 1069, 1070, 0, 0, 0, 0, + 0, 1071, 1072, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 1073, 1074, 1075, 1076, 61, 62, 63, 1077, 65, 66, + 67, 68, 69, 70, 1078, 72, 73, 74, 75, 76, + 77, 78, 1079, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 1080, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 1081, 108, 1082, 1083, 1084, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 1085, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 1086, 1087, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 1088, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 1089, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 1090, 1091, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 1092, + 264, 265, 266, 267, 268, 1093, 270, 271, 272, 273, + 274, 275, 276, 277, 1094, 1095, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 1096, 300, + 301, 302, 303, 304, 305, 306, 1097, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 1098, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 1099, 363, 364, 365, 601, 367, 368, 1100, + 370, 371, 372, 373, 374, 375, 1101, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 1102, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 1103, 1104, 1105, 1106, + 429, 430, 431, 432, 1107, 1108, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 1109, 448, + 1110, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 1111, 607, 1112, 464, 465, 466, 0, 467, + 608, 469, 1113, 0, 0, 0, 0, 0, 0, 0, + 0, 1949, 1950, 0, 0, 996, 0, 1116, 0, 0, + 997, 998, 1117, 0, 0, 0, 1118, 1119, 0, 0, + 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, + 1007, 1008, 1009, 1010, 1011, 0, 0, 0, 0, 0, + 0, 0, 1012, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1013, + 1014, 1015, 1016, 0, 0, 0, 0, 0, 0, 0, + 1017, 1018, 0, 1019, 0, 0, 0, 0, 0, 0, + 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, 0, 1026, + 13, 0, 1027, 1028, 0, 0, 0, 0, 0, 0, + 0, 1029, 0, 0, 1030, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 1031, 1032, 1033, 0, 1034, 0, 0, 0, + 0, 0, 0, 0, 1035, 1036, 1037, 22, 0, 0, + 0, 0, 0, 1038, 0, 0, 571, 0, 0, 0, + 0, 0, 1039, 0, 0, 2064, 0, 0, 0, 0, + 0, 0, 0, 0, 1041, 0, 1042, 0, 1043, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1044, 1045, 0, 1046, 0, 0, 0, 1047, + 0, 0, 0, 0, 1048, 0, 0, 29, 0, 0, + 1050, 1051, 1052, 1053, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 1054, 1055, 1056, 0, 1057, 0, 0, 0, 0, + 0, 0, 1058, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1059, 0, 0, 0, 0, 0, 0, + 0, 1060, 1061, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1062, 0, 0, 0, 0, 0, 0, 1063, 1064, 0, + 1065, 1066, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1067, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1068, 1069, 1070, 0, 0, 0, 0, 0, + 1071, 1072, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 1073, + 1074, 1075, 1076, 61, 62, 63, 1077, 65, 66, 67, + 68, 69, 70, 1078, 72, 73, 74, 75, 76, 77, + 78, 1079, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 1080, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 1081, 108, 1082, 1083, 1084, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 1085, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 1086, 1087, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 1088, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 1089, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 1090, 1091, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 1092, 264, + 265, 266, 267, 268, 1093, 270, 271, 272, 273, 274, + 275, 276, 277, 1094, 1095, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 1096, 300, 301, + 302, 303, 304, 305, 306, 1097, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 1098, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 1099, 363, 364, 365, 601, 367, 368, 1100, 370, + 371, 372, 373, 374, 375, 1101, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 1102, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 1103, 1104, 1105, 1106, 429, + 430, 431, 432, 1107, 1108, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 1109, 448, 1110, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 1111, 607, 1112, 464, 465, 466, 0, 467, 608, + 469, 1113, 0, 0, 0, 0, 0, 0, 0, 0, + 1949, 1950, 0, 0, 996, 0, 1116, 0, 0, 997, + 998, 1117, 0, 0, 0, 1118, 1119, 0, 0, 1120, + 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 0, 0, 0, 0, 0, 0, + 0, 1012, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1013, 1014, + 1015, 1016, 0, 0, 0, 0, 0, 0, 0, 1017, + 1018, 0, 1019, 0, 0, 0, 0, 0, 0, 1020, + 1021, 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, + 0, 1027, 1028, 0, 0, 0, 0, 0, 0, 0, + 1029, 0, 0, 1030, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, + 0, 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, + 0, 0, 1038, 0, 0, 571, 0, 0, 0, 0, + 0, 1039, 0, 0, 1040, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 1042, 0, 1043, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, + 0, 0, 0, 1048, 0, 0, 29, 0, 0, 1050, + 1051, 1052, 1053, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 1054, 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, + 0, 1058, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1059, 0, 0, 0, 0, 0, 0, 0, + 1060, 1061, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1062, + 0, 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, + 1066, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1067, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1068, 1069, 1070, 0, 0, 0, 0, 0, 1071, + 1072, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 1073, 1074, + 1075, 1076, 61, 62, 63, 1077, 65, 66, 67, 68, + 69, 70, 1078, 72, 73, 74, 75, 76, 77, 78, + 1079, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 1080, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 1081, 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 1085, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 1086, 1087, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 1088, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 1089, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 1090, 1091, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 1092, 264, 265, + 266, 267, 268, 1093, 270, 271, 272, 273, 274, 275, + 276, 277, 1094, 1095, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 1096, 300, 301, 302, + 303, 304, 305, 306, 1097, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 1098, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 1099, 363, 364, 365, 601, 367, 368, 1100, 370, 371, + 372, 373, 374, 375, 1101, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 1102, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, + 431, 432, 1107, 1108, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 1109, 448, 1110, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 1111, 607, 1112, 464, 465, 466, 0, 467, 608, 469, + 1113, 0, 0, 0, 0, 0, 0, 0, 0, 1114, + 1115, 0, 0, 996, 0, 1116, 0, 0, 997, 998, + 1117, 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, + 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 0, 0, 0, 0, 0, 0, 0, + 1012, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 1015, + 1016, 0, 0, 0, 0, 0, 0, 0, 1017, 1018, + 0, 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, + 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, + 1027, 1028, 0, 0, 0, 0, 0, 0, 0, 1029, + 0, 0, 1030, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, + 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, + 0, 1038, 0, 0, 571, 0, 0, 0, 0, 0, + 1039, 0, 0, 2872, 0, 0, 0, 0, 0, 0, + 0, 0, 1041, 0, 1042, 0, 1043, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, + 0, 0, 1048, 0, 0, 29, 0, 0, 1050, 1051, + 1052, 1053, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 1054, + 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, 0, + 1058, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1059, 0, 0, 0, 0, 0, 0, 0, 1060, + 1061, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1062, 0, + 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1067, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1068, 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, + 1076, 61, 62, 63, 1077, 65, 66, 67, 68, 69, + 70, 1078, 72, 73, 74, 75, 76, 77, 78, 1079, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 1080, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 1081, + 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 1085, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 1086, 1087, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 1088, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 1089, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 1090, 1091, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 1092, 264, 265, 266, + 267, 268, 1093, 270, 271, 272, 273, 274, 275, 276, + 277, 1094, 1095, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 1096, 300, 301, 302, 303, + 304, 305, 306, 1097, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 1098, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 1099, + 363, 364, 365, 601, 367, 368, 1100, 370, 371, 372, + 373, 374, 375, 1101, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 1102, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, + 432, 1107, 1108, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 1109, 448, 1110, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 1111, + 607, 1112, 464, 465, 466, 0, 467, 608, 469, 1113, + 0, 0, 0, 0, 0, 0, 0, 0, 1114, 1115, + 0, 0, 996, 0, 1116, 0, 0, 997, 998, 1117, + 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, 1000, + 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 0, 0, 0, 0, 0, 0, 0, 1012, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1013, 1014, 1015, 1016, + 0, 0, 0, 0, 0, 0, 0, 1017, 1018, 0, + 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, 0, + 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, + 1028, 0, 0, 0, 0, 0, 0, 0, 1029, 0, + 0, 1030, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 1031, + 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, 0, + 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, + 1038, 0, 0, 571, 0, 0, 0, 0, 0, 1039, + 0, 0, 2874, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1044, + 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, 0, + 0, 1048, 0, 0, 29, 0, 0, 1050, 1051, 1052, + 1053, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 1054, 1055, + 1056, 0, 1057, 0, 0, 0, 0, 0, 0, 1058, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1059, 0, 0, 0, 0, 0, 0, 0, 1060, 1061, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1062, 0, 0, + 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1067, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1068, + 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, + 61, 62, 63, 1077, 65, 66, 67, 68, 69, 70, + 1078, 72, 73, 74, 75, 76, 77, 78, 1079, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 1080, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 1081, 108, + 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 1085, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 1086, + 1087, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 1088, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 1089, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 1090, + 1091, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 1092, 264, 265, 266, 267, + 268, 1093, 270, 271, 272, 273, 274, 275, 276, 277, + 1094, 1095, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 1096, 300, 301, 302, 303, 304, + 305, 306, 1097, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 1098, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 1099, 363, + 364, 365, 601, 367, 368, 1100, 370, 371, 372, 373, + 374, 375, 1101, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 1102, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, + 1107, 1108, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 1109, 448, 1110, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 1111, 607, + 1112, 464, 465, 466, 0, 467, 608, 469, 1113, 0, + 0, 0, 0, 0, 0, 0, 0, 1114, 1115, 0, + 0, 996, 0, 1116, 0, 0, 997, 998, 1117, 0, + 0, 0, 1118, 1119, 0, 0, 1120, 6088, 6089, 0, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1014, 1015, 1016, 0, + 0, 0, 0, 0, 0, 0, 1017, 1018, 0, 1019, + 0, 0, 0, 0, 0, 0, 1020, 1021, 0, 0, + 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, 1028, + 0, 0, 0, 0, 0, 0, 0, 1029, 0, 0, + 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 1031, 1032, + 1033, 0, 1034, 0, 0, 0, 0, 0, 0, 0, + 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, 1038, + 0, 0, 571, 0, 0, 0, 0, 0, 1039, 0, + 0, 1948, 0, 0, 0, 0, 0, 0, 0, 0, + 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1044, 1045, + 0, 1046, 0, 0, 0, 1047, 0, 0, 0, 0, + 1048, 0, 0, 29, 0, 0, 1050, 1051, 1052, 1053, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 1054, 1055, 1056, + 0, 1057, 0, 0, 0, 0, 0, 0, 1058, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1059, + 0, 0, 0, 0, 0, 0, 0, 1060, 1061, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1062, 0, 0, 0, + 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1068, 1069, + 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, 61, + 62, 63, 1077, 65, 66, 67, 68, 69, 70, 1078, + 72, 73, 74, 75, 76, 77, 78, 1079, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 1080, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 1081, 108, 1082, + 1083, 1084, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 1085, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 1086, 1087, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 1088, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 1089, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 1090, 1091, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 1092, 264, 265, 266, 267, 268, + 1093, 270, 271, 272, 273, 274, 275, 276, 277, 1094, + 1095, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 1096, 300, 301, 302, 303, 304, 305, + 306, 1097, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 1098, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 1099, 363, 364, + 365, 601, 367, 368, 1100, 370, 371, 372, 373, 374, + 375, 1101, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 1102, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, 1107, + 1108, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 1109, 448, 1110, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 1111, 607, 1112, + 464, 465, 466, 0, 467, 608, 469, 1113, 0, 0, + 0, 0, 0, 0, 0, 0, 6090, 6091, 0, 0, + 996, 0, 0, 0, 0, 1986, 0, 6092, 0, 0, + 0, 0, 1119, 0, 0, 1120, 1941, 1942, 0, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 1033, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 1053, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1067, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 2908, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 2909, 426, 427, 2910, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 6384, 467, 608, 469, 470, 2828, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 6384, 467, 608, 469, 470, 2828, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 0, 0, 0, 0, 0, 0, 0, 6385, + 0, 0, 0, 0, 0, 0, 2829, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 1986, 467, 608, 469, + 470, 0, 0, 0, 0, 0, 0, 1941, 1942, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2829, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 1986, 467, 608, 469, 470, 0, 0, + 0, 0, 0, 0, 1941, 1942, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1987, 0, 0, + 0, 0, 0, 0, 0, 1120, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 2828, 467, 608, 469, 470, 0, 0, 0, 0, 0, + 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 1, 0, 2, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2829, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 9, 0, 10, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 15, 0, + 16, 17, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 33, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 37, 38, 39, 0, + 40, 0, 0, 0, 0, 41, 0, 0, 0, 0, + 0, 42, 0, 0, 0, 43, 44, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 46, 0, 47, 0, 48, 0, 0, 0, 0, + 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, + 50, 51, 0, 0, 0, 52, 53, 54, 0, 55, + 56, 57, 58, 59, 0, 60, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 0, 96, 97, 98, 99, 100, 101, + 102, 0, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 0, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 0, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 0, 179, 0, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 0, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 0, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 0, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 0, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 0, 467, 468, 469, 470, 1, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 5, 0, 0, 0, 471, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, + 9, 0, 10, 0, 11, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 0, 0, 15, 0, 16, 17, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 26, 0, 27, 0, 0, 0, 28, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 30, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 35, + 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 37, 38, 39, 0, 40, 0, 0, 0, 0, + 41, 0, 0, 0, 0, 0, 42, 0, 0, 0, + 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46, 0, 47, 0, + 48, 0, 0, 0, 0, 0, 0, 49, 0, 0, + 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, + 52, 53, 54, 0, 55, 56, 57, 58, 59, 0, + 60, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 0, 96, + 97, 98, 99, 100, 101, 102, 0, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 0, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 0, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 0, + 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 0, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 0, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 0, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 0, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 0, 467, 468, + 469, 470, 1, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, + 0, 471, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 10, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 16, 17, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 33, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 37, 38, 0, 0, + 40, 0, 0, 0, 0, 41, 0, 0, 0, 0, + 0, 42, 0, 0, 0, 43, 44, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 46, 0, 47, 0, 48, 0, 0, 0, 0, + 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, + 0, 51, 0, 0, 0, 52, 53, 54, 0, 55, + 56, 57, 58, 59, 0, 60, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 0, 0, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 0, 96, 97, 98, 99, 100, 101, + 102, 0, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 0, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 0, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 0, 179, 0, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 0, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 0, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 0, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 0, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 0, 467, 468, 469, 470, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 471, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5068, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 3706, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3707, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 764, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 5069, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5070, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1385, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1386, 0, + 0, 0, 0, 0, 0, 0, 793, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1384, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1385, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1386, + 0, 0, 0, 0, 1387, 0, 0, 793, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1385, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1386, 0, 0, 0, 0, 1387, 0, 0, 793, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1385, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 4, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1386, 0, 0, 0, 0, 0, 0, 0, 793, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 607, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 3359, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 793, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5235, 0, 0, 0, 0, 0, 0, + 0, 5070, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 5496, 0, 0, 571, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 4, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5070, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 790, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 791, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 792, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 793, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 793, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 715, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5070, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1464, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 0, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2057, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 1209, 467, 608, 469, 470, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 5, 0, 0, 0, 0, 0, 0, 2883, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1210, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1211, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 1212, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 1213, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 1214, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 1215, 184, 185, 186, 589, + 1216, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 1217, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 1218, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 1219, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 1220, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 1221, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 1222, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 1223, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 1224, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 1225, 463, 464, 465, 466, 1209, 467, 608, + 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1210, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1211, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 1212, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 1213, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 1214, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 1215, 184, 185, + 186, 589, 1216, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 1217, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 1218, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 1219, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 1220, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 1221, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 1222, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 1225, 463, 464, 465, 466, 2136, + 467, 608, 469, 470, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 5, 813, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 715, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 2380, 467, 608, 469, 470, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 5, 813, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 715, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 2670, 467, 608, 469, 470, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 5, 813, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 715, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 2287, 467, 608, 469, 470, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1941, 1942, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2288, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 2287, 467, 608, + 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1941, 1942, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 2394, 998, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1941, 1942, 0, 0, 0, + 0, 0, 0, 0, 2395, 0, 2396, 0, 2397, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2398, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 2394, 998, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1941, 1942, 0, + 0, 0, 0, 0, 0, 0, 2395, 0, 2396, 0, + 2397, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3163, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 3164, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 2394, 998, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1941, + 1942, 0, 0, 0, 0, 0, 0, 0, 2395, 0, + 2396, 0, 2397, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4464, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 2394, 998, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1941, 1942, 0, 0, 0, 0, 0, 0, 0, + 2395, 0, 2396, 0, 2397, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 1941, 1942, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 0, 2889, 2890, 2891, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 607, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 4631, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 3340, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 1941, 1942, 0, 0, 0, + 0, 0, 0, 0, 0, 4480, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 5323, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 5609, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 0, 0, 0, 0, 0, 3322, 0, 0, 5914, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 709, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 710, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 3957, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3958, 0, 680, 0, 3959, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 813, 0, 0, 0, 0, 0, 0, 3323, 0, + 0, 715, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1453, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2141, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2142, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 813, 1454, 0, 0, 0, 0, 0, 0, + 0, 0, 715, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1453, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 0, 1454, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1501, 1502, 1503, + 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, + 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, + 1524, 1525, 1526, 1527, 1528, 1529, 0, 1530, 1531, 1532, + 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 0, 1541, + 13, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, + 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, + 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 19, 1569, + 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 0, + 1579, 1580, 1581, 1582, 1583, 0, 0, 22, 1584, 1585, + 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, + 0, 1596, 1597, 0, 1598, 1599, 1600, 1601, 1602, 1603, + 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, + 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, + 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, + 1634, 1635, 1636, 1637, 1638, 1639, 1640, 29, 1641, 1642, + 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 31, + 1652, 1653, 1654, 1655, 0, 1656, 1657, 1658, 1659, 1660, + 34, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, + 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, + 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, + 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, + 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, + 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, + 1720, 0, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, + 1729, 1730, 1731, 1732, 1733, 1734, 1735, 0, 1736, 1737, + 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, + 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, + 52, 53, 54, 0, 55, 56, 57, 58, 59, 0, + 1758, 1759, 1760, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 1761, 85, 1762, 1763, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 0, 1764, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 1765, 1766, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 1767, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 1768, 586, 587, + 179, 0, 180, 181, 182, 0, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 1769, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 0, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 1770, 1771, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 0, 1772, 1773, 292, 1774, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 0, 1775, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 1776, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 0, 374, 375, 376, 377, 602, 0, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 1777, 423, 424, 1778, 426, 427, 1779, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 0, 1780, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 1781, 463, 464, 465, 466, 0, 467, 608, + 469, 1782, 4, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1501, 1502, + 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, + 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, + 1523, 1524, 1525, 1526, 1527, 1528, 1529, 0, 1530, 1531, + 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 0, + 1541, 13, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, + 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, + 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 19, + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + 0, 1579, 1580, 1581, 1582, 1583, 0, 0, 22, 1584, + 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, + 1595, 0, 1596, 1597, 0, 1598, 1599, 1600, 1601, 1602, + 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, + 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, + 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 29, 1641, + 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, + 31, 1652, 1653, 1654, 1655, 0, 1656, 1657, 1658, 1659, + 1660, 34, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, + 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, + 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, + 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, + 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, + 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, + 1719, 1720, 0, 1721, 1722, 1723, 1724, 1725, 1726, 1727, + 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 0, 1736, + 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, + 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, + 1757, 52, 53, 54, 0, 55, 56, 57, 58, 59, + 0, 1758, 1759, 1760, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 1761, 85, 1762, + 1763, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 0, 1764, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 1765, 1766, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 1767, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 1768, 586, + 587, 179, 0, 180, 181, 182, 0, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 1769, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 0, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 1770, 1771, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 0, 1772, 1773, 292, + 1774, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 0, 1775, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 4446, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 0, 374, 375, 376, 377, 602, 0, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 1777, 423, 424, 1778, 426, 427, 1779, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 0, 1780, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 1781, 463, 464, 465, 466, 0, 467, + 608, 469, 1782, 4, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, + 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 0, 1530, + 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, + 0, 1541, 13, 1542, 1543, 1544, 1545, 1546, 1547, 1548, + 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, + 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 19, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, + 1578, 0, 1579, 1580, 1581, 1582, 1583, 0, 0, 22, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, + 1594, 1595, 0, 1596, 1597, 0, 1598, 1599, 1600, 1601, + 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, + 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, + 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, + 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 29, + 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, + 1651, 31, 1652, 1653, 1654, 1655, 0, 1656, 1657, 1658, + 1659, 1660, 34, 1661, 1662, 1663, 1664, 1665, 1666, 1667, + 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, + 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, + 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, + 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, + 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, + 1718, 1719, 1720, 0, 1721, 1722, 1723, 1724, 1725, 1726, + 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 0, + 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, + 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, + 1756, 1757, 52, 53, 54, 0, 55, 56, 57, 58, + 59, 0, 1758, 1759, 1760, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 1761, 85, + 1762, 1763, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 0, 1764, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 1765, 1766, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 1767, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 1768, + 586, 587, 179, 0, 180, 181, 182, 0, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 1769, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 0, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 1770, 1771, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 0, 1772, 1773, + 292, 1774, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, + 1775, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 0, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 5640, 374, 375, 376, 377, 602, + 0, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 1777, 423, 424, 1778, 426, 427, + 1779, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 0, 1780, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 1781, 463, 464, 465, 466, 0, + 467, 608, 469, 1782, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, + 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, + 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 0, + 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, + 1540, 0, 1541, 13, 1542, 1543, 1544, 1545, 1546, 1547, + 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, + 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, + 1568, 19, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, + 1577, 1578, 0, 1579, 1580, 1581, 1582, 1583, 0, 0, + 22, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 3941, + 1593, 1594, 1595, 0, 1596, 1597, 0, 1598, 1599, 1600, + 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, + 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, + 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, + 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, + 29, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, + 1650, 1651, 31, 1652, 1653, 1654, 1655, 0, 1656, 1657, + 1658, 1659, 1660, 34, 1661, 1662, 1663, 1664, 1665, 1666, + 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, + 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, + 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, + 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, + 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, + 1717, 1718, 1719, 1720, 0, 1721, 1722, 1723, 1724, 1725, + 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, + 0, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, + 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, + 1755, 1756, 1757, 52, 53, 54, 0, 55, 56, 57, + 58, 59, 0, 1758, 1759, 1760, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 1761, + 85, 1762, 1763, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 0, 1764, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 1765, 1766, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 1767, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 1768, 586, 587, 179, 0, 180, 181, 182, 0, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 1769, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 0, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 1770, 1771, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 0, 1772, + 1773, 292, 1774, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 0, 1775, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 0, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 0, 374, 375, 376, 377, + 602, 0, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 1777, 423, 424, 1778, 426, + 427, 1779, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 0, 1780, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 0, 463, 464, 465, 466, + 0, 467, 608, 469, 1782, 4, 5, 813, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 715, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 904, 905, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 906, 0, 0, 0, + 907, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 908, 0, 0, + 0, 0, 0, 0, 0, 0, 909, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 910, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 911, 0, 0, 0, 0, 912, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 913, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 914, 0, + 0, 0, 915, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 916, 0, 0, 0, 917, 918, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 919, 0, 0, 0, 0, + 0, 0, 920, 921, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 922, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 923, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 924, 161, 162, 163, 164, 925, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 926, 927, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 928, 321, 322, 323, 929, 325, 326, + 327, 328, 329, 930, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 931, 342, 343, 598, 345, 346, + 932, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 933, 379, 380, 381, 934, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 935, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 813, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 715, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1187, 905, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 906, 0, 0, + 0, 907, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 908, 0, + 0, 0, 0, 0, 0, 0, 0, 909, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 910, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 911, 0, 0, 0, 0, 912, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 913, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 914, + 0, 0, 0, 915, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 916, 0, 0, 0, 917, 918, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 919, 0, 0, 0, + 0, 0, 0, 920, 921, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 1188, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 922, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 923, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 924, 161, 162, 163, 164, 925, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 926, + 927, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 928, 321, 322, 323, 1189, 325, + 326, 327, 328, 329, 930, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 931, 342, 343, 598, 345, + 346, 932, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 933, 379, 380, 381, 934, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 935, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 0, + 0, 0, 2692, 2693, 5422, 0, 5423, 0, 5424, 715, + 5425, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5426, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 715, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 907, 1464, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 813, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 715, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2156, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2157, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 0, 0, 1346, 0, 0, 1347, 1348, 0, + 0, 0, 1349, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 813, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 715, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2141, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2142, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 4, 5, 813, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 715, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1464, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 607, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 813, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 715, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2192, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 813, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 715, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 907, + 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 1941, 1942, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 2889, 2890, 2891, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 813, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 715, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3276, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 813, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 715, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2141, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 715, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3628, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 813, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 715, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3933, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 679, + 0, 0, 0, 0, 0, 0, 0, 0, 680, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 813, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 715, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 4, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 849, + 850, 0, 0, 0, 0, 0, 0, 0, 0, 851, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 852, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 0, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 0, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 0, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 853, 854, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 183, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 855, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1911, 0, 0, 0, 0, 0, 0, 22, + 1912, 0, 0, 0, 0, 0, 0, 0, 571, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 1913, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 715, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4627, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 4, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1822, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 1941, 1942, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1943, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 1941, 1942, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2151, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 1941, + 1942, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2957, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 2958, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2970, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3699, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 1941, 1942, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2957, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 607, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 4679, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 715, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 4, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5048, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5519, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5529, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 5874, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 722, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 803, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 1941, 1942, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 607, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 2307, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2975, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 4, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 715, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3607, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 3608, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 3609, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 3610, + 184, 185, 186, 589, 0, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 0, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 3611, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 0, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 3612, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 3726, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 3727, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5826, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 3377, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 3378, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 3379, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 0, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 715, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 3608, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 3609, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 3610, 184, 185, 186, 589, 0, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 0, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 3611, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 0, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 3612, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 851, 0, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 852, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 0, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 0, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 0, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 183, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 855, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 0, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 0, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 0, 96, + 578, 98, 99, 100, 101, 102, 0, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 0, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 0, 148, 149, 150, 151, 0, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 0, + 179, 0, 180, 181, 182, 183, 184, 185, 186, 589, + 188, 189, 0, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 0, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 0, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 0, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 0, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 0, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 0, 359, 360, + 361, 362, 363, 364, 365, 0, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 0, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 0, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 4, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 1898, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1909, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 1899, 55, 0, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 0, 72, 73, 74, 75, 76, + 77, 78, 79, 0, 0, 0, 0, 84, 85, 86, + 87, 88, 0, 0, 91, 92, 93, 94, 95, 0, + 0, 0, 98, 99, 100, 101, 102, 0, 103, 104, + 105, 106, 0, 0, 0, 0, 0, 0, 112, 0, + 114, 0, 116, 117, 1900, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 0, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 0, 148, 149, 150, 151, + 0, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 0, 0, 0, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 0, 0, 0, 0, 181, 182, 1901, 184, 185, 186, + 0, 188, 189, 0, 191, 192, 0, 0, 194, 0, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 0, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 0, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 0, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 0, 0, 0, 299, 0, + 301, 302, 0, 304, 305, 306, 307, 0, 309, 310, + 311, 312, 0, 0, 0, 0, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 0, 343, 0, 345, 346, 347, 0, 349, + 350, 0, 352, 353, 354, 355, 356, 357, 0, 359, + 360, 361, 362, 363, 364, 365, 0, 367, 368, 369, + 0, 371, 372, 373, 374, 0, 376, 377, 4, 5, + 380, 381, 0, 0, 384, 385, 386, 0, 388, 0, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 0, + 399, 400, 0, 402, 0, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 0, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 0, 435, 436, 0, 438, + 439, 440, 441, 0, 0, 444, 445, 13, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 0, 0, 464, 465, 0, 0, 467, + 0, 469, 470, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 1898, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1919, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 1899, 55, 0, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 0, 72, 73, 74, 75, 76, 77, 78, 79, 0, + 0, 0, 0, 84, 85, 86, 87, 88, 0, 0, + 91, 92, 93, 94, 95, 0, 0, 0, 98, 99, + 100, 101, 102, 0, 103, 104, 105, 106, 0, 0, + 0, 0, 0, 0, 112, 0, 114, 0, 116, 117, + 1900, 119, 120, 121, 122, 123, 124, 0, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 0, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 0, 148, 149, 150, 151, 0, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 0, 0, + 0, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 0, 0, 0, 0, + 181, 182, 1901, 184, 185, 186, 0, 188, 189, 0, + 191, 192, 0, 0, 194, 0, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 0, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 0, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 0, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 0, 0, 0, 299, 0, 301, 302, 0, 304, + 305, 306, 307, 0, 309, 310, 311, 312, 0, 0, + 0, 0, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 0, 343, + 0, 345, 346, 347, 0, 349, 350, 0, 352, 353, + 354, 355, 356, 357, 0, 359, 360, 361, 362, 363, + 364, 365, 0, 367, 368, 369, 0, 371, 372, 373, + 374, 0, 376, 377, 4, 5, 380, 381, 0, 0, + 384, 385, 386, 0, 388, 0, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 0, 399, 400, 0, 402, + 0, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 0, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 0, 435, 436, 0, 438, 439, 440, 441, 0, + 0, 444, 445, 13, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 0, + 0, 464, 465, 0, 0, 467, 0, 469, 470, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 1898, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 1899, 55, 0, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 0, 72, 73, 74, + 75, 76, 77, 78, 79, 0, 0, 0, 0, 84, + 85, 86, 87, 88, 0, 0, 91, 92, 93, 94, + 95, 0, 0, 0, 98, 99, 100, 101, 102, 0, + 103, 104, 105, 106, 0, 0, 0, 0, 0, 0, + 112, 0, 114, 0, 116, 117, 1900, 119, 120, 121, + 122, 123, 124, 0, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 0, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 0, 148, 149, + 150, 151, 0, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 0, 0, 0, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 0, 0, 0, 0, 181, 182, 1901, 184, + 185, 186, 0, 188, 189, 0, 191, 192, 0, 0, + 194, 0, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 0, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 0, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 0, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 0, 0, 0, + 299, 0, 301, 302, 0, 304, 305, 306, 307, 0, + 309, 310, 311, 312, 0, 0, 0, 0, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 0, 343, 0, 345, 346, 347, + 0, 349, 350, 0, 352, 353, 354, 355, 356, 357, + 0, 359, 360, 361, 362, 363, 364, 365, 0, 367, + 368, 369, 0, 371, 372, 373, 374, 0, 376, 377, + 0, 0, 380, 381, 0, 0, 384, 385, 386, 0, + 388, 0, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 0, 399, 400, 0, 402, 0, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 0, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 0, 435, 436, + 0, 438, 439, 440, 441, 0, 0, 444, 445, 0, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 4, 5, 464, 465, 0, + 0, 467, 0, 469, 470, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, + 1510, 1511, 0, 4030, 1514, 1515, 1516, 0, 0, 1519, + 1520, 1521, 1522, 1523, 1524, 1525, 1526, 4031, 1528, 1529, + 0, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, + 1539, 1540, 0, 1541, 13, 1542, 1543, 1544, 1545, 1546, + 1547, 1548, 4032, 1550, 1551, 1552, 1553, 1554, 1555, 1556, + 1557, 1558, 1559, 1560, 1561, 4033, 1563, 1564, 1565, 1566, + 1567, 1568, 19, 1569, 1570, 1571, 1572, 1573, 1574, 1575, + 1576, 4034, 1578, 0, 1579, 1580, 1581, 1582, 1583, 0, + 0, 22, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, + 3941, 1593, 1594, 1595, 0, 1596, 1597, 0, 1598, 4035, + 1600, 4036, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, + 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, + 0, 0, 0, 1623, 1624, 1625, 1626, 1627, 1628, 1629, + 0, 0, 0, 1633, 1634, 1635, 1636, 1637, 1638, 1639, + 1640, 29, 1641, 1642, 1643, 1644, 1645, 1646, 0, 1648, + 1649, 1650, 1651, 31, 1652, 1653, 1654, 1655, 0, 1656, + 1657, 1658, 1659, 1660, 34, 1661, 1662, 1663, 1664, 1665, + 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, + 0, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, + 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, + 1696, 1697, 1698, 1699, 0, 1701, 1702, 0, 1704, 1705, + 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, + 1716, 1717, 1718, 1719, 1720, 0, 1721, 1722, 1723, 1724, + 0, 0, 0, 1728, 1729, 1730, 1731, 1732, 1733, 1734, + 1735, 4037, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, + 1744, 1745, 0, 4038, 1748, 1749, 1750, 1751, 1752, 1753, + 1754, 1755, 1756, 1757, 52, 53, 54, 0, 55, 56, + 57, 58, 59, 0, 1758, 1759, 1760, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 0, 85, 0, 0, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 0, 0, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 4039, 4040, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 0, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 0, 586, 587, 179, 0, 180, 181, 182, 0, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 0, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 0, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 0, 4041, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 0, + 0, 0, 292, 1774, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 0, 0, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 0, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 0, 374, 375, 376, + 377, 602, 4042, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 0, 423, 424, 0, + 426, 427, 4043, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 0, 4044, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 0, 463, 464, 465, + 466, 0, 467, 608, 469, 4, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 852, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 5431, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 0, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 0, 575, + 0, 85, 0, 0, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 0, 0, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 0, 0, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 0, 152, 153, 154, 0, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 0, 586, 587, 179, 0, 180, 181, 182, 5432, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 0, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 0, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 0, 0, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 0, + 0, 0, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 0, 0, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 0, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 0, 374, 375, 376, + 377, 602, 0, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 0, 423, 424, 0, + 426, 427, 0, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 0, 0, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 1781, 463, 464, 465, + 466, 0, 467, 608, 469 +}; + +static const yytype_int16 yycheck[] = +{ + 3, 0, 30, 631, 82, 8, 856, 967, 645, 82, + 693, 471, 2109, 693, 694, 0, 0, 1446, 645, 2003, + 1967, 0, 2264, 0, 639, 2320, 2442, 0, 2058, 0, + 809, 2122, 1414, 36, 660, 1417, 1411, 40, 623, 721, + 0, 626, 45, 2294, 0, 48, 2559, 0, 0, 2565, + 0, 2667, 1828, 1276, 809, 2626, 693, 776, 1621, 0, + 0, 1973, 1577, 628, 3285, 2012, 693, 1982, 3602, 2319, + 3034, 2461, 1182, 2575, 2405, 688, 2042, 629, 661, 1044, + 661, 1798, 761, 41, 763, 3753, 1417, 766, 767, 0, + 1457, 2512, 3298, 1517, 2060, 647, 661, 649, 650, 651, + 652, 653, 654, 655, 1386, 657, 658, 3911, 691, 3829, + 691, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, + 2104, 2105, 2106, 2107, 3178, 1518, 691, 2548, 1457, 4393, + 1255, 1405, 1647, 1343, 4393, 687, 1876, 641, 2548, 738, + 877, 3046, 741, 3986, 3822, 2179, 2180, 4293, 2122, 714, + 178, 3685, 1277, 2237, 847, 2668, 1549, 4299, 3109, 4439, + 3797, 3044, 165, 728, 4771, 1218, 4315, 1220, 1221, 2080, + 3413, 3414, 2288, 856, 2655, 1228, 2432, 2088, 2089, 3811, + 2091, 2092, 4023, 2186, 1577, 3139, 3220, 1013, 38, 2943, + 3434, 743, 744, 3830, 3669, 3073, 700, 2288, 3138, 3139, + 3430, 5140, 2956, 2206, 3434, 1278, 4283, 4039, 4761, 4043, + 4882, 4043, 3148, 0, 6, 7, 2513, 5121, 639, 856, + 3883, 639, 639, 639, 1184, 851, 1622, 2230, 2231, 856, + 639, 4393, 4262, 15, 2369, 1620, 1632, 15, 15, 876, + 12, 2545, 16, 17, 15, 1630, 26, 97, 83, 876, + 42, 2285, 47, 1768, 1647, 67, 42, 1772, 6, 7, + 825, 6, 7, 53, 15, 15, 6, 7, 15, 15, + 2660, 1786, 1621, 1622, 526, 1485, 5124, 6, 7, 15, + 15, 15, 26, 1632, 5320, 47, 6, 7, 1114, 1115, + 1116, 127, 65, 6, 7, 4796, 15, 6, 7, 63, + 145, 1127, 787, 33, 889, 890, 891, 892, 4282, 4283, + 31, 41, 315, 89, 2288, 47, 344, 42, 42, 4671, + 50, 42, 1746, 178, 53, 33, 42, 11, 12, 122, + 895, 1727, 836, 41, 182, 206, 888, 1761, 26, 31, + 1725, 1765, 50, 3580, 47, 53, 898, 899, 31, 31, + 26, 1775, 51, 1777, 1778, 1779, 1780, 31, 1782, 99, + 244, 5354, 5355, 366, 31, 31, 156, 42, 1764, 1793, + 1794, 1795, 1796, 1797, 2669, 1768, 3330, 232, 1727, 1772, + 53, 42, 299, 217, 1769, 31, 268, 4891, 158, 242, + 3330, 254, 283, 1786, 1953, 1954, 33, 26, 143, 314, + 51, 6, 7, 1962, 41, 104, 31, 2504, 201, 110, + 123, 318, 4719, 50, 123, 1764, 26, 3766, 26, 4393, + 24, 25, 26, 3898, 28, 127, 30, 232, 32, 3183, + 3184, 42, 244, 1992, 26, 1994, 378, 42, 2643, 33, + 310, 251, 305, 3851, 4839, 433, 42, 41, 4839, 1824, + 2009, 2010, 2011, 104, 26, 168, 50, 2016, 2017, 168, + 24, 25, 26, 4753, 28, 2024, 30, 971, 32, 24, + 25, 26, 119, 28, 26, 30, 182, 32, 208, 123, + 281, 4839, 254, 156, 26, 33, 471, 267, 47, 99, + 33, 99, 3375, 41, 143, 33, 33, 290, 41, 299, + 208, 143, 50, 41, 41, 152, 71, 50, 127, 128, + 3026, 448, 50, 50, 387, 5642, 127, 42, 5122, 99, + 28, 42, 178, 526, 168, 314, 33, 99, 427, 99, + 122, 42, 33, 305, 41, 203, 178, 71, 33, 73, + 41, 314, 314, 50, 65, 371, 41, 99, 33, 50, + 54, 299, 537, 537, 14, 50, 41, 99, 314, 42, + 5961, 71, 6115, 408, 788, 50, 4873, 4764, 96, 178, + 254, 208, 645, 153, 258, 42, 591, 42, 33, 203, + 50, 203, 4386, 328, 5432, 315, 41, 114, 33, 582, + 128, 393, 197, 33, 42, 50, 41, 537, 2338, 312, + 33, 41, 5533, 312, 542, 50, 197, 315, 41, 211, + 50, 1304, 173, 4147, 208, 203, 641, 50, 110, 622, + 623, 305, 6059, 626, 2919, 628, 6063, 155, 203, 5622, + 314, 5135, 268, 4296, 14, 33, 99, 352, 53, 314, + 639, 688, 3875, 41, 1209, 292, 386, 107, 232, 203, + 335, 598, 50, 1218, 639, 639, 1221, 1117, 661, 1147, + 208, 1226, 54, 43, 44, 208, 645, 1386, 645, 598, + 208, 208, 723, 1272, 645, 1274, 4508, 614, 315, 4154, + 127, 660, 685, 660, 528, 203, 6305, 1366, 691, 660, + 1369, 1179, 1257, 740, 1373, 1374, 1375, 1376, 290, 639, + 4849, 208, 528, 706, 645, 4867, 234, 208, 281, 779, + 40, 714, 427, 208, 693, 3921, 693, 787, 1473, 660, + 6339, 315, 693, 208, 727, 728, 173, 107, 686, 676, + 314, 1841, 192, 294, 645, 4840, 787, 4842, 201, 781, + 4845, 53, 5441, 693, 786, 772, 788, 676, 57, 660, + 386, 299, 693, 208, 4859, 4171, 4172, 760, 414, 747, + 1870, 358, 787, 208, 779, 3015, 258, 315, 208, 454, + 5701, 709, 315, 776, 254, 208, 341, 315, 315, 4753, + 5375, 688, 693, 287, 311, 3027, 252, 686, 638, 727, + 793, 580, 122, 643, 787, 629, 504, 824, 801, 802, + 6201, 366, 787, 1496, 6241, 414, 809, 642, 315, 659, + 208, 613, 192, 173, 315, 252, 386, 287, 474, 378, + 315, 423, 825, 673, 580, 305, 3780, 632, 5118, 1444, + 315, 834, 366, 145, 314, 3166, 5440, 779, 314, 649, + 3780, 547, 1407, 669, 847, 782, 696, 6400, 160, 5129, + 314, 3787, 477, 726, 659, 3791, 366, 658, 645, 817, + 315, 743, 5989, 780, 577, 782, 196, 782, 577, 639, + 315, 201, 851, 660, 851, 315, 4284, 856, 3083, 856, + 851, 884, 315, 886, 299, 3639, 889, 890, 891, 892, + 893, 782, 895, 4867, 2323, 730, 1481, 876, 782, 876, + 755, 506, 3153, 738, 5457, 876, 741, 669, 281, 779, + 851, 782, 578, 758, 3209, 506, 779, 315, 5270, 593, + 2835, 2836, 1474, 723, 688, 4162, 1386, 593, 5235, 782, + 5127, 779, 581, 577, 294, 876, 894, 669, 896, 732, + 851, 642, 4291, 335, 643, 856, 782, 593, 782, 2860, + 2861, 954, 2863, 2864, 957, 717, 1441, 5805, 5657, 5807, + 290, 964, 5998, 966, 3169, 876, 5470, 743, 5232, 742, + 782, 970, 614, 5232, 5475, 287, 5477, 980, 955, 956, + 560, 958, 959, 960, 779, 970, 970, 779, 965, 769, + 1242, 970, 643, 970, 786, 787, 786, 970, 5670, 970, + 3250, 787, 779, 3307, 3308, 787, 1971, 779, 782, 787, + 2392, 3146, 3147, 3016, 955, 956, 787, 958, 959, 960, + 970, 2131, 1987, 1444, 965, 769, 1444, 1444, 1444, 970, + 970, 1283, 5062, 779, 763, 1444, 787, 787, 786, 763, + 787, 786, 763, 5120, 955, 956, 786, 958, 959, 960, + 780, 787, 787, 787, 965, 3350, 5363, 786, 2183, 970, + 2185, 2392, 787, 2188, 851, 2432, 786, 2177, 787, 856, + 5232, 787, 384, 786, 782, 2200, 779, 786, 2203, 2361, + 782, 769, 2207, 6076, 2137, 6078, 6079, 779, 763, 876, + 2372, 2520, 780, 769, 782, 779, 779, 779, 2527, 2152, + 5653, 5654, 763, 2432, 780, 2490, 782, 2492, 2233, 2234, + 2235, 708, 779, 786, 782, 2511, 1119, 768, 1117, 4002, + 2505, 1876, 4785, 1949, 1950, 4803, 787, 4661, 4806, 6033, + 6034, 704, 1117, 780, 3431, 4969, 3433, 4969, 2523, 4973, + 769, 4973, 2538, 5538, 5118, 2541, 5120, 5538, 785, 1842, + 2535, 780, 763, 782, 2550, 2228, 4389, 2122, 782, 769, + 782, 769, 2511, 782, 692, 730, 2551, 763, 955, 956, + 14, 958, 959, 960, 779, 4807, 780, 769, 965, 1182, + 5538, 786, 787, 970, 6177, 6178, 780, 3284, 782, 2538, + 2749, 787, 2541, 2752, 782, 6188, 5503, 769, 5505, 43, + 44, 2550, 5797, 5510, 33, 33, 1209, 782, 4624, 2768, + 5517, 5518, 41, 41, 299, 1218, 780, 769, 1221, 528, + 5527, 50, 50, 1226, 1448, 780, 5533, 769, 782, 2788, + 169, 53, 33, 28, 782, 30, 14, 780, 763, 782, + 41, 1319, 763, 780, 782, 782, 1939, 42, 1833, 50, + 281, 33, 763, 6246, 1257, 3339, 1839, 723, 5232, 41, + 768, 769, 787, 107, 782, 43, 44, 6206, 50, 4323, + 5823, 2481, 99, 780, 1839, 4809, 787, 57, 1960, 780, + 763, 782, 3522, 4337, 2110, 780, 723, 782, 19, 20, + 229, 71, 1295, 73, 1297, 780, 763, 782, 763, 779, + 1303, 1304, 40, 299, 787, 14, 782, 151, 768, 769, + 770, 771, 772, 773, 4558, 763, 391, 1320, 782, 72, + 787, 143, 787, 2288, 684, 369, 1329, 782, 4558, 107, + 33, 704, 3537, 376, 43, 44, 281, 782, 41, 787, + 1343, 1344, 782, 143, 2607, 448, 5512, 50, 192, 782, + 33, 4305, 4306, 2132, 2036, 281, 1383, 376, 41, 50, + 232, 1364, 735, 5082, 4242, 4305, 4306, 50, 33, 19, + 20, 2090, 4406, 4309, 4310, 1940, 41, 2132, 331, 208, + 208, 295, 780, 1386, 1387, 50, 5666, 1386, 768, 769, + 770, 771, 772, 773, 5701, 572, 376, 116, 107, 239, + 5707, 1386, 732, 317, 1407, 1909, 1448, 208, 232, 1367, + 1368, 99, 376, 144, 192, 1919, 53, 33, 143, 40, + 19, 20, 1425, 471, 141, 2204, 208, 98, 4182, 3669, + 71, 75, 580, 5274, 50, 5540, 258, 1272, 2491, 1274, + 435, 390, 4196, 1446, 1447, 1444, 4200, 127, 580, 2204, + 494, 763, 5721, 178, 378, 5991, 1441, 1460, 196, 1444, + 1444, 232, 1312, 33, 3714, 196, 208, 143, 1471, 3711, + 1473, 41, 3588, 1323, 270, 3459, 298, 10, 1481, 1482, + 50, 2164, 1485, 192, 2164, 5981, 315, 315, 160, 2168, + 160, 3741, 197, 1496, 144, 3751, 3886, 3588, 298, 33, + 136, 491, 752, 6110, 1444, 208, 454, 41, 225, 67, + 1345, 614, 803, 201, 315, 3936, 50, 3938, 2237, 314, + 2630, 1981, 363, 14, 644, 208, 3936, 2164, 3938, 779, + 4481, 4482, 4013, 315, 5672, 5842, 5674, 2164, 5170, 510, + 769, 178, 3747, 208, 2109, 144, 196, 226, 178, 235, + 74, 780, 43, 44, 5861, 33, 2139, 5723, 2139, 333, + 33, 341, 389, 41, 391, 3341, 505, 193, 41, 746, + 577, 226, 50, 369, 2139, 196, 281, 50, 287, 359, + 74, 5850, 553, 2338, 2169, 2170, 366, 2172, 2173, 2174, + 2175, 572, 236, 3577, 127, 232, 2422, 196, 425, 2184, + 5278, 3567, 3568, 3569, 3570, 782, 4489, 755, 361, 2302, + 2238, 391, 315, 561, 3588, 3355, 107, 2202, 74, 5094, + 492, 1456, 298, 755, 2128, 4015, 143, 675, 455, 5104, + 5105, 107, 315, 736, 314, 5313, 3583, 459, 208, 3551, + 593, 3552, 2361, 3554, 634, 688, 3561, 3562, 5367, 299, + 315, 695, 3857, 2372, 2373, 386, 74, 6264, 3898, 459, + 151, 2340, 2341, 2926, 2927, 2344, 307, 787, 492, 688, + 2349, 2350, 2351, 704, 208, 33, 3679, 33, 369, 2278, + 5818, 352, 6218, 41, 608, 41, 244, 3892, 3983, 3894, + 3895, 4934, 50, 688, 50, 3900, 434, 782, 494, 315, + 258, 192, 787, 3908, 779, 654, 2305, 3912, 688, 3914, + 101, 4227, 743, 432, 74, 314, 192, 688, 6214, 2347, + 2348, 492, 2287, 67, 688, 76, 77, 568, 568, 33, + 208, 357, 658, 74, 33, 208, 386, 41, 3105, 14, + 33, 33, 41, 1816, 432, 315, 50, 173, 41, 41, + 475, 50, 666, 506, 2337, 460, 2436, 50, 50, 704, + 2345, 588, 392, 2328, 703, 746, 497, 403, 43, 44, + 566, 33, 2337, 6269, 2339, 782, 3105, 551, 704, 41, + 704, 315, 2747, 459, 463, 775, 782, 386, 50, 3012, + 3172, 787, 3174, 3175, 5768, 622, 720, 321, 743, 3783, + 472, 506, 472, 494, 358, 2915, 2916, 57, 463, 1812, + 232, 328, 123, 434, 6310, 2380, 127, 1820, 3185, 1822, + 10, 71, 5796, 73, 2561, 5300, 5800, 321, 5974, 1832, + 1833, 2941, 107, 5975, 191, 74, 1839, 315, 1841, 1842, + 458, 3172, 315, 3174, 3175, 3127, 5524, 497, 5997, 40, + 208, 3133, 208, 33, 6003, 653, 3185, 168, 2471, 633, + 2985, 41, 173, 40, 2989, 321, 2991, 1870, 45, 5712, + 50, 33, 5509, 1876, 231, 33, 2441, 572, 31, 41, + 3005, 4635, 101, 41, 127, 2938, 4640, 4641, 50, 614, + 4944, 3975, 50, 3018, 3019, 206, 2589, 2590, 497, 695, + 244, 6165, 2955, 321, 208, 296, 2959, 6166, 1911, 208, + 2536, 268, 338, 4484, 4154, 208, 208, 192, 472, 1023, + 1024, 1025, 766, 767, 768, 769, 770, 771, 772, 773, + 10, 150, 568, 5907, 177, 4840, 1939, 1940, 342, 2504, + 4845, 763, 5620, 3977, 4998, 4850, 208, 4363, 2513, 404, + 730, 141, 374, 782, 782, 33, 2639, 315, 33, 315, + 756, 321, 2466, 41, 1068, 4216, 41, 127, 763, 1073, + 5944, 6109, 50, 768, 769, 50, 4218, 5371, 2591, 5796, + 321, 782, 1981, 601, 127, 448, 4499, 5961, 1973, 767, + 768, 769, 770, 771, 772, 773, 1981, 468, 241, 704, + 782, 10, 2639, 3213, 695, 196, 2084, 33, 4339, 33, + 568, 315, 2639, 744, 167, 41, 315, 41, 649, 33, + 409, 410, 315, 315, 50, 209, 50, 41, 208, 386, + 2667, 33, 145, 437, 2037, 506, 50, 2663, 2041, 41, + 2667, 398, 119, 167, 2047, 421, 208, 127, 50, 461, + 208, 746, 2665, 315, 145, 2058, 293, 766, 767, 768, + 769, 770, 771, 772, 773, 42, 33, 5745, 6025, 160, + 313, 6028, 5777, 723, 41, 152, 712, 296, 3038, 782, + 33, 493, 321, 50, 4505, 2070, 2070, 782, 41, 4510, + 572, 341, 443, 444, 744, 4505, 4517, 50, 652, 782, + 4510, 47, 3376, 337, 117, 118, 2109, 4517, 2111, 359, + 4350, 4351, 595, 568, 4354, 4355, 366, 782, 755, 753, + 4360, 4361, 99, 5791, 2127, 5793, 763, 5944, 2131, 2132, + 208, 6105, 141, 208, 5854, 315, 2139, 2140, 5197, 323, + 53, 498, 462, 2862, 2648, 744, 33, 4387, 779, 386, + 2654, 614, 170, 315, 41, 567, 2838, 315, 2161, 312, + 106, 99, 2666, 50, 5223, 541, 2169, 2170, 2171, 2172, + 2173, 2174, 2175, 2176, 2177, 2178, 5081, 5082, 4383, 4384, + 4385, 2184, 208, 457, 208, 2164, 668, 2164, 312, 88, + 661, 5980, 205, 2164, 208, 458, 63, 72, 2201, 2202, + 3976, 2204, 4407, 4408, 364, 4410, 208, 307, 691, 229, + 310, 568, 782, 5918, 2164, 292, 671, 4128, 71, 4130, + 73, 364, 2225, 2164, 35, 36, 37, 6201, 39, 463, + 528, 251, 3285, 251, 2237, 3345, 648, 315, 5916, 5633, + 315, 208, 33, 156, 5638, 5639, 99, 5152, 782, 5154, + 41, 126, 2935, 2164, 5308, 208, 3996, 3997, 495, 50, + 5928, 5467, 745, 3223, 746, 2893, 577, 81, 6225, 282, + 590, 5025, 5026, 736, 141, 766, 767, 768, 769, 770, + 771, 772, 773, 5342, 2287, 2120, 6090, 6091, 448, 315, + 450, 315, 154, 384, 770, 771, 772, 773, 2935, 2302, + 63, 315, 780, 3678, 2307, 448, 33, 450, 2935, 782, + 131, 120, 4224, 315, 41, 613, 4033, 6106, 6107, 782, + 55, 208, 454, 50, 713, 2328, 600, 716, 413, 33, + 413, 723, 2335, 147, 2337, 2338, 2339, 41, 601, 2922, + 2343, 2922, 2345, 214, 158, 156, 50, 667, 315, 403, + 225, 33, 166, 602, 3729, 226, 47, 2922, 2361, 41, + 1464, 4566, 315, 417, 226, 303, 304, 499, 50, 2372, + 2373, 669, 2207, 6041, 2939, 33, 6044, 2380, 141, 193, + 540, 33, 4587, 41, 3751, 2970, 217, 6279, 3081, 41, + 2975, 3351, 50, 5787, 33, 787, 2856, 540, 50, 2984, + 0, 6169, 41, 5953, 489, 2990, 489, 128, 3127, 218, + 281, 50, 5921, 5922, 3133, 106, 151, 208, 293, 3032, + 47, 4663, 3751, 33, 782, 47, 782, 528, 315, 3148, + 151, 41, 167, 6325, 3816, 249, 568, 6249, 2441, 3118, + 50, 33, 3121, 2278, 4684, 5995, 3125, 2450, 47, 41, + 281, 33, 3207, 2456, 614, 627, 287, 2460, 50, 41, + 47, 47, 5367, 277, 2537, 403, 3065, 53, 50, 55, + 2305, 614, 2545, 4889, 3154, 3040, 780, 4808, 2481, 106, + 730, 208, 6250, 782, 106, 3816, 3596, 51, 7, 782, + 782, 766, 767, 768, 769, 770, 771, 772, 773, 573, + 574, 2504, 4918, 238, 208, 3787, 33, 106, 3937, 3791, + 2513, 683, 613, 366, 41, 148, 3626, 4032, 151, 106, + 782, 5575, 787, 50, 315, 6293, 208, 5029, 33, 144, + 3115, 602, 3117, 386, 763, 128, 41, 475, 3123, 3124, + 104, 2544, 128, 4933, 101, 50, 33, 6359, 6360, 6245, + 208, 6060, 763, 4974, 41, 6064, 208, 2536, 57, 2536, + 6328, 154, 3615, 50, 4974, 2536, 33, 5196, 669, 208, + 5324, 5325, 71, 2576, 41, 2578, 650, 476, 3631, 212, + 2583, 196, 3, 50, 3637, 3638, 2589, 2590, 315, 6285, + 6358, 3156, 463, 150, 2667, 2536, 3978, 33, 208, 136, + 3355, 5230, 782, 2606, 2607, 3980, 4030, 4031, 4523, 4524, + 31, 315, 6257, 6258, 50, 3298, 208, 4041, 780, 145, + 3339, 158, 782, 3588, 782, 2536, 208, 2630, 5044, 4576, + 57, 2634, 141, 315, 160, 5540, 4666, 4552, 153, 4032, + 4606, 2644, 419, 5607, 769, 4038, 73, 3978, 2651, 426, + 33, 4044, 4567, 168, 6299, 780, 2659, 315, 41, 2662, + 2639, 3298, 2639, 315, 769, 33, 33, 50, 2639, 206, + 779, 3298, 4619, 41, 41, 780, 315, 782, 787, 413, + 5109, 208, 50, 50, 2663, 5114, 2663, 586, 2667, 787, + 2667, 1050, 2663, 682, 593, 2438, 2667, 254, 2639, 2442, + 599, 690, 763, 208, 782, 315, 695, 782, 214, 311, + 1069, 1070, 533, 534, 19, 20, 537, 538, 539, 3284, + 226, 208, 2663, 315, 2709, 2709, 2667, 271, 2639, 3689, + 713, 647, 31, 315, 717, 3418, 88, 328, 282, 296, + 154, 208, 33, 6252, 6253, 768, 769, 3430, 305, 2536, + 41, 3434, 2663, 3435, 780, 65, 2667, 314, 782, 50, + 510, 3344, 268, 3344, 3446, 3447, 1334, 22, 782, 3451, + 258, 328, 1340, 1341, 29, 674, 31, 5027, 737, 3344, + 782, 3418, 23, 289, 178, 26, 27, 33, 315, 705, + 31, 3418, 708, 3430, 780, 41, 782, 3434, 36, 37, + 33, 4350, 4351, 3430, 50, 4354, 4355, 3434, 41, 2812, + 315, 4360, 4361, 2816, 33, 782, 779, 50, 3597, 735, + 1424, 3503, 41, 1427, 1428, 208, 2829, 743, 315, 782, + 4582, 50, 343, 5249, 4586, 50, 735, 81, 3520, 88, + 208, 208, 3597, 33, 5260, 33, 299, 780, 315, 782, + 33, 41, 2639, 41, 5094, 6315, 6316, 2856, 41, 417, + 50, 33, 50, 53, 5104, 5105, 3431, 50, 3433, 41, + 780, 2856, 782, 6407, 226, 5504, 2663, 141, 50, 36, + 2667, 128, 6103, 40, 5089, 5090, 5091, 5092, 45, 33, + 5095, 5096, 5521, 780, 780, 5100, 782, 41, 5103, 746, + 780, 5106, 782, 147, 5109, 5534, 50, 5536, 5113, 5114, + 2051, 2052, 2915, 2916, 158, 670, 268, 208, 33, 2922, + 33, 24, 166, 2926, 2927, 28, 41, 30, 41, 32, + 436, 780, 315, 782, 670, 50, 2939, 50, 2941, 6033, + 6034, 2944, 2945, 33, 113, 114, 115, 315, 315, 193, + 281, 41, 763, 764, 765, 24, 2935, 4339, 2935, 28, + 50, 30, 208, 32, 2935, 214, 2969, 2970, 782, 460, + 3653, 3654, 2975, 3653, 3654, 208, 33, 226, 4890, 128, + 33, 2984, 351, 352, 41, 4208, 338, 2990, 41, 208, + 33, 782, 4555, 50, 2935, 784, 785, 50, 41, 780, + 3960, 782, 119, 786, 33, 249, 123, 50, 4339, 780, + 127, 782, 41, 5043, 3017, 780, 3653, 3654, 208, 388, + 208, 50, 145, 312, 315, 208, 3653, 3654, 662, 145, + 3033, 4254, 281, 277, 145, 152, 208, 3040, 3041, 3042, + 289, 101, 780, 5614, 782, 28, 3004, 30, 5253, 33, + 5255, 168, 5257, 780, 4164, 787, 173, 41, 427, 3687, + 5300, 413, 33, 780, 208, 782, 50, 3070, 3787, 315, + 41, 3921, 3791, 127, 3077, 324, 780, 734, 3081, 50, + 47, 780, 315, 782, 436, 88, 4461, 4212, 120, 206, + 150, 5006, 780, 208, 782, 208, 315, 3557, 780, 23, + 2935, 5306, 26, 27, 3107, 5345, 787, 31, 3111, 3112, + 3113, 463, 3115, 47, 3117, 281, 515, 516, 208, 3122, + 3123, 3124, 780, 657, 3127, 315, 129, 315, 780, 436, + 3133, 530, 315, 532, 101, 780, 4912, 782, 743, 779, + 2431, 780, 145, 315, 4197, 3148, 4199, 2982, 2935, 3152, + 57, 208, 114, 3156, 3157, 208, 5572, 780, 2993, 782, + 268, 780, 4215, 782, 71, 208, 73, 18, 19, 20, + 780, 315, 786, 287, 33, 292, 470, 786, 40, 208, + 5210, 782, 41, 150, 128, 3770, 147, 436, 780, 40, + 780, 50, 782, 55, 254, 141, 3824, 158, 780, 780, + 315, 782, 315, 5819, 3207, 166, 151, 24, 25, 26, + 3213, 28, 647, 30, 463, 32, 454, 606, 18, 19, + 20, 5312, 779, 779, 208, 315, 625, 626, 5744, 584, + 3065, 33, 3797, 602, 3307, 3308, 296, 208, 3921, 41, + 40, 3996, 3997, 3321, 3079, 305, 748, 749, 50, 751, + 619, 753, 475, 780, 314, 3258, 3975, 779, 315, 262, + 704, 499, 315, 3266, 3829, 3830, 71, 580, 328, 128, + 735, 779, 315, 73, 333, 780, 645, 5261, 281, 287, + 780, 3284, 782, 4658, 3921, 779, 315, 254, 249, 151, + 293, 96, 333, 780, 3921, 780, 5809, 782, 779, 99, + 3865, 203, 333, 5333, 109, 167, 658, 203, 551, 160, + 662, 782, 283, 780, 3940, 779, 277, 686, 3321, 3298, + 125, 3298, 40, 561, 5239, 283, 128, 311, 3331, 296, + 3333, 315, 50, 427, 196, 338, 3339, 55, 305, 3342, + 33, 3344, 3345, 360, 315, 196, 786, 314, 41, 208, + 155, 3186, 3355, 5769, 780, 779, 782, 50, 40, 3194, + 160, 328, 780, 780, 782, 782, 604, 33, 50, 15, + 780, 5613, 782, 55, 225, 41, 238, 780, 780, 782, + 782, 779, 779, 735, 50, 955, 956, 3298, 958, 959, + 960, 743, 4171, 4172, 779, 965, 196, 780, 779, 306, + 307, 201, 780, 203, 782, 780, 208, 782, 779, 658, + 413, 737, 780, 780, 33, 779, 4171, 4172, 40, 779, + 779, 355, 41, 779, 73, 225, 5677, 38, 3431, 234, + 3433, 50, 4655, 151, 341, 3412, 3413, 3414, 780, 3418, + 782, 3418, 293, 780, 4126, 782, 779, 3418, 4963, 167, + 779, 3430, 359, 3430, 182, 3434, 315, 3434, 33, 366, + 577, 780, 780, 782, 782, 399, 41, 401, 780, 151, + 782, 3412, 3413, 3414, 780, 50, 782, 3418, 196, 737, + 780, 5776, 782, 779, 391, 167, 735, 5782, 5783, 780, + 295, 779, 779, 293, 743, 5586, 213, 780, 4277, 782, + 779, 3412, 3413, 3414, 780, 5596, 782, 213, 780, 128, + 782, 3298, 779, 315, 196, 208, 4945, 779, 779, 3430, + 238, 4149, 4277, 3434, 213, 763, 764, 765, 779, 5192, + 5193, 3534, 5195, 213, 780, 386, 31, 5200, 160, 779, + 5203, 785, 208, 5206, 5207, 779, 346, 780, 780, 779, + 782, 5214, 127, 5216, 779, 779, 238, 491, 3557, 779, + 3563, 780, 5225, 779, 751, 4947, 3551, 24, 25, 26, + 4963, 28, 3557, 30, 196, 32, 787, 780, 47, 782, + 4633, 4634, 5612, 3418, 5531, 780, 386, 782, 3591, 208, + 4309, 4310, 780, 3596, 3597, 533, 534, 780, 779, 537, + 538, 539, 779, 225, 409, 410, 779, 541, 780, 779, + 24, 25, 33, 15, 28, 5599, 30, 283, 32, 780, + 41, 782, 315, 3626, 3697, 3412, 3413, 3414, 780, 50, + 782, 3418, 360, 208, 779, 15, 780, 106, 780, 779, + 782, 644, 3641, 3430, 495, 779, 3649, 3434, 3651, 315, + 780, 780, 782, 782, 588, 658, 3641, 3641, 780, 662, + 782, 779, 3641, 780, 3641, 780, 763, 780, 3641, 779, + 3641, 293, 779, 3746, 3653, 3654, 3653, 3654, 406, 779, + 3683, 3641, 3653, 3654, 5714, 3641, 779, 779, 3641, 3641, + 780, 3641, 3695, 3766, 6207, 495, 315, 780, 779, 782, + 3641, 3641, 779, 3653, 3654, 708, 4759, 128, 780, 4294, + 782, 779, 3653, 3654, 24, 25, 43, 779, 28, 779, + 30, 33, 32, 780, 780, 203, 782, 780, 779, 41, + 3641, 780, 735, 782, 779, 19, 20, 780, 50, 779, + 315, 68, 3653, 3654, 678, 780, 513, 782, 515, 516, + 77, 780, 779, 558, 559, 5739, 484, 779, 18, 19, + 20, 6056, 782, 530, 386, 532, 700, 3770, 779, 24, + 25, 98, 3775, 28, 4483, 30, 4485, 32, 779, 779, + 40, 33, 75, 75, 3787, 779, 779, 208, 3791, 41, + 779, 779, 779, 5884, 3797, 264, 123, 266, 50, 779, + 127, 53, 3805, 130, 779, 779, 779, 779, 277, 779, + 779, 779, 779, 73, 141, 677, 128, 128, 584, 547, + 779, 203, 779, 730, 293, 779, 3829, 3830, 779, 779, + 157, 779, 779, 126, 126, 563, 564, 779, 165, 99, + 568, 569, 570, 779, 779, 4624, 3919, 779, 5511, 779, + 177, 4533, 145, 145, 3641, 5952, 779, 4472, 625, 626, + 660, 145, 3865, 779, 779, 779, 779, 160, 160, 4624, + 258, 782, 670, 495, 201, 4558, 460, 688, 3881, 779, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 127, 688, 676, 315, 704, 208, 3188, 3189, 429, + 160, 752, 510, 143, 782, 177, 782, 782, 636, 3744, + 582, 716, 4594, 55, 241, 18, 19, 20, 360, 246, + 247, 4558, 119, 127, 217, 782, 123, 394, 782, 782, + 127, 4558, 225, 225, 645, 579, 196, 40, 699, 763, + 7, 201, 3921, 203, 3921, 2500, 743, 5894, 463, 660, + 53, 3954, 752, 463, 779, 152, 208, 6162, 686, 677, + 10, 3940, 782, 3940, 2519, 225, 217, 31, 145, 3940, + 73, 168, 3975, 2528, 6390, 136, 173, 296, 151, 2534, + 122, 65, 22, 694, 24, 25, 313, 2542, 28, 29, + 30, 31, 3995, 3996, 3997, 677, 99, 2552, 4001, 3940, + 2555, 393, 408, 315, 42, 474, 42, 3, 743, 206, + 3921, 4014, 583, 787, 311, 427, 779, 779, 3853, 3854, + 3855, 3856, 224, 3858, 3859, 352, 391, 779, 779, 3940, + 779, 6273, 33, 293, 15, 779, 127, 411, 127, 787, + 41, 786, 54, 5990, 352, 786, 4023, 374, 127, 50, + 81, 782, 53, 5482, 5483, 787, 5485, 160, 120, 201, + 787, 3896, 3897, 315, 3899, 177, 3901, 3902, 3903, 3904, + 3905, 3906, 3907, 643, 3909, 704, 780, 333, 3913, 333, + 333, 141, 4023, 506, 44, 311, 346, 561, 6035, 128, + 311, 384, 384, 196, 779, 292, 154, 177, 201, 786, + 203, 40, 386, 782, 478, 779, 4109, 6137, 106, 393, + 787, 47, 4023, 427, 336, 780, 147, 444, 780, 782, + 787, 780, 225, 780, 408, 780, 386, 158, 648, 780, + 127, 391, 127, 780, 3921, 166, 779, 787, 167, 779, + 851, 782, 136, 287, 782, 856, 430, 4150, 290, 127, + 770, 73, 787, 3940, 782, 688, 127, 19, 20, 151, + 6144, 4164, 193, 4166, 6406, 876, 105, 770, 4171, 4172, + 544, 4174, 546, 490, 4177, 4178, 701, 451, 552, 127, + 782, 688, 127, 4811, 780, 435, 779, 782, 779, 154, + 293, 217, 427, 3, 151, 57, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 208, 782, 386, + 679, 680, 681, 682, 363, 239, 393, 360, 249, 510, + 510, 510, 510, 510, 510, 782, 782, 763, 120, 676, + 4233, 408, 287, 47, 127, 495, 4023, 673, 612, 4224, + 4225, 596, 6272, 346, 955, 956, 277, 958, 959, 960, + 743, 535, 191, 430, 965, 582, 5685, 196, 5687, 5688, + 4825, 403, 780, 780, 548, 81, 780, 780, 410, 81, + 158, 780, 4275, 158, 4277, 210, 779, 4280, 4281, 787, + 782, 565, 656, 386, 65, 5338, 137, 439, 251, 787, + 418, 4294, 231, 6277, 664, 779, 122, 480, 4883, 480, + 782, 594, 594, 250, 780, 782, 4309, 4310, 6255, 283, + 595, 68, 81, 4316, 315, 734, 4394, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 779, 268, + 310, 147, 391, 310, 237, 147, 57, 30, 782, 4174, + 703, 72, 158, 222, 75, 6375, 158, 206, 128, 203, + 166, 782, 782, 779, 166, 287, 63, 146, 535, 6389, + 154, 42, 465, 780, 780, 6395, 649, 780, 128, 780, + 427, 548, 6402, 770, 748, 201, 780, 193, 147, 4457, + 577, 193, 780, 769, 780, 759, 779, 203, 565, 158, + 780, 203, 495, 6, 7, 126, 780, 166, 129, 780, + 660, 5080, 780, 780, 780, 18, 690, 780, 270, 702, + 702, 780, 780, 780, 145, 362, 780, 122, 780, 281, + 779, 705, 782, 370, 193, 782, 780, 780, 780, 160, + 779, 782, 782, 249, 203, 782, 4439, 249, 385, 780, + 53, 780, 787, 780, 780, 779, 217, 386, 395, 396, + 397, 773, 4287, 779, 4457, 782, 779, 4460, 405, 398, + 4463, 277, 780, 779, 290, 277, 779, 378, 81, 591, + 31, 31, 31, 4472, 427, 782, 131, 128, 782, 782, + 249, 763, 787, 299, 127, 5122, 217, 4472, 4472, 787, + 127, 787, 752, 504, 225, 5122, 201, 128, 4501, 88, + 5065, 782, 4487, 782, 782, 5184, 119, 787, 277, 782, + 123, 780, 613, 690, 127, 258, 780, 782, 53, 5199, + 782, 100, 47, 136, 137, 5375, 365, 127, 705, 670, + 143, 262, 576, 782, 147, 782, 5101, 19, 20, 152, + 158, 154, 158, 750, 439, 158, 507, 549, 3839, 3840, + 123, 3842, 3843, 166, 416, 168, 145, 660, 557, 498, + 173, 779, 293, 657, 268, 268, 268, 268, 430, 268, + 432, 713, 4575, 314, 716, 57, 203, 127, 779, 4558, + 193, 4558, 156, 725, 410, 290, 734, 763, 763, 763, + 203, 763, 763, 206, 763, 763, 543, 763, 763, 763, + 763, 1312, 464, 763, 4607, 763, 763, 763, 555, 763, + 763, 317, 763, 226, 427, 477, 763, 4620, 763, 295, + 787, 4624, 299, 763, 4627, 214, 763, 763, 763, 568, + 763, 763, 245, 576, 780, 168, 249, 226, 34, 333, + 287, 780, 780, 287, 755, 258, 780, 4558, 510, 752, + 5202, 782, 392, 384, 4657, 782, 506, 787, 787, 782, + 154, 787, 427, 4666, 277, 780, 528, 153, 4667, 153, + 787, 780, 780, 780, 780, 4678, 213, 787, 780, 292, + 65, 769, 787, 769, 780, 298, 299, 4672, 780, 782, + 5369, 4764, 5375, 640, 5373, 5374, 779, 779, 403, 312, + 289, 314, 338, 287, 697, 410, 287, 241, 655, 584, + 4713, 128, 128, 787, 787, 492, 4719, 232, 779, 30, + 4723, 769, 321, 779, 733, 545, 780, 779, 763, 782, + 779, 763, 203, 126, 203, 786, 782, 333, 5375, 203, + 287, 50, 712, 4746, 606, 158, 693, 158, 5375, 782, + 780, 613, 408, 31, 408, 31, 31, 240, 53, 283, + 707, 623, 72, 779, 779, 75, 779, 30, 30, 5729, + 461, 4558, 4607, 787, 177, 637, 780, 245, 6, 7, + 770, 584, 770, 143, 5467, 352, 155, 787, 270, 95, + 18, 155, 4627, 4796, 780, 780, 780, 780, 30, 206, + 787, 780, 4805, 5440, 779, 153, 33, 669, 780, 782, + 672, 780, 780, 5440, 41, 782, 126, 65, 780, 129, + 128, 780, 4825, 50, 780, 53, 688, 779, 31, 780, + 5467, 31, 763, 779, 232, 145, 177, 779, 782, 780, + 5467, 311, 704, 232, 782, 779, 459, 436, 734, 779, + 160, 203, 690, 81, 554, 690, 408, 719, 779, 779, + 299, 299, 779, 594, 378, 92, 93, 94, 95, 53, + 4873, 780, 782, 31, 463, 782, 208, 446, 287, 53, + 4883, 212, 780, 439, 251, 4888, 131, 713, 502, 780, + 716, 119, 65, 256, 168, 123, 780, 780, 504, 127, + 314, 643, 206, 65, 782, 4890, 4909, 780, 136, 137, + 780, 138, 139, 140, 782, 225, 347, 169, 217, 147, + 780, 782, 780, 780, 152, 6354, 154, 314, 780, 447, + 158, 173, 779, 763, 416, 4920, 4920, 782, 166, 754, + 168, 167, 741, 418, 5509, 173, 418, 217, 430, 203, + 432, 5630, 262, 53, 247, 780, 250, 4934, 676, 247, + 299, 299, 189, 190, 577, 193, 170, 30, 5046, 30, + 779, 702, 593, 217, 384, 203, 217, 217, 206, 65, + 217, 208, 464, 293, 159, 705, 217, 159, 4823, 705, + 592, 603, 217, 4934, 217, 477, 217, 217, 226, 252, + 5003, 203, 203, 386, 485, 128, 439, 584, 713, 314, + 203, 716, 154, 602, 780, 427, 780, 245, 780, 498, + 725, 249, 549, 4934, 155, 613, 253, 71, 510, 780, + 258, 780, 782, 65, 780, 780, 406, 50, 782, 787, + 5043, 5669, 780, 5046, 780, 782, 528, 779, 787, 277, + 6103, 5054, 5130, 779, 779, 644, 427, 5042, 5042, 654, + 53, 780, 5065, 31, 292, 5068, 378, 5070, 362, 779, + 779, 299, 117, 662, 384, 65, 370, 65, 65, 30, + 446, 779, 5085, 741, 312, 331, 314, 141, 315, 316, + 160, 385, 741, 225, 390, 422, 314, 669, 5101, 424, + 281, 395, 396, 397, 782, 780, 549, 780, 445, 780, + 685, 405, 779, 782, 5797, 780, 419, 779, 5121, 708, + 583, 160, 779, 160, 606, 236, 5129, 779, 53, 782, + 780, 613, 105, 779, 5137, 780, 203, 750, 786, 780, + 779, 623, 782, 5122, 786, 5122, 735, 4934, 786, 127, + 763, 65, 65, 65, 743, 637, 31, 127, 287, 160, + 5797, 411, 127, 782, 314, 287, 5194, 780, 6221, 782, + 5797, 780, 785, 786, 674, 782, 584, 780, 601, 780, + 5183, 5209, 5819, 649, 411, 440, 601, 669, 779, 787, + 672, 5219, 5819, 5196, 5197, 5198, 367, 779, 5226, 779, + 5228, 5229, 299, 779, 787, 5208, 688, 5210, 72, 787, + 780, 5122, 120, 120, 5217, 5218, 281, 73, 287, 287, + 5223, 721, 281, 287, 685, 584, 5061, 5230, 72, 72, + 15, 160, 5235, 50, 5953, 780, 696, 719, 711, 30, + 782, 782, 780, 779, 18, 65, 786, 5250, 779, 543, + 65, 478, 218, 779, 786, 144, 217, 99, 99, 428, + 6, 555, 5097, 5098, 584, 584, 723, 296, 649, 779, + 418, 418, 5107, 779, 430, 780, 5995, 780, 782, 180, + 779, 779, 779, 160, 594, 741, 5121, 160, 296, 5854, + 201, 339, 99, 53, 427, 154, 702, 5274, 697, 779, + 589, 203, 780, 779, 5139, 779, 426, 198, 737, 247, + 352, 127, 779, 422, 779, 207, 173, 544, 5321, 546, + 779, 338, 780, 218, 779, 552, 585, 780, 779, 779, + 5333, 5334, 780, 5274, 251, 5122, 782, 6017, 838, 5342, + 782, 480, 203, 780, 780, 6398, 332, 427, 5351, 577, + 203, 5354, 5355, 780, 112, 203, 5359, 65, 780, 296, + 5363, 655, 101, 5274, 649, 203, 203, 143, 5371, 116, + 432, 30, 258, 5376, 779, 3641, 3053, 3915, 782, 5257, + 5255, 5253, 3763, 6102, 5781, 612, 4372, 5952, 5462, 5821, + 5979, 6209, 702, 2133, 774, 5137, 5375, 1469, 5375, 693, + 3940, 4446, 3924, 5046, 4457, 2558, 2121, 3074, 4242, 5244, + 4013, 3991, 2467, 707, 840, 2663, 5652, 5651, 5496, 2664, + 5498, 5421, 4872, 2665, 4393, 5525, 4616, 5317, 4620, 656, + 6023, 2901, 6392, 4724, 4725, 4726, 4727, 4728, 4729, 4730, + 4731, 4732, 4733, 5003, 4735, 4736, 4737, 4738, 4739, 4740, + 4741, 4742, 4743, 4744, 5599, 6139, 4747, 4748, 6277, 6234, + 5907, 5440, 5597, 5440, 5375, 3185, 1457, 4867, 5191, 5497, + 5803, 6036, 5475, 5499, 5477, 5235, 5363, 4873, 5079, 6102, + 6258, 6092, 5995, 5984, 5984, 5984, 5984, 5274, 5467, 4555, + 5467, 43, 4508, 6105, 4033, 6017, 1621, 997, 2502, 5502, + 5503, 5504, 5505, 4112, 3317, 4583, 5509, 5510, 4578, 5512, + 4586, 6283, 491, 1013, 5517, 5518, 68, 1017, 5521, 491, + 6252, 748, 750, 5526, 5527, 77, 6253, 5788, 3755, 5440, + 5533, 5534, 759, 5536, 6048, 763, 92, 93, 94, 95, + 1040, 5544, 6060, 5378, 1044, 6064, 98, 5698, 2527, 1049, + 5495, 4278, 780, 4872, 782, 4846, 5467, 785, 786, 5394, + 4851, 5564, 5493, 5232, 1885, 1478, 5866, 2317, 3743, 3738, + 5573, 123, 3213, 6014, 5702, 127, 2484, 4001, 130, 3591, + 6208, 3042, 138, 139, 140, 3375, 4490, 537, 5375, 141, + 3551, 5664, 1441, 5671, 6159, 780, 3684, 1388, 1206, 5672, + 1428, 5674, 3820, 4917, 3600, 157, 4607, 3502, 3499, 5612, + 2055, 3569, 3568, 165, 1114, 1115, 1116, 1117, 4149, 5622, + 1120, 2111, 4058, 5626, 4946, 177, 1987, 1127, 1956, 1977, + 5633, 5634, 6092, 189, 190, 5638, 5639, 6211, 5983, 6316, + 6315, 5480, 2368, 2373, 5156, 5648, 4660, 5987, 5054, 201, + 5988, 1386, 1386, 5440, 2363, 3162, 1386, 5660, 1386, 5662, + 1962, 5664, 1386, 5666, 2389, 4135, 5651, 6232, 3807, 5672, + 4805, 5674, 4133, 5676, 4804, 5884, 5714, 5312, 5029, 3823, + 5467, 5308, 4947, 3816, 5329, 786, 1419, 4566, 1449, 241, + 4811, 509, 491, 3156, 246, 247, 3331, 253, 5701, 703, + 2628, 4487, 1296, 3368, 5707, 4672, 5709, 5612, 3850, 4659, + 5060, 5714, 6272, 4657, 884, 2576, 3013, 885, 5796, 694, + 5723, 2193, 5800, 1223, 3014, 694, 3676, 1444, 3068, 5648, + 694, 5734, 5735, 5345, 2306, 1890, 4493, 6275, 5161, 6321, + 5489, 6395, 6402, 1001, 3365, 5818, 5819, 3033, 5333, 3418, + 3653, 693, 3654, 2670, 2947, 3655, 3650, 5760, 693, 2644, + 316, 313, 3646, 3645, 4183, 691, 1187, 1221, 5771, 2337, + 4382, 3596, 4923, 3207, 5777, 6403, 4825, 2133, 1878, 1878, + 3758, 5569, 5785, 4394, 5787, 734, 1330, 515, 491, 491, + 491, 970, 4484, 2666, 4016, 5973, 5087, 989, 5801, 4676, + 352, 5974, 6203, 970, 4291, 5431, 5440, 3764, 5099, 1309, + 5440, 5432, 5469, 1313, 6379, 5818, 5447, -1, 5797, 6384, + 5797, 876, 374, 989, -1, 2536, -1, 1816, -1, -1, + 5858, -1, -1, -1, -1, -1, -1, -1, -1, 5842, + 5819, -1, 5819, -1, -1, 43, -1, -1, 5819, 5852, + -1, 5854, -1, -1, -1, 411, -1, 5860, 5861, 5862, + -1, -1, -1, -1, -1, -1, 5944, -1, -1, -1, + 68, -1, -1, -1, -1, -1, -1, -1, 5819, 77, + -1, -1, -1, 5961, 108, -1, 5797, -1, -1, -1, + -1, -1, 444, -1, -1, -1, -1, -1, -1, -1, + 98, -1, -1, -1, -1, -1, -1, -1, 5819, -1, + -1, -1, -1, -1, 1414, 5918, -1, 1417, 142, -1, + 5923, -1, 478, -1, -1, 123, 5929, -1, 2639, 127, + -1, -1, 130, -1, -1, -1, -1, -1, -1, 997, + -1, -1, -1, 141, -1, -1, -1, -1, -1, 5952, + 1450, -1, 2663, -1, -1, 179, 2667, -1, -1, 157, + -1, -1, -1, -1, -1, -1, -1, 165, -1, -1, + -1, -1, -1, -1, -1, 5978, -1, -1, -1, 177, + 5983, -1, -1, -1, 5987, 5988, 1044, 1487, 544, -1, + 546, -1, -1, -1, -1, -1, 552, -1, -1, -1, + -1, -1, -1, 201, -1, -1, -1, -1, -1, -1, + 5797, 6014, -1, -1, -1, -1, -1, -1, -1, -1, + 6023, -1, -1, -1, -1, -1, -1, 6105, -1, -1, + 582, -1, 5819, 6036, -1, -1, 6109, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, 246, 247, + -1, -1, -1, -1, -1, -1, 612, -1, -1, -1, + -1, -1, 1120, -1, -1, 6068, -1, -1, -1, -1, + -1, -1, -1, 6076, -1, 6078, 6079, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, + 7, -1, -1, 6092, -1, -1, -1, -1, -1, -1, + 656, 18, -1, -1, 5939, -1, 6109, 6092, -1, -1, + -1, -1, -1, -1, -1, 313, -1, -1, -1, -1, + -1, -1, -1, 6201, -1, -1, -1, 6205, -1, 6202, + 6203, -1, -1, -1, 6137, -1, 53, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 352, -1, 6159, -1, -1, -1, + -1, -1, -1, -1, 81, 1223, -1, -1, -1, -1, + -1, -1, -1, -1, 6177, 6178, 374, -1, 6181, 6257, + 6258, 733, -1, -1, -1, 6188, -1, -1, -1, -1, + -1, -1, 748, -1, -1, 6030, 6031, -1, -1, 6202, + 6203, -1, 119, 759, -1, -1, 123, 6042, -1, -1, + 127, -1, -1, -1, -1, -1, -1, -1, -1, 136, + 137, 6299, -1, -1, 2935, -1, -1, -1, 6306, 6232, + 147, -1, -1, -1, -1, 152, -1, 154, -1, -1, + -1, 158, -1, 6246, -1, -1, 444, -1, -1, 166, + -1, 168, -1, -1, -1, 1313, 173, 481, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6272, + -1, -1, -1, -1, -1, -1, 193, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 203, 511, 512, 206, + 514, 515, 516, 517, 518, -1, 520, 521, 522, 523, + 524, 525, 526, 527, -1, 529, 530, 531, 532, 226, + -1, -1, -1, 6148, -1, -1, 6151, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 245, -1, + -1, -1, 249, -1, -1, -1, -1, -1, -1, -1, + -1, 258, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1414, 3068, -1, 1417, + 277, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6375, -1, -1, 292, 6379, -1, -1, 1879, + -1, 6384, 299, -1, 582, -1, 6389, -1, 1888, -1, + 1890, -1, 6395, -1, -1, 312, -1, 314, -1, 6402, + -1, 625, 626, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1949, + 1950, -1, -1, -1, -1, 1955, -1, -1, -1, 1959, + 1960, 1961, -1, -1, -1, -1, -1, -1, -1, 1969, + 1970, 1971, -1, -1, -1, 1975, -1, -1, -1, 1979, + 1980, 1981, -1, 1983, 1984, 1985, 1986, 1987, -1, -1, + -1, -1, -1, 1993, -1, 1995, -1, -1, 1998, 1999, + 2000, 2001, -1, 2003, -1, 2005, 2006, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2019, + 2020, 2021, 2022, 2023, -1, 2025, 2026, 2027, 2028, 2029, + 2030, -1, 2032, 2033, -1, 2035, 2036, -1, 2038, 2039, + -1, -1, 2042, 2043, -1, 2045, 2046, -1, 2048, -1, + 2050, -1, -1, -1, 2054, 2055, 2056, -1, -1, 2059, + 2060, 2061, 2062, -1, 2064, -1, -1, -1, -1, -1, + -1, 2071, -1, 18, 19, 20, -1, 2077, 2078, 2079, + 2080, -1, -1, -1, -1, -1, -1, 3298, 2088, 2089, + -1, 2091, 2092, -1, -1, 2095, 2096, 2097, 2098, 2099, + 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 5899, 5900, + 2110, 5902, 5903, 5904, 5905, 2115, -1, -1, -1, -1, + -1, -1, 2122, -1, -1, -1, 71, -1, 73, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2145, -1, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, + 577, -1, -1, 2163, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6, 7, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 18, 19, 20, -1, -1, -1, -1, -1, -1, -1, + 145, 3412, 3413, 3414, -1, -1, -1, 3418, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 46, 3430, + 48, 49, -1, 3434, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6029, -1, + -1, 6032, 70, -1, 72, -1, -1, -1, -1, 6040, + 78, -1, 6043, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2262, -1, 2264, -1, -1, -1, -1, -1, + 215, 99, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 110, -1, -1, -1, -1, -1, 2288, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2299, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 145, -1, -1, + -1, 1879, -1, -1, -1, -1, -1, 272, 273, 274, + -1, -1, -1, 750, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 173, 763, 292, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 780, -1, 782, -1, -1, 785, 786, + -1, -1, -1, -1, -1, -1, 204, -1, 206, -1, + -1, -1, -1, -1, -1, -1, 2386, 215, -1, 217, + -1, -1, 2392, -1, 2394, -1, -1, -1, -1, -1, + -1, 346, -1, 348, -1, -1, -1, -1, -1, -1, + -1, -1, 240, 1971, 2414, -1, -1, -1, -1, -1, + -1, 366, 2422, 368, -1, -1, -1, -1, 1986, 1987, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 386, -1, -1, 272, 273, 274, -1, 393, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 408, 292, -1, -1, -1, -1, -1, + 415, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 430, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 43, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 338, -1, -1, -1, -1, -1, -1, -1, 346, -1, + 348, -1, -1, 68, -1, -1, -1, -1, -1, -1, + -1, -1, 77, -1, -1, -1, -1, -1, -1, -1, + 368, -1, 487, -1, -1, -1, -1, 375, -1, -1, + -1, -1, 497, 98, -1, -1, -1, 2115, 386, -1, + -1, -1, -1, -1, 2122, 393, -1, -1, 113, 114, + 115, -1, -1, -1, -1, -1, -1, -1, 123, -1, + 408, -1, 127, -1, -1, 130, -1, 415, -1, -1, + 535, 419, 420, -1, -1, -1, 141, -1, 426, -1, + -1, -1, 430, 548, -1, 2163, -1, -1, -1, -1, + 438, -1, 157, -1, -1, -1, -1, -1, -1, -1, + 165, -1, -1, -1, -1, -1, -1, -1, -1, 2629, + -1, 459, 177, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 587, -1, -1, -1, -1, -1, 593, -1, + -1, -1, -1, -1, -1, 483, 201, -1, -1, 487, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 497, + -1, -1, -1, 2673, 2674, -1, -1, -1, -1, -1, + -1, -1, 2682, 2683, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, 246, 247, -1, -1, -1, 651, 535, -1, 11, + 3921, 13, -1, 658, -1, -1, 18, 19, 20, -1, + 548, -1, 550, -1, -1, -1, -1, -1, -1, 3940, + 2288, -1, -1, -1, -1, -1, 2736, -1, -1, -1, + -1, -1, -1, -1, -1, 690, -1, 2747, 2748, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 587, + 705, 706, -1, -1, -1, 593, 311, -1, 313, 71, + 43, 73, -1, 718, -1, -1, -1, -1, -1, 2779, + 2780, 2781, -1, -1, -1, -1, -1, -1, -1, -1, + 618, -1, -1, -1, -1, 68, -1, 99, -1, -1, + -1, 629, 630, 631, 77, -1, -1, 352, -1, -1, + -1, -1, 4023, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 651, -1, 98, -1, -1, 2828, 374, + 658, -1, -1, -1, 2392, -1, 2394, 782, 2838, -1, + -1, 2841, -1, 145, -1, -1, -1, -1, -1, -1, + 123, -1, -1, -1, 127, -1, 2856, 130, -1, -1, + 2860, 2861, 690, 2863, 2864, 167, -1, -1, 141, -1, + -1, -1, 2872, -1, 2874, -1, -1, 705, 706, -1, + -1, -1, 427, -1, 157, -1, -1, -1, -1, -1, + 718, -1, 165, -1, 722, -1, -1, -1, -1, 444, + -1, -1, -1, -1, 177, 2905, -1, -1, -1, -1, + -1, -1, -1, 215, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 43, 201, -1, + -1, 2931, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2943, -1, -1, -1, 2947, -1, -1, + -1, -1, 68, -1, -1, -1, 2956, -1, 786, -1, + -1, 77, -1, -1, -1, -1, -1, 2967, 241, -1, + 272, 273, 274, 246, 247, -1, -1, -1, -1, -1, + -1, -1, 98, 2983, -1, -1, -1, -1, -1, -1, + 292, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 674, -1, -1, -1, -1, -1, -1, 123, -1, -1, + -1, 127, -1, -1, 130, -1, -1, -1, -1, -1, + 3020, -1, -1, -1, -1, 141, -1, 3027, -1, -1, + -1, -1, -1, -1, 3034, -1, -1, 582, -1, -1, + 313, 157, -1, -1, 346, -1, 348, 721, 321, 165, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 177, -1, -1, 366, -1, 368, -1, -1, -1, + -1, 4282, 4283, 3073, 3074, -1, -1, -1, -1, 352, + -1, -1, -1, -1, 386, 201, -1, -1, -1, -1, + -1, 393, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 374, -1, -1, -1, -1, 408, -1, -1, -1, + -1, -1, -1, 415, -1, 2673, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, 3126, -1, 430, -1, + 246, 247, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 427, -1, -1, -1, -1, 3159, + -1, -1, -1, -1, 838, -1, -1, -1, -1, -1, + -1, 444, 3172, -1, 3174, 3175, 3176, -1, 3178, -1, + -1, -1, 4393, 3183, 3184, 487, -1, -1, -1, 2747, + 2748, -1, -1, -1, -1, 497, -1, 313, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3219, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 535, -1, -1, 352, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 548, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 374, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2828, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2841, -1, 587, -1, -1, -1, -1, + -1, 593, -1, -1, 19, 20, -1, -1, -1, -1, + 3300, 3301, -1, -1, -1, -1, -1, -1, -1, 582, + -1, 427, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 47, -1, 49, -1, -1, -1, 444, -1, + -1, -1, 57, -1, -1, -1, -1, -1, -1, 1013, + -1, -1, -1, 1017, -1, -1, 71, 4558, -1, 651, + -1, -1, -1, -1, 79, 80, 658, -1, -1, -1, + -1, -1, -1, -1, 89, 3365, 1040, -1, -1, -1, + -1, -1, -1, 2931, -1, 1049, -1, -1, 103, 104, + -1, -1, -1, -1, -1, -1, -1, -1, 690, 2947, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 705, 706, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 718, -1, -1, 3419, + 145, -1, -1, 3423, -1, -1, 3426, -1, -1, -1, + -1, -1, -1, -1, 159, 3435, -1, -1, -1, -1, + 1114, 1115, 1116, 1117, 3444, -1, 3446, 3447, -1, 3449, + 3450, 3451, 3452, 1127, 3454, -1, 3456, 3457, -1, 3459, + -1, -1, -1, -1, -1, -1, 582, 3467, 3468, -1, + -1, -1, 3472, 3473, 3474, -1, 3034, -1, -1, -1, + -1, -1, 3482, 3483, 3484, -1, 3486, -1, 3488, 214, + 3490, -1, 3492, -1, 3494, -1, -1, -1, -1, 3499, + 3500, 226, 3502, 3503, 3504, -1, -1, -1, 3508, -1, + -1, 3511, -1, -1, -1, 3073, 3074, -1, -1, -1, + 3520, -1, -1, 3523, -1, 3525, 3526, 3527, -1, -1, + 3530, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4753, -1, -1, 18, 19, 20, -1, -1, + -1, -1, 3552, -1, 3554, -1, 281, 3557, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3567, 3568, 3569, + 3570, 3571, 3572, 46, -1, 48, -1, 3577, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3588, -1, + -1, -1, -1, -1, -1, -1, -1, 70, -1, 324, + -1, -1, -1, -1, -1, 78, -1, -1, -1, -1, + -1, -1, -1, -1, 3172, -1, 3174, 3175, 3176, 344, + -1, -1, -1, -1, -1, 3625, 99, -1, 353, -1, + -1, -1, -1, -1, -1, 1309, -1, 110, -1, 3639, + -1, 366, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 377, -1, -1, 3655, 4867, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 145, -1, -1, 400, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3688, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 173, -1, -1, -1, 429, 430, -1, -1, 433, -1, + 435, 3711, -1, 48, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4934, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 206, -1, -1, -1, 462, 463, -1, + -1, -1, 215, 468, 469, 80, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 485, -1, -1, -1, -1, -1, 101, 240, -1, -1, + -1, -1, -1, -1, -1, 110, 1450, -1, -1, -1, + -1, 506, -1, 3783, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 131, -1, -1, 272, + 273, 274, -1, 528, 3804, -1, -1, 3365, -1, -1, + 145, -1, -1, 1487, -1, 150, 3816, -1, -1, 292, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, -1, -1, -1, 173, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 582, -1, 68, + -1, -1, -1, -1, -1, 338, -1, -1, 77, -1, + -1, -1, 597, 346, -1, 348, -1, -1, -1, -1, + -1, 606, -1, -1, 609, 610, -1, -1, -1, 98, + -1, -1, -1, -1, -1, 368, -1, 232, -1, 624, + -1, 236, -1, -1, -1, -1, -1, 5118, -1, 5120, + -1, 5122, -1, 386, 123, -1, -1, -1, 127, 254, + 393, 130, -1, 258, 259, -1, -1, -1, -1, -1, + -1, -1, 141, -1, -1, 408, 661, -1, -1, -1, + -1, -1, 415, -1, 669, -1, 419, -1, 157, -1, + -1, -1, -1, 426, 289, -1, 165, 430, -1, -1, + -1, 296, 297, 688, -1, 690, -1, -1, 177, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3978, -1, + -1, -1, -1, -1, -1, -1, 459, -1, -1, -1, + 3990, -1, 201, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4011, -1, 3571, 487, 740, -1, -1, 353, -1, + -1, 5232, 747, -1, 497, -1, 4026, -1, -1, 4029, + 3588, -1, 241, -1, -1, -1, -1, 246, 247, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4054, 4055, -1, -1, 393, 4059, + -1, -1, 535, 5274, -1, -1, -1, -1, 4068, -1, + -1, -1, -1, -1, -1, 548, -1, 550, -1, -1, + -1, 4081, -1, 4083, -1, 4085, -1, 4087, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3655, -1, -1, + -1, 436, 4102, -1, 313, -1, 441, -1, 4108, -1, + -1, -1, -1, -1, 587, -1, -1, 452, 453, -1, + 593, 4121, 4122, -1, -1, -1, 4126, -1, 4128, -1, + 4130, -1, -1, -1, -1, 4135, -1, -1, -1, -1, + -1, -1, -1, 352, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5375, 374, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4176, -1, 651, -1, + -1, -1, 4182, -1, -1, 658, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4196, -1, -1, -1, + 4200, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1888, -1, 1890, 690, 4218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5440, + -1, -1, 705, 706, -1, 444, -1, -1, -1, -1, + -1, -1, 4242, -1, -1, 718, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5467, -1, 3816, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 607, -1, -1, 1949, 1950, -1, -1, -1, + -1, 1955, 617, -1, -1, 1959, 1960, 1961, -1, -1, + -1, -1, -1, 628, -1, 1969, 1970, -1, -1, 634, + -1, 1975, -1, -1, -1, 1979, 1980, 1981, -1, 1983, + 1984, 1985, -1, 4313, -1, -1, -1, -1, -1, 1993, + -1, 1995, -1, 4323, 1998, 1999, 2000, 2001, -1, 2003, + 665, 2005, 2006, -1, 669, -1, -1, 4337, -1, 4339, + 4340, -1, -1, -1, -1, 2019, 2020, 2021, 2022, 2023, + -1, 2025, 2026, 2027, 2028, 2029, 2030, -1, 2032, 2033, + -1, 2035, 2036, 698, 2038, 2039, -1, -1, 2042, 2043, + -1, 2045, 2046, 582, 2048, -1, 2050, -1, -1, -1, + 2054, 2055, 2056, -1, -1, 2059, 2060, 2061, 2062, -1, + 2064, -1, -1, -1, -1, -1, -1, 2071, -1, -1, + -1, -1, -1, 2077, 2078, 2079, 2080, -1, -1, -1, + -1, -1, -1, -1, 2088, 2089, -1, 2091, 2092, -1, + 3978, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, + 2104, 2105, 2106, 2107, -1, -1, 2110, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2145, -1, 56, 57, -1, -1, -1, 61, 62, + -1, -1, -1, -1, -1, -1, -1, -1, 71, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4068, -1, -1, 96, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 109, -1, -1, -1, + 4530, 4531, -1, 4533, -1, -1, -1, -1, -1, -1, + -1, -1, 125, -1, 127, -1, 4546, 4547, 4548, -1, + 4108, -1, -1, -1, -1, -1, -1, 5768, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4570, 4571, 155, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5796, 5797, -1, 2262, 5800, + 2264, 174, 175, 176, 4594, -1, -1, -1, -1, -1, + -1, 184, 185, 186, -1, -1, 4606, -1, 5819, -1, + -1, -1, -1, -1, -1, 4615, -1, -1, 4176, 202, + -1, -1, -1, -1, -1, 2299, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4635, -1, -1, -1, -1, + 4640, 4641, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 234, -1, -1, -1, -1, -1, -1, -1, 4659, + -1, -1, -1, 4663, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 261, -1, + -1, -1, -1, -1, 4242, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5907, -1, -1, -1, + -1, 284, 285, 286, 5915, -1, -1, 43, -1, -1, + 5921, 5922, 2386, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 306, 307, 18, 19, 20, 18, 19, + 20, -1, 68, 5944, -1, -1, -1, -1, -1, -1, + 2414, 77, -1, -1, -1, -1, -1, -1, 2422, -1, + 5961, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 98, -1, -1, -1, -1, -1, -1, -1, + -1, 354, -1, 356, 357, -1, -1, -1, 71, -1, + 73, 4339, -1, -1, -1, -1, -1, 123, -1, -1, + 373, 127, -1, -1, 130, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 141, 99, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 157, -1, -1, -1, -1, 409, 410, -1, 165, + -1, -1, -1, -1, -1, -1, -1, 6048, -1, -1, + -1, 177, -1, -1, -1, -1, -1, -1, -1, 6060, + -1, -1, 145, 6064, -1, 145, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 201, -1, -1, -1, -1, + -1, -1, 455, -1, -1, -1, -1, -1, -1, -1, + 4880, 4881, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 6105, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + 246, 247, -1, 496, -1, -1, -1, -1, -1, -1, + -1, -1, 215, -1, -1, 215, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4944, -1, -1, 4947, -1, -1, + -1, -1, -1, -1, -1, 2629, -1, -1, 6169, 6170, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 558, 559, 313, -1, 272, + 273, 274, 272, 273, 274, -1, -1, -1, -1, -1, + 6201, 574, 575, -1, -1, -1, -1, -1, 4998, 292, + 2674, -1, 292, -1, -1, -1, -1, -1, 2682, 2683, + -1, -1, -1, -1, -1, -1, 352, 5017, -1, -1, + -1, -1, -1, -1, -1, 5025, 5026, -1, -1, -1, + -1, -1, -1, 616, -1, -1, -1, -1, 374, 6250, + -1, 6252, 6253, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 346, -1, 348, 346, -1, 348, -1, + 5060, -1, 2736, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 366, -1, 368, -1, -1, 368, -1, + -1, -1, 6293, -1, -1, -1, -1, -1, -1, -1, + -1, 427, -1, 386, -1, -1, 386, -1, -1, -1, + 393, -1, -1, 393, -1, 2779, 2780, 2781, 444, -1, + -1, -1, -1, -1, -1, 408, -1, 6328, 408, -1, + -1, -1, 415, -1, -1, 415, -1, 710, -1, 43, + 713, -1, -1, 716, -1, -1, -1, 430, -1, -1, + 430, -1, -1, -1, -1, -1, 5146, 6358, 5148, -1, + -1, -1, -1, -1, 68, -1, 739, -1, -1, -1, + -1, -1, -1, 77, 2838, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 759, -1, -1, -1, + -1, -1, 2856, -1, 98, -1, 2860, 2861, -1, 2863, + 2864, -1, -1, -1, 487, -1, -1, 487, 2872, -1, + 2874, -1, -1, -1, 497, -1, -1, 497, -1, 123, + -1, -1, -1, 127, -1, -1, 130, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, + -1, 2905, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 535, 157, -1, 535, 582, -1, -1, -1, + -1, 165, -1, -1, -1, 548, -1, 2931, 548, -1, + -1, 5261, -1, 177, -1, -1, -1, -1, -1, 2943, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2956, -1, -1, 5285, -1, 201, -1, -1, + -1, -1, -1, 2967, 587, -1, -1, 587, -1, -1, + 593, -1, -1, 593, -1, -1, -1, -1, 5308, 2983, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5324, 5325, 674, 241, -1, -1, + -1, -1, 246, 247, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3020, -1, -1, -1, + -1, -1, -1, 3027, -1, -1, -1, -1, 651, -1, + -1, 651, -1, -1, -1, 658, -1, -1, 658, -1, + -1, -1, -1, 721, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, + -1, -1, -1, -1, -1, -1, -1, 690, -1, 313, + 690, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 705, 706, -1, 705, 706, -1, -1, -1, + -1, -1, -1, -1, -1, 718, -1, -1, 718, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 352, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3126, -1, -1, -1, -1, -1, -1, 5017, + 374, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3159, -1, -1, -1, -1, + 838, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3178, -1, -1, -1, -1, 3183, + 3184, -1, -1, 427, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 444, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3219, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5575, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5599, + -1, -1, -1, -1, -1, -1, -1, 5607, -1, -1, + -1, -1, -1, 5613, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3300, 3301, -1, 5629, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1013, -1, -1, 582, 1017, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1040, -1, -1, -1, -1, -1, -1, -1, + -1, 1049, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5739, + -1, -1, -1, -1, -1, 3419, -1, -1, -1, 3423, + -1, -1, 3426, -1, -1, -1, -1, -1, -1, -1, + -1, 3435, -1, -1, -1, -1, 1114, 1115, 1116, 1117, + 3444, -1, 3446, 3447, -1, 3449, 3450, 3451, 3452, 1127, + 3454, -1, 3456, 3457, -1, 3459, -1, -1, -1, -1, + -1, -1, -1, 3467, 3468, -1, -1, -1, 3472, 3473, + 3474, -1, -1, -1, -1, -1, -1, -1, 3482, 3483, + 3484, -1, 3486, -1, 3488, -1, 3490, -1, 3492, -1, + 3494, -1, -1, -1, -1, 3499, 3500, -1, 3502, 3503, + 3504, -1, -1, -1, 3508, -1, -1, 3511, -1, -1, + -1, -1, -1, -1, -1, -1, 3520, -1, -1, 3523, + -1, 3525, 3526, 3527, -1, -1, 3530, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5867, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3552, -1, + 3554, -1, -1, 3557, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3567, 3568, 3569, 3570, -1, 3572, -1, + -1, -1, -1, 3577, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 526, -1, + -1, 3625, -1, 5953, -1, -1, -1, -1, -1, -1, + -1, 1309, -1, -1, -1, 3639, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5995, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6007, -1, -1, + -1, -1, -1, -1, 3688, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3711, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5607, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6092, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1450, -1, -1, -1, -1, -1, -1, 3783, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3804, -1, -1, -1, -1, -1, -1, -1, -1, 1487, + -1, -1, -1, -1, 6144, -1, -1, -1, -1, 727, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 776, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6273, -1, -1, -1, 6277, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3990, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4011, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4026, -1, -1, 4029, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 954, -1, -1, -1, + 4054, 4055, -1, -1, -1, 4059, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 6406, 4081, -1, 4083, + -1, 4085, -1, 4087, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4121, 4122, -1, + -1, -1, 4126, -1, 4128, -1, 4130, -1, -1, -1, + -1, 4135, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4182, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4196, -1, -1, -1, 4200, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1888, -1, 1890, -1, 4218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1949, 1950, -1, -1, -1, -1, 1955, -1, -1, + -1, 1959, 1960, 1961, -1, -1, -1, -1, -1, -1, + -1, 1969, 1970, -1, -1, -1, -1, 1975, -1, -1, + -1, 1979, 1980, 1981, -1, 1983, 1984, 1985, -1, 4313, + -1, -1, -1, -1, -1, 1993, -1, 1995, -1, 4323, + 1998, 1999, 2000, 2001, -1, 2003, -1, 2005, 2006, -1, + -1, -1, -1, 4337, -1, -1, 4340, -1, -1, -1, + -1, 2019, 2020, 2021, 2022, 2023, -1, 2025, 2026, 2027, + 2028, 2029, 2030, -1, 2032, 2033, -1, 2035, 2036, -1, + 2038, 2039, -1, -1, 2042, 2043, -1, 2045, 2046, -1, + 2048, -1, 2050, -1, -1, -1, 2054, 2055, 2056, -1, + -1, 2059, 2060, 2061, 2062, -1, 2064, -1, -1, 1297, + -1, -1, -1, 2071, -1, 1303, -1, -1, -1, 2077, + 2078, 2079, 2080, -1, -1, -1, -1, -1, -1, -1, + 2088, 2089, -1, 2091, 2092, -1, -1, 2095, 2096, 2097, + 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, + -1, -1, 2110, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2145, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1386, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4530, 4531, -1, 4533, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4546, 4547, 4548, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1471, -1, -1, 4570, 4571, -1, -1, + -1, -1, -1, -1, 1482, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2262, -1, 2264, -1, -1, -1, + 4594, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4606, -1, -1, -1, -1, -1, -1, -1, + -1, 4615, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2299, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4635, -1, -1, -1, -1, 4640, 4641, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4659, -1, -1, -1, 4663, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2386, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2414, -1, -1, -1, + -1, -1, -1, -1, 2422, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4880, 4881, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1820, -1, 1822, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4944, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2629, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4998, -1, 2674, -1, -1, -1, + -1, -1, -1, -1, 2682, 2683, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5025, 5026, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5060, -1, 2736, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2779, 2780, 2781, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2037, + -1, -1, -1, 2041, -1, -1, -1, -1, -1, 2047, + -1, -1, 5146, -1, 5148, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2838, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2856, -1, + -1, -1, 2860, 2861, -1, 2863, 2864, -1, -1, -1, + -1, -1, -1, -1, 2872, -1, 2874, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2127, + -1, -1, -1, -1, -1, -1, -1, 2905, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 674, -1, -1, -1, + -1, -1, -1, 2931, -1, -1, -1, 5261, -1, -1, + -1, -1, -1, 2171, -1, 2943, -1, -1, 2176, -1, + 2178, -1, -1, -1, -1, -1, -1, -1, 2956, -1, + -1, 5285, -1, -1, -1, -1, -1, -1, -1, 2967, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5308, 2983, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2225, -1, -1, + 5324, 5325, -1, -1, -1, -1, -1, -1, -1, 2237, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3020, -1, -1, -1, -1, -1, -1, 3027, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 838, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2343, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3126, -1, + -1, -1, -1, 2361, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2372, 2373, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3159, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3178, -1, -1, -1, -1, 3183, 3184, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3219, 2450, -1, -1, -1, -1, -1, 2456, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5575, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1017, + -1, -1, -1, -1, -1, 5599, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5613, + -1, -1, 1040, -1, -1, -1, -1, -1, -1, -1, + -1, 1049, 3300, 3301, -1, 5629, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1117, + -1, -1, -1, -1, -1, -1, -1, -1, 2606, 2607, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2634, -1, -1, -1, + -1, -1, -1, -1, -1, 5739, 2644, -1, -1, -1, + -1, 3419, -1, -1, -1, 3423, -1, -1, 3426, -1, + -1, -1, -1, -1, -1, -1, -1, 3435, -1, -1, + -1, -1, -1, -1, -1, -1, 3444, -1, 3446, 3447, + -1, 3449, 3450, 3451, 3452, -1, 3454, -1, 3456, 3457, + -1, 3459, -1, -1, -1, -1, -1, -1, -1, 3467, + 3468, -1, -1, -1, 3472, 3473, 3474, -1, -1, -1, + -1, -1, -1, -1, 3482, 3483, 3484, -1, 3486, -1, + 3488, -1, 3490, -1, 3492, -1, 3494, -1, -1, -1, + -1, 3499, 3500, -1, 3502, 3503, 3504, -1, -1, -1, + 3508, -1, -1, 3511, -1, -1, -1, -1, -1, -1, + -1, -1, 3520, -1, -1, 3523, -1, 3525, 3526, 3527, + -1, -1, 3530, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5867, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3552, -1, 3554, -1, -1, 3557, + -1, 1309, -1, -1, -1, -1, -1, -1, -1, 3567, + 3568, 3569, 3570, -1, 3572, -1, -1, -1, -1, 3577, + -1, -1, -1, -1, 2812, -1, -1, -1, 2816, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3625, -1, 5953, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3639, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5995, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6007, -1, -1, -1, -1, -1, -1, + 3688, -1, -1, -1, -1, -1, -1, -1, 2926, 2927, + -1, -1, 1450, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3711, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1487, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6092, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3783, -1, -1, -1, 3017, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3804, -1, -1, -1, + -1, -1, -1, -1, 3042, -1, -1, -1, -1, -1, + 6144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3113, -1, -1, -1, -1, + -1, -1, -1, -1, 3122, -1, -1, -1, -1, 3127, + -1, -1, -1, -1, -1, 3133, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3148, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6273, + -1, -1, -1, 6277, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3990, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4011, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4026, -1, + -1, 4029, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4054, 4055, -1, -1, + -1, 4059, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6406, 4081, -1, 4083, -1, 4085, -1, 4087, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4102, -1, -1, -1, -1, -1, + -1, 3339, -1, -1, 3342, -1, -1, -1, -1, -1, + -1, -1, -1, 4121, 4122, -1, -1, -1, 4126, -1, + 4128, -1, 4130, -1, -1, -1, -1, 4135, -1, -1, + 1888, -1, 1890, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4182, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4196, -1, + -1, -1, 4200, -1, -1, -1, -1, 1955, -1, -1, + -1, 1959, -1, 1961, -1, -1, -1, -1, -1, -1, + 4218, 1969, 1970, -1, -1, -1, -1, 1975, -1, -1, + -1, 1979, 1980, 1981, -1, 1983, 1984, 1985, -1, -1, + -1, -1, -1, -1, -1, 1993, -1, 1995, -1, -1, + 1998, 1999, 2000, 2001, -1, -1, -1, 2005, 2006, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2019, 2020, 2021, 2022, 2023, -1, 2025, 2026, 2027, + 2028, 2029, -1, -1, 2032, 2033, -1, 2035, 2036, -1, + 2038, 2039, -1, -1, -1, 2043, -1, 2045, 2046, -1, + 2048, -1, 2050, -1, -1, -1, 2054, 2055, 2056, -1, + -1, 2059, -1, 2061, 2062, 4313, 2064, -1, -1, -1, + -1, -1, -1, 2071, -1, 4323, -1, -1, -1, 2077, + 2078, 2079, -1, -1, -1, -1, -1, -1, -1, 4337, + -1, -1, 4340, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3591, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2145, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3695, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2262, -1, 2264, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4530, 4531, -1, 4533, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3775, 4546, 4547, + 4548, 2299, -1, -1, -1, -1, -1, -1, -1, 3787, + -1, -1, -1, 3791, -1, -1, -1, -1, -1, -1, + -1, -1, 4570, 4571, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4594, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4606, -1, + -1, -1, -1, -1, -1, -1, -1, 4615, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4635, 2386, -1, + -1, -1, 4640, 4641, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4659, -1, -1, -1, 4663, 2414, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3975, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4001, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2629, 4880, 4881, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2674, -1, -1, -1, + -1, -1, -1, -1, 2682, 2683, -1, -1, 4166, -1, + -1, -1, -1, -1, -1, -1, 4944, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2736, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4998, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5025, 5026, -1, + -1, 2779, 2780, 2781, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4275, -1, -1, + -1, -1, 4280, 4281, -1, -1, -1, -1, -1, -1, + -1, -1, 5060, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4309, 4310, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2856, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2872, -1, 2874, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5146, -1, + 5148, -1, -1, -1, -1, -1, -1, 2905, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2931, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2943, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2956, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2967, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2983, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5261, -1, -1, -1, -1, -1, -1, + -1, -1, 3020, -1, -1, -1, -1, -1, -1, 3027, + -1, -1, -1, -1, -1, -1, -1, 5285, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5308, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5324, 5325, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3126, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3159, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3178, -1, -1, -1, -1, 3183, 3184, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3219, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4713, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4723, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3300, 3301, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5575, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5599, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5613, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5629, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3419, -1, -1, -1, 3423, -1, -1, 3426, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3444, -1, -1, -1, + -1, 3449, 3450, 3451, 3452, -1, 3454, -1, 3456, 3457, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3467, + 3468, -1, -1, -1, 3472, 3473, 3474, -1, -1, -1, + -1, -1, -1, -1, 3482, 3483, 3484, -1, 3486, -1, + 3488, 5739, 3490, -1, 3492, -1, 3494, -1, -1, -1, + -1, 3499, 3500, -1, 3502, -1, 3504, -1, -1, -1, + 3508, -1, -1, 3511, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3523, -1, 3525, 3526, 3527, + -1, -1, 3530, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3557, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3568, 3569, -1, -1, 3572, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5085, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5867, + -1, -1, -1, -1, -1, -1, -1, 3625, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3639, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3688, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5953, -1, -1, -1, -1, + -1, -1, -1, 3711, -1, -1, -1, -1, -1, -1, + 5198, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5217, + -1, -1, -1, -1, -1, -1, -1, 5995, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6007, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3804, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 6092, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 6144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3990, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4011, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 6273, -1, -1, 4026, 6277, + -1, 4029, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4054, 4055, -1, -1, + -1, 4059, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4081, -1, 4083, -1, 4085, -1, 4087, + -1, -1, -1, -1, -1, 5573, -1, -1, -1, -1, + -1, -1, -1, -1, 4102, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4121, 4122, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4135, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5634, -1, 6406, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4182, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4196, -1, + -1, -1, 4200, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4313, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4323, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 4337, + -1, -1, 4340, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5852, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5862, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5978, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4530, 4531, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4546, 4547, + 4548, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4570, 4571, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4615, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4635, -1, -1, + -1, -1, 4640, 4641, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4659, -1, -1, -1, 4663, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4880, 4881, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4944, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4998, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5025, 5026, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5060, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5146, -1, + 5148, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5285, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5308, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5324, 5325, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5575, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5613, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5629, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3, -1, -1, -1, -1, 8, + 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, -1, -1, -1, -1, 5867, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, 58, + 59, 60, -1, -1, -1, -1, -1, -1, -1, 68, + 69, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, -1, -1, 82, 83, 84, 85, -1, 87, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, 102, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, 120, 121, 122, -1, 124, -1, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, 150, -1, -1, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 162, -1, 164, -1, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6007, + -1, 180, 181, -1, 183, -1, -1, -1, 187, -1, + -1, -1, -1, 192, -1, -1, 195, 196, -1, 198, + 199, 200, 201, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + 219, 220, 221, -1, 223, -1, -1, -1, -1, -1, + -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, -1, -1, -1, + 249, 250, -1, -1, -1, 254, -1, -1, -1, -1, + -1, -1, -1, -1, 6092, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, 275, 276, -1, 278, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 300, 301, 302, -1, -1, 305, -1, -1, 308, + 309, -1, -1, -1, -1, 314, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, 6273, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 6406, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, 3, -1, 774, -1, -1, 8, 9, + 779, -1, -1, -1, 783, 784, -1, -1, 787, 19, + 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, 58, 59, + 60, -1, -1, -1, 64, -1, -1, -1, 68, 69, + -1, 71, -1, -1, -1, -1, -1, -1, 78, 79, + -1, -1, 82, 83, 84, 85, -1, 87, 88, -1, + 90, 91, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + 120, 121, 122, -1, 124, -1, -1, -1, -1, -1, + -1, -1, 132, 133, 134, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + 150, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162, 163, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 181, -1, 183, -1, -1, -1, 187, -1, -1, + -1, -1, 192, -1, -1, 195, 196, -1, 198, 199, + 200, 201, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, 219, + 220, 221, -1, 223, -1, -1, -1, -1, -1, -1, + 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, -1, -1, -1, 249, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 268, -1, + -1, -1, -1, -1, -1, 275, 276, -1, 278, 279, + -1, -1, -1, -1, -1, -1, -1, -1, 288, -1, + 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 300, 301, 302, -1, -1, -1, -1, -1, 308, 309, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, 768, 769, + -1, -1, 3, -1, 774, -1, -1, 8, 9, 779, + -1, -1, -1, 783, 784, -1, -1, 787, 19, 20, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, 47, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 57, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, + 71, -1, -1, -1, -1, -1, -1, 78, 79, -1, + -1, 82, 83, 84, 85, -1, 87, 88, -1, 90, + 91, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, 120, + 121, 122, -1, 124, -1, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, 150, + -1, -1, 153, -1, -1, -1, -1, -1, -1, -1, + -1, 162, -1, 164, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 181, -1, 183, -1, -1, -1, 187, -1, -1, -1, + -1, 192, -1, -1, 195, 196, -1, 198, 199, 200, + 201, -1, 203, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, 219, 220, + 221, -1, 223, -1, -1, -1, -1, -1, -1, 230, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, -1, -1, -1, 249, 250, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 268, -1, -1, + -1, -1, -1, -1, 275, 276, -1, 278, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 300, + 301, 302, -1, -1, -1, -1, -1, 308, 309, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, 768, 769, -1, + -1, 3, -1, 774, -1, -1, 8, 9, 779, -1, + -1, -1, 783, 784, -1, -1, 787, 19, 20, -1, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 57, 58, 59, 60, -1, + -1, -1, -1, -1, -1, -1, 68, 69, -1, 71, + -1, -1, -1, -1, -1, -1, 78, 79, -1, -1, + 82, 83, 84, 85, -1, 87, 88, -1, 90, 91, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, 120, 121, + 122, -1, 124, -1, -1, -1, -1, -1, -1, -1, + 132, 133, 134, 135, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 162, -1, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, 181, + -1, 183, -1, -1, -1, 187, -1, -1, -1, -1, + 192, -1, -1, 195, 196, -1, 198, 199, 200, 201, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, 219, 220, 221, + -1, 223, -1, -1, -1, -1, -1, -1, 230, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, -1, -1, -1, 249, 250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 268, -1, -1, -1, + -1, -1, -1, 275, 276, -1, 278, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 300, 301, + 302, -1, -1, -1, -1, -1, 308, 309, -1, 311, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, 768, 769, -1, -1, + 3, -1, 774, -1, -1, 8, 9, 779, -1, -1, + -1, 783, 784, -1, -1, 787, 19, 20, -1, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 57, 58, 59, 60, -1, -1, + -1, -1, -1, -1, -1, 68, 69, -1, 71, -1, + -1, -1, -1, -1, -1, 78, 79, -1, -1, 82, + 83, 84, 85, -1, 87, 88, -1, 90, 91, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, 102, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, 120, 121, 122, + -1, 124, -1, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, -1, -1, -1, -1, -1, 141, -1, + 143, 144, -1, -1, -1, -1, -1, 150, -1, -1, + 153, -1, -1, -1, -1, -1, -1, -1, -1, 162, + -1, 164, -1, 166, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 180, 181, -1, + 183, -1, -1, -1, 187, -1, -1, -1, -1, 192, + -1, -1, 195, 196, -1, 198, 199, 200, 201, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, 219, 220, 221, -1, + 223, -1, -1, -1, -1, -1, -1, 230, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, -1, -1, -1, 249, 250, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 268, -1, -1, -1, -1, + -1, -1, 275, 276, -1, 278, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 300, 301, 302, + -1, -1, -1, -1, -1, 308, 309, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, 768, 769, -1, -1, 3, + -1, 774, -1, -1, 8, 9, 779, -1, -1, -1, + 783, 784, -1, -1, 787, 19, 20, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 57, 58, 59, 60, -1, -1, -1, + -1, -1, -1, -1, 68, 69, -1, 71, -1, -1, + -1, -1, -1, -1, 78, 79, -1, -1, 82, 83, + 84, 85, -1, 87, 88, -1, 90, 91, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, 120, 121, 122, -1, + 124, -1, -1, -1, 128, -1, -1, -1, 132, 133, + 134, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, -1, -1, -1, -1, 150, -1, -1, 153, + -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 180, 181, -1, 183, + -1, -1, -1, 187, -1, -1, -1, -1, 192, -1, + -1, 195, 196, -1, 198, 199, 200, 201, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, 219, 220, 221, -1, 223, + -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, -1, -1, -1, 249, 250, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, 275, 276, -1, 278, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 300, 301, 302, -1, + -1, -1, -1, -1, 308, 309, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, -1, 3, -1, + 774, -1, -1, 8, 9, 779, -1, -1, -1, 783, + 784, -1, -1, 787, 19, 20, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 57, 58, 59, 60, -1, -1, -1, -1, + -1, -1, -1, 68, 69, -1, 71, -1, -1, -1, + -1, -1, -1, 78, 79, -1, -1, 82, 83, 84, + 85, -1, 87, 88, -1, 90, 91, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, 120, 121, 122, -1, 124, + -1, -1, -1, 128, -1, -1, -1, 132, 133, 134, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, 150, -1, -1, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 162, -1, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, 181, -1, 183, -1, + -1, -1, 187, -1, -1, -1, -1, 192, -1, -1, + 195, 196, -1, 198, 199, 200, 201, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, 219, 220, 221, -1, 223, -1, + -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, -1, -1, -1, 249, 250, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, + 275, 276, -1, 278, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 300, 301, 302, -1, -1, + -1, -1, -1, 308, 309, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, 768, 769, -1, -1, 3, -1, 774, + -1, -1, 8, 9, 779, -1, -1, -1, 783, 784, + -1, -1, 787, 19, 20, -1, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 57, 58, 59, 60, -1, -1, -1, -1, -1, + -1, -1, 68, 69, -1, 71, -1, -1, -1, -1, + -1, -1, 78, 79, -1, -1, 82, 83, 84, 85, + -1, 87, 88, -1, 90, 91, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, 102, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, 120, 121, 122, -1, 124, -1, + -1, -1, 128, -1, -1, -1, 132, 133, 134, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, 150, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, -1, 162, -1, 164, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 180, 181, -1, 183, -1, -1, + -1, 187, -1, -1, -1, -1, 192, -1, -1, 195, + 196, -1, 198, 199, 200, 201, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, 219, 220, 221, -1, 223, -1, -1, + -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, -1, 249, 250, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, -1, 275, + 276, -1, 278, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 300, 301, 302, -1, -1, -1, + -1, -1, 308, 309, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, 768, 769, -1, -1, 3, -1, 774, -1, + -1, 8, 9, 779, -1, -1, -1, 783, 784, -1, + -1, 787, 19, 20, -1, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, 58, 59, 60, -1, -1, -1, -1, -1, -1, + -1, 68, 69, -1, 71, -1, -1, -1, -1, -1, + -1, 78, 79, -1, -1, 82, 83, 84, 85, -1, + 87, 88, -1, 90, 91, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, 102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, 120, 121, 122, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, -1, + -1, -1, -1, -1, 141, -1, 143, 144, -1, -1, + -1, -1, -1, 150, -1, -1, 153, -1, -1, -1, + -1, -1, -1, -1, -1, 162, -1, 164, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 180, 181, -1, 183, -1, -1, -1, + 187, -1, -1, -1, -1, 192, -1, -1, 195, 196, + -1, 198, 199, 200, 201, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, 219, 220, 221, -1, 223, -1, -1, -1, + -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, -1, + -1, -1, 249, 250, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 268, -1, -1, -1, -1, -1, -1, 275, 276, + -1, 278, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 300, 301, 302, -1, -1, -1, -1, + -1, 308, 309, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, 768, 769, -1, -1, 3, -1, 774, -1, -1, + 8, 9, 779, -1, -1, -1, 783, 784, -1, -1, + 787, 19, 20, -1, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + 58, 59, 60, -1, -1, -1, -1, -1, -1, -1, + 68, 69, -1, 71, -1, -1, -1, -1, -1, -1, + 78, 79, -1, -1, 82, 83, 84, 85, -1, 87, + 88, -1, 90, 91, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, 102, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, 120, 121, 122, -1, 124, -1, -1, -1, + -1, -1, -1, -1, 132, 133, 134, 135, -1, -1, + -1, -1, -1, 141, -1, -1, 144, -1, -1, -1, + -1, -1, 150, -1, -1, 153, -1, -1, -1, -1, + -1, -1, -1, -1, 162, -1, 164, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 180, 181, -1, 183, -1, -1, -1, 187, + -1, -1, -1, -1, 192, -1, -1, 195, 196, -1, + 198, 199, 200, 201, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, 219, 220, 221, -1, 223, -1, -1, -1, -1, + -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, -1, -1, + -1, 249, 250, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 268, -1, -1, -1, -1, -1, -1, 275, 276, -1, + 278, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 300, 301, 302, -1, -1, -1, -1, -1, + 308, 309, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + 768, 769, -1, -1, 3, -1, 774, -1, -1, 8, + 9, 779, -1, -1, -1, 783, 784, -1, -1, 787, + 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, 58, + 59, 60, -1, -1, -1, -1, -1, -1, -1, 68, + 69, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, -1, -1, 82, 83, 84, 85, -1, 87, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, 102, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, 120, 121, 122, -1, 124, -1, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, 150, -1, -1, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 162, -1, 164, -1, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 180, 181, -1, 183, -1, -1, -1, 187, -1, + -1, -1, -1, 192, -1, -1, 195, 196, -1, 198, + 199, 200, 201, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + 219, 220, 221, -1, 223, -1, -1, -1, -1, -1, + -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, -1, -1, -1, + 249, 250, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, 275, 276, -1, 278, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 300, 301, 302, -1, -1, -1, -1, -1, 308, + 309, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, 3, -1, 774, -1, -1, 8, 9, + 779, -1, -1, -1, 783, 784, -1, -1, 787, 19, + 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, 58, 59, + 60, -1, -1, -1, -1, -1, -1, -1, 68, 69, + -1, 71, -1, -1, -1, -1, -1, -1, 78, 79, + -1, -1, 82, 83, 84, 85, -1, 87, 88, -1, + 90, 91, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + 120, 121, 122, -1, 124, -1, -1, -1, -1, -1, + -1, -1, 132, 133, 134, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + 150, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162, -1, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 181, -1, 183, -1, -1, -1, 187, -1, -1, + -1, -1, 192, -1, -1, 195, 196, -1, 198, 199, + 200, 201, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, 219, + 220, 221, -1, 223, -1, -1, -1, -1, -1, -1, + 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, -1, -1, -1, 249, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 268, -1, + -1, -1, -1, -1, -1, 275, 276, -1, 278, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 300, 301, 302, -1, -1, -1, -1, -1, 308, 309, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, 768, 769, + -1, -1, 3, -1, 774, -1, -1, 8, 9, 779, + -1, -1, -1, 783, 784, -1, -1, 787, 19, 20, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 57, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, + 71, -1, -1, -1, -1, -1, -1, 78, 79, -1, + -1, 82, 83, 84, 85, -1, 87, 88, -1, 90, + 91, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, 120, + 121, 122, -1, 124, -1, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, 150, + -1, -1, 153, -1, -1, -1, -1, -1, -1, -1, + -1, 162, -1, 164, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 181, -1, 183, -1, -1, -1, 187, -1, -1, -1, + -1, 192, -1, -1, 195, 196, -1, 198, 199, 200, + 201, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, 219, 220, + 221, -1, 223, -1, -1, -1, -1, -1, -1, 230, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, -1, -1, -1, 249, 250, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 268, -1, -1, + -1, -1, -1, -1, 275, 276, -1, 278, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 300, + 301, 302, -1, -1, -1, -1, -1, 308, 309, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, 768, 769, -1, + -1, 3, -1, 774, -1, -1, 8, 9, 779, -1, + -1, -1, 783, 784, -1, -1, 787, 19, 20, -1, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 57, 58, 59, 60, -1, + -1, -1, -1, -1, -1, -1, 68, 69, -1, 71, + -1, -1, -1, -1, -1, -1, 78, 79, -1, -1, + 82, 83, 84, 85, -1, 87, 88, -1, 90, 91, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, 120, 121, + 122, -1, 124, -1, -1, -1, -1, -1, -1, -1, + 132, 133, 134, 135, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 162, -1, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, 181, + -1, 183, -1, -1, -1, 187, -1, -1, -1, -1, + 192, -1, -1, 195, -1, -1, 198, 199, 200, 201, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, 219, 220, 221, + -1, 223, -1, -1, -1, -1, -1, -1, 230, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, -1, -1, -1, 249, 250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 268, -1, -1, -1, + -1, -1, -1, 275, 276, -1, 278, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 300, 301, + 302, -1, -1, -1, -1, -1, 308, 309, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, 768, 769, -1, -1, + 3, -1, 774, -1, -1, 8, 9, 779, -1, -1, + -1, 783, 784, -1, -1, 787, 19, 20, -1, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 57, 58, 59, 60, -1, -1, + -1, -1, -1, -1, -1, 68, 69, -1, 71, -1, + -1, -1, -1, -1, -1, 78, 79, -1, -1, 82, + 83, 84, 85, -1, 87, 88, -1, 90, 91, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, 102, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, 120, 121, 122, + -1, 124, -1, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, -1, -1, -1, -1, -1, 141, -1, + -1, 144, -1, -1, -1, -1, -1, 150, -1, -1, + 153, -1, -1, -1, -1, -1, -1, -1, -1, 162, + -1, 164, -1, 166, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 180, 181, -1, + 183, -1, -1, -1, 187, -1, -1, -1, -1, 192, + -1, -1, 195, 196, -1, 198, 199, 200, 201, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, 219, 220, 221, -1, + 223, -1, -1, -1, -1, -1, -1, 230, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, -1, -1, -1, 249, 250, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 268, -1, -1, -1, -1, + -1, -1, 275, 276, -1, 278, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 300, 301, 302, + -1, -1, -1, -1, -1, 308, 309, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, 768, 769, -1, -1, 3, + -1, 774, -1, -1, 8, 9, 779, -1, -1, -1, + 783, 784, -1, -1, 787, 19, 20, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 57, 58, 59, 60, -1, -1, -1, + -1, -1, -1, -1, 68, 69, -1, 71, -1, -1, + -1, -1, -1, -1, 78, 79, -1, -1, 82, 83, + 84, 85, -1, 87, 88, -1, 90, 91, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, 120, 121, 122, -1, + 124, -1, -1, -1, -1, -1, -1, -1, 132, 133, + 134, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, -1, -1, -1, -1, 150, -1, -1, 153, + -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 180, 181, -1, 183, + -1, -1, -1, 187, -1, -1, -1, -1, 192, -1, + -1, 195, 196, -1, 198, 199, 200, 201, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, 219, 220, 221, -1, 223, + -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, -1, -1, -1, 249, 250, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, 275, 276, -1, 278, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 300, 301, 302, -1, + -1, -1, -1, -1, 308, 309, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, -1, 3, -1, + 774, -1, -1, 8, 9, 779, -1, -1, -1, 783, + 784, -1, -1, 787, 19, 20, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 57, 58, 59, 60, -1, -1, -1, -1, + -1, -1, -1, 68, 69, -1, 71, -1, -1, -1, + -1, -1, -1, 78, 79, -1, -1, 82, 83, 84, + 85, -1, 87, 88, -1, 90, 91, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, 120, 121, 122, -1, 124, + -1, -1, -1, -1, -1, -1, -1, 132, 133, 134, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, 150, -1, -1, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 162, -1, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, 181, 182, 183, -1, + -1, -1, 187, -1, -1, -1, -1, 192, -1, -1, + 195, -1, -1, 198, 199, 200, 201, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, 219, 220, 221, -1, 223, -1, + -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, -1, -1, -1, 249, 250, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, + 275, 276, -1, 278, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 300, 301, 302, -1, -1, + -1, -1, -1, 308, 309, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, 768, 769, -1, -1, 3, -1, 774, + -1, -1, 8, 9, 779, -1, -1, -1, 783, 784, + -1, -1, 787, 19, 20, -1, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 57, 58, 59, 60, -1, -1, -1, -1, -1, + -1, -1, 68, 69, -1, 71, -1, -1, -1, -1, + -1, -1, 78, 79, -1, -1, 82, 83, 84, 85, + -1, 87, 88, -1, 90, 91, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, 102, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, 120, 121, 122, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 132, 133, 134, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, 150, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, -1, 162, -1, 164, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 180, 181, -1, 183, -1, -1, + -1, 187, -1, -1, -1, -1, 192, -1, -1, 195, + -1, -1, 198, 199, 200, 201, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, 219, 220, 221, -1, 223, -1, -1, + -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, -1, 249, 250, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, -1, 275, + 276, -1, 278, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 300, 301, 302, -1, -1, -1, + -1, -1, 308, 309, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, 768, 769, -1, -1, 3, -1, 774, -1, + -1, 8, 9, 779, -1, -1, -1, 783, 784, -1, + -1, 787, 19, 20, -1, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, 58, 59, 60, -1, -1, -1, -1, -1, -1, + -1, 68, 69, -1, 71, -1, -1, -1, -1, -1, + -1, 78, 79, -1, -1, 82, 83, 84, 85, -1, + 87, 88, -1, 90, 91, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, 102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, 120, 121, 122, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + -1, -1, -1, 150, -1, -1, 153, -1, -1, -1, + -1, -1, -1, -1, -1, 162, -1, 164, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 180, 181, -1, 183, -1, -1, -1, + 187, -1, -1, -1, -1, 192, -1, -1, 195, -1, + -1, 198, 199, 200, 201, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, 219, 220, 221, -1, 223, -1, -1, -1, + -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, -1, + -1, -1, 249, 250, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 268, -1, -1, -1, -1, -1, -1, 275, 276, + -1, 278, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 300, 301, 302, -1, -1, -1, -1, + -1, 308, 309, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, 768, 769, -1, -1, 3, -1, 774, -1, -1, + 8, 9, 779, -1, -1, -1, 783, 784, -1, -1, + 787, 19, 20, -1, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + 58, 59, 60, -1, -1, -1, -1, -1, -1, -1, + 68, 69, -1, 71, -1, -1, -1, -1, -1, -1, + 78, 79, -1, -1, 82, 83, 84, 85, -1, 87, + 88, -1, 90, 91, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, 102, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, 120, 121, 122, -1, 124, -1, -1, -1, + -1, -1, -1, -1, 132, 133, 134, 135, -1, -1, + -1, -1, -1, 141, -1, -1, 144, -1, -1, -1, + -1, -1, 150, -1, -1, 153, -1, -1, -1, -1, + -1, -1, -1, -1, 162, -1, 164, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 180, 181, -1, 183, -1, -1, -1, 187, + -1, -1, -1, -1, 192, -1, -1, 195, -1, -1, + 198, 199, 200, 201, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, 219, 220, 221, -1, 223, -1, -1, -1, -1, + -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, -1, -1, + -1, 249, 250, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 268, -1, -1, -1, -1, -1, -1, 275, 276, -1, + 278, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 300, 301, 302, -1, -1, -1, -1, -1, + 308, 309, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + 768, 769, -1, -1, 3, -1, 774, -1, -1, 8, + 9, 779, -1, -1, -1, 783, 784, -1, -1, 787, + 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, 58, + 59, 60, -1, -1, -1, -1, -1, -1, -1, 68, + 69, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, -1, -1, 82, 83, 84, 85, -1, 87, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, 102, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, 120, 121, 122, -1, 124, -1, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, 150, -1, -1, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 162, -1, 164, -1, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 180, 181, -1, 183, -1, -1, -1, 187, -1, + -1, -1, -1, 192, -1, -1, 195, -1, -1, 198, + 199, 200, 201, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + 219, 220, 221, -1, 223, -1, -1, -1, -1, -1, + -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, -1, -1, -1, + 249, 250, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, 275, 276, -1, 278, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 300, 301, 302, -1, -1, -1, -1, -1, 308, + 309, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, 3, -1, 774, -1, -1, 8, 9, + 779, -1, -1, -1, 783, 784, -1, -1, 787, 19, + 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, 58, 59, + 60, -1, -1, -1, -1, -1, -1, -1, 68, 69, + -1, 71, -1, -1, -1, -1, -1, -1, 78, 79, + -1, -1, 82, 83, 84, 85, -1, 87, 88, -1, + 90, 91, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + 120, 121, 122, -1, 124, -1, -1, -1, -1, -1, + -1, -1, 132, 133, 134, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + 150, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162, -1, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 181, -1, 183, -1, -1, -1, 187, -1, -1, + -1, -1, 192, -1, -1, 195, -1, -1, 198, 199, + 200, 201, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, 219, + 220, 221, -1, 223, -1, -1, -1, -1, -1, -1, + 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, -1, -1, -1, 249, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 268, -1, + -1, -1, -1, -1, -1, 275, 276, -1, 278, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 300, 301, 302, -1, -1, -1, -1, -1, 308, 309, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, 768, 769, + -1, -1, 3, -1, 774, -1, -1, 8, 9, 779, + -1, -1, -1, 783, 784, -1, -1, 787, 19, 20, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 57, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, + 71, -1, -1, -1, -1, -1, -1, 78, 79, -1, + -1, 82, 83, 84, 85, -1, 87, 88, -1, 90, + 91, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, 120, + 121, 122, -1, 124, -1, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, 150, + -1, -1, 153, -1, -1, -1, -1, -1, -1, -1, + -1, 162, -1, 164, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 181, -1, 183, -1, -1, -1, 187, -1, -1, -1, + -1, 192, -1, -1, 195, -1, -1, 198, 199, 200, + 201, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, 219, 220, + 221, -1, 223, -1, -1, -1, -1, -1, -1, 230, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, -1, -1, -1, 249, 250, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 268, -1, -1, + -1, -1, -1, -1, 275, 276, -1, 278, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 300, + 301, 302, -1, -1, -1, -1, -1, 308, 309, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, 768, 769, -1, + -1, 3, -1, 774, -1, -1, 8, 9, 779, -1, + -1, -1, 783, 784, -1, -1, 787, 19, 20, -1, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 58, 59, 60, -1, + -1, -1, -1, -1, -1, -1, 68, 69, -1, 71, + -1, -1, -1, -1, -1, -1, 78, 79, -1, -1, + 82, 83, 84, 85, -1, 87, 88, -1, 90, 91, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, 120, 121, + 122, -1, 124, -1, -1, -1, -1, -1, -1, -1, + 132, 133, 134, 135, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 162, -1, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, 181, + -1, 183, -1, -1, -1, 187, -1, -1, -1, -1, + 192, -1, -1, 195, -1, -1, 198, 199, 200, 201, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, 219, 220, 221, + -1, 223, -1, -1, -1, -1, -1, -1, 230, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, -1, -1, -1, 249, 250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 268, -1, -1, -1, + -1, -1, -1, 275, 276, -1, 278, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 300, 301, + 302, -1, -1, -1, -1, -1, 308, 309, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, 768, 769, -1, -1, + 3, -1, -1, -1, -1, 8, -1, 779, -1, -1, + -1, -1, 784, -1, -1, 787, 19, 20, -1, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, 122, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, 201, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 3, 756, 757, 758, 759, 8, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 787, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 3, 756, 757, 758, 759, 8, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 19, 20, -1, -1, -1, -1, -1, -1, -1, 780, + -1, -1, -1, -1, -1, -1, 787, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, 8, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 787, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, 8, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 779, -1, -1, + -1, -1, -1, -1, -1, 787, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + 8, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 787, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 5, -1, 7, 8, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 787, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 48, 49, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, -1, 68, -1, 70, -1, 72, + -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 98, -1, -1, 101, -1, + 103, 104, -1, -1, -1, -1, -1, 110, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 127, -1, -1, -1, 131, -1, + -1, -1, 135, -1, -1, -1, -1, -1, 141, -1, + -1, -1, -1, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 161, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 171, -1, + 173, -1, -1, -1, 177, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, 204, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, 216, 217, 218, -1, -1, -1, -1, + -1, -1, -1, -1, 227, 228, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 239, 240, 241, -1, + 243, -1, -1, -1, -1, 248, -1, -1, -1, -1, + -1, 254, -1, -1, -1, 258, 259, 260, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 294, -1, 296, -1, 298, -1, -1, -1, -1, + -1, -1, 305, -1, -1, -1, -1, -1, -1, -1, + 313, 314, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, -1, 328, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, -1, 367, 368, 369, 370, 371, 372, + 373, -1, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, -1, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, -1, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, -1, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, -1, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, -1, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, -1, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, -1, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 5, -1, -1, + 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 19, 20, -1, -1, -1, 779, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 48, 49, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 66, -1, + 68, -1, 70, -1, 72, -1, -1, -1, -1, -1, + -1, -1, 80, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 98, -1, -1, 101, -1, 103, 104, -1, -1, -1, + -1, -1, 110, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 127, + -1, -1, -1, 131, -1, -1, -1, 135, -1, -1, + -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, + -1, -1, 150, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 161, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 171, -1, 173, -1, -1, -1, 177, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, 204, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, 216, 217, + 218, -1, -1, -1, -1, -1, -1, -1, -1, 227, + 228, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 239, 240, 241, -1, 243, -1, -1, -1, -1, + 248, -1, -1, -1, -1, -1, 254, -1, -1, -1, + 258, 259, 260, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 294, -1, 296, -1, + 298, -1, -1, -1, -1, -1, -1, 305, -1, -1, + -1, -1, -1, -1, -1, 313, 314, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, -1, + 328, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, -1, 367, + 368, 369, 370, 371, 372, 373, -1, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + -1, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, -1, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, -1, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + -1, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + -1, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, -1, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, -1, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 5, -1, -1, 8, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 19, 20, -1, -1, + -1, 779, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 48, 49, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, -1, -1, -1, 70, -1, 72, + -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, + 103, 104, -1, -1, -1, -1, -1, 110, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 131, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 161, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 171, -1, + 173, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, 204, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, 216, 217, 218, -1, -1, -1, -1, + -1, -1, -1, -1, 227, 228, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 239, 240, -1, -1, + 243, -1, -1, -1, -1, 248, -1, -1, -1, -1, + -1, 254, -1, -1, -1, 258, 259, 260, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 294, -1, 296, -1, 298, -1, -1, -1, -1, + -1, -1, 305, -1, -1, -1, -1, -1, -1, -1, + -1, 314, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, -1, 328, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, -1, 367, 368, 369, 370, 371, 372, + 373, -1, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, -1, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, -1, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, -1, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, -1, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, -1, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, -1, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, -1, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 779, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 75, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 129, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, 145, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 160, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 262, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 787, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 254, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 305, -1, -1, -1, -1, -1, + -1, -1, -1, 314, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 779, -1, + -1, -1, -1, -1, -1, -1, 787, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 111, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 779, + -1, -1, -1, -1, 784, -1, -1, 787, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 779, -1, -1, -1, -1, 784, -1, -1, 787, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 779, -1, -1, -1, -1, -1, -1, -1, 787, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, 770, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 787, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 779, -1, -1, -1, -1, -1, -1, + -1, 787, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 787, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 787, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 787, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 787, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 85, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, -1, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 779, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, 3, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 19, 20, -1, -1, -1, -1, -1, -1, 779, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 71, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, 3, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 71, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 3, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, 3, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, 3, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, 3, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, 3, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 8, 9, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 19, 20, -1, -1, -1, + -1, -1, -1, -1, 28, -1, 30, -1, 32, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 251, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 8, 9, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 19, 20, -1, + -1, -1, -1, -1, -1, -1, 28, -1, 30, -1, + 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 251, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 8, 9, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, + 20, -1, -1, -1, -1, -1, -1, -1, 28, -1, + 30, -1, 32, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 251, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 19, 20, -1, -1, -1, -1, -1, -1, -1, + 28, -1, 30, -1, 32, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, 770, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, 770, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, 770, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, 770, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, 770, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, 26, -1, -1, 770, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, 196, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, 209, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 265, -1, 267, -1, 269, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, 769, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 42, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, 21, 763, -1, -1, -1, -1, -1, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 42, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, 763, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, -1, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, -1, + 128, 129, 130, 131, 132, -1, -1, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + -1, 149, 150, -1, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, -1, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, -1, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, -1, 322, 323, 324, 325, 326, -1, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, -1, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, -1, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, -1, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, -1, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, -1, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, -1, 661, 662, 663, 664, 665, -1, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + -1, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, -1, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + -1, 128, 129, 130, 131, 132, -1, -1, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, -1, 149, 150, -1, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, -1, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, -1, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, -1, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, -1, 322, 323, 324, 325, 326, + -1, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, -1, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, -1, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, -1, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, -1, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, -1, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, -1, 661, 662, 663, 664, 665, -1, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, -1, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + -1, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, -1, 128, 129, 130, 131, 132, -1, -1, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, -1, 149, 150, -1, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, -1, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, -1, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, -1, 322, 323, 324, 325, + 326, -1, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, -1, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, -1, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, -1, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, -1, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, -1, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, -1, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + -1, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, -1, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, -1, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, -1, 128, 129, 130, 131, 132, -1, -1, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, -1, 149, 150, -1, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, -1, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, -1, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, -1, 322, 323, 324, + 325, 326, -1, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, -1, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, -1, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, -1, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, -1, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + -1, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, -1, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, -1, 661, 662, 663, 664, + 665, -1, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, -1, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, -1, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 47, 48, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 80, -1, -1, -1, + 84, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, + -1, -1, -1, -1, -1, -1, 110, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 131, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, 145, -1, -1, -1, -1, 150, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 173, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 232, -1, + -1, -1, 236, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 254, -1, -1, -1, 258, 259, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 289, -1, -1, -1, -1, + -1, -1, 296, 297, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, 21, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 47, 48, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, + -1, 84, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, + -1, -1, -1, -1, -1, -1, -1, 110, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 131, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, 145, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 173, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 232, + -1, -1, -1, 236, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 254, -1, -1, -1, 258, 259, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 289, -1, -1, -1, + -1, -1, -1, 296, 297, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, 24, 25, 26, -1, 28, -1, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 84, 85, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, 23, -1, -1, 26, 27, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, 21, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 31, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, 21, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 31, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, 21, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 258, + -1, -1, -1, -1, -1, -1, -1, -1, 267, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, 21, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, + 77, -1, -1, -1, -1, -1, -1, -1, -1, 86, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + -1, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 128, -1, -1, -1, -1, -1, -1, 135, + 136, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 267, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 128, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 30, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, 225, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, 225, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, -1, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, -1, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, -1, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, -1, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, -1, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, -1, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, -1, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 86, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, -1, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, -1, 367, + 368, 369, 370, 371, 372, 373, -1, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + -1, 389, 390, 391, 392, 393, 394, 395, 396, 397, + -1, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, -1, 423, 424, 425, 426, -1, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, -1, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, -1, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + -1, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + -1, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, -1, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, -1, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, -1, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, -1, 646, 647, + 648, 649, 650, 651, 652, -1, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, -1, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, -1, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 311, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, -1, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, -1, 342, 343, 344, 345, 346, + 347, 348, 349, -1, -1, -1, -1, 354, 355, 356, + 357, 358, -1, -1, 361, 362, 363, 364, 365, -1, + -1, -1, 369, 370, 371, 372, 373, -1, 375, 376, + 377, 378, -1, -1, -1, -1, -1, -1, 385, -1, + 387, -1, 389, 390, 391, 392, 393, 394, 395, 396, + 397, -1, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, -1, 413, -1, 415, 416, + 417, 418, 419, 420, 421, -1, 423, 424, 425, 426, + -1, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, -1, -1, -1, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, + -1, -1, -1, -1, 461, 462, 463, 464, 465, 466, + -1, 468, 469, -1, 471, 472, -1, -1, 475, -1, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, -1, 489, 490, 491, 492, 493, 494, 495, 496, + 497, -1, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, -1, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, -1, -1, -1, 585, -1, + 587, 588, -1, 590, 591, 592, 593, -1, 595, 596, + 597, 598, -1, -1, -1, -1, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, -1, 630, -1, 632, 633, 634, -1, 636, + 637, -1, 639, 640, 641, 642, 643, 644, -1, 646, + 647, 648, 649, 650, 651, 652, -1, 654, 655, 656, + -1, 658, 659, 660, 661, -1, 663, 664, 19, 20, + 667, 668, -1, -1, 671, 672, 673, -1, 675, -1, + 677, 678, 679, 680, -1, 682, 683, 684, 685, -1, + 687, 688, -1, 690, -1, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, -1, 713, 714, 715, 716, + 717, 718, 719, 720, 721, -1, 723, 724, -1, 726, + 727, 728, 729, -1, -1, 732, 733, 88, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, -1, -1, 752, 753, -1, -1, 756, + -1, 758, 759, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 311, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, -1, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + -1, 342, 343, 344, 345, 346, 347, 348, 349, -1, + -1, -1, -1, 354, 355, 356, 357, 358, -1, -1, + 361, 362, 363, 364, 365, -1, -1, -1, 369, 370, + 371, 372, 373, -1, 375, 376, 377, 378, -1, -1, + -1, -1, -1, -1, 385, -1, 387, -1, 389, 390, + 391, 392, 393, 394, 395, 396, 397, -1, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, 413, -1, 415, 416, 417, 418, 419, 420, + 421, -1, 423, 424, 425, 426, -1, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, -1, -1, + -1, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, -1, -1, -1, -1, -1, + 461, 462, 463, 464, 465, 466, -1, 468, 469, -1, + 471, 472, -1, -1, 475, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, -1, 489, 490, + 491, 492, 493, 494, 495, 496, 497, -1, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, -1, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, -1, -1, -1, 585, -1, 587, 588, -1, 590, + 591, 592, 593, -1, 595, 596, 597, 598, -1, -1, + -1, -1, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, -1, 630, + -1, 632, 633, 634, -1, 636, 637, -1, 639, 640, + 641, 642, 643, 644, -1, 646, 647, 648, 649, 650, + 651, 652, -1, 654, 655, 656, -1, 658, 659, 660, + 661, -1, 663, 664, 19, 20, 667, 668, -1, -1, + 671, 672, 673, -1, 675, -1, 677, 678, 679, 680, + -1, 682, 683, 684, 685, -1, 687, 688, -1, 690, + -1, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, -1, 713, 714, 715, 716, 717, 718, 719, 720, + 721, -1, 723, 724, -1, 726, 727, 728, 729, -1, + -1, 732, 733, 88, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, -1, + -1, 752, 753, -1, -1, 756, -1, 758, 759, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, -1, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, -1, 342, 343, 344, + 345, 346, 347, 348, 349, -1, -1, -1, -1, 354, + 355, 356, 357, 358, -1, -1, 361, 362, 363, 364, + 365, -1, -1, -1, 369, 370, 371, 372, 373, -1, + 375, 376, 377, 378, -1, -1, -1, -1, -1, -1, + 385, -1, 387, -1, 389, 390, 391, 392, 393, 394, + 395, 396, 397, -1, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, -1, 413, -1, + 415, 416, 417, 418, 419, 420, 421, -1, 423, 424, + 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, -1, -1, -1, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, -1, -1, -1, -1, -1, 461, 462, 463, 464, + 465, 466, -1, 468, 469, -1, 471, 472, -1, -1, + 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, -1, 489, 490, 491, 492, 493, 494, + 495, 496, 497, -1, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, -1, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, -1, -1, -1, + 585, -1, 587, 588, -1, 590, 591, 592, 593, -1, + 595, 596, 597, 598, -1, -1, -1, -1, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, -1, 630, -1, 632, 633, 634, + -1, 636, 637, -1, 639, 640, 641, 642, 643, 644, + -1, 646, 647, 648, 649, 650, 651, 652, -1, 654, + 655, 656, -1, 658, 659, 660, 661, -1, 663, 664, + -1, -1, 667, 668, -1, -1, 671, 672, 673, -1, + 675, -1, 677, 678, 679, 680, -1, 682, 683, 684, + 685, -1, 687, 688, -1, 690, -1, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, -1, 713, 714, + 715, 716, 717, 718, 719, 720, 721, -1, 723, 724, + -1, 726, 727, 728, 729, -1, -1, 732, 733, -1, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 19, 20, 752, 753, -1, + -1, 756, -1, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, -1, 57, 58, 59, 60, -1, -1, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, -1, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, -1, 128, 129, 130, 131, 132, -1, + -1, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, -1, 149, 150, -1, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + -1, -1, -1, 177, 178, 179, 180, 181, 182, 183, + -1, -1, -1, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, -1, 203, + 204, 205, 206, 207, 208, 209, 210, 211, -1, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + -1, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, -1, 259, 260, -1, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, -1, 280, 281, 282, 283, + -1, -1, -1, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, -1, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, -1, 322, 323, + 324, 325, 326, -1, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + -1, 355, -1, -1, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, -1, -1, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, -1, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, -1, 456, 457, 458, -1, 460, 461, 462, -1, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, -1, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, -1, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, -1, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, -1, + -1, -1, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, -1, -1, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, -1, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, -1, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, -1, 711, 712, -1, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, -1, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, -1, 751, 752, 753, + 754, -1, 756, 757, 758, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, 226, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, -1, 353, + -1, 355, -1, -1, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, -1, -1, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, -1, -1, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, -1, 428, 429, 430, -1, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, -1, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, -1, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, -1, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, -1, -1, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, -1, + -1, -1, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, -1, -1, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, -1, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, -1, 661, 662, 663, + 664, 665, -1, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, -1, 711, 712, -1, + 714, 715, -1, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, -1, -1, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758 +}; + +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ +static const yytype_int16 yystos[] = +{ + 0, 5, 7, 8, 19, 20, 48, 49, 66, 68, + 70, 72, 80, 88, 98, 101, 103, 104, 110, 116, + 127, 131, 135, 141, 150, 161, 171, 173, 177, 195, + 204, 207, 216, 217, 218, 227, 228, 239, 240, 241, + 243, 248, 254, 258, 259, 260, 294, 296, 298, 305, + 313, 314, 318, 319, 320, 322, 323, 324, 325, 326, + 328, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 367, 368, 369, 370, + 371, 372, 373, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 458, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 569, 570, 571, 572, 573, + 574, 575, 576, 578, 579, 580, 581, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, 756, 757, 758, + 759, 779, 789, 792, 793, 794, 795, 796, 798, 804, + 806, 821, 868, 907, 908, 915, 916, 929, 964, 989, + 1007, 1069, 1122, 1223, 1276, 1279, 1289, 1294, 1300, 1313, + 1316, 1322, 1325, 1330, 1337, 1349, 1352, 1355, 1356, 1358, + 1361, 1362, 1364, 1365, 1368, 1369, 1372, 1609, 1611, 1624, + 1627, 1665, 1674, 1692, 1700, 1714, 1718, 1719, 1723, 1724, + 1734, 1741, 1749, 1751, 1757, 1760, 1761, 1793, 1815, 1837, + 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1848, 1889, 1896, + 1898, 1907, 1910, 1946, 1948, 1953, 1954, 1955, 1956, 1981, + 1990, 1991, 1992, 1994, 2019, 2021, 2022, 2075, 2076, 2094, + 2100, 144, 321, 350, 352, 353, 360, 366, 368, 374, + 388, 398, 412, 422, 427, 441, 456, 457, 463, 467, + 470, 473, 488, 498, 568, 582, 600, 602, 631, 635, + 645, 653, 665, 686, 689, 722, 731, 750, 757, 1815, + 1817, 1826, 1833, 1837, 1838, 1839, 1840, 1841, 1842, 1843, + 1846, 2002, 88, 226, 338, 413, 463, 658, 662, 735, + 1224, 1960, 1961, 1962, 1963, 197, 460, 506, 1324, 1721, + 1826, 965, 528, 1317, 208, 2102, 1675, 88, 145, 214, + 226, 289, 436, 463, 644, 662, 708, 735, 743, 1623, + 992, 859, 930, 1625, 1752, 145, 408, 758, 1766, 281, + 704, 1892, 990, 1324, 1123, 1008, 57, 528, 1706, 258, + 267, 904, 909, 911, 1826, 653, 735, 1892, 994, 909, + 910, 859, 1359, 1849, 1701, 909, 1897, 1666, 1826, 1357, + 991, 235, 1795, 1628, 173, 294, 684, 1735, 1947, 40, + 196, 1405, 1993, 2099, 3, 31, 1820, 145, 1892, 753, + 1950, 1610, 482, 1826, 1324, 403, 917, 1899, 805, 598, + 676, 1826, 1324, 1742, 1950, 1826, 1758, 47, 669, 717, + 47, 669, 1693, 598, 676, 351, 352, 388, 427, 602, + 619, 645, 686, 1984, 1358, 1365, 1368, 0, 7, 790, + 602, 88, 129, 145, 262, 293, 644, 735, 838, 1201, + 1202, 1623, 1960, 1961, 1962, 1963, 128, 154, 1375, 1376, + 1605, 1353, 1350, 119, 152, 292, 1367, 1957, 1366, 1957, + 448, 460, 591, 787, 1720, 1721, 1812, 1826, 1362, 1364, + 42, 787, 787, 386, 1243, 1826, 862, 1826, 763, 763, + 862, 141, 1622, 21, 1820, 1826, 1828, 1622, 1268, 1269, + 268, 1393, 1964, 1965, 1960, 763, 1892, 1349, 1352, 1624, + 1627, 1665, 1674, 1717, 787, 869, 311, 945, 946, 966, + 969, 972, 817, 818, 1820, 743, 1314, 1892, 328, 76, + 77, 86, 144, 443, 444, 750, 891, 892, 894, 900, + 927, 928, 1817, 1837, 1838, 1839, 1840, 1841, 1846, 1993, + 2004, 2019, 2020, 2066, 2084, 2085, 2087, 2088, 2090, 143, + 178, 475, 614, 1677, 1690, 1691, 1622, 1613, 63, 1622, + 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 658, 1892, + 977, 1817, 2006, 2020, 47, 48, 80, 84, 101, 110, + 131, 145, 150, 173, 232, 236, 254, 258, 259, 289, + 296, 297, 353, 393, 436, 441, 452, 453, 607, 611, + 617, 628, 634, 665, 669, 698, 1828, 1911, 1915, 1916, + 1917, 1919, 1921, 1922, 1923, 1924, 945, 960, 1630, 471, + 675, 1753, 154, 1762, 1890, 43, 77, 123, 130, 157, + 165, 201, 246, 247, 374, 444, 582, 886, 929, 931, + 932, 933, 934, 936, 939, 942, 943, 944, 954, 955, + 956, 957, 958, 964, 979, 982, 989, 2011, 2012, 2026, + 2027, 2092, 2093, 2095, 2100, 1892, 3, 8, 9, 19, + 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 40, 57, 58, 59, 60, 68, 69, 71, + 78, 79, 82, 83, 84, 85, 87, 90, 91, 99, + 102, 120, 121, 122, 124, 132, 133, 134, 141, 150, + 153, 162, 164, 166, 180, 181, 183, 187, 192, 196, + 198, 199, 200, 201, 219, 220, 221, 223, 230, 241, + 249, 250, 268, 275, 276, 278, 279, 290, 300, 301, + 302, 308, 309, 327, 328, 329, 330, 334, 341, 349, + 366, 379, 381, 382, 383, 398, 410, 411, 466, 478, + 500, 501, 546, 552, 561, 562, 585, 593, 605, 649, + 656, 663, 694, 713, 714, 715, 716, 721, 722, 735, + 737, 749, 751, 759, 768, 769, 774, 779, 783, 784, + 787, 1368, 1374, 1399, 1400, 1401, 1402, 1406, 1417, 1421, + 1422, 1423, 1424, 1425, 1426, 1427, 1431, 1432, 1433, 1441, + 1447, 1448, 1449, 1450, 1451, 1453, 1456, 1785, 1788, 1790, + 1791, 1792, 1809, 1816, 1818, 1819, 1826, 1833, 1844, 1845, + 65, 1009, 510, 250, 362, 370, 385, 395, 396, 397, + 405, 543, 555, 655, 693, 707, 912, 914, 737, 905, + 911, 1826, 859, 1622, 886, 980, 911, 47, 333, 611, + 1908, 1909, 1917, 1919, 47, 106, 264, 266, 277, 293, + 474, 679, 680, 681, 682, 1378, 1385, 1386, 1959, 3, + 71, 99, 144, 321, 366, 463, 468, 506, 556, 577, + 593, 644, 661, 687, 717, 750, 1166, 1815, 1824, 1835, + 1837, 1838, 1839, 1841, 1842, 1843, 1846, 1850, 1860, 1871, + 2002, 47, 49, 79, 80, 89, 145, 159, 214, 226, + 281, 324, 344, 353, 366, 377, 400, 430, 433, 435, + 462, 463, 468, 469, 485, 506, 528, 582, 597, 606, + 609, 610, 624, 661, 669, 690, 747, 1166, 1200, 1702, + 1706, 1707, 1709, 1718, 1817, 1861, 911, 1892, 178, 1673, + 779, 1644, 1653, 945, 2008, 1794, 1630, 1736, 1826, 1950, + 343, 2101, 1828, 1331, 1290, 50, 1951, 1399, 1472, 799, + 299, 801, 1725, 417, 1812, 1814, 1826, 1900, 1828, 141, + 1068, 1820, 128, 1295, 528, 613, 669, 1743, 1744, 287, + 1951, 746, 1759, 670, 817, 232, 314, 1280, 1281, 1282, + 670, 817, 281, 1695, 1622, 1622, 23, 26, 27, 31, + 1786, 1787, 1821, 1983, 1983, 1983, 460, 1982, 1983, 1983, + 780, 780, 786, 1826, 1068, 1068, 145, 1068, 1068, 662, + 843, 145, 145, 281, 658, 214, 226, 289, 436, 1964, + 337, 860, 860, 1960, 111, 135, 779, 784, 1374, 1377, + 1477, 1480, 1492, 1495, 1496, 1497, 1508, 1509, 1510, 1511, + 1513, 1514, 1515, 1812, 211, 423, 1600, 1601, 1606, 312, + 1538, 1375, 123, 127, 168, 173, 206, 577, 1387, 1563, + 1568, 1569, 1578, 1579, 1583, 226, 1582, 1595, 1605, 47, + 106, 1958, 1958, 1958, 1578, 1580, 1368, 1371, 1372, 1579, + 1581, 1370, 47, 1826, 1716, 127, 1715, 787, 1354, 1351, + 2023, 1826, 1826, 42, 763, 1647, 1648, 1226, 734, 1228, + 787, 542, 709, 727, 85, 1828, 1829, 1830, 1915, 1229, + 120, 1234, 1233, 859, 281, 143, 581, 1270, 1271, 1272, + 657, 436, 743, 1964, 1828, 1301, 1826, 779, 872, 945, + 967, 1399, 114, 974, 972, 287, 1315, 1616, 1617, 1812, + 2020, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 87, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, + 129, 130, 131, 132, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 149, 150, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 208, 209, 210, 211, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 328, 329, + 330, 354, 356, 357, 373, 409, 410, 431, 455, 496, + 558, 559, 574, 575, 577, 616, 649, 710, 713, 716, + 739, 750, 759, 887, 927, 1128, 1130, 1131, 1132, 1134, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1817, + 1836, 1837, 1838, 1839, 1840, 1841, 1846, 1847, 2001, 2002, + 786, 470, 782, 74, 321, 2103, 2086, 2090, 894, 786, + 128, 1678, 128, 1678, 1679, 1680, 1687, 1688, 1826, 1690, + 1826, 141, 1621, 1622, 862, 862, 862, 862, 1826, 859, + 1828, 859, 1614, 1622, 1622, 993, 151, 978, 606, 1920, + 647, 647, 705, 708, 735, 743, 779, 1398, 475, 584, + 704, 580, 735, 89, 743, 333, 551, 633, 333, 333, + 203, 333, 371, 528, 669, 551, 287, 203, 782, 779, + 283, 427, 178, 414, 474, 1632, 1634, 393, 613, 1754, + 1755, 360, 178, 392, 1768, 1812, 1893, 1894, 144, 321, + 391, 463, 1817, 1827, 1840, 1841, 1842, 1846, 2003, 311, + 1827, 128, 136, 561, 1826, 1827, 1827, 1827, 1826, 311, + 1827, 1826, 427, 2092, 1994, 1995, 2021, 945, 959, 1826, + 127, 177, 241, 313, 98, 352, 2027, 2093, 786, 1323, + 1457, 19, 20, 30, 1816, 1833, 31, 1787, 153, 768, + 769, 1424, 779, 779, 779, 311, 1399, 1475, 1476, 779, + 779, 779, 779, 779, 1398, 1398, 1398, 779, 1397, 779, + 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 779, 1399, 779, 779, 779, 8, 779, 1473, 1474, + 1809, 1816, 779, 779, 779, 779, 1399, 1397, 779, 779, + 779, 779, 779, 779, 779, 779, 779, 779, 15, 779, + 779, 779, 779, 1398, 1397, 1397, 779, 779, 1398, 779, + 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 31, 779, 779, 779, 779, 779, 779, 779, 779, + 737, 779, 779, 779, 737, 779, 779, 779, 779, 31, + 779, 779, 779, 31, 779, 779, 779, 779, 779, 779, + 779, 779, 153, 1424, 153, 1424, 1424, 1124, 1368, 1399, + 1793, 1826, 1816, 33, 41, 50, 208, 315, 1403, 1404, + 35, 36, 37, 39, 156, 763, 764, 765, 1407, 55, + 151, 167, 238, 677, 1405, 14, 43, 44, 107, 192, + 766, 767, 768, 769, 770, 771, 772, 773, 1424, 73, + 38, 213, 213, 751, 1821, 787, 779, 15, 1010, 54, + 287, 782, 763, 1821, 1327, 1829, 1831, 1326, 733, 1920, + 584, 203, 128, 203, 1360, 1386, 3, 1828, 258, 644, + 787, 57, 99, 1167, 1168, 1647, 1828, 127, 1647, 1647, + 1916, 99, 1816, 1854, 1863, 1851, 57, 99, 1170, 1171, + 1828, 787, 1647, 1852, 782, 670, 1721, 779, 88, 214, + 226, 281, 289, 324, 436, 463, 658, 735, 743, 167, + 312, 1713, 63, 688, 376, 688, 688, 318, 688, 435, + 688, 1713, 47, 1081, 1828, 1567, 1568, 1573, 128, 151, + 1708, 1710, 376, 688, 127, 688, 704, 676, 47, 355, + 399, 401, 491, 541, 588, 678, 700, 1696, 1697, 1698, + 817, 477, 817, 1573, 1713, 1710, 510, 429, 378, 608, + 704, 720, 1721, 1392, 688, 740, 143, 1267, 1654, 782, + 177, 1796, 1797, 1804, 1826, 1633, 1634, 1812, 2038, 2104, + 782, 1332, 1333, 1334, 1335, 1812, 1616, 363, 568, 239, + 568, 1952, 782, 1399, 802, 57, 270, 416, 430, 432, + 464, 477, 510, 528, 606, 613, 623, 637, 669, 672, + 688, 719, 1726, 1731, 1732, 1817, 1892, 3, 74, 918, + 919, 920, 921, 1816, 582, 232, 374, 1405, 1826, 797, + 743, 1292, 1892, 1746, 360, 1745, 782, 653, 1826, 1952, + 127, 1283, 1284, 1283, 580, 755, 394, 782, 1283, 1283, + 1617, 1826, 1820, 782, 579, 1986, 699, 1987, 763, 158, + 639, 1985, 7, 791, 1826, 825, 1068, 859, 859, 1068, + 829, 831, 1068, 1068, 63, 1068, 1068, 836, 837, 743, + 463, 463, 1964, 779, 1477, 1497, 1509, 1510, 1511, 1512, + 1513, 1826, 10, 1383, 81, 147, 158, 166, 193, 249, + 277, 1504, 1505, 782, 217, 1506, 1507, 31, 1822, 1822, + 3, 1602, 1603, 1604, 1826, 1828, 1539, 136, 1542, 1538, + 454, 561, 1570, 296, 8, 28, 30, 32, 251, 1574, + 1575, 1788, 1816, 151, 65, 1575, 1567, 1387, 1826, 1387, + 1388, 1388, 1371, 1717, 393, 1722, 1786, 1826, 1826, 1579, + 1582, 47, 57, 99, 203, 1399, 1888, 42, 42, 1820, + 99, 386, 1065, 1066, 1078, 1079, 1174, 408, 863, 1826, + 1398, 3, 863, 1812, 583, 1829, 1830, 1831, 1930, 1934, + 1622, 1272, 413, 489, 862, 1812, 743, 1302, 1303, 1617, + 787, 870, 873, 874, 1399, 973, 311, 968, 970, 2000, + 2016, 2017, 427, 807, 1616, 127, 364, 448, 450, 540, + 614, 782, 1318, 1319, 1320, 2091, 779, 1149, 1150, 1152, + 1152, 391, 1150, 1158, 1160, 779, 1145, 1146, 1150, 224, + 1145, 1158, 57, 71, 73, 306, 341, 359, 730, 1133, + 1138, 1140, 1160, 1166, 1175, 1177, 1133, 1158, 1133, 1145, + 779, 1158, 1133, 1152, 1152, 1133, 1152, 779, 1145, 1158, + 71, 307, 307, 310, 1145, 1152, 779, 890, 1152, 1152, + 1152, 1152, 1152, 15, 787, 893, 1145, 310, 1152, 1152, + 1152, 1152, 1152, 779, 1146, 1154, 127, 1826, 127, 352, + 1993, 2088, 2089, 786, 786, 1812, 54, 1676, 1619, 1620, + 1813, 1826, 127, 1381, 1382, 1538, 782, 1681, 787, 1689, + 120, 1826, 862, 787, 1914, 1917, 1831, 1929, 1616, 1615, + 1612, 177, 2010, 643, 976, 704, 780, 333, 1831, 333, + 333, 1930, 214, 226, 281, 463, 861, 1918, 353, 393, + 436, 441, 452, 453, 607, 617, 628, 634, 665, 669, + 698, 1922, 1924, 1802, 1803, 1816, 961, 141, 1267, 479, + 735, 1399, 1756, 1756, 1338, 506, 1767, 53, 763, 1534, + 1535, 1536, 572, 746, 782, 1891, 44, 945, 311, 1826, + 561, 128, 154, 945, 311, 779, 953, 177, 786, 787, + 1996, 935, 782, 985, 983, 988, 984, 2097, 2096, 1616, + 3, 1458, 1828, 787, 779, 47, 1466, 1537, 1466, 1466, + 1399, 1476, 114, 311, 427, 1399, 1472, 1399, 106, 1466, + 1537, 780, 24, 25, 26, 28, 30, 32, 780, 1587, + 1591, 1592, 1399, 1399, 1809, 780, 1363, 1364, 1373, 1793, + 92, 93, 94, 95, 138, 139, 140, 189, 190, 253, + 316, 411, 478, 544, 546, 552, 612, 656, 748, 759, + 1531, 1532, 1399, 106, 1459, 1459, 1446, 1399, 1399, 1399, + 1531, 1399, 1399, 1399, 1816, 1474, 336, 782, 787, 106, + 1466, 1399, 106, 1466, 1399, 1399, 1399, 1399, 1399, 780, + 1402, 780, 1399, 1399, 780, 648, 1466, 1466, 106, 1466, + 780, 1587, 1466, 1466, 1399, 1399, 1428, 1429, 1430, 64, + 163, 288, 1399, 1418, 1419, 1420, 1399, 1399, 106, 1466, + 1399, 1399, 1399, 1414, 1415, 1399, 1399, 1471, 1472, 1399, + 1399, 409, 410, 713, 716, 1533, 1399, 1399, 1472, 1812, + 1399, 1399, 127, 1812, 1471, 1399, 127, 1399, 1399, 1812, + 1399, 1399, 1532, 1532, 1399, 1418, 1399, 780, 8, 787, + 1810, 1826, 1399, 1471, 1399, 1399, 1399, 780, 782, 1364, + 1399, 787, 1399, 1399, 1399, 1401, 122, 201, 290, 732, + 1405, 47, 340, 1401, 1408, 1401, 779, 1374, 1401, 1401, + 167, 55, 151, 167, 238, 1402, 1402, 1402, 1402, 1402, + 1402, 1402, 153, 1402, 153, 1402, 1402, 1402, 1402, 1402, + 1172, 1828, 1424, 779, 1455, 1548, 1826, 779, 136, 328, + 329, 330, 1816, 1434, 461, 493, 567, 648, 1416, 169, + 229, 505, 703, 1011, 1015, 1750, 1820, 914, 410, 713, + 716, 913, 1456, 1790, 1809, 782, 287, 1328, 1329, 1812, + 945, 782, 127, 1831, 1830, 1931, 861, 1918, 770, 1390, + 1391, 1393, 468, 506, 661, 1862, 1647, 1917, 1826, 73, + 1399, 1881, 1880, 1879, 787, 787, 1647, 782, 1853, 232, + 492, 1882, 1883, 1884, 1885, 1826, 1872, 99, 717, 1816, + 1855, 1867, 1857, 1858, 1860, 1871, 688, 127, 770, 1068, + 63, 862, 862, 1812, 862, 318, 862, 862, 862, 1812, + 1831, 1812, 1392, 1392, 376, 688, 1713, 862, 1713, 1708, + 376, 688, 1713, 151, 1711, 510, 553, 688, 1705, 1705, + 1713, 1826, 862, 1713, 1830, 1708, 1713, 1820, 490, 701, + 451, 127, 1699, 782, 435, 688, 1812, 1710, 1708, 1708, + 127, 1713, 1713, 1713, 1480, 1664, 1812, 1393, 1656, 1658, + 779, 1651, 2009, 782, 779, 1800, 154, 1635, 885, 427, + 3, 151, 782, 217, 1343, 1345, 1346, 448, 614, 1291, + 363, 239, 1399, 800, 99, 143, 803, 1399, 1659, 1660, + 510, 510, 510, 510, 360, 510, 817, 510, 782, 1392, + 1727, 1828, 913, 923, 782, 763, 1535, 1901, 120, 676, + 1399, 1293, 1616, 287, 1748, 817, 1744, 1826, 47, 1278, + 627, 683, 1285, 1286, 127, 819, 820, 673, 1282, 819, + 1891, 1786, 596, 1988, 1828, 833, 1826, 827, 1914, 1930, + 1828, 1068, 1068, 822, 1812, 1068, 862, 2077, 1393, 1973, + 847, 1393, 1068, 1068, 1068, 743, 1493, 782, 780, 780, + 780, 780, 780, 782, 780, 1477, 47, 53, 55, 128, + 1384, 1536, 158, 158, 210, 1516, 166, 249, 1504, 1516, + 1477, 1495, 779, 1383, 1607, 1828, 782, 787, 1399, 65, + 137, 1540, 1542, 251, 649, 1571, 1575, 572, 668, 746, + 1389, 1816, 439, 251, 577, 782, 787, 664, 1564, 649, + 1571, 1596, 1399, 2024, 2025, 1227, 1648, 1066, 73, 1166, + 418, 191, 231, 268, 386, 398, 498, 568, 865, 867, + 1631, 1828, 1631, 1235, 779, 480, 242, 782, 1938, 1812, + 1232, 1231, 1812, 782, 595, 1304, 1826, 872, 780, 782, + 283, 945, 970, 886, 68, 108, 142, 179, 481, 511, + 512, 514, 515, 516, 517, 518, 520, 521, 522, 523, + 524, 525, 526, 527, 529, 530, 531, 532, 625, 626, + 808, 809, 816, 127, 1321, 734, 1617, 1319, 779, 896, + 24, 28, 30, 32, 1158, 1157, 1647, 1158, 30, 295, + 317, 666, 1147, 1148, 1148, 1175, 99, 1172, 1158, 1133, + 1176, 1177, 1167, 57, 73, 391, 1161, 1148, 1222, 1786, + 1158, 1222, 1148, 310, 1148, 1158, 888, 889, 2007, 2020, + 42, 99, 1993, 2014, 1133, 1133, 1148, 252, 723, 1826, + 2014, 237, 1144, 1176, 57, 1178, 1133, 1158, 1148, 30, + 1148, 895, 26, 769, 903, 904, 1584, 1586, 2104, 1506, + 703, 782, 1683, 787, 1689, 222, 1562, 1563, 1688, 128, + 770, 1826, 203, 1826, 782, 782, 67, 244, 1273, 1616, + 1616, 886, 779, 947, 950, 287, 314, 1913, 63, 770, + 1812, 1826, 1928, 1928, 780, 782, 1999, 2016, 1635, 1399, + 1831, 1339, 1340, 1341, 1342, 1812, 146, 144, 321, 463, + 1817, 1823, 1832, 1837, 1838, 1839, 1840, 1841, 1842, 1843, + 1846, 2002, 178, 232, 755, 1895, 1586, 1894, 940, 945, + 154, 649, 1826, 937, 945, 947, 948, 952, 1826, 872, + 1826, 977, 979, 980, 2008, 2084, 2104, 1891, 1862, 42, + 1816, 1399, 780, 1467, 780, 780, 283, 427, 1399, 1399, + 53, 299, 780, 299, 782, 1442, 780, 770, 780, 782, + 782, 780, 780, 1364, 128, 780, 1444, 1445, 1399, 782, + 782, 782, 769, 780, 782, 780, 782, 782, 780, 779, + 1809, 1816, 1466, 780, 780, 1466, 780, 782, 782, 780, + 780, 780, 151, 782, 782, 780, 780, 1466, 780, 780, + 780, 780, 782, 128, 782, 780, 128, 1399, 128, 1399, + 128, 1399, 128, 780, 782, 780, 1466, 780, 780, 782, + 782, 780, 782, 782, 782, 780, 780, 780, 782, 780, + 780, 782, 780, 780, 780, 1812, 780, 780, 780, 1812, + 782, 780, 782, 782, 780, 782, 782, 782, 780, 780, + 782, 1816, 1826, 780, 787, 53, 504, 782, 1189, 780, + 780, 1531, 1531, 1472, 780, 785, 1816, 122, 201, 290, + 732, 779, 50, 1399, 434, 1401, 1401, 779, 1374, 1401, + 1401, 1399, 1399, 1549, 217, 1551, 779, 779, 779, 779, + 779, 787, 1393, 1438, 1439, 1440, 378, 779, 1020, 1021, + 1013, 1020, 1014, 591, 1023, 160, 472, 1399, 763, 1831, + 1831, 782, 1891, 427, 131, 1917, 128, 782, 1928, 1928, + 782, 1399, 1807, 1816, 787, 787, 787, 99, 144, 321, + 463, 577, 750, 1817, 1820, 1825, 1834, 1837, 1838, 1839, + 1840, 1842, 1843, 1846, 2002, 1875, 127, 1647, 99, 1172, + 1173, 1831, 31, 578, 593, 1887, 1888, 1826, 1826, 1864, + 1863, 127, 580, 755, 504, 782, 782, 1647, 1888, 787, + 1856, 787, 1647, 782, 782, 1859, 1399, 780, 1826, 862, + 862, 1820, 1399, 862, 1713, 1713, 862, 1713, 1820, 128, + 1712, 859, 1713, 613, 1573, 1698, 1711, 819, 1708, 1812, + 1713, 1713, 1399, 258, 1506, 1660, 780, 782, 1652, 886, + 1797, 1801, 1803, 53, 1636, 1637, 2092, 2105, 1828, 99, + 1336, 1826, 1334, 1812, 1006, 1345, 145, 160, 1198, 1347, + 801, 782, 100, 1737, 817, 1732, 1616, 1733, 921, 924, + 925, 920, 573, 574, 650, 922, 454, 561, 1826, 1902, + 1903, 1820, 1616, 448, 614, 736, 1296, 1297, 1298, 1586, + 47, 1747, 670, 782, 365, 1277, 1694, 782, 127, 1989, + 1064, 1065, 299, 723, 1210, 1826, 314, 1912, 1938, 844, + 1826, 1826, 1812, 824, 862, 2046, 2047, 862, 2072, 1068, + 1068, 1812, 862, 1826, 862, 1068, 1399, 1477, 1477, 785, + 576, 713, 717, 1379, 1380, 1426, 1380, 158, 1516, 1516, + 1508, 158, 203, 299, 1530, 1826, 1535, 1166, 1169, 1603, + 1826, 1399, 1543, 1808, 1541, 750, 1545, 1540, 314, 580, + 1572, 1571, 507, 1586, 1575, 1576, 439, 1575, 1575, 1816, + 549, 1565, 1808, 123, 779, 1888, 1888, 1064, 1820, 1648, + 1648, 557, 268, 268, 657, 1820, 268, 268, 268, 182, + 360, 406, 484, 547, 563, 564, 568, 569, 570, 636, + 686, 840, 841, 88, 476, 586, 593, 599, 674, 735, + 845, 846, 65, 314, 742, 1932, 270, 369, 494, 566, + 695, 756, 1926, 1927, 1934, 314, 1941, 1891, 203, 855, + 1240, 779, 1966, 1230, 1303, 127, 871, 1399, 2000, 971, + 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 782, 819, 734, 877, 878, + 1826, 2067, 2068, 2069, 156, 780, 780, 780, 780, 1826, + 782, 317, 295, 99, 1172, 1157, 780, 782, 780, 780, + 782, 144, 1128, 1817, 1837, 1838, 1839, 1840, 1841, 1846, + 1399, 1399, 2014, 2014, 787, 763, 1178, 209, 265, 269, + 901, 902, 903, 906, 1405, 1826, 24, 25, 28, 30, + 32, 427, 1380, 1620, 1826, 299, 1826, 576, 168, 1577, + 1480, 787, 1689, 1812, 1917, 1831, 1891, 427, 897, 898, + 951, 34, 1930, 333, 787, 787, 287, 287, 1802, 962, + 1636, 782, 1343, 1345, 1822, 755, 506, 392, 941, 154, + 938, 949, 780, 782, 787, 1997, 986, 975, 981, 1827, + 981, 981, 2098, 427, 1825, 1399, 782, 1399, 1399, 283, + 57, 71, 96, 109, 125, 153, 155, 295, 307, 409, + 410, 559, 666, 716, 739, 1130, 1468, 1469, 1470, 1167, + 1167, 1468, 1472, 780, 153, 153, 1399, 1472, 1472, 782, + 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1402, 787, 780, + 780, 1399, 1399, 1399, 1399, 1399, 780, 1399, 1399, 1399, + 1399, 128, 1399, 128, 1399, 128, 1399, 153, 1399, 780, + 1415, 1399, 1414, 1472, 1399, 1399, 1399, 1472, 28, 768, + 1584, 1588, 153, 1399, 1399, 1399, 1399, 1399, 787, 787, + 1826, 57, 71, 1184, 1185, 1186, 1187, 1188, 1587, 1586, + 780, 769, 769, 1373, 1401, 780, 782, 1401, 50, 1399, + 434, 1531, 1531, 1550, 1826, 65, 780, 1452, 1471, 1399, + 1430, 1471, 1399, 1420, 1471, 1471, 1816, 1399, 780, 782, + 779, 1029, 1402, 1021, 168, 1059, 1060, 1587, 697, 1024, + 338, 1016, 1012, 913, 287, 1329, 287, 241, 584, 1929, + 1830, 128, 128, 1391, 1394, 1394, 787, 787, 787, 1647, + 1399, 1831, 1874, 1647, 779, 779, 1647, 1647, 1888, 792, + 232, 632, 659, 1886, 1884, 1883, 1873, 1826, 1882, 1826, + 1868, 1857, 1858, 1867, 433, 747, 1584, 1589, 1703, 30, + 1712, 1538, 1708, 1669, 1670, 1810, 1381, 1394, 1393, 1655, + 1657, 1660, 427, 780, 779, 1629, 1618, 1812, 786, 321, + 1993, 2028, 1344, 779, 1660, 763, 819, 127, 314, 1728, + 1729, 763, 782, 36, 37, 454, 499, 561, 604, 763, + 764, 765, 1904, 1906, 1538, 127, 128, 1299, 1297, 819, + 1286, 1820, 733, 1287, 110, 642, 1993, 2005, 1586, 545, + 358, 472, 652, 1216, 1216, 203, 1210, 333, 1941, 126, + 203, 203, 823, 839, 840, 2046, 2080, 386, 867, 1993, + 2043, 2044, 2045, 2073, 1974, 862, 834, 2079, 641, 2078, + 1812, 782, 1380, 31, 1402, 50, 287, 1477, 1508, 158, + 158, 1477, 1508, 1498, 1499, 780, 782, 1525, 1526, 1168, + 1608, 16, 17, 782, 1544, 51, 104, 1566, 1399, 1455, + 1546, 1547, 1545, 712, 1572, 1576, 1389, 782, 1566, 1570, + 1393, 1597, 1598, 1599, 1173, 1168, 408, 408, 413, 489, + 1648, 1648, 65, 1648, 1650, 1648, 182, 547, 314, 1648, + 1649, 1649, 841, 1236, 1820, 1820, 1820, 1820, 1586, 1820, + 1820, 780, 782, 31, 593, 1828, 1935, 1936, 31, 31, + 31, 50, 1925, 533, 534, 537, 538, 539, 1939, 1940, + 331, 593, 1239, 1225, 390, 654, 240, 1241, 1826, 1967, + 53, 1966, 47, 378, 1305, 872, 283, 779, 779, 1586, + 779, 1586, 1586, 1820, 1820, 1589, 1820, 1586, 1820, 1820, + 1820, 1820, 1820, 1820, 1820, 1586, 1820, 404, 568, 671, + 1791, 122, 290, 1586, 1594, 1820, 1586, 809, 780, 782, + 148, 151, 212, 881, 1993, 2015, 649, 927, 1128, 898, + 30, 1176, 1786, 1176, 888, 1826, 30, 782, 2092, 461, + 787, 1480, 1689, 1392, 251, 1575, 245, 1685, 1538, 1891, + 1273, 177, 899, 780, 1399, 950, 314, 1943, 584, 770, + 770, 1930, 1930, 113, 114, 115, 963, 1626, 1341, 1812, + 1345, 143, 1348, 1763, 1399, 948, 1826, 872, 2010, 352, + 975, 787, 1399, 1399, 1152, 1152, 1145, 1154, 95, 155, + 1150, 1149, 1151, 1153, 1152, 155, 1153, 1150, 780, 780, + 780, 780, 1443, 1399, 1399, 780, 206, 1461, 1461, 1399, + 782, 782, 780, 782, 780, 780, 780, 151, 1435, 1436, + 1816, 780, 780, 780, 780, 780, 782, 127, 782, 1399, + 1399, 1399, 1399, 780, 780, 53, 1409, 780, 53, 780, + 780, 780, 28, 30, 30, 780, 782, 1399, 780, 780, + 782, 782, 780, 1816, 1826, 787, 779, 1179, 1179, 51, + 104, 643, 768, 1181, 1182, 1183, 782, 782, 1399, 1399, + 780, 1472, 1401, 780, 782, 1401, 1551, 1543, 206, 1454, + 780, 780, 780, 780, 780, 780, 779, 1394, 1440, 1017, + 1018, 1019, 1826, 780, 1589, 153, 65, 779, 1031, 763, + 779, 1021, 1831, 1812, 128, 1931, 1931, 53, 1395, 1820, + 1826, 770, 1816, 1826, 1826, 1876, 1888, 1887, 31, 31, + 1866, 1865, 387, 726, 232, 1888, 1647, 1647, 1888, 24, + 25, 28, 30, 32, 1573, 1704, 1713, 782, 1667, 1647, + 1535, 1660, 780, 782, 177, 1363, 11, 12, 258, 1001, + 1363, 1638, 1640, 1643, 1506, 311, 2029, 2030, 779, 225, + 1527, 1528, 1529, 1826, 779, 1730, 232, 250, 362, 370, + 385, 395, 396, 397, 405, 543, 555, 640, 655, 693, + 707, 926, 925, 1905, 1573, 734, 554, 513, 816, 1288, + 690, 690, 1812, 203, 1830, 1239, 408, 1812, 1812, 11, + 13, 18, 145, 167, 215, 272, 273, 274, 292, 346, + 348, 368, 386, 393, 408, 415, 430, 487, 497, 535, + 548, 587, 593, 651, 658, 690, 705, 706, 718, 997, + 999, 1070, 1072, 1073, 1075, 1077, 1078, 1079, 1086, 1817, + 1070, 2081, 53, 156, 2037, 1820, 2043, 779, 882, 1993, + 2032, 2034, 862, 848, 1966, 779, 884, 2032, 2033, 96, + 155, 234, 692, 1084, 2033, 835, 1494, 1380, 1380, 203, + 1501, 1508, 1508, 203, 1503, 1399, 779, 1006, 1826, 1523, + 1524, 378, 1770, 1808, 53, 782, 1808, 1571, 1575, 1399, + 780, 782, 1588, 1588, 1588, 1588, 1588, 1588, 1631, 846, + 31, 53, 299, 1933, 1937, 208, 1926, 1586, 1586, 1586, + 1791, 768, 1584, 1585, 1939, 173, 294, 1237, 446, 46, + 48, 49, 70, 72, 78, 110, 173, 204, 206, 217, + 240, 338, 375, 419, 420, 426, 438, 459, 483, 550, + 618, 629, 630, 631, 722, 1004, 1071, 1073, 1244, 1249, + 1251, 1254, 1260, 1261, 1262, 1264, 1265, 1559, 1405, 1949, + 342, 437, 849, 287, 419, 426, 851, 780, 782, 1968, + 1969, 53, 47, 779, 1306, 2000, 812, 813, 1586, 814, + 815, 1586, 810, 811, 1586, 2068, 212, 890, 15, 787, + 780, 902, 1826, 1538, 1826, 439, 251, 1686, 1682, 1349, + 1793, 131, 1938, 1938, 960, 1999, 960, 1638, 1348, 502, + 143, 328, 1769, 1998, 987, 2104, 1826, 1176, 1151, 1176, + 1176, 780, 1531, 1531, 65, 256, 1460, 168, 1463, 1464, + 780, 1399, 1399, 1472, 193, 357, 780, 314, 1437, 1399, + 1399, 1399, 1531, 96, 109, 125, 155, 234, 295, 409, + 410, 558, 559, 716, 1138, 1139, 1410, 1411, 1412, 1413, + 1468, 1594, 1531, 1399, 1399, 1826, 1587, 780, 1189, 1184, + 1182, 1184, 1185, 1586, 780, 1472, 206, 1552, 65, 780, + 1471, 1395, 780, 782, 347, 1062, 1399, 1015, 217, 1032, + 1033, 1034, 1587, 1017, 1931, 1820, 1826, 787, 1647, 1647, + 1888, 780, 780, 1888, 1888, 1870, 1869, 1573, 1670, 1538, + 99, 1659, 1525, 1394, 1660, 780, 1641, 1642, 1805, 1806, + 1810, 1826, 1793, 1639, 1685, 1643, 2031, 2030, 47, 1250, + 1258, 1259, 1826, 780, 782, 1589, 1738, 1739, 447, 173, + 779, 763, 782, 826, 1812, 754, 830, 832, 75, 594, + 787, 1087, 1088, 1089, 1090, 1098, 1099, 1104, 1105, 1106, + 1198, 1201, 1202, 1811, 1826, 167, 741, 418, 1812, 1648, + 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 418, + 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, + 421, 541, 1826, 1648, 1648, 1002, 1003, 1004, 782, 1072, + 998, 1647, 2037, 226, 463, 1993, 2063, 2064, 2065, 883, + 864, 54, 335, 995, 203, 53, 875, 876, 247, 676, + 247, 1966, 22, 29, 31, 1478, 1500, 299, 1502, 299, + 1530, 143, 298, 459, 1518, 1519, 1522, 117, 118, 205, + 282, 1771, 1772, 170, 1773, 1566, 1548, 1547, 1566, 1572, + 1571, 1394, 1599, 593, 1820, 1935, 30, 30, 593, 99, + 153, 560, 1238, 75, 217, 384, 594, 702, 1090, 1098, + 1099, 1266, 1198, 1266, 217, 1266, 217, 217, 281, 287, + 75, 126, 217, 594, 702, 1103, 1198, 1266, 1648, 217, + 65, 1006, 53, 287, 384, 763, 1198, 1275, 1648, 217, + 159, 705, 159, 217, 705, 1266, 217, 592, 217, 217, + 217, 1071, 782, 1003, 1249, 779, 1089, 603, 1399, 1399, + 203, 855, 862, 203, 386, 856, 1826, 1631, 1363, 1968, + 1307, 485, 780, 782, 780, 782, 780, 782, 252, 1826, + 1684, 128, 439, 1390, 1631, 584, 314, 1942, 1942, 203, + 1661, 154, 872, 981, 427, 780, 780, 1462, 1808, 1786, + 1463, 1465, 1574, 780, 780, 782, 780, 498, 549, 613, + 780, 780, 1145, 155, 1153, 71, 1153, 1176, 780, 780, + 782, 780, 780, 780, 1180, 780, 782, 780, 65, 229, + 251, 1553, 1554, 1808, 780, 1019, 1531, 160, 472, 780, + 782, 1035, 780, 770, 1878, 1877, 1888, 1888, 819, 1562, + 406, 1798, 780, 782, 787, 1364, 1645, 1646, 1810, 1631, + 901, 780, 782, 1528, 780, 782, 50, 1740, 1657, 1820, + 816, 779, 828, 1828, 779, 779, 1221, 1811, 10, 127, + 1100, 1826, 780, 782, 72, 126, 225, 293, 1102, 1197, + 1104, 1068, 1198, 1199, 1199, 1107, 787, 1812, 1648, 99, + 1586, 1593, 99, 1586, 99, 1586, 99, 1586, 1074, 1589, + 1586, 1586, 1820, 1820, 1648, 1586, 1828, 454, 499, 568, + 1083, 1586, 1589, 1589, 99, 1586, 1820, 99, 389, 391, + 425, 455, 588, 622, 1082, 1593, 1586, 1593, 1000, 1769, + 1072, 1070, 26, 28, 30, 32, 99, 1590, 1591, 1820, + 1826, 226, 463, 892, 1817, 1837, 1840, 1841, 1846, 2049, + 2050, 2051, 2057, 2062, 2065, 2018, 2055, 2018, 2053, 427, + 2065, 879, 880, 2068, 865, 866, 1949, 2074, 101, 150, + 296, 996, 654, 1968, 780, 877, 1979, 1980, 1820, 1979, + 53, 31, 378, 1481, 1399, 779, 1399, 779, 780, 1198, + 1198, 1519, 65, 65, 117, 65, 1772, 271, 282, 1774, + 1775, 1572, 779, 446, 30, 331, 141, 1068, 141, 1067, + 741, 1067, 1621, 1621, 1324, 1621, 1250, 1259, 1812, 1166, + 1621, 160, 1622, 10, 1621, 741, 225, 1621, 1621, 99, + 1826, 1324, 1560, 1561, 1810, 1005, 1621, 1621, 1812, 99, + 1826, 1324, 1259, 1621, 1324, 1324, 1324, 1250, 46, 78, + 110, 1262, 1085, 1087, 335, 454, 1274, 1531, 669, 1820, + 422, 1242, 314, 1970, 1631, 1310, 1826, 47, 779, 1308, + 813, 815, 811, 15, 787, 1631, 1402, 131, 1939, 1944, + 1945, 424, 1685, 281, 975, 782, 1566, 780, 1399, 549, + 445, 1589, 780, 1586, 1565, 780, 55, 403, 410, 713, + 716, 725, 1555, 1556, 1790, 1566, 685, 1061, 1016, 779, + 1022, 1034, 1036, 1826, 1888, 1888, 1577, 1799, 1805, 770, + 1826, 780, 782, 1647, 283, 1259, 1739, 419, 780, 1218, + 1220, 1826, 779, 583, 1218, 1218, 779, 1826, 1088, 779, + 160, 160, 1199, 1068, 236, 1191, 1221, 1826, 1068, 1068, + 660, 927, 1108, 1129, 1131, 1826, 780, 1820, 779, 1820, + 53, 1063, 1002, 2055, 2053, 786, 2082, 2051, 2062, 2057, + 2052, 786, 2052, 786, 2013, 780, 782, 105, 2037, 203, + 849, 864, 2070, 1128, 2070, 1968, 779, 780, 1530, 1530, + 127, 1517, 1517, 1786, 1786, 65, 1786, 65, 65, 1775, + 31, 1238, 411, 1237, 1405, 1324, 1405, 1100, 1826, 1811, + 1250, 1811, 1246, 287, 1248, 1168, 1811, 1621, 1258, 127, + 160, 1811, 1811, 1250, 782, 1566, 1009, 1826, 1811, 1587, + 314, 1106, 1250, 1255, 1250, 780, 1826, 850, 857, 858, + 72, 361, 506, 780, 782, 1309, 252, 723, 1826, 287, + 584, 1945, 1662, 1631, 1812, 1808, 780, 780, 780, 725, + 1556, 1557, 1790, 649, 601, 440, 1558, 601, 1790, 1062, + 779, 1029, 1025, 99, 303, 304, 403, 475, 1037, 1668, + 1803, 787, 1646, 1660, 2016, 367, 780, 782, 1566, 779, + 1218, 779, 780, 780, 1826, 779, 1399, 1068, 1221, 1826, + 1812, 299, 1209, 723, 1221, 1221, 1110, 787, 1101, 1102, + 1109, 787, 1733, 1001, 1000, 2037, 2060, 2037, 2058, 352, + 427, 2048, 1826, 1826, 862, 1993, 2035, 2068, 2039, 2040, + 1393, 854, 855, 2071, 2035, 2035, 195, 1482, 1483, 1826, + 1535, 780, 780, 136, 158, 206, 1521, 1520, 1786, 1786, + 1786, 780, 120, 1252, 120, 144, 196, 1217, 110, 258, + 1106, 1318, 281, 287, 73, 1811, 1826, 1273, 1245, 1561, + 287, 287, 281, 1274, 1256, 1258, 1247, 685, 852, 2092, + 584, 72, 72, 1826, 225, 1311, 1312, 1826, 15, 1402, + 160, 1506, 1566, 458, 50, 458, 136, 403, 568, 712, + 1027, 1028, 1826, 780, 696, 1030, 1039, 711, 145, 386, + 393, 408, 535, 548, 565, 705, 1053, 1054, 1055, 1058, + 1075, 1707, 1631, 244, 770, 1891, 1220, 30, 782, 1219, + 845, 1891, 1891, 782, 1826, 780, 1221, 1209, 723, 779, + 1192, 1216, 1091, 1216, 1093, 1094, 18, 225, 293, 386, + 495, 752, 1075, 1111, 1112, 1121, 1163, 1164, 1165, 1190, + 1405, 1131, 73, 99, 201, 203, 346, 465, 660, 1115, + 1117, 1155, 1156, 1164, 1826, 780, 1076, 1077, 2018, 786, + 2018, 786, 2104, 2083, 2056, 2054, 2035, 2084, 1975, 851, + 2037, 218, 780, 782, 1484, 65, 65, 779, 779, 1811, + 591, 779, 1253, 144, 99, 99, 1274, 1812, 217, 1173, + 1324, 1826, 1811, 1812, 1257, 1296, 1399, 428, 853, 6, + 842, 584, 584, 780, 782, 723, 296, 1764, 1557, 649, + 209, 323, 780, 782, 1587, 779, 1041, 1043, 1038, 418, + 1648, 1648, 418, 1648, 1648, 1648, 1648, 779, 1048, 1055, + 430, 299, 386, 497, 723, 744, 1075, 1203, 1206, 1211, + 1212, 1213, 1217, 1566, 780, 1826, 780, 780, 314, 1204, + 1208, 1212, 1215, 1205, 1207, 1212, 1214, 1826, 782, 1097, + 1095, 1216, 1193, 1826, 180, 1194, 779, 1092, 779, 779, + 160, 1820, 702, 1164, 741, 160, 201, 1172, 19, 20, + 768, 769, 779, 1125, 1126, 1127, 1374, 1421, 1789, 296, + 339, 99, 53, 391, 1156, 1162, 2061, 2059, 427, 2013, + 2034, 2033, 2041, 1812, 856, 2039, 1478, 1483, 127, 1132, + 1134, 1135, 1136, 1486, 1487, 1527, 1529, 1102, 1587, 1032, + 1127, 1006, 1034, 1006, 154, 1399, 1312, 1663, 1169, 1026, + 1028, 779, 1042, 1043, 1044, 182, 1040, 1043, 1648, 1820, + 1820, 1648, 1590, 1590, 1587, 1828, 697, 1049, 1050, 1648, + 1216, 1820, 1648, 1216, 1263, 1264, 1265, 1213, 752, 1891, + 589, 1263, 1215, 1263, 1214, 780, 1826, 779, 779, 1096, + 780, 782, 462, 590, 667, 203, 1195, 1218, 779, 1218, + 1218, 426, 1159, 1791, 1791, 1124, 198, 737, 649, 1125, + 1157, 1155, 2039, 2039, 2035, 864, 247, 352, 127, 422, + 842, 1485, 207, 120, 218, 780, 780, 780, 779, 1671, + 1672, 1810, 1765, 1030, 780, 782, 182, 1046, 1047, 1402, + 1820, 1820, 1051, 780, 782, 1080, 1828, 1586, 1265, 1264, + 585, 1203, 1817, 780, 1218, 1218, 779, 1826, 101, 296, + 780, 1218, 780, 780, 780, 779, 1396, 427, 686, 1116, + 1826, 1993, 2036, 2036, 1979, 2104, 1393, 857, 1481, 218, + 1478, 1032, 782, 1647, 251, 1776, 1043, 782, 1045, 1052, + 1828, 1050, 1263, 780, 1219, 1218, 67, 244, 258, 568, + 1196, 1196, 1203, 780, 1204, 1205, 780, 1587, 1113, 1114, + 1163, 1113, 595, 691, 745, 1118, 864, 2042, 1976, 1478, + 99, 201, 432, 1488, 1489, 1490, 1491, 780, 1672, 1660, + 480, 1770, 1047, 780, 1056, 1057, 1058, 1191, 780, 1219, + 99, 201, 332, 203, 203, 1203, 780, 1163, 1119, 1120, + 1121, 427, 112, 24, 25, 28, 30, 1478, 1479, 203, + 1489, 1491, 1489, 1490, 65, 1773, 1058, 1203, 780, 296, + 101, 1121, 649, 116, 432, 203, 203, 1786, 143, 1777, + 1203, 1196, 1196, 1977, 30, 779, 1779, 457, 600, 1971, + 1972, 170, 251, 1778, 3, 780, 1780, 1781, 1810, 258, + 1782, 1828, 1978, 1828, 780, 782, 1783, 1784, 1810, 1631, + 2092, 1781, 782, 1647, 842, 1784, 1393, 1660, 1394 +}; + +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ +static const yytype_int16 yyr1[] = +{ + 0, 788, 789, 790, 789, 789, 791, 791, 792, 792, + 792, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 794, 795, 795, 797, 796, 798, 799, 800, 798, + 801, 802, 801, 803, 803, 805, 804, 807, 806, 808, + 808, 809, 809, 809, 809, 809, 809, 809, 809, 809, + 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, + 809, 810, 810, 810, 811, 812, 812, 812, 813, 814, + 814, 814, 815, 816, 816, 816, 816, 816, 816, 816, + 816, 817, 817, 818, 819, 819, 820, 822, 823, 821, + 824, 821, 825, 826, 821, 827, 828, 821, 829, 830, + 821, 831, 832, 821, 833, 821, 834, 821, 835, 821, + 836, 821, 837, 821, 821, 821, 838, 821, 821, 839, + 839, 840, 840, 841, 841, 841, 841, 841, 841, 841, + 841, 841, 841, 841, 841, 841, 841, 842, 842, 844, + 843, 845, 845, 846, 846, 846, 846, 846, 846, 846, + 848, 847, 850, 849, 849, 851, 851, 851, 851, 852, + 852, 853, 853, 854, 854, 855, 856, 856, 858, 857, + 859, 860, 860, 861, 861, 861, 861, 862, 862, 863, + 863, 864, 864, 865, 865, 865, 865, 865, 865, 865, + 866, 866, 867, 867, 869, 868, 870, 868, 871, 868, + 872, 872, 873, 873, 874, 874, 875, 876, 875, 877, + 877, 878, 879, 879, 880, 880, 881, 881, 881, 883, + 882, 884, 885, 885, 886, 886, 887, 887, 887, 888, + 889, 889, 890, 891, 893, 892, 892, 892, 895, 894, + 896, 896, 897, 899, 898, 900, 900, 900, 900, 901, + 901, 902, 903, 903, 904, 905, 905, 906, 906, 906, + 906, 906, 906, 907, 907, 908, 909, 909, 910, 910, + 911, 911, 912, 912, 913, 913, 913, 914, 914, 914, + 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, + 915, 916, 917, 917, 918, 918, 919, 919, 920, 921, + 921, 922, 922, 922, 923, 924, 924, 925, 926, 926, + 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, + 926, 926, 927, 927, 928, 928, 930, 929, 932, 931, + 933, 933, 935, 934, 934, 936, 936, 937, 936, 938, + 936, 939, 939, 940, 939, 941, 939, 942, 943, 944, + 946, 945, 947, 949, 948, 951, 950, 952, 952, 953, + 953, 954, 954, 954, 955, 956, 956, 956, 957, 957, + 958, 959, 959, 961, 962, 960, 963, 963, 963, 963, + 965, 964, 967, 966, 966, 968, 968, 969, 969, 971, + 970, 973, 972, 974, 974, 975, 975, 976, 976, 977, + 978, 978, 978, 979, 980, 981, 983, 982, 984, 982, + 985, 986, 987, 982, 988, 982, 990, 989, 991, 989, + 992, 993, 989, 994, 989, 995, 995, 996, 996, 996, + 998, 997, 997, 997, 999, 999, 1000, 1000, 1001, 1001, + 1002, 1003, 1003, 1005, 1004, 1006, 1008, 1007, 1010, 1009, + 1011, 1012, 1011, 1011, 1011, 1013, 1011, 1011, 1014, 1011, + 1015, 1015, 1016, 1016, 1017, 1017, 1018, 1018, 1019, 1020, + 1021, 1022, 1023, 1023, 1024, 1025, 1024, 1026, 1024, 1027, + 1027, 1028, 1029, 1030, 1030, 1031, 1031, 1032, 1032, 1033, + 1033, 1035, 1034, 1036, 1037, 1038, 1037, 1039, 1037, 1037, + 1037, 1037, 1040, 1040, 1041, 1041, 1042, 1042, 1044, 1045, + 1043, 1046, 1046, 1047, 1047, 1048, 1048, 1049, 1049, 1051, + 1050, 1052, 1053, 1053, 1054, 1054, 1055, 1055, 1056, 1056, + 1057, 1057, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, + 1058, 1059, 1060, 1059, 1059, 1061, 1061, 1062, 1062, 1063, + 1063, 1064, 1064, 1065, 1065, 1066, 1066, 1066, 1067, 1067, + 1068, 1068, 1069, 1069, 1070, 1070, 1071, 1071, 1072, 1072, + 1072, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1074, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1075, 1075, 1075, + 1075, 1076, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1083, 1083, 1083, 1084, 1084, + 1084, 1084, 1085, 1086, 1087, 1087, 1088, 1088, 1088, 1088, + 1088, 1089, 1089, 1091, 1090, 1092, 1090, 1093, 1090, 1094, + 1090, 1095, 1090, 1096, 1090, 1097, 1090, 1098, 1099, 1100, + 1101, 1101, 1102, 1103, 1103, 1104, 1104, 1105, 1107, 1106, + 1109, 1108, 1110, 1108, 1111, 1111, 1112, 1112, 1113, 1113, + 1114, 1114, 1115, 1115, 1115, 1115, 1116, 1115, 1115, 1115, + 1117, 1117, 1118, 1118, 1118, 1118, 1119, 1119, 1120, 1120, + 1121, 1121, 1121, 1121, 1123, 1122, 1124, 1124, 1125, 1125, + 1126, 1126, 1127, 1127, 1128, 1129, 1129, 1130, 1130, 1130, + 1131, 1131, 1131, 1131, 1131, 1131, 1132, 1132, 1132, 1132, + 1132, 1132, 1132, 1132, 1132, 1132, 1133, 1133, 1133, 1133, + 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1135, 1135, + 1135, 1135, 1135, 1136, 1136, 1136, 1136, 1136, 1136, 1136, + 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1137, 1137, + 1138, 1139, 1139, 1140, 1140, 1141, 1141, 1141, 1141, 1141, + 1142, 1142, 1142, 1142, 1142, 1143, 1143, 1143, 1144, 1144, + 1145, 1145, 1145, 1146, 1147, 1147, 1147, 1147, 1147, 1147, + 1148, 1149, 1149, 1149, 1149, 1150, 1151, 1152, 1152, 1153, + 1153, 1154, 1154, 1155, 1155, 1156, 1156, 1156, 1156, 1156, + 1156, 1156, 1157, 1157, 1158, 1158, 1159, 1159, 1160, 1161, + 1162, 1163, 1163, 1163, 1164, 1164, 1164, 1165, 1165, 1166, + 1166, 1167, 1167, 1168, 1168, 1169, 1169, 1170, 1170, 1171, + 1171, 1172, 1173, 1173, 1174, 1174, 1175, 1175, 1175, 1176, + 1176, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, + 1178, 1178, 1180, 1179, 1181, 1181, 1182, 1183, 1183, 1183, + 1183, 1184, 1185, 1186, 1186, 1187, 1188, 1188, 1189, 1189, + 1190, 1190, 1191, 1192, 1192, 1193, 1193, 1194, 1194, 1194, + 1194, 1195, 1195, 1195, 1195, 1195, 1196, 1196, 1196, 1196, + 1196, 1197, 1197, 1198, 1198, 1199, 1199, 1200, 1200, 1200, + 1201, 1202, 1203, 1203, 1204, 1204, 1205, 1205, 1206, 1206, + 1207, 1207, 1208, 1208, 1209, 1209, 1210, 1210, 1210, 1211, + 1211, 1212, 1212, 1212, 1212, 1212, 1213, 1213, 1214, 1215, + 1215, 1216, 1216, 1216, 1217, 1217, 1218, 1218, 1219, 1219, + 1220, 1220, 1221, 1221, 1222, 1222, 1224, 1225, 1223, 1226, + 1223, 1227, 1223, 1223, 1228, 1223, 1229, 1223, 1230, 1223, + 1231, 1223, 1232, 1223, 1233, 1223, 1223, 1234, 1235, 1236, + 1223, 1237, 1237, 1238, 1238, 1238, 1238, 1239, 1239, 1239, + 1239, 1239, 1240, 1240, 1240, 1240, 1241, 1241, 1242, 1242, + 1243, 1243, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + 1244, 1244, 1245, 1244, 1244, 1246, 1244, 1247, 1244, 1244, + 1244, 1244, 1244, 1244, 1248, 1244, 1249, 1250, 1250, 1252, + 1251, 1253, 1253, 1253, 1255, 1254, 1256, 1257, 1256, 1258, + 1258, 1259, 1260, 1260, 1261, 1262, 1262, 1262, 1262, 1262, + 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, + 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, + 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1263, 1263, + 1263, 1263, 1263, 1264, 1264, 1265, 1265, 1266, 1266, 1267, + 1267, 1269, 1268, 1270, 1270, 1271, 1271, 1272, 1272, 1273, + 1273, 1273, 1274, 1274, 1274, 1275, 1275, 1275, 1275, 1277, + 1276, 1278, 1276, 1276, 1276, 1279, 1280, 1280, 1281, 1281, + 1282, 1282, 1282, 1284, 1283, 1285, 1285, 1286, 1286, 1286, + 1287, 1287, 1287, 1288, 1288, 1290, 1289, 1291, 1291, 1291, + 1292, 1293, 1292, 1295, 1294, 1296, 1296, 1297, 1297, 1298, + 1298, 1298, 1299, 1299, 1299, 1301, 1300, 1302, 1302, 1303, + 1304, 1304, 1305, 1305, 1306, 1307, 1306, 1308, 1309, 1308, + 1310, 1310, 1310, 1311, 1311, 1311, 1312, 1312, 1313, 1313, + 1314, 1315, 1314, 1317, 1316, 1318, 1318, 1319, 1319, 1320, + 1320, 1320, 1320, 1320, 1320, 1321, 1321, 1323, 1322, 1324, + 1324, 1324, 1326, 1325, 1325, 1327, 1327, 1328, 1328, 1329, + 1331, 1330, 1332, 1332, 1333, 1333, 1334, 1335, 1336, 1336, + 1338, 1337, 1339, 1339, 1340, 1340, 1341, 1342, 1344, 1343, + 1346, 1345, 1347, 1347, 1348, 1348, 1350, 1349, 1351, 1349, + 1353, 1352, 1354, 1352, 1355, 1355, 1357, 1356, 1359, 1360, + 1358, 1361, 1362, 1363, 1363, 1364, 1364, 1366, 1365, 1367, + 1365, 1368, 1368, 1369, 1370, 1369, 1369, 1371, 1371, 1372, + 1373, 1374, 1374, 1375, 1375, 1376, 1377, 1377, 1378, 1378, + 1379, 1379, 1379, 1380, 1380, 1380, 1381, 1382, 1382, 1383, + 1383, 1384, 1384, 1384, 1384, 1385, 1385, 1386, 1386, 1386, + 1387, 1387, 1388, 1388, 1389, 1389, 1389, 1389, 1390, 1390, + 1390, 1391, 1391, 1392, 1393, 1394, 1395, 1395, 1395, 1395, + 1395, 1396, 1396, 1396, 1397, 1397, 1397, 1398, 1398, 1399, + 1399, 1399, 1399, 1399, 1400, 1400, 1400, 1400, 1400, 1400, + 1400, 1400, 1400, 1400, 1400, 1400, 1401, 1401, 1401, 1401, + 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, + 1401, 1401, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, + 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, + 1402, 1403, 1403, 1404, 1404, 1405, 1405, 1406, 1406, 1407, + 1407, 1407, 1407, 1407, 1407, 1408, 1408, 1409, 1409, 1410, + 1410, 1410, 1411, 1411, 1411, 1411, 1411, 1411, 1412, 1412, + 1412, 1413, 1413, 1414, 1415, 1415, 1416, 1416, 1416, 1416, + 1417, 1418, 1418, 1419, 1420, 1420, 1420, 1420, 1420, 1420, + 1420, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, + 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, + 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, + 1422, 1422, 1422, 1422, 1423, 1423, 1424, 1424, 1424, 1424, + 1424, 1424, 1425, 1425, 1426, 1426, 1427, 1427, 1427, 1427, + 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, + 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1428, 1428, 1429, + 1429, 1430, 1430, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1434, 1433, 1433, 1433, 1433, 1433, + 1433, 1433, 1433, 1433, 1433, 1433, 1435, 1435, 1436, 1436, + 1437, 1437, 1438, 1438, 1439, 1439, 1440, 1441, 1441, 1441, + 1441, 1441, 1441, 1441, 1442, 1443, 1441, 1441, 1441, 1441, + 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1444, 1441, 1445, + 1441, 1446, 1441, 1447, 1447, 1448, 1448, 1448, 1449, 1449, + 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, + 1449, 1450, 1452, 1451, 1451, 1453, 1453, 1454, 1455, 1457, + 1456, 1458, 1458, 1458, 1458, 1459, 1459, 1460, 1460, 1461, + 1461, 1462, 1462, 1463, 1463, 1464, 1465, 1467, 1466, 1468, + 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1469, 1469, 1469, + 1469, 1469, 1469, 1469, 1469, 1470, 1470, 1470, 1470, 1471, + 1471, 1472, 1472, 1473, 1473, 1474, 1474, 1475, 1475, 1476, + 1476, 1477, 1477, 1478, 1478, 1478, 1479, 1479, 1479, 1479, + 1479, 1480, 1481, 1482, 1482, 1484, 1483, 1485, 1483, 1486, + 1486, 1486, 1487, 1487, 1487, 1487, 1488, 1488, 1488, 1488, + 1488, 1489, 1489, 1489, 1490, 1491, 1493, 1494, 1492, 1495, + 1495, 1496, 1496, 1497, 1498, 1497, 1499, 1497, 1497, 1500, + 1497, 1501, 1497, 1497, 1502, 1497, 1503, 1497, 1497, 1504, + 1504, 1504, 1505, 1505, 1506, 1506, 1507, 1508, 1508, 1508, + 1508, 1508, 1509, 1509, 1510, 1510, 1511, 1511, 1512, 1512, + 1513, 1513, 1514, 1515, 1515, 1516, 1516, 1517, 1517, 1517, + 1517, 1518, 1518, 1520, 1519, 1521, 1519, 1522, 1522, 1523, + 1524, 1523, 1526, 1525, 1527, 1527, 1528, 1528, 1529, 1529, + 1530, 1530, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, + 1531, 1531, 1531, 1531, 1532, 1532, 1532, 1532, 1532, 1532, + 1532, 1532, 1532, 1533, 1533, 1533, 1533, 1534, 1534, 1534, + 1535, 1535, 1536, 1537, 1537, 1538, 1539, 1538, 1540, 1541, + 1540, 1542, 1542, 1543, 1543, 1544, 1544, 1544, 1545, 1545, + 1546, 1546, 1547, 1549, 1548, 1550, 1550, 1551, 1551, 1552, + 1552, 1553, 1553, 1554, 1554, 1555, 1555, 1556, 1556, 1556, + 1557, 1557, 1557, 1558, 1558, 1558, 1558, 1558, 1558, 1559, + 1560, 1560, 1561, 1562, 1562, 1564, 1563, 1565, 1565, 1566, + 1566, 1566, 1567, 1567, 1568, 1568, 1568, 1568, 1569, 1569, + 1569, 1569, 1569, 1570, 1570, 1571, 1571, 1572, 1572, 1573, + 1574, 1574, 1574, 1575, 1575, 1575, 1575, 1575, 1575, 1576, + 1577, 1577, 1577, 1577, 1578, 1578, 1578, 1579, 1579, 1580, + 1581, 1582, 1582, 1582, 1583, 1583, 1584, 1584, 1585, 1585, + 1586, 1586, 1586, 1586, 1586, 1586, 1587, 1587, 1587, 1587, + 1587, 1588, 1588, 1588, 1588, 1589, 1589, 1589, 1589, 1589, + 1590, 1590, 1590, 1590, 1590, 1591, 1592, 1592, 1593, 1593, + 1594, 1594, 1594, 1596, 1595, 1597, 1597, 1598, 1598, 1599, + 1601, 1600, 1602, 1602, 1603, 1604, 1604, 1604, 1605, 1607, + 1608, 1606, 1606, 1606, 1610, 1609, 1612, 1611, 1613, 1611, + 1611, 1611, 1611, 1614, 1611, 1611, 1611, 1611, 1615, 1611, + 1611, 1616, 1616, 1617, 1618, 1619, 1619, 1620, 1621, 1621, + 1622, 1622, 1623, 1623, 1625, 1626, 1624, 1628, 1629, 1627, + 1630, 1631, 1632, 1632, 1632, 1633, 1633, 1634, 1634, 1635, + 1635, 1637, 1636, 1638, 1638, 1639, 1638, 1640, 1641, 1641, + 1642, 1642, 1643, 1644, 1644, 1645, 1645, 1646, 1647, 1647, + 1648, 1648, 1649, 1649, 1650, 1650, 1652, 1651, 1654, 1653, + 1655, 1655, 1656, 1656, 1657, 1657, 1658, 1658, 1659, 1659, + 1660, 1660, 1661, 1662, 1663, 1661, 1664, 1664, 1666, 1667, + 1668, 1665, 1669, 1669, 1670, 1670, 1671, 1671, 1672, 1673, + 1673, 1675, 1674, 1676, 1676, 1677, 1677, 1678, 1679, 1680, + 1681, 1682, 1680, 1683, 1684, 1680, 1685, 1686, 1685, 1687, + 1687, 1688, 1688, 1689, 1689, 1690, 1690, 1691, 1691, 1691, + 1693, 1694, 1692, 1695, 1695, 1696, 1696, 1697, 1697, 1698, + 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1699, 1699, + 1701, 1700, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1703, 1702, 1704, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1705, + 1705, 1705, 1706, 1706, 1707, 1707, 1708, 1708, 1709, 1709, + 1710, 1710, 1711, 1711, 1712, 1712, 1713, 1713, 1713, 1715, + 1714, 1716, 1714, 1717, 1717, 1717, 1717, 1717, 1717, 1718, + 1718, 1719, 1720, 1720, 1720, 1720, 1721, 1721, 1722, 1722, + 1722, 1723, 1725, 1724, 1727, 1726, 1726, 1728, 1728, 1729, + 1730, 1729, 1731, 1731, 1732, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1733, 1733, 1734, 1735, 1736, 1735, 1735, 1737, + 1737, 1738, 1738, 1738, 1739, 1740, 1740, 1742, 1741, 1743, + 1743, 1745, 1744, 1746, 1744, 1744, 1747, 1747, 1748, 1748, + 1749, 1750, 1749, 1752, 1751, 1753, 1753, 1753, 1754, 1754, + 1754, 1755, 1755, 1756, 1756, 1758, 1757, 1759, 1759, 1760, + 1762, 1763, 1764, 1765, 1761, 1766, 1766, 1767, 1767, 1768, + 1768, 1768, 1769, 1769, 1769, 1770, 1770, 1771, 1771, 1772, + 1772, 1772, 1772, 1773, 1773, 1774, 1774, 1775, 1775, 1776, + 1776, 1777, 1777, 1778, 1778, 1779, 1779, 1779, 1780, 1780, + 1781, 1781, 1782, 1782, 1783, 1783, 1784, 1785, 1785, 1785, + 1785, 1786, 1786, 1787, 1787, 1787, 1788, 1788, 1788, 1789, + 1789, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, + 1790, 1791, 1791, 1791, 1791, 1791, 1792, 1792, 1792, 1794, + 1793, 1795, 1795, 1796, 1796, 1797, 1798, 1799, 1798, 1800, + 1800, 1801, 1802, 1803, 1803, 1804, 1805, 1805, 1806, 1806, + 1807, 1807, 1808, 1809, 1809, 1809, 1809, 1809, 1810, 1810, + 1810, 1810, 1810, 1811, 1811, 1811, 1811, 1812, 1812, 1812, + 1813, 1813, 1814, 1815, 1815, 1816, 1816, 1816, 1817, 1818, + 1818, 1818, 1818, 1819, 1820, 1821, 1822, 1823, 1823, 1824, + 1824, 1825, 1825, 1825, 1826, 1826, 1827, 1827, 1828, 1828, + 1828, 1829, 1829, 1829, 1830, 1830, 1831, 1832, 1832, 1832, + 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1833, + 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, + 1833, 1833, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, + 1834, 1834, 1834, 1834, 1834, 1835, 1835, 1835, 1835, 1835, + 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1836, 1836, + 1836, 1836, 1836, 1836, 1836, 1836, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1838, + 1838, 1838, 1838, 1838, 1838, 1839, 1839, 1839, 1839, 1839, + 1839, 1839, 1839, 1839, 1839, 1840, 1840, 1840, 1841, 1841, + 1841, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1843, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1845, + 1845, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, + 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, + 1846, 1846, 1846, 1846, 1846, 1846, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1849, 1848, 1850, 1850, 1851, 1850, 1852, 1850, + 1853, 1850, 1854, 1854, 1855, 1855, 1856, 1855, 1857, 1857, + 1859, 1858, 1858, 1860, 1860, 1860, 1861, 1861, 1861, 1861, + 1862, 1862, 1862, 1862, 1864, 1863, 1865, 1863, 1866, 1863, + 1868, 1867, 1869, 1867, 1870, 1867, 1872, 1871, 1873, 1871, + 1874, 1871, 1875, 1871, 1876, 1871, 1877, 1871, 1878, 1871, + 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1879, 1871, 1880, + 1871, 1881, 1871, 1882, 1882, 1882, 1882, 1883, 1884, 1885, + 1885, 1886, 1886, 1886, 1886, 1887, 1887, 1887, 1888, 1888, + 1888, 1888, 1888, 1890, 1889, 1891, 1891, 1891, 1892, 1892, + 1893, 1893, 1894, 1895, 1895, 1895, 1895, 1895, 1897, 1896, + 1899, 1898, 1900, 1900, 1901, 1900, 1902, 1902, 1903, 1903, + 1904, 1904, 1904, 1904, 1905, 1904, 1906, 1906, 1906, 1906, + 1906, 1907, 1908, 1908, 1908, 1908, 1908, 1909, 1909, 1910, + 1911, 1911, 1911, 1911, 1912, 1912, 1913, 1913, 1914, 1914, + 1915, 1916, 1917, 1917, 1918, 1918, 1919, 1919, 1920, 1920, + 1921, 1921, 1921, 1921, 1922, 1923, 1923, 1923, 1923, 1924, + 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, + 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, + 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, + 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, + 1924, 1925, 1925, 1926, 1926, 1927, 1927, 1927, 1928, 1928, + 1928, 1928, 1929, 1929, 1930, 1930, 1931, 1931, 1932, 1932, + 1933, 1933, 1934, 1934, 1934, 1934, 1935, 1935, 1936, 1937, + 1937, 1937, 1938, 1938, 1938, 1938, 1938, 1939, 1939, 1939, + 1939, 1939, 1940, 1940, 1941, 1941, 1942, 1942, 1943, 1943, + 1944, 1944, 1945, 1945, 1947, 1946, 1948, 1949, 1949, 1950, + 1950, 1951, 1951, 1951, 1952, 1952, 1952, 1953, 1954, 1954, + 1954, 1955, 1956, 1957, 1957, 1957, 1958, 1958, 1958, 1959, + 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1960, 1960, + 1961, 1962, 1963, 1963, 1963, 1964, 1964, 1965, 1965, 1966, + 1966, 1967, 1967, 1969, 1968, 1970, 1970, 1970, 1970, 1971, + 1971, 1972, 1972, 1974, 1975, 1976, 1977, 1978, 1973, 1980, + 1979, 1981, 1981, 1981, 1981, 1981, 1981, 1982, 1982, 1983, + 1983, 1983, 1984, 1984, 1984, 1985, 1985, 1985, 1986, 1986, + 1987, 1988, 1987, 1989, 1989, 1990, 1990, 1991, 1991, 1992, + 1993, 1994, 1994, 1995, 1996, 1995, 1997, 1995, 1998, 1995, + 1999, 2000, 2001, 2002, 2002, 2003, 2003, 2003, 2003, 2003, + 2003, 2003, 2003, 2004, 2004, 2004, 2004, 2004, 2004, 2004, + 2004, 2005, 2005, 2005, 2006, 2007, 2009, 2008, 2010, 2011, + 2012, 2013, 2014, 2014, 2014, 2015, 2015, 2015, 2017, 2016, + 2018, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2020, + 2020, 2021, 2021, 2023, 2022, 2024, 2022, 2025, 2022, 2026, + 2026, 2027, 2028, 2028, 2029, 2029, 2031, 2030, 2032, 2033, + 2033, 2034, 2034, 2035, 2035, 2036, 2036, 2037, 2037, 2038, + 2040, 2041, 2042, 2039, 2043, 2043, 2044, 2044, 2045, 2045, + 2047, 2046, 2048, 2048, 2049, 2049, 2049, 2050, 2050, 2051, + 2051, 2052, 2054, 2053, 2056, 2055, 2057, 2057, 2057, 2059, + 2058, 2061, 2060, 2062, 2063, 2063, 2064, 2064, 2065, 2065, + 2066, 2066, 2067, 2068, 2068, 2068, 2069, 2069, 2069, 2069, + 2071, 2070, 2073, 2074, 2072, 2075, 2075, 2075, 2075, 2075, + 2077, 2076, 2078, 2076, 2079, 2076, 2076, 2080, 2076, 2081, + 2082, 2083, 2076, 2084, 2084, 2086, 2085, 2085, 2087, 2087, + 2088, 2088, 2089, 2089, 2090, 2090, 2090, 2091, 2090, 2092, + 2092, 2092, 2092, 2092, 2092, 2093, 2093, 2093, 2093, 2093, + 2093, 2093, 2093, 2093, 2093, 2093, 2094, 2094, 2094, 2094, + 2096, 2095, 2097, 2098, 2095, 2099, 2099, 2101, 2100, 2102, + 2103, 2100, 2105, 2104 +}; + +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 1, 0, 4, 2, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 0, 5, 3, 0, 0, 6, + 0, 0, 3, 1, 3, 0, 3, 0, 7, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, + 1, 0, 1, 3, 1, 0, 1, 3, 1, 0, + 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 1, 1, 0, 1, 3, 0, 0, 8, + 0, 8, 0, 0, 15, 0, 0, 17, 0, 0, + 15, 0, 0, 15, 0, 6, 0, 10, 0, 11, + 0, 5, 0, 5, 8, 6, 0, 3, 1, 0, + 1, 1, 2, 3, 2, 1, 3, 2, 1, 3, + 3, 3, 1, 1, 1, 1, 3, 0, 1, 0, + 12, 1, 3, 2, 2, 2, 2, 2, 2, 2, + 0, 12, 0, 6, 2, 0, 1, 3, 1, 0, + 2, 0, 2, 0, 1, 4, 0, 2, 0, 3, + 0, 0, 1, 1, 1, 1, 2, 3, 1, 0, + 2, 0, 2, 2, 2, 2, 2, 3, 3, 1, + 1, 2, 3, 3, 0, 4, 0, 6, 0, 8, + 0, 3, 0, 1, 3, 1, 0, 0, 2, 3, + 1, 1, 0, 1, 3, 1, 1, 1, 1, 0, + 4, 3, 0, 3, 2, 3, 1, 3, 5, 2, + 1, 3, 3, 1, 0, 4, 4, 1, 0, 6, + 0, 3, 0, 0, 3, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 3, 0, 1, 1, 1, 1, + 2, 1, 1, 2, 3, 3, 1, 1, 0, 1, + 0, 2, 3, 5, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 4, 0, 1, 1, 3, 1, 3, 3, 1, + 2, 1, 1, 1, 1, 1, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 0, 5, 0, 2, + 1, 1, 0, 3, 1, 1, 2, 0, 4, 0, + 5, 1, 2, 0, 4, 0, 5, 2, 2, 2, + 0, 2, 0, 0, 3, 0, 3, 1, 3, 0, + 3, 1, 1, 1, 3, 3, 4, 5, 2, 4, + 2, 1, 3, 0, 0, 6, 0, 2, 2, 2, + 0, 6, 0, 3, 1, 1, 2, 1, 2, 0, + 5, 0, 5, 0, 2, 0, 1, 0, 1, 2, + 5, 3, 5, 3, 5, 1, 0, 5, 0, 5, + 0, 0, 0, 8, 0, 5, 0, 3, 0, 3, + 0, 0, 5, 0, 3, 1, 1, 1, 1, 1, + 0, 5, 3, 1, 2, 4, 0, 4, 1, 4, + 1, 0, 1, 0, 4, 0, 0, 3, 0, 6, + 6, 0, 4, 2, 2, 0, 3, 2, 0, 3, + 0, 1, 0, 3, 0, 1, 1, 3, 1, 4, + 3, 3, 0, 2, 0, 0, 7, 0, 10, 1, + 3, 1, 1, 0, 2, 0, 3, 1, 3, 0, + 1, 0, 6, 1, 0, 0, 4, 0, 3, 1, + 1, 1, 1, 1, 1, 3, 1, 3, 0, 0, + 5, 1, 3, 1, 1, 0, 3, 1, 3, 0, + 4, 1, 0, 1, 2, 1, 1, 1, 0, 1, + 2, 1, 3, 4, 3, 3, 3, 3, 4, 4, + 3, 0, 0, 6, 3, 0, 2, 0, 1, 0, + 1, 0, 1, 1, 2, 1, 1, 3, 0, 3, + 0, 3, 1, 3, 0, 1, 1, 2, 1, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 6, 1, 1, 3, 4, 4, 2, 2, + 2, 3, 3, 3, 1, 3, 1, 3, 3, 3, + 3, 0, 1, 2, 4, 4, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, + 2, 1, 3, 0, 9, 0, 10, 0, 9, 0, + 9, 0, 11, 0, 12, 0, 10, 2, 7, 7, + 0, 1, 4, 0, 1, 0, 1, 2, 0, 4, + 0, 3, 0, 3, 0, 1, 2, 1, 0, 1, + 2, 1, 0, 1, 2, 3, 0, 6, 5, 5, + 0, 2, 0, 1, 1, 1, 0, 1, 2, 1, + 1, 2, 2, 1, 0, 3, 1, 3, 3, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 3, 3, 3, 2, + 1, 1, 3, 3, 3, 3, 0, 1, 2, 2, + 3, 3, 2, 3, 3, 4, 3, 3, 3, 1, + 2, 2, 2, 2, 3, 3, 2, 2, 2, 3, + 3, 2, 3, 2, 2, 2, 2, 2, 5, 5, + 1, 1, 2, 2, 1, 2, 1, 2, 3, 2, + 1, 1, 1, 1, 1, 1, 1, 2, 0, 3, + 0, 1, 1, 5, 0, 1, 1, 1, 2, 2, + 1, 3, 3, 3, 3, 1, 1, 0, 1, 0, + 1, 0, 1, 2, 1, 1, 2, 4, 1, 3, + 2, 1, 0, 2, 0, 1, 0, 1, 2, 2, + 2, 3, 2, 1, 1, 1, 2, 1, 2, 2, + 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 2, 1, 1, 0, + 1, 1, 1, 2, 1, 2, 3, 3, 2, 2, + 0, 1, 0, 4, 1, 1, 1, 0, 1, 2, + 1, 1, 2, 1, 3, 3, 1, 1, 0, 2, + 0, 1, 5, 0, 3, 3, 1, 0, 2, 2, + 2, 0, 3, 3, 6, 6, 1, 1, 2, 2, + 2, 2, 2, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 1, 1, 2, + 1, 2, 1, 2, 0, 2, 0, 2, 2, 2, + 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 2, 4, 2, 0, 4, + 1, 4, 0, 1, 1, 3, 0, 0, 9, 0, + 5, 0, 7, 7, 0, 6, 0, 6, 0, 11, + 0, 10, 0, 11, 0, 8, 8, 0, 0, 0, + 9, 1, 1, 0, 1, 1, 3, 0, 2, 3, + 5, 5, 0, 3, 1, 4, 0, 3, 0, 2, + 0, 1, 0, 2, 2, 2, 2, 1, 1, 1, + 4, 4, 0, 6, 4, 0, 5, 0, 6, 4, + 3, 1, 7, 7, 0, 7, 2, 1, 1, 0, + 6, 0, 3, 2, 0, 5, 0, 0, 6, 1, + 3, 1, 1, 3, 3, 3, 2, 2, 4, 4, + 2, 7, 6, 5, 5, 4, 5, 4, 4, 2, + 2, 7, 5, 6, 3, 6, 6, 4, 6, 1, + 1, 1, 1, 1, 3, 3, 3, 5, 0, 1, + 1, 2, 2, 3, 3, 3, 3, 0, 1, 0, + 1, 0, 2, 0, 1, 2, 1, 1, 1, 0, + 1, 1, 0, 2, 1, 0, 1, 1, 1, 0, + 7, 0, 5, 5, 4, 3, 0, 1, 1, 3, + 3, 2, 2, 0, 2, 1, 3, 0, 1, 1, + 0, 2, 4, 1, 3, 0, 5, 0, 1, 1, + 3, 0, 4, 0, 4, 0, 1, 1, 2, 1, + 1, 1, 0, 2, 2, 0, 5, 1, 3, 2, + 0, 3, 1, 4, 1, 0, 4, 1, 0, 4, + 0, 1, 3, 0, 1, 3, 1, 1, 2, 6, + 3, 0, 4, 0, 3, 0, 1, 1, 2, 1, + 1, 1, 1, 1, 2, 0, 2, 0, 6, 0, + 1, 1, 0, 5, 4, 3, 5, 1, 3, 4, + 0, 6, 1, 1, 1, 3, 2, 3, 1, 1, + 0, 6, 1, 1, 1, 3, 3, 4, 0, 6, + 0, 2, 0, 4, 0, 2, 0, 3, 0, 4, + 0, 3, 0, 4, 1, 1, 0, 3, 0, 0, + 5, 6, 7, 1, 2, 1, 1, 0, 3, 0, + 3, 3, 3, 1, 0, 4, 3, 1, 1, 1, + 1, 1, 4, 0, 1, 2, 1, 1, 0, 1, + 0, 1, 1, 2, 1, 2, 9, 0, 1, 0, + 2, 3, 1, 4, 4, 2, 1, 1, 1, 1, + 3, 5, 0, 1, 0, 2, 1, 2, 3, 1, + 1, 3, 4, 0, 0, 0, 0, 2, 2, 1, + 1, 0, 2, 3, 0, 2, 3, 0, 2, 3, + 3, 3, 2, 1, 3, 4, 3, 4, 3, 4, + 3, 4, 3, 3, 6, 1, 3, 4, 5, 7, + 6, 8, 5, 6, 4, 3, 5, 4, 6, 3, + 4, 1, 3, 3, 3, 3, 3, 3, 3, 5, + 5, 5, 6, 6, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, + 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, + 2, 2, 1, 4, 1, 3, 1, 1, 1, 1, + 3, 1, 1, 1, 4, 4, 4, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 6, 4, 4, 7, 6, 3, 4, 6, + 6, 4, 4, 4, 4, 4, 4, 6, 8, 10, + 1, 1, 3, 1, 1, 3, 1, 2, 2, 2, + 2, 2, 1, 3, 4, 6, 4, 6, 2, 2, + 4, 4, 4, 10, 6, 8, 6, 4, 4, 6, + 4, 3, 4, 1, 4, 3, 4, 1, 1, 5, + 3, 5, 3, 6, 8, 2, 2, 8, 8, 6, + 6, 2, 6, 2, 6, 8, 4, 1, 3, 4, + 8, 8, 4, 2, 2, 2, 6, 6, 4, 8, + 4, 4, 8, 4, 6, 6, 4, 6, 8, 6, + 5, 8, 7, 10, 0, 5, 4, 4, 4, 6, + 8, 6, 6, 6, 6, 6, 2, 3, 0, 4, + 0, 3, 0, 1, 1, 3, 4, 4, 5, 4, + 4, 4, 5, 4, 0, 0, 7, 4, 5, 4, + 5, 4, 4, 4, 4, 4, 5, 0, 9, 0, + 8, 0, 7, 3, 3, 1, 1, 1, 3, 3, + 3, 3, 3, 4, 4, 4, 6, 4, 6, 4, + 6, 5, 0, 7, 4, 4, 4, 4, 1, 0, + 3, 3, 1, 3, 5, 0, 1, 0, 2, 0, + 3, 4, 2, 0, 1, 2, 1, 0, 3, 2, + 3, 3, 3, 2, 1, 1, 1, 1, 1, 2, + 1, 2, 2, 1, 2, 1, 2, 2, 3, 0, + 1, 1, 3, 1, 3, 1, 3, 4, 5, 1, + 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 4, 1, 3, 0, 3, 0, 5, 2, + 4, 4, 1, 1, 1, 1, 0, 1, 2, 1, + 2, 1, 1, 2, 3, 3, 0, 0, 10, 1, + 4, 1, 3, 3, 0, 6, 0, 8, 4, 0, + 8, 0, 10, 6, 0, 8, 0, 10, 6, 1, + 2, 1, 1, 2, 0, 1, 5, 1, 1, 1, + 1, 1, 1, 3, 1, 3, 3, 3, 3, 3, + 3, 3, 5, 3, 2, 0, 1, 0, 2, 3, + 3, 1, 1, 0, 7, 0, 7, 1, 2, 0, + 0, 2, 0, 2, 0, 1, 1, 1, 1, 3, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 2, 0, 1, 0, 0, 3, 0, 0, + 3, 0, 4, 4, 2, 0, 1, 1, 0, 2, + 3, 1, 3, 0, 7, 0, 1, 0, 3, 0, + 3, 0, 3, 1, 1, 1, 4, 2, 2, 2, + 1, 2, 2, 0, 3, 2, 2, 3, 3, 3, + 3, 1, 2, 0, 1, 0, 4, 4, 2, 0, + 1, 1, 0, 1, 2, 5, 4, 1, 4, 7, + 5, 8, 3, 1, 1, 1, 1, 1, 2, 1, + 1, 3, 3, 1, 3, 1, 1, 1, 1, 1, + 0, 2, 3, 4, 1, 2, 1, 0, 1, 1, + 1, 0, 2, 2, 2, 1, 0, 1, 2, 2, + 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 6, 0, 1, 3, 1, 3, + 0, 2, 3, 1, 1, 2, 1, 3, 2, 0, + 0, 7, 2, 1, 0, 3, 0, 8, 0, 8, + 4, 5, 5, 0, 6, 4, 4, 4, 0, 6, + 1, 1, 3, 1, 2, 1, 3, 1, 0, 2, + 0, 2, 0, 1, 0, 0, 12, 0, 0, 10, + 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, + 1, 0, 2, 1, 2, 0, 3, 3, 0, 1, + 3, 1, 1, 3, 1, 3, 1, 3, 1, 1, + 0, 1, 1, 1, 1, 1, 0, 4, 0, 4, + 0, 1, 0, 1, 3, 1, 5, 3, 1, 1, + 1, 1, 0, 0, 0, 7, 5, 1, 0, 0, + 0, 13, 3, 1, 3, 3, 3, 1, 3, 0, + 1, 0, 3, 0, 3, 2, 3, 3, 2, 5, + 0, 0, 7, 0, 0, 8, 0, 0, 3, 1, + 3, 2, 4, 0, 2, 0, 2, 1, 1, 1, + 0, 0, 7, 0, 1, 0, 1, 1, 3, 1, + 1, 2, 2, 2, 1, 1, 1, 1, 0, 3, + 0, 3, 2, 4, 4, 3, 4, 4, 1, 3, + 3, 3, 3, 6, 2, 2, 0, 6, 0, 8, + 5, 2, 1, 1, 1, 5, 5, 2, 2, 1, + 4, 3, 2, 3, 2, 2, 1, 4, 4, 3, + 3, 3, 2, 2, 3, 4, 3, 3, 3, 3, + 4, 4, 3, 2, 3, 3, 3, 3, 3, 4, + 4, 3, 3, 4, 4, 3, 4, 4, 3, 1, + 1, 1, 1, 1, 0, 1, 0, 2, 0, 1, + 1, 1, 0, 2, 0, 2, 0, 3, 3, 0, + 4, 0, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 2, 1, 1, 0, 3, 0, 1, + 1, 5, 0, 4, 0, 4, 1, 0, 1, 4, + 0, 3, 3, 1, 2, 2, 2, 2, 3, 4, + 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 2, 0, 1, 2, 2, 0, 3, 1, 0, + 5, 0, 1, 3, 1, 0, 3, 0, 3, 3, + 1, 0, 5, 0, 3, 2, 0, 1, 0, 2, + 5, 0, 6, 0, 4, 0, 1, 1, 2, 2, + 3, 0, 1, 1, 2, 0, 3, 0, 4, 2, + 0, 0, 0, 0, 23, 1, 1, 0, 1, 0, + 1, 1, 0, 1, 1, 0, 2, 2, 1, 3, + 4, 3, 3, 0, 2, 2, 1, 3, 3, 0, + 4, 0, 3, 1, 1, 0, 3, 2, 3, 1, + 1, 2, 0, 2, 3, 1, 5, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 2, 2, 2, 0, + 4, 0, 1, 1, 3, 7, 0, 0, 4, 0, + 3, 1, 1, 1, 3, 1, 1, 1, 3, 5, + 3, 5, 1, 1, 3, 4, 5, 4, 1, 3, + 4, 4, 5, 1, 5, 3, 2, 1, 3, 2, + 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 3, 1, 3, 0, 3, 0, 3, + 0, 5, 1, 3, 1, 3, 0, 3, 1, 3, + 0, 3, 1, 1, 1, 1, 0, 1, 1, 1, + 0, 2, 2, 2, 0, 4, 0, 6, 0, 6, + 0, 4, 0, 6, 0, 6, 0, 4, 0, 6, + 0, 6, 0, 5, 0, 7, 0, 9, 0, 9, + 2, 3, 2, 4, 3, 5, 2, 0, 4, 0, + 4, 0, 6, 1, 1, 3, 3, 1, 3, 2, + 2, 2, 2, 2, 1, 1, 4, 4, 1, 1, + 1, 1, 1, 0, 5, 0, 2, 1, 1, 1, + 1, 3, 3, 1, 1, 2, 2, 2, 0, 3, + 0, 3, 3, 2, 0, 6, 1, 2, 1, 1, + 1, 1, 1, 1, 0, 5, 1, 1, 1, 1, + 1, 3, 6, 6, 7, 5, 3, 4, 1, 3, + 8, 8, 6, 4, 0, 3, 0, 3, 1, 3, + 2, 1, 1, 1, 0, 1, 1, 2, 0, 1, + 1, 1, 3, 3, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 1, 3, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, + 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, + 2, 0, 1, 3, 1, 2, 2, 2, 1, 3, + 3, 1, 1, 3, 1, 3, 1, 3, 1, 1, + 1, 1, 4, 5, 4, 1, 3, 1, 2, 0, + 2, 5, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 0, 2, 0, 2, 0, 3, + 2, 1, 2, 1, 0, 3, 1, 0, 1, 0, + 1, 0, 3, 2, 0, 1, 2, 4, 4, 5, + 4, 2, 3, 2, 2, 2, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 3, 3, 3, 3, 0, 1, 3, 3, 0, + 3, 1, 3, 0, 3, 0, 3, 4, 4, 1, + 1, 0, 2, 0, 0, 0, 0, 0, 20, 0, + 2, 4, 4, 3, 4, 3, 3, 0, 3, 1, + 3, 5, 1, 1, 1, 0, 1, 1, 0, 2, + 0, 0, 3, 0, 2, 6, 3, 4, 4, 1, + 0, 1, 1, 1, 0, 3, 0, 5, 0, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 1, 1, 0, 6, 4, 1, + 1, 0, 1, 2, 2, 1, 1, 2, 0, 2, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 4, 0, 6, 0, 7, 1, + 2, 3, 1, 2, 1, 2, 0, 5, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 7, 2, 1, 1, 2, 1, 1, + 0, 2, 1, 3, 1, 1, 2, 1, 2, 1, + 2, 0, 0, 8, 0, 6, 4, 4, 1, 0, + 5, 0, 5, 2, 1, 1, 1, 2, 3, 3, + 5, 5, 2, 2, 3, 1, 6, 8, 4, 6, + 0, 5, 0, 0, 8, 6, 4, 4, 4, 5, + 0, 6, 0, 12, 0, 12, 10, 0, 12, 0, + 0, 0, 15, 1, 1, 0, 3, 1, 2, 3, + 2, 3, 1, 1, 1, 4, 2, 0, 6, 1, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 6, 0, 0, 9, 1, 2, 0, 5, 0, + 0, 7, 0, 4 +}; + + +enum { YYENOMEM = -2 }; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (thd, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use YYerror or YYUNDEF. */ +#define YYERRCODE YYUNDEF + + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value, thd); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, THD *thd) +{ + FILE *yyoutput = yyo; + YY_USE (yyoutput); + YY_USE (thd); + if (!yyvaluep) + return; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ + +static void +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, THD *thd) +{ + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); + + yy_symbol_value_print (yyo, yykind, yyvaluep, thd); + YYFPRINTF (yyo, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, + int yyrule, THD *thd) +{ + int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)], thd); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule, thd); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + + + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep, THD *thd) +{ + YY_USE (yyvaluep); + YY_USE (thd); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + switch (yykind) + { + case YYSYMBOL_expr_lex: /* expr_lex */ +#line 1551 "/home/buildbot/git/mkdist/sql/yy_oracle.yy" +{ + /* + In case of a syntax/oom error let's free the sp_expr_lex + instance, but only if it has not been linked to any structures + such as sp_instr_jump_if_not::m_lex_keeper yet, e.g.: + IF f1() THEN1 + i.e. THEN1 came instead of the expected THEN causing a syntax error. + */ + if (!((*yyvaluep).expr_lex)->sp_lex_in_use) + delete ((*yyvaluep).expr_lex); +} +#line 28691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case YYSYMBOL_cursor_actual_parameters: /* cursor_actual_parameters */ +#line 1610 "/home/buildbot/git/mkdist/sql/yy_oracle.yy" +{ + if (((*yyvaluep).sp_assignment_lex_list)) + { + sp_assignment_lex *elem; + List_iterator li(*((*yyvaluep).sp_assignment_lex_list)); + while ((elem= li++)) + { + if (!elem->sp_lex_in_use) + delete elem; + } + } +} +#line 28708 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case YYSYMBOL_opt_parenthesized_cursor_actual_parameters: /* opt_parenthesized_cursor_actual_parameters */ +#line 1610 "/home/buildbot/git/mkdist/sql/yy_oracle.yy" +{ + if (((*yyvaluep).sp_assignment_lex_list)) + { + sp_assignment_lex *elem; + List_iterator li(*((*yyvaluep).sp_assignment_lex_list)); + while ((elem= li++)) + { + if (!elem->sp_lex_in_use) + delete elem; + } + } +} +#line 28725 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + default: + break; + } + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + + + + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (THD *thd) +{ +/* Lookahead token kind. */ +int yychar; + + +/* The semantic value of the lookahead symbol. */ +/* Default value used for initialization, for pacifying older GCCs + or non-GCC compilers. */ +YY_INITIAL_VALUE (static YYSTYPE yyval_default;) +YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); + + /* Number of syntax errors so far. */ + int yynerrs = 0; + + yy_state_fast_t yystate = 0; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus = 0; + + /* Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; + + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; + + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; + + int yyn; + /* The return value of yyparse. */ + int yyresult; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yychar = YYEMPTY; /* Cause a token to be read. */ + + goto yysetstate; + + +/*------------------------------------------------------------. +| yynewstate -- push a new state, which is found in yystate. | +`------------------------------------------------------------*/ +yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); + + if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + YYNOMEM; +#else + { + /* Get the current used size of the three stacks, in elements. */ + YYPTRDIFF_T yysize = yyssp - yyss + 1; + +# if defined yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; + } +# else /* defined YYSTACK_RELOCATE */ + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + YYNOMEM; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + YYNOMEM; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ + + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (&yylval, thd); + } + + if (yychar <= YYEOF) + { + yychar = YYEOF; + yytoken = YYSYMBOL_YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else if (yychar == YYerror) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = YYUNDEF; + yytoken = YYSYMBOL_YYerror; + goto yyerrlab1; + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + /* Discard the shifted token. */ + yychar = YYEMPTY; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: /* query: END_OF_INPUT */ +#line 1976 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!thd->bootstrap && + (!(thd->lex->lex_options & OPTION_LEX_FOUND_COMMENT))) + my_yyabort_error((ER_EMPTY_QUERY, MYF(0))); + + thd->lex->sql_command= SQLCOM_EMPTY_QUERY; + YYLIP->found_semicolon= NULL; + } +#line 29008 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3: /* $@1: %empty */ +#line 1985 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_input_stream *lip = YYLIP; + + if ((thd->client_capabilities & CLIENT_MULTI_QUERIES) && + lip->multi_statements && + ! lip->eof()) + { + /* + We found a well formed query, and multi queries are allowed: + - force the parser to stop after the ';' + - mark the start of the next query for the next invocation + of the parser. + */ + lip->next_state= MY_LEX_END; + lip->found_semicolon= lip->get_ptr(); + } + else + { + /* Single query, terminated. */ + lip->found_semicolon= NULL; + } + } +#line 29035 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 5: /* query: directly_executable_statement END_OF_INPUT */ +#line 2010 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Single query, not terminated. */ + YYLIP->found_semicolon= NULL; + } +#line 29044 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 71: /* deallocate: deallocate_or_drop PREPARE_SYM ident */ +#line 2093 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_deallocate_prepare((yyvsp[0].ident_sys)); + } +#line 29052 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 74: /* $@2: %empty */ +#line 2105 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "PREPARE..FROM"; } +#line 29058 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 75: /* prepare: PREPARE_SYM ident FROM $@2 expr */ +#line 2107 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->clause_that_disallows_subselect= NULL; + if (Lex->stmt_prepare((yyvsp[-3].ident_sys), (yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 29068 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 76: /* execute: EXECUTE_SYM ident execute_using */ +#line 2116 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_execute((yyvsp[-1].ident_sys), (yyvsp[0].item_list))) + MYSQL_YYABORT; + } +#line 29077 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 77: /* $@3: %empty */ +#line 2121 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "EXECUTE IMMEDIATE"; } +#line 29083 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 78: /* $@4: %empty */ +#line 2123 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= NULL; } +#line 29089 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 79: /* execute: EXECUTE_SYM IMMEDIATE_SYM $@3 expr $@4 execute_using */ +#line 2125 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_execute_immediate((yyvsp[-2].item), (yyvsp[0].item_list))) + MYSQL_YYABORT; + } +#line 29098 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 80: /* execute_using: %empty */ +#line 2132 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 29104 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 81: /* $@5: %empty */ +#line 2134 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "EXECUTE..USING"; } +#line 29110 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 82: /* execute_using: USING $@5 execute_params */ +#line 2136 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= (yyvsp[0].item_list); + Lex->clause_that_disallows_subselect= NULL; + } +#line 29119 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 83: /* execute_params: expr_or_ignore_or_default */ +#line 2144 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_list)= List::make(thd->mem_root, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 29128 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 84: /* execute_params: execute_params ',' expr_or_ignore_or_default */ +#line 2149 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.item_list)= (yyvsp[-2].item_list))->push_back((yyvsp[0].item), thd->mem_root)) + MYSQL_YYABORT; + } +#line 29137 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 85: /* $@6: %empty */ +#line 2160 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HELP")); + } +#line 29146 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 86: /* help: HELP_SYM $@6 ident_or_text */ +#line 2165 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_HELP; + lex->help_arg= (yyvsp[0].lex_str).str; + } +#line 29156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 87: /* $@7: %empty */ +#line 2176 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_CHANGE_MASTER; + } +#line 29164 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 88: /* change: CHANGE MASTER_SYM optional_connection_name TO_SYM $@7 master_defs optional_for_channel */ +#line 2181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 29170 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 91: /* master_def: MASTER_HOST_SYM '=' TEXT_STRING_sys */ +#line 2191 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.host = (yyvsp[0].lex_str).str; + } +#line 29178 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 92: /* master_def: MASTER_USER_SYM '=' TEXT_STRING_sys */ +#line 2195 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.user = (yyvsp[0].lex_str).str; + } +#line 29186 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 93: /* master_def: MASTER_PASSWORD_SYM '=' TEXT_STRING_sys */ +#line 2199 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.password = (yyvsp[0].lex_str).str; + } +#line 29194 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 94: /* master_def: MASTER_PORT_SYM '=' ulong_num */ +#line 2203 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.port = (yyvsp[0].ulong_num); + } +#line 29202 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 95: /* master_def: MASTER_CONNECT_RETRY_SYM '=' ulong_num */ +#line 2207 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.connect_retry = (yyvsp[0].ulong_num); + } +#line 29210 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 96: /* master_def: MASTER_DELAY_SYM '=' ulong_num */ +#line 2211 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].ulong_num) > MASTER_DELAY_MAX) + { + my_error(ER_MASTER_DELAY_VALUE_OUT_OF_RANGE, MYF(0), + (ulong) (yyvsp[0].ulong_num), (ulong) MASTER_DELAY_MAX); + } + else + Lex->mi.sql_delay = (yyvsp[0].ulong_num); + } +#line 29224 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 97: /* master_def: MASTER_SSL_SYM '=' ulong_num */ +#line 2221 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl= (yyvsp[0].ulong_num) ? + LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; + } +#line 29233 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 98: /* master_def: MASTER_SSL_CA_SYM '=' TEXT_STRING_sys */ +#line 2226 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_ca= (yyvsp[0].lex_str).str; + } +#line 29241 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 99: /* master_def: MASTER_SSL_CAPATH_SYM '=' TEXT_STRING_sys */ +#line 2230 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_capath= (yyvsp[0].lex_str).str; + } +#line 29249 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 100: /* master_def: MASTER_SSL_CERT_SYM '=' TEXT_STRING_sys */ +#line 2234 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_cert= (yyvsp[0].lex_str).str; + } +#line 29257 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 101: /* master_def: MASTER_SSL_CIPHER_SYM '=' TEXT_STRING_sys */ +#line 2238 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_cipher= (yyvsp[0].lex_str).str; + } +#line 29265 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 102: /* master_def: MASTER_SSL_KEY_SYM '=' TEXT_STRING_sys */ +#line 2242 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_key= (yyvsp[0].lex_str).str; + } +#line 29273 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 103: /* master_def: MASTER_SSL_VERIFY_SERVER_CERT_SYM '=' ulong_num */ +#line 2246 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_verify_server_cert= (yyvsp[0].ulong_num) ? + LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; + } +#line 29282 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 104: /* master_def: MASTER_SSL_CRL_SYM '=' TEXT_STRING_sys */ +#line 2251 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_crl= (yyvsp[0].lex_str).str; + } +#line 29290 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 105: /* master_def: MASTER_SSL_CRLPATH_SYM '=' TEXT_STRING_sys */ +#line 2255 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_crlpath= (yyvsp[0].lex_str).str; + } +#line 29298 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 106: /* master_def: MASTER_HEARTBEAT_PERIOD_SYM '=' NUM_literal */ +#line 2260 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.heartbeat_period= (float) (yyvsp[0].item_num)->val_real(); + if (unlikely(Lex->mi.heartbeat_period > + SLAVE_MAX_HEARTBEAT_PERIOD) || + unlikely(Lex->mi.heartbeat_period < 0.0)) + my_yyabort_error((ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, MYF(0), + SLAVE_MAX_HEARTBEAT_PERIOD)); + + if (unlikely(Lex->mi.heartbeat_period > slave_net_timeout)) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX, + ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX)); + } + if (unlikely(Lex->mi.heartbeat_period < 0.001)) + { + if (unlikely(Lex->mi.heartbeat_period != 0.0)) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN, + ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN)); + Lex->mi.heartbeat_period= 0.0; + } + Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_DISABLE; + } + Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 29330 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 107: /* master_def: IGNORE_SERVER_IDS_SYM '=' '(' ignore_server_id_list ')' */ +#line 2288 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_ignore_server_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 29338 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 108: /* master_def: DO_DOMAIN_IDS_SYM '=' '(' do_domain_id_list ')' */ +#line 2292 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_do_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 29346 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 109: /* master_def: IGNORE_DOMAIN_IDS_SYM '=' '(' ignore_domain_id_list ')' */ +#line 2296 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_ignore_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 29354 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 114: /* ignore_server_id: ulong_num */ +#line 2311 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_ignore_server_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 29362 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 118: /* do_domain_id: ulong_num */ +#line 2324 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_do_domain_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 29370 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 122: /* ignore_domain_id: ulong_num */ +#line 2337 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_ignore_domain_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 29378 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 123: /* master_file_def: MASTER_LOG_FILE_SYM '=' TEXT_STRING_sys */ +#line 2344 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.log_file_name = (yyvsp[0].lex_str).str; + } +#line 29386 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 124: /* master_file_def: MASTER_LOG_POS_SYM '=' ulonglong_num */ +#line 2348 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + If the user specified a value < BIN_LOG_HEADER_SIZE, adjust it + instead of causing subsequent errors. + We need to do it in this file, because only there we know that + MASTER_LOG_POS has been explicitly specified. On the contrary + in change_master() (sql_repl.cc) we cannot distinguish between 0 + (MASTER_LOG_POS explicitly specified as 0) and 0 (unspecified), + whereas we want to distinguish (specified 0 means "read the binlog + from 0" (4 in fact), unspecified means "don't change the position + (keep the preceding value)"). + */ + Lex->mi.pos= MY_MAX(BIN_LOG_HEADER_SIZE, (yyvsp[0].ulonglong_number)); + } +#line 29405 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 125: /* master_file_def: RELAY_LOG_FILE_SYM '=' TEXT_STRING_sys */ +#line 2363 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.relay_log_name = (yyvsp[0].lex_str).str; + } +#line 29413 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 126: /* master_file_def: RELAY_LOG_POS_SYM '=' ulong_num */ +#line 2367 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.relay_log_pos = (yyvsp[0].ulong_num); + /* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */ + Lex->mi.relay_log_pos= MY_MAX(BIN_LOG_HEADER_SIZE, Lex->mi.relay_log_pos); + } +#line 29423 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 127: /* master_file_def: MASTER_USE_GTID_SYM '=' CURRENT_POS_SYM */ +#line 2373 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_CURRENT_POS; + } +#line 29433 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 128: /* master_file_def: MASTER_USE_GTID_SYM '=' SLAVE_POS_SYM */ +#line 2379 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_SLAVE_POS; + } +#line 29443 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 129: /* master_file_def: MASTER_USE_GTID_SYM '=' NO_SYM */ +#line 2385 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_NO; + } +#line 29453 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 130: /* master_file_def: MASTER_DEMOTE_TO_SLAVE_SYM '=' bool */ +#line 2391 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.is_demotion_opt= (bool) (yyvsp[0].ulong_num); + } +#line 29461 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 131: /* optional_connection_name: %empty */ +#line 2398 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->mi.connection_name= null_clex_str; + } +#line 29470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 133: /* connection_name: TEXT_STRING_sys */ +#line 2407 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.connection_name= (yyvsp[0].lex_str); +#ifdef HAVE_REPLICATION + if (unlikely(check_master_connection_name(&(yyvsp[0].lex_str)))) + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); +#endif + } +#line 29482 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 134: /* optional_for_channel: %empty */ +#line 2418 "/home/buildbot/git/sql/sql_yacc.yy" + { + /*do nothing */ + } +#line 29490 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 136: /* for_channel: FOR_SYM CHANNEL_SYM TEXT_STRING_sys */ +#line 2427 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->mi.connection_name.str != NULL) + { + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)")); + } + else + { + Lex->mi.connection_name= (yyvsp[0].lex_str); +#ifdef HAVE_REPLICATION + if (unlikely(check_master_connection_name(&(yyvsp[0].lex_str)))) + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); +#endif + } + + } +#line 29510 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 137: /* $@8: %empty */ +#line 2448 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_table())) + MYSQL_YYABORT; + lex->create_info.init(); + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->current_select->parsing_place= BEFORE_OPT_LIST; + if (lex->set_command_with_check(SQLCOM_CREATE_TABLE, (yyvsp[-2].num), (yyvsp[-3].object_ddl_options) | (yyvsp[0].object_ddl_options))) + MYSQL_YYABORT; + } +#line 29526 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 138: /* $@9: %empty */ +#line 2460 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING, + TL_WRITE, MDL_SHARED_UPGRADABLE)) + MYSQL_YYABORT; + lex->alter_info.reset(); + /* + For CREATE TABLE we should not open the table even if it exists. + If the table exists, we should either not create it or replace it + */ + lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; + lex->name= null_clex_str; + lex->create_last_non_select_table= lex->last_table(); + lex->inc_select_stack_outer_barrier(); + } +#line 29547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 139: /* create: create_or_replace opt_temporary TABLE_SYM opt_if_not_exists $@8 table_ident $@9 create_body */ +#line 2477 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + create_table_set_open_action_and_adjust_tables(lex); + Lex->pop_select(); //main select + } +#line 29557 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 140: /* $@10: %empty */ +#line 2483 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (lex->main_select_push()) + MYSQL_YYABORT; + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_sequence())) + MYSQL_YYABORT; + lex->create_info.init(); + if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_SEQUENCE, (yyvsp[-3].num), + (yyvsp[-4].object_ddl_options) | (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING, + TL_WRITE, MDL_EXCLUSIVE)) + MYSQL_YYABORT; + + /* + For CREATE TABLE, an non-existing table is not an error. + Instruct open_tables() to just take an MDL lock if the + table does not exist. + */ + lex->alter_info.reset(); + lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; + lex->name= null_clex_str; + lex->create_last_non_select_table= lex->last_table(); + if (unlikely(!(lex->create_info.seq_create_info= + new (thd->mem_root) sequence_definition()))) + MYSQL_YYABORT; + } +#line 29591 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 141: /* create: create_or_replace opt_temporary SEQUENCE_SYM opt_if_not_exists table_ident $@10 opt_sequence opt_create_table_options */ +#line 2513 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + + if (unlikely(lex->create_info.seq_create_info->check_and_adjust(1))) + { + my_error(ER_SEQUENCE_INVALID_DATA, MYF(0), + lex->first_select_lex()->table_list.first->db.str, + lex->first_select_lex()->table_list.first-> + table_name.str); + MYSQL_YYABORT; + } + + /* No fields specified, generate them */ + if (unlikely(prepare_sequence_fields(thd, + &lex->alter_info.create_list))) + MYSQL_YYABORT; + + /* CREATE SEQUENCE always creates a sequence */ + Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE; + Lex->create_info.sequence= 1; + + create_table_set_open_action_and_adjust_tables(lex); + Lex->pop_select(); //main select + } +#line 29620 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 142: /* $@11: %empty */ +#line 2538 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 29629 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 143: /* $@12: %empty */ +#line 2545 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index(Key::MULTIPLE, &(yyvsp[-3].ident_sys), (yyvsp[-2].key_alg), (yyvsp[-7].object_ddl_options) | (yyvsp[-5].object_ddl_options))) + MYSQL_YYABORT; + } +#line 29640 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 144: /* create: create_or_replace INDEX_SYM opt_if_not_exists $@11 ident opt_key_algorithm_clause ON table_ident $@12 '(' key_list ')' opt_lock_wait_timeout normal_key_options opt_index_lock_algorithm */ +#line 2553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 145: /* $@13: %empty */ +#line 2557 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 29657 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 146: /* $@14: %empty */ +#line 2564 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index(Key::UNIQUE, &(yyvsp[-3].ident_sys), (yyvsp[-2].key_alg), (yyvsp[-8].object_ddl_options) | (yyvsp[-5].object_ddl_options))) + MYSQL_YYABORT; + } +#line 29668 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 147: /* create: create_or_replace UNIQUE_SYM INDEX_SYM opt_if_not_exists $@13 ident opt_key_algorithm_clause ON table_ident $@14 '(' key_list opt_without_overlaps ')' opt_lock_wait_timeout normal_key_options opt_index_lock_algorithm */ +#line 2573 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29676 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 148: /* $@15: %empty */ +#line 2577 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 29685 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 149: /* $@16: %empty */ +#line 2583 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index((yyvsp[-6].key_type), &(yyvsp[-2].ident_sys), HA_KEY_ALG_UNDEF, (yyvsp[-7].object_ddl_options) | (yyvsp[-3].object_ddl_options))) + MYSQL_YYABORT; + } +#line 29696 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 150: /* create: create_or_replace fulltext INDEX_SYM $@15 opt_if_not_exists ident ON table_ident $@16 '(' key_list ')' opt_lock_wait_timeout fulltext_key_options opt_index_lock_algorithm */ +#line 2591 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29704 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 151: /* $@17: %empty */ +#line 2595 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 29713 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 152: /* $@18: %empty */ +#line 2601 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index((yyvsp[-6].key_type), &(yyvsp[-2].ident_sys), HA_KEY_ALG_UNDEF, (yyvsp[-7].object_ddl_options) | (yyvsp[-3].object_ddl_options))) + MYSQL_YYABORT; + } +#line 29724 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 153: /* create: create_or_replace spatial INDEX_SYM $@17 opt_if_not_exists ident ON table_ident $@18 '(' key_list ')' opt_lock_wait_timeout spatial_key_options opt_index_lock_algorithm */ +#line 2609 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29732 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 154: /* $@19: %empty */ +#line 2613 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + } +#line 29740 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 155: /* create: create_or_replace DATABASE opt_if_not_exists ident $@19 opt_create_database_options */ +#line 2617 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_DB, 0, + (yyvsp[-5].object_ddl_options) | (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + lex->name= (yyvsp[-2].ident_sys); + } +#line 29752 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 156: /* $@20: %empty */ +#line 2626 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->inc_select_stack_outer_barrier(); + if (Lex->add_create_view(thd, (yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), + DTYPE_ALGORITHM_UNDEFINED, (yyvsp[-3].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 29765 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 157: /* create: create_or_replace definer_opt opt_view_suid VIEW_SYM opt_if_not_exists table_ident $@20 view_list_opt AS view_select */ +#line 2635 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29773 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 158: /* $@21: %empty */ +#line 2640 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_view(thd, (yyvsp[-6].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-5].num), (yyvsp[-3].view_suid), (yyvsp[0].table)))) + MYSQL_YYABORT; + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->inc_select_stack_outer_barrier(); + } +#line 29785 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 159: /* create: create_or_replace view_algorithm definer_opt opt_view_suid VIEW_SYM opt_if_not_exists table_ident $@21 view_list_opt AS view_select */ +#line 2648 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29793 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 160: /* $@22: %empty */ +#line 2652 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + } +#line 29803 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 161: /* create: create_or_replace definer_opt TRIGGER_SYM $@22 trigger_tail */ +#line 2658 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29811 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 162: /* $@23: %empty */ +#line 2662 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + } +#line 29821 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 163: /* create: create_or_replace definer_opt EVENT_SYM $@23 event_tail */ +#line 2668 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 164: /* create: create_or_replace USER_SYM opt_if_not_exists clear_privileges grant_list opt_require_clause opt_resource_options opt_account_locking_and_opt_password_expiration */ +#line 2673 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_command_with_check(SQLCOM_CREATE_USER, + (yyvsp[-7].object_ddl_options) | (yyvsp[-5].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 29839 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 165: /* create: create_or_replace ROLE_SYM opt_if_not_exists clear_privileges role_list opt_with_admin */ +#line 2680 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_command_with_check(SQLCOM_CREATE_ROLE, + (yyvsp[-5].object_ddl_options) | (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 29849 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 166: /* $@24: %empty */ +#line 2685 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->set_command(SQLCOM_CREATE_SERVER, (yyvsp[0].object_ddl_options)); } +#line 29855 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 167: /* create: create_or_replace $@24 server_def */ +#line 2687 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 29861 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 169: /* opt_sequence: %empty */ +#line 2692 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 29867 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 173: /* sequence_def: MINVALUE_SYM opt_equal longlong_num */ +#line 2703 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.seq_create_info->min_value= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 29876 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 174: /* sequence_def: NO_SYM MINVALUE_SYM */ +#line 2708 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 29886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 175: /* sequence_def: NOMINVALUE_SYM */ +#line 2714 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 29896 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 176: /* sequence_def: MAXVALUE_SYM opt_equal longlong_num */ +#line 2720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->max_value= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 29908 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 177: /* sequence_def: NO_SYM MAXVALUE_SYM */ +#line 2728 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 29918 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 178: /* sequence_def: NOMAXVALUE_SYM */ +#line 2734 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 29928 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 179: /* sequence_def: START_SYM opt_with longlong_num */ +#line 2740 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_start)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "START")); + Lex->create_info.seq_create_info->start= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_start; + } +#line 29940 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 180: /* sequence_def: INCREMENT_SYM opt_by longlong_num */ +#line 2748 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_increment)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "INCREMENT")); + Lex->create_info.seq_create_info->increment= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment; + } +#line 29952 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 181: /* sequence_def: CACHE_SYM opt_equal longlong_num */ +#line 2756 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); + Lex->create_info.seq_create_info->cache= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; + } +#line 29964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 182: /* sequence_def: NOCACHE_SYM */ +#line 2764 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); + Lex->create_info.seq_create_info->cache= 0; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; + } +#line 29976 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 183: /* sequence_def: CYCLE_SYM */ +#line 2772 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); + Lex->create_info.seq_create_info->cycle= 1; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; + } +#line 29988 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 184: /* sequence_def: NOCYCLE_SYM */ +#line 2780 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); + Lex->create_info.seq_create_info->cycle= 0; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; + } +#line 30000 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 185: /* sequence_def: RESTART_SYM */ +#line 2788 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) + { + thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); + MYSQL_YYABORT; + } + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart; + } +#line 30016 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 186: /* sequence_def: RESTART_SYM opt_with longlong_num */ +#line 2800 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) + { + thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); + MYSQL_YYABORT; + } + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); + Lex->create_info.seq_create_info->restart= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value; + } +#line 30033 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 187: /* force_lookahead: %empty */ +#line 2815 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30039 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 188: /* force_lookahead: FORCE_LOOKAHEAD */ +#line 2815 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30045 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 189: /* $@25: %empty */ +#line 2819 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_options_with_check((yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + Lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 30055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 190: /* server_def: SERVER_SYM opt_if_not_exists ident_or_text $@25 FOREIGN DATA_SYM WRAPPER_SYM ident_or_text OPTIONS_SYM '(' server_options_list ')' */ +#line 2826 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->server_options.scheme= (yyvsp[-4].lex_str); } +#line 30061 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 193: /* server_option: USER_SYM TEXT_STRING_sys */ +#line 2836 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.username.str == 0); + Lex->server_options.username= (yyvsp[0].lex_str); + } +#line 30070 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 194: /* server_option: HOST_SYM TEXT_STRING_sys */ +#line 2841 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.host.str == 0); + Lex->server_options.host= (yyvsp[0].lex_str); + } +#line 30079 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 195: /* server_option: DATABASE TEXT_STRING_sys */ +#line 2846 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.db.str == 0); + Lex->server_options.db= (yyvsp[0].lex_str); + } +#line 30088 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 196: /* server_option: OWNER_SYM TEXT_STRING_sys */ +#line 2851 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.owner.str == 0); + Lex->server_options.owner= (yyvsp[0].lex_str); + } +#line 30097 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 197: /* server_option: PASSWORD_SYM TEXT_STRING_sys */ +#line 2856 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.password.str == 0); + Lex->server_options.password= (yyvsp[0].lex_str); + } +#line 30106 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 198: /* server_option: SOCKET_SYM TEXT_STRING_sys */ +#line 2861 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.socket.str == 0); + Lex->server_options.socket= (yyvsp[0].lex_str); + } +#line 30115 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 199: /* server_option: PORT_SYM ulong_num */ +#line 2866 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->server_options.port= (yyvsp[0].ulong_num); + } +#line 30123 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 200: /* $@26: %empty */ +#line 2873 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->stmt_definition_begin= (yyvsp[-2].simple_string); + if (unlikely(lex->add_create_options_with_check((yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + if (unlikely(!(lex->event_parse_data= + Event_parse_data::new_instance(thd)))) + MYSQL_YYABORT; + lex->event_parse_data->identifier= (yyvsp[0].spname); + lex->event_parse_data->on_completion= + Event_parse_data::ON_COMPLETION_DROP; + + lex->sql_command= SQLCOM_CREATE_EVENT; + /* We need that for disallowing subqueries */ + } +#line 30144 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 201: /* event_tail: remember_name opt_if_not_exists sp_name $@26 ON SCHEDULE_SYM ev_schedule_time opt_ev_on_completion opt_ev_status opt_ev_comment DO_SYM ev_sql_stmt */ +#line 2894 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + sql_command is set here because some rules in ev_sql_stmt + can overwrite it + */ + Lex->sql_command= SQLCOM_CREATE_EVENT; + } +#line 30156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 202: /* $@27: %empty */ +#line 2905 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_expression= (yyvsp[-1].item); + Lex->event_parse_data->interval= (yyvsp[0].interval); + } +#line 30165 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 204: /* ev_schedule_time: AT_SYM expr */ +#line 2912 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_execute_at= (yyvsp[0].item); + } +#line 30173 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 205: /* opt_ev_status: %empty */ +#line 2918 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30179 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 206: /* opt_ev_status: ENABLE_SYM */ +#line 2920 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::ENABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30189 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 207: /* opt_ev_status: DISABLE_SYM ON SLAVE */ +#line 2926 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::SLAVESIDE_DISABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30199 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 208: /* opt_ev_status: DISABLE_SYM */ +#line 2932 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::DISABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30209 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 209: /* ev_starts: %empty */ +#line 2941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_now_local(thd, 0); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + Lex->event_parse_data->item_starts= item; + } +#line 30220 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 210: /* ev_starts: STARTS_SYM expr */ +#line 2948 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_starts= (yyvsp[0].item); + } +#line 30228 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 212: /* ev_ends: ENDS_SYM expr */ +#line 2956 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_ends= (yyvsp[0].item); + } +#line 30236 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 213: /* opt_ev_on_completion: %empty */ +#line 2962 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30242 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 215: /* ev_on_completion: ON COMPLETION_SYM opt_not PRESERVE_SYM */ +#line 2968 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->on_completion= (yyvsp[-1].num) + ? Event_parse_data::ON_COMPLETION_DROP + : Event_parse_data::ON_COMPLETION_PRESERVE; + (yyval.num)= 1; + } +#line 30253 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 216: /* opt_ev_comment: %empty */ +#line 2977 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30259 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 217: /* opt_ev_comment: COMMENT_SYM TEXT_STRING_sys */ +#line 2979 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->comment= Lex->event_parse_data->comment= (yyvsp[0].lex_str); + (yyval.num)= 1; + } +#line 30268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 218: /* $@28: %empty */ +#line 2986 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + /* + This stops the following : + - CREATE EVENT ... DO CREATE EVENT ...; + - ALTER EVENT ... DO CREATE EVENT ...; + - CREATE EVENT ... DO ALTER EVENT DO ....; + - CREATE PROCEDURE ... BEGIN CREATE EVENT ... END| + This allows: + - CREATE EVENT ... DO DROP EVENT yyy; + - CREATE EVENT ... DO ALTER EVENT yyy; + (the nested ALTER EVENT can have anything but DO clause) + - ALTER EVENT ... DO ALTER EVENT yyy; + (the nested ALTER EVENT can have anything but DO clause) + - ALTER EVENT ... DO DROP EVENT yyy; + - CREATE PROCEDURE ... BEGIN ALTER EVENT ... END| + (the nested ALTER EVENT can have anything but DO clause) + - CREATE PROCEDURE ... BEGIN DROP EVENT ... END| + */ + if (unlikely(lex->sphead)) + my_yyabort_error((ER_EVENT_RECURSION_FORBIDDEN, MYF(0))); + + if (unlikely(!lex->make_sp_head(thd, + lex->event_parse_data->identifier, + &sp_handler_procedure, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + + lex->sphead->set_body_start(thd, lip->get_cpp_ptr()); + } +#line 30305 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 219: /* ev_sql_stmt: $@28 sp_proc_stmt force_lookahead */ +#line 3019 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* return back to the original memory root ASAP */ + if (Lex->sp_body_finalize_event(thd)) + MYSQL_YYABORT; + } +#line 30315 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 220: /* clear_privileges: %empty */ +#line 3028 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->users_list.empty(); + lex->first_select_lex()->db= null_clex_str; + lex->account_options.reset(); + } +#line 30326 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 221: /* opt_aggregate: %empty */ +#line 3037 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_aggregate_type)= NOT_AGGREGATE; } +#line 30332 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 222: /* opt_aggregate: AGGREGATE_SYM */ +#line 3038 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_aggregate_type)= GROUP_AGGREGATE; } +#line 30338 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 223: /* sp_handler: FUNCTION_SYM */ +#line 3043 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_function; } +#line 30344 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 224: /* sp_handler: PROCEDURE_SYM */ +#line 3044 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_procedure; } +#line 30350 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 225: /* sp_handler: PACKAGE_ORACLE_SYM */ +#line 3045 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_package_spec; } +#line 30356 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 226: /* sp_handler: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM */ +#line 3046 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_package_body; } +#line 30362 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 227: /* sp_name: ident '.' ident */ +#line 3052 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spname)= Lex->make_sp_name(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30371 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 228: /* sp_name: ident */ +#line 3057 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spname)= Lex->make_sp_name(thd, &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 229: /* sp_a_chistics: %empty */ +#line 3064 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30386 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 230: /* sp_a_chistics: sp_a_chistics sp_chistic */ +#line 3065 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30392 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 231: /* sp_c_chistics: %empty */ +#line 3069 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30398 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 232: /* sp_c_chistics: sp_c_chistics sp_c_chistic */ +#line 3070 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30404 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 233: /* sp_chistic: COMMENT_SYM TEXT_STRING_sys */ +#line 3076 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.comment= (yyvsp[0].lex_str); } +#line 30410 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 234: /* sp_chistic: LANGUAGE_SYM SQL_SYM */ +#line 3078 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Just parse it, we only have one language for now. */ } +#line 30416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 235: /* sp_chistic: NO_SYM SQL_SYM */ +#line 3080 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_NO_SQL; } +#line 30422 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 236: /* sp_chistic: CONTAINS_SYM SQL_SYM */ +#line 3082 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_CONTAINS_SQL; } +#line 30428 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 237: /* sp_chistic: READS_SYM SQL_SYM DATA_SYM */ +#line 3084 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_READS_SQL_DATA; } +#line 30434 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 238: /* sp_chistic: MODIFIES_SYM SQL_SYM DATA_SYM */ +#line 3086 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_MODIFIES_SQL_DATA; } +#line 30440 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 239: /* sp_chistic: sp_suid */ +#line 3088 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.suid= (yyvsp[0].sp_suid); } +#line 30446 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 240: /* sp_c_chistic: sp_chistic */ +#line 3093 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 30452 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 241: /* sp_c_chistic: opt_not DETERMINISTIC_SYM */ +#line 3094 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.detistic= ! (yyvsp[-1].num); } +#line 30458 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 242: /* sp_suid: SQL_SYM SECURITY_SYM DEFINER_SYM */ +#line 3098 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_suid)= SP_IS_SUID; } +#line 30464 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 243: /* sp_suid: SQL_SYM SECURITY_SYM INVOKER_SYM */ +#line 3099 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_suid)= SP_IS_NOT_SUID; } +#line 30470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 244: /* $@29: %empty */ +#line 3104 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 30479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 245: /* call: CALL_SYM ident $@29 opt_sp_cparam_list */ +#line 3109 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 30488 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 246: /* $@30: %empty */ +#line 3114 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 30497 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 247: /* call: CALL_SYM ident '.' ident $@30 opt_sp_cparam_list */ +#line 3119 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 30506 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 248: /* $@31: %empty */ +#line 3124 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 30515 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 249: /* call: CALL_SYM ident '.' ident '.' ident $@31 opt_sp_cparam_list */ +#line 3129 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 30524 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 254: /* sp_cparams: sp_cparams ',' expr */ +#line 3148 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_back((yyvsp[0].item), thd->mem_root); + } +#line 30532 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 255: /* sp_cparams: expr */ +#line 3152 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_back((yyvsp[0].item), thd->mem_root); + } +#line 30540 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 256: /* sp_fdparam_list: %empty */ +#line 3160 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start(); + Lex->sphead->m_param_end= Lex->sphead->m_param_begin; + } +#line 30549 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 257: /* $@32: %empty */ +#line 3165 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start(); + } +#line 30557 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 258: /* sp_fdparam_list: $@32 sp_fdparams */ +#line 3169 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); + } +#line 30565 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 261: /* sp_param_name: ident */ +#line 3181 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spvar)= Lex->sp_param_init(&(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30574 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 266: /* sp_parameter_type: IN_SYM */ +#line 3199 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_IN; } +#line 30580 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 267: /* sp_parameter_type: OUT_SYM */ +#line 3200 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_OUT; } +#line 30586 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 268: /* sp_parameter_type: INOUT_SYM */ +#line 3201 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_INOUT; } +#line 30592 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 269: /* $@33: %empty */ +#line 3206 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start() + 1; + } +#line 30600 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 270: /* sp_parenthesized_pdparam_list: '(' $@33 sp_pdparam_list ')' */ +#line 3211 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); + } +#line 30608 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 272: /* sp_proc_stmts: %empty */ +#line 3221 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30614 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 274: /* sp_proc_stmts1: sp_proc_stmt ';' */ +#line 3226 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30620 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 276: /* optionally_qualified_column_ident: sp_decl_ident */ +#line 3233 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(&(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30630 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 277: /* optionally_qualified_column_ident: sp_decl_ident '.' ident */ +#line 3239 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(&(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30640 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 278: /* optionally_qualified_column_ident: sp_decl_ident '.' ident '.' ident */ +#line 3245 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30650 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 279: /* row_field_definition: row_field_name field_type */ +#line 3255 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_ROUTINE_LOCAL); + } +#line 30659 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 280: /* row_field_definition_list: row_field_definition */ +#line 3263 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spvar_definition_list)= Row_definition_list::make(thd->mem_root, (yyvsp[0].spvar_definition)))) + MYSQL_YYABORT; + } +#line 30668 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 281: /* row_field_definition_list: row_field_definition_list ',' row_field_definition */ +#line 3268 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.spvar_definition_list)= (yyvsp[-2].spvar_definition_list))->append_uniq(thd->mem_root, (yyvsp[0].spvar_definition))) + MYSQL_YYABORT; + } +#line 30677 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 282: /* row_type_body: '(' row_field_definition_list ')' */ +#line 3275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_definition_list)= (yyvsp[-1].spvar_definition_list); } +#line 30683 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 283: /* sp_decl_idents_init_vars: sp_decl_idents */ +#line 3280 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_variable_declarations_init(thd, (yyvsp[0].num)); + } +#line 30691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 284: /* $@34: %empty */ +#line 3288 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_ROUTINE_LOCAL); + } +#line 30700 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 285: /* sp_decl_variable_list: sp_decl_idents_init_vars field_type $@34 sp_opt_default */ +#line 3293 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_finalize(thd, (yyvsp[-3].num), + &Lex->last_field[0], + (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-3].num)); + } +#line 30712 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 286: /* sp_decl_variable_list: sp_decl_idents_init_vars ROW_SYM row_type_body sp_opt_default */ +#line 3303 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_row_finalize(thd, (yyvsp[-3].num), (yyvsp[-1].spvar_definition_list), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-3].num)); + } +#line 30722 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 288: /* $@35: %empty */ +#line 3313 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_init(thd, (yyvsp[-2].num)))) + MYSQL_YYABORT; + } +#line 30731 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 289: /* sp_decl_handler: sp_handler_type HANDLER_SYM FOR_SYM $@35 sp_hcond_list sp_proc_stmt */ +#line 3318 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_finalize(thd, (yyvsp[-5].num)))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).curs= 0; + (yyval.spblock).hndlrs= 1; + } +#line 30742 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 292: /* sp_cursor_stmt_lex: %empty */ +#line 3333 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->lex->sphead); + if (unlikely(!((yyval.sp_cursor_stmt)= new (thd->mem_root) + sp_lex_cursor(thd, thd->lex)))) + MYSQL_YYABORT; + } +#line 30753 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 293: /* $@36: %empty */ +#line 3343 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->free_list == NULL); + Lex->sphead->reset_lex(thd, (yyvsp[0].sp_cursor_stmt)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 30764 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 294: /* sp_cursor_stmt: sp_cursor_stmt_lex $@36 select */ +#line 3350 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex == (yyvsp[-2].sp_cursor_stmt)); + Lex->pop_select(); //main select + if (unlikely((yyvsp[-2].sp_cursor_stmt)->stmt_finalize(thd)) || + unlikely((yyvsp[-2].sp_cursor_stmt)->sphead->restore_lex(thd))) + MYSQL_YYABORT; + (yyval.sp_cursor_stmt)= (yyvsp[-2].sp_cursor_stmt); + } +#line 30777 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 295: /* sp_handler_type: EXIT_MARIADB_SYM */ +#line 3361 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::EXIT; } +#line 30783 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 296: /* sp_handler_type: CONTINUE_MARIADB_SYM */ +#line 3362 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::CONTINUE; } +#line 30789 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 297: /* sp_handler_type: EXIT_ORACLE_SYM */ +#line 3363 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::EXIT; } +#line 30795 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 298: /* sp_handler_type: CONTINUE_ORACLE_SYM */ +#line 3364 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::CONTINUE; } +#line 30801 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 299: /* sp_hcond_list: sp_hcond_element */ +#line 3370 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 30807 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 300: /* sp_hcond_list: sp_hcond_list ',' sp_hcond_element */ +#line 3372 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)+= 1; } +#line 30813 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 301: /* sp_hcond_element: sp_hcond */ +#line 3377 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *ctx= lex->spcont->parent_context(); + + if (unlikely(ctx->check_duplicate_handler((yyvsp[0].spcondvalue)))) + my_yyabort_error((ER_SP_DUP_HANDLER, MYF(0))); + + sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction(); + i->add_condition((yyvsp[0].spcondvalue)); + } +#line 30829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 302: /* sp_cond: ulong_num */ +#line 3392 "/home/buildbot/git/sql/sql_yacc.yy" + { /* mysql errno */ + if (unlikely((yyvsp[0].ulong_num) == 0)) + my_yyabort_error((ER_WRONG_VALUE, MYF(0), "CONDITION", "0")); + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value((yyvsp[0].ulong_num)); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30841 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 304: /* sqlstate: SQLSTATE_SYM opt_value TEXT_STRING_literal */ +#line 3404 "/home/buildbot/git/sql/sql_yacc.yy" + { /* SQLSTATE */ + + /* + An error is triggered: + - if the specified string is not a valid SQLSTATE, + - or if it represents the completion condition -- it is not + allowed to SIGNAL, or declare a handler for the completion + condition. + */ + if (unlikely(!is_sqlstate_valid(&(yyvsp[0].lex_str)) || + is_sqlstate_completion((yyvsp[0].lex_str).str))) + my_yyabort_error((ER_SP_BAD_SQLSTATE, MYF(0), (yyvsp[0].lex_str).str)); + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value((yyvsp[0].lex_str).str); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30862 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 305: /* opt_value: %empty */ +#line 3423 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30868 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 306: /* opt_value: VALUE_SYM */ +#line 3424 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30874 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 307: /* sp_hcond: sp_cond */ +#line 3429 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= (yyvsp[0].spcondvalue); + } +#line 30882 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 308: /* sp_hcond: ident */ +#line 3433 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= Lex->spcont->find_declared_or_predefined_condition(thd, &(yyvsp[0].ident_sys)); + if (unlikely((yyval.spcondvalue) == NULL)) + my_yyabort_error((ER_SP_COND_MISMATCH, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 30892 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 309: /* sp_hcond: SQLWARNING_SYM */ +#line 3439 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::WARNING); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 310: /* sp_hcond: not FOUND_SYM */ +#line 3445 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::NOT_FOUND); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30912 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 311: /* sp_hcond: SQLEXCEPTION_SYM */ +#line 3451 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30922 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 312: /* sp_hcond: OTHERS_ORACLE_SYM */ +#line 3457 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 313: /* raise_stmt_oracle: RAISE_ORACLE_SYM opt_set_signal_information */ +#line 3467 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_resignal_statement(thd, NULL))) + MYSQL_YYABORT; + } +#line 30941 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 314: /* raise_stmt_oracle: RAISE_ORACLE_SYM signal_value opt_set_signal_information */ +#line 3472 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_signal_statement(thd, (yyvsp[-1].spcondvalue)))) + MYSQL_YYABORT; + } +#line 30950 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 315: /* signal_stmt: SIGNAL_SYM signal_value opt_set_signal_information */ +#line 3480 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_signal_statement(thd, (yyvsp[-1].spcondvalue))) + MYSQL_YYABORT; + } +#line 30959 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 316: /* signal_value: ident */ +#line 3488 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spcondvalue)= Lex->stmt_signal_value((yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 30968 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 317: /* signal_value: sqlstate */ +#line 3493 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } +#line 30974 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 318: /* opt_signal_value: %empty */ +#line 3498 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= NULL; } +#line 30980 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 319: /* opt_signal_value: signal_value */ +#line 3500 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } +#line 30986 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 320: /* opt_set_signal_information: %empty */ +#line 3505 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->m_parser_state->m_yacc.m_set_signal_info.clear(); + } +#line 30994 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 322: /* signal_information_item_list: signal_condition_information_item_name '=' signal_allowed_expr */ +#line 3513 "/home/buildbot/git/sql/sql_yacc.yy" + { + Set_signal_information *info; + info= &thd->m_parser_state->m_yacc.m_set_signal_info; + int index= (int) (yyvsp[-2].diag_condition_item_name); + info->clear(); + info->m_item[index]= (yyvsp[0].item); + } +#line 31006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 323: /* signal_information_item_list: signal_information_item_list ',' signal_condition_information_item_name '=' signal_allowed_expr */ +#line 3522 "/home/buildbot/git/sql/sql_yacc.yy" + { + Set_signal_information *info; + info= &thd->m_parser_state->m_yacc.m_set_signal_info; + int index= (int) (yyvsp[-2].diag_condition_item_name); + if (unlikely(info->m_item[index] != NULL)) + my_yyabort_error((ER_DUP_SIGNAL_SET, MYF(0), + Diag_condition_item_names[index].str)); + info->m_item[index]= (yyvsp[0].item); + } +#line 31020 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 324: /* signal_allowed_expr: literal */ +#line 3538 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 31026 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 325: /* signal_allowed_expr: variable */ +#line 3540 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].item)->type() == Item::FUNC_ITEM) + { + Item_func *item= (Item_func*) (yyvsp[0].item); + if (unlikely(item->functype() == Item_func::SUSERVAR_FUNC)) + { + /* + Don't allow the following syntax: + SIGNAL/RESIGNAL ... + SET = @foo := expr + */ + thd->parse_error(); + MYSQL_YYABORT; + } + } + (yyval.item)= (yyvsp[0].item); + } +#line 31048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 326: /* signal_allowed_expr: simple_ident */ +#line 3558 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 31054 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 327: /* signal_condition_information_item_name: CLASS_ORIGIN_SYM */ +#line 3564 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CLASS_ORIGIN; } +#line 31060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 328: /* signal_condition_information_item_name: SUBCLASS_ORIGIN_SYM */ +#line 3566 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_SUBCLASS_ORIGIN; } +#line 31066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 329: /* signal_condition_information_item_name: CONSTRAINT_CATALOG_SYM */ +#line 3568 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_CATALOG; } +#line 31072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 330: /* signal_condition_information_item_name: CONSTRAINT_SCHEMA_SYM */ +#line 3570 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_SCHEMA; } +#line 31078 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 331: /* signal_condition_information_item_name: CONSTRAINT_NAME_SYM */ +#line 3572 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_NAME; } +#line 31084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 332: /* signal_condition_information_item_name: CATALOG_NAME_SYM */ +#line 3574 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CATALOG_NAME; } +#line 31090 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 333: /* signal_condition_information_item_name: SCHEMA_NAME_SYM */ +#line 3576 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_SCHEMA_NAME; } +#line 31096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 334: /* signal_condition_information_item_name: TABLE_NAME_SYM */ +#line 3578 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_TABLE_NAME; } +#line 31102 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 335: /* signal_condition_information_item_name: COLUMN_NAME_SYM */ +#line 3580 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_COLUMN_NAME; } +#line 31108 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 336: /* signal_condition_information_item_name: CURSOR_NAME_SYM */ +#line 3582 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CURSOR_NAME; } +#line 31114 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 337: /* signal_condition_information_item_name: MESSAGE_TEXT_SYM */ +#line 3584 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_MESSAGE_TEXT; } +#line 31120 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 338: /* signal_condition_information_item_name: MYSQL_ERRNO_SYM */ +#line 3586 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_MYSQL_ERRNO; } +#line 31126 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 339: /* signal_condition_information_item_name: ROW_NUMBER_SYM */ +#line 3588 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_ROW_NUMBER; } +#line 31132 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 340: /* resignal_stmt: RESIGNAL_SYM opt_signal_value opt_set_signal_information */ +#line 3593 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_resignal_statement(thd, (yyvsp[-1].spcondvalue)))) + MYSQL_YYABORT; + } +#line 31141 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 341: /* get_diagnostics: GET_SYM which_area DIAGNOSTICS_SYM diagnostics_information */ +#line 3601 "/home/buildbot/git/sql/sql_yacc.yy" + { + Diagnostics_information *info= (yyvsp[0].diag_info); + + info->set_which_da((yyvsp[-2].diag_area)); + + Lex->sql_command= SQLCOM_GET_DIAGNOSTICS; + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_get_diagnostics(info); + + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 31157 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 342: /* which_area: %empty */ +#line 3616 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_area)= Diagnostics_information::CURRENT_AREA; } +#line 31163 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 343: /* which_area: CURRENT_SYM */ +#line 3618 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_area)= Diagnostics_information::CURRENT_AREA; } +#line 31169 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 344: /* diagnostics_information: statement_information */ +#line 3623 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.diag_info)= new (thd->mem_root) Statement_information((yyvsp[0].stmt_info_list)); + if (unlikely((yyval.diag_info) == NULL)) + MYSQL_YYABORT; + } +#line 31179 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 345: /* diagnostics_information: CONDITION_SYM condition_number condition_information */ +#line 3629 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.diag_info)= new (thd->mem_root) Condition_information((yyvsp[-1].item), (yyvsp[0].cond_info_list)); + if (unlikely((yyval.diag_info) == NULL)) + MYSQL_YYABORT; + } +#line 31189 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 346: /* statement_information: statement_information_item */ +#line 3638 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.stmt_info_list)= new (thd->mem_root) List; + if (unlikely((yyval.stmt_info_list) == NULL) || + unlikely((yyval.stmt_info_list)->push_back((yyvsp[0].stmt_info_item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 31200 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 347: /* statement_information: statement_information ',' statement_information_item */ +#line 3645 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].stmt_info_list)->push_back((yyvsp[0].stmt_info_item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.stmt_info_list)= (yyvsp[-2].stmt_info_list); + } +#line 31210 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 348: /* statement_information_item: simple_target_specification '=' statement_information_item_name */ +#line 3654 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.stmt_info_item)= new (thd->mem_root) Statement_information_item((yyvsp[0].stmt_info_item_name), (yyvsp[-2].item)); + if (unlikely((yyval.stmt_info_item) == NULL)) + MYSQL_YYABORT; + } +#line 31220 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 349: /* simple_target_specification: ident_cli */ +#line 3663 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= thd->lex->create_item_for_sp_var(&(yyvsp[0].ident_cli), NULL)))) + MYSQL_YYABORT; + } +#line 31229 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 350: /* simple_target_specification: '@' ident_or_text */ +#line 3668 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= new (thd->mem_root) Item_func_get_user_var(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 31244 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 351: /* statement_information_item_name: NUMBER_MARIADB_SYM */ +#line 3682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::NUMBER; } +#line 31250 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 352: /* statement_information_item_name: NUMBER_ORACLE_SYM */ +#line 3684 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::NUMBER; } +#line 31256 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 353: /* statement_information_item_name: ROW_COUNT_SYM */ +#line 3686 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::ROW_COUNT; } +#line 31262 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 354: /* condition_number: signal_allowed_expr */ +#line 3695 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 31268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 355: /* condition_information: condition_information_item */ +#line 3700 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.cond_info_list)= new (thd->mem_root) List; + if (unlikely((yyval.cond_info_list) == NULL) || + unlikely((yyval.cond_info_list)->push_back((yyvsp[0].cond_info_item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 31279 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 356: /* condition_information: condition_information ',' condition_information_item */ +#line 3707 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].cond_info_list)->push_back((yyvsp[0].cond_info_item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.cond_info_list)= (yyvsp[-2].cond_info_list); + } +#line 31289 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 357: /* condition_information_item: simple_target_specification '=' condition_information_item_name */ +#line 3716 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.cond_info_item)= new (thd->mem_root) Condition_information_item((yyvsp[0].cond_info_item_name), (yyvsp[-2].item)); + if (unlikely((yyval.cond_info_item) == NULL)) + MYSQL_YYABORT; + } +#line 31299 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 358: /* condition_information_item_name: CLASS_ORIGIN_SYM */ +#line 3725 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CLASS_ORIGIN; } +#line 31305 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 359: /* condition_information_item_name: SUBCLASS_ORIGIN_SYM */ +#line 3727 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::SUBCLASS_ORIGIN; } +#line 31311 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 360: /* condition_information_item_name: CONSTRAINT_CATALOG_SYM */ +#line 3729 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_CATALOG; } +#line 31317 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 361: /* condition_information_item_name: CONSTRAINT_SCHEMA_SYM */ +#line 3731 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_SCHEMA; } +#line 31323 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 362: /* condition_information_item_name: CONSTRAINT_NAME_SYM */ +#line 3733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_NAME; } +#line 31329 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 363: /* condition_information_item_name: CATALOG_NAME_SYM */ +#line 3735 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CATALOG_NAME; } +#line 31335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 364: /* condition_information_item_name: SCHEMA_NAME_SYM */ +#line 3737 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::SCHEMA_NAME; } +#line 31341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 365: /* condition_information_item_name: TABLE_NAME_SYM */ +#line 3739 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::TABLE_NAME; } +#line 31347 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 366: /* condition_information_item_name: COLUMN_NAME_SYM */ +#line 3741 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::COLUMN_NAME; } +#line 31353 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 367: /* condition_information_item_name: CURSOR_NAME_SYM */ +#line 3743 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CURSOR_NAME; } +#line 31359 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 368: /* condition_information_item_name: MESSAGE_TEXT_SYM */ +#line 3745 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::MESSAGE_TEXT; } +#line 31365 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 369: /* condition_information_item_name: MYSQL_ERRNO_SYM */ +#line 3747 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::MYSQL_ERRNO; } +#line 31371 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 370: /* condition_information_item_name: RETURNED_SQLSTATE_SYM */ +#line 3749 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::RETURNED_SQLSTATE; } +#line 31377 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 371: /* condition_information_item_name: ROW_NUMBER_SYM */ +#line 3751 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::ROW_NUMBER; } +#line 31383 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 373: /* sp_decl_ident: keyword_sp_decl */ +#line 3757 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_ident_cli(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 31392 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 374: /* sp_decl_idents: sp_decl_ident */ +#line 3765 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* NOTE: field definition is filled in sp_decl section. */ + + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + + if (unlikely(spc->find_variable(&(yyvsp[0].ident_sys), TRUE))) + my_yyabort_error((ER_SP_DUP_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + spc->add_variable(thd, &(yyvsp[0].ident_sys)); + (yyval.num)= 1; + } +#line 31408 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 375: /* sp_decl_idents: sp_decl_idents ',' ident */ +#line 3777 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* NOTE: field definition is filled in sp_decl section. */ + + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + + if (unlikely(spc->find_variable(&(yyvsp[0].ident_sys), TRUE))) + my_yyabort_error((ER_SP_DUP_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + spc->add_variable(thd, &(yyvsp[0].ident_sys)); + (yyval.num)= (yyvsp[-2].num) + 1; + } +#line 31424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 376: /* $@37: %empty */ +#line 3792 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sphead->new_cont_backpatch(NULL); + } +#line 31434 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 377: /* sp_proc_stmt_if: IF_SYM $@37 sp_if END IF_SYM */ +#line 3798 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sphead->do_cont_backpatch(); } +#line 31440 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 378: /* $@38: %empty */ +#line 3802 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + lex->sphead->reset_lex(thd); + /* + We should not push main select here, it will be done or not + done by the statement, we just provide only a new LEX for the + statement here as if it is start of parsing a new statement. + */ + lex->sphead->m_tmp_query= lip->get_tok_start(); + } +#line 31457 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 379: /* sp_proc_stmt_statement: $@38 sp_statement */ +#line 3815 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->sp_proc_stmt_statement_finalize(thd, yychar == YYEMPTY) || + Lex->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 31467 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 382: /* $@39: %empty */ +#line 3830 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_head *sp= (yyvsp[0].expr_lex)->sphead; + if (unlikely(sp->m_handler->add_instr_freturn(thd, sp, (yyvsp[0].expr_lex)->spcont, + (yyvsp[0].expr_lex)->get_item(), (yyvsp[0].expr_lex)))) + MYSQL_YYABORT; + } +#line 31478 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 383: /* sp_proc_stmt_return: RETURN_ALLMODES_SYM expr_lex $@39 */ +#line 3836 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 31484 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 384: /* sp_proc_stmt_return: RETURN_ORACLE_SYM */ +#line 3838 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + if (unlikely(sp->m_handler->add_instr_preturn(thd, sp, + lex->spcont))) + MYSQL_YYABORT; + } +#line 31496 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 385: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM */ +#line 3849 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_exit_statement(thd, NULL))) + MYSQL_YYABORT; + } +#line 31505 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 386: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM label_ident */ +#line 3854 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_exit_statement(thd, &(yyvsp[0].ident_sys), NULL))) + MYSQL_YYABORT; + } +#line 31514 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 387: /* $@40: %empty */ +#line 3859 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_exit_statement(thd, (yyvsp[0].expr_lex)->get_item()))) + MYSQL_YYABORT; + } +#line 31523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 388: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM WHEN_SYM expr_lex $@40 */ +#line 3863 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 31529 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 389: /* $@41: %empty */ +#line 3865 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_exit_statement(thd, &(yyvsp[-2].ident_sys), (yyvsp[0].expr_lex)->get_item()))) + MYSQL_YYABORT; + } +#line 31538 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 390: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM label_ident WHEN_SYM expr_lex $@41 */ +#line 3869 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 31544 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 391: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM */ +#line 3874 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_continue_statement(thd))) + MYSQL_YYABORT; + } +#line 31553 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 392: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM label_ident */ +#line 3879 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_continue_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31562 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 393: /* $@42: %empty */ +#line 3884 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_continue_when_statement(thd))) + MYSQL_YYABORT; + } +#line 31571 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 394: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM WHEN_SYM expr_lex $@42 */ +#line 3888 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 31577 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 395: /* $@43: %empty */ +#line 3890 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_continue_when_statement(thd, &(yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 31586 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 396: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM label_ident WHEN_SYM expr_lex $@43 */ +#line 3894 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 31592 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 397: /* sp_proc_stmt_leave: LEAVE_SYM label_ident */ +#line 3900 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_leave_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31601 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 398: /* sp_proc_stmt_iterate: ITERATE_SYM label_ident */ +#line 3908 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_iterate_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31610 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 399: /* sp_proc_stmt_goto_oracle: GOTO_ORACLE_SYM label_ident */ +#line 3916 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_goto_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31619 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 400: /* @44: %empty */ +#line 3924 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->sphead); + if (unlikely(!((yyval.expr_lex)= new (thd->mem_root) + sp_expr_lex(thd, thd->lex)))) + MYSQL_YYABORT; + Lex->sphead->reset_lex(thd, (yyval.expr_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 31633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 401: /* expr_lex: @44 expr */ +#line 3934 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.expr_lex)= (yyvsp[-1].expr_lex); + (yyval.expr_lex)->set_item((yyvsp[0].item)); + Lex->pop_select(); //min select + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + if ((yyval.expr_lex)->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 31647 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 402: /* assignment_source_lex: %empty */ +#line 3947 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->sphead); + if (unlikely(!((yyval.assignment_lex)= new (thd->mem_root) + sp_assignment_lex(thd, thd->lex)))) + MYSQL_YYABORT; + } +#line 31658 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 403: /* $@45: %empty */ +#line 3957 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->free_list == NULL); + Lex->sphead->reset_lex(thd, (yyvsp[0].assignment_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 31669 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 404: /* assignment_source_expr: assignment_source_lex $@45 expr */ +#line 3964 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].assignment_lex) == thd->lex); + (yyval.assignment_lex)= (yyvsp[-2].assignment_lex); + (yyval.assignment_lex)->set_item_and_free_list((yyvsp[0].item), thd->free_list); + thd->free_list= NULL; + Lex->pop_select(); //min select + if ((yyval.assignment_lex)->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 31683 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 405: /* $@46: %empty */ +#line 3977 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->reset_lex(thd, (yyvsp[0].assignment_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + Lex->current_select->parsing_place= FOR_LOOP_BOUND; + } +#line 31694 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 406: /* for_loop_bound_expr: assignment_source_lex $@46 expr */ +#line 3984 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].assignment_lex) == thd->lex); + (yyval.assignment_lex)= (yyvsp[-2].assignment_lex); + (yyval.assignment_lex)->set_item_and_free_list((yyvsp[0].item), NULL); + Lex->pop_select(); //main select + if (unlikely((yyval.assignment_lex)->sphead->restore_lex(thd))) + MYSQL_YYABORT; + Lex->current_select->parsing_place= NO_MATTER; + } +#line 31708 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 407: /* cursor_actual_parameters: assignment_source_expr */ +#line 3997 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.sp_assignment_lex_list)= new (thd->mem_root) List))) + MYSQL_YYABORT; + (yyval.sp_assignment_lex_list)->push_back((yyvsp[0].assignment_lex), thd->mem_root); + } +#line 31718 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 408: /* cursor_actual_parameters: cursor_actual_parameters ',' assignment_source_expr */ +#line 4003 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.sp_assignment_lex_list)= (yyvsp[-2].sp_assignment_lex_list); + (yyval.sp_assignment_lex_list)->push_back((yyvsp[0].assignment_lex), thd->mem_root); + } +#line 31727 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 409: /* opt_parenthesized_cursor_actual_parameters: %empty */ +#line 4010 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_assignment_lex_list)= NULL; } +#line 31733 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 410: /* opt_parenthesized_cursor_actual_parameters: '(' cursor_actual_parameters ')' */ +#line 4011 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_assignment_lex_list)= (yyvsp[-1].sp_assignment_lex_list); } +#line 31739 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 414: /* sp_proc_stmt_open: OPEN_SYM ident opt_parenthesized_cursor_actual_parameters */ +#line 4022 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_open_cursor(thd, &(yyvsp[-1].ident_sys), (yyvsp[0].sp_assignment_lex_list)))) + MYSQL_YYABORT; + } +#line 31748 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 415: /* sp_proc_stmt_fetch_head: FETCH_SYM ident INTO */ +#line 4030 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 31757 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 416: /* sp_proc_stmt_fetch_head: FETCH_SYM FROM ident INTO */ +#line 4035 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 31766 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 417: /* sp_proc_stmt_fetch_head: FETCH_SYM NEXT_SYM FROM ident INTO */ +#line 4040 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 31775 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 418: /* sp_proc_stmt_fetch: sp_proc_stmt_fetch_head sp_fetch_list */ +#line 4047 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 31781 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 419: /* sp_proc_stmt_fetch: FETCH_SYM GROUP_SYM NEXT_SYM ROW_SYM */ +#line 4049 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_agg_cfetch())) + MYSQL_YYABORT; + } +#line 31790 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 420: /* sp_proc_stmt_close: CLOSE_SYM ident */ +#line 4057 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint offset; + sp_instr_cclose *i; + + if (unlikely(!lex->spcont->find_cursor(&(yyvsp[0].ident_sys), &offset, false))) + my_yyabort_error((ER_SP_CURSOR_MISMATCH, MYF(0), (yyvsp[0].ident_sys).str)); + i= new (thd->mem_root) + sp_instr_cclose(sp->instructions(), lex->spcont, offset); + if (unlikely(i == NULL) || + unlikely(sp->add_instr(i))) + MYSQL_YYABORT; + } +#line 31809 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 421: /* sp_fetch_list: ident */ +#line 4075 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *spc= lex->spcont; + sp_variable *spv= likely(spc != NULL) + ? spc->find_variable(&(yyvsp[0].ident_sys), false) + : NULL; + + if (unlikely(!spv)) + my_yyabort_error((ER_SP_UNDECLARED_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + + /* An SP local variable */ + sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); + i->add_to_varlist(spv); + } +#line 31829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 422: /* sp_fetch_list: sp_fetch_list ',' ident */ +#line 4091 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *spc= lex->spcont; + sp_variable *spv= likely(spc != NULL) + ? spc->find_variable(&(yyvsp[0].ident_sys), false) + : NULL; + + if (unlikely(!spv)) + my_yyabort_error((ER_SP_UNDECLARED_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + + /* An SP local variable */ + sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); + i->add_to_varlist(spv); + } +#line 31849 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 423: /* $@47: %empty */ +#line 4110 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-1].expr_lex)->sp_if_expr(thd))) + MYSQL_YYABORT; + } +#line 31858 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 424: /* $@48: %empty */ +#line 4115 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-3].expr_lex)->sp_if_after_statements(thd))) + MYSQL_YYABORT; + } +#line 31867 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 425: /* sp_if: expr_lex THEN_SYM $@47 sp_if_then_statements $@48 sp_elseifs */ +#line 4120 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sphead->backpatch(lex->spcont->pop_label()); + } +#line 31877 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 430: /* $@49: %empty */ +#line 4136 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + + /** + An example of the CASE statement in use is +
+            CREATE PROCEDURE proc_19194_simple(i int)
+            BEGIN
+              DECLARE str CHAR(10);
+
+              CASE i
+                WHEN 1 THEN SET str="1";
+                WHEN 2 THEN SET str="2";
+                WHEN 3 THEN SET str="3";
+                ELSE SET str="unknown";
+              END CASE;
+
+              SELECT str;
+            END
+            
+ The actions are used to generate the following code: +
+            SHOW PROCEDURE CODE proc_19194_simple;
+            Pos     Instruction
+            0       set str@1 NULL
+            1       set_case_expr (12) 0 i@0
+            2       jump_if_not 5(12) (case_expr@0 = 1)
+            3       set str@1 _latin1'1'
+            4       jump 12
+            5       jump_if_not 8(12) (case_expr@0 = 2)
+            6       set str@1 _latin1'2'
+            7       jump 12
+            8       jump_if_not 11(12) (case_expr@0 = 3)
+            9       set str@1 _latin1'3'
+            10      jump 12
+            11      set str@1 _latin1'unknown'
+            12      stmt 0 "SELECT str"
+            
+ */ + + Lex->sphead->new_cont_backpatch(NULL); + + /* + BACKPATCH: Creating target label for the jump to after END CASE + (instruction 12 in the example) + */ + Lex->spcont->push_label(thd, &empty_clex_str, Lex->sphead->instructions()); + } +#line 31931 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 431: /* case_stmt_specification: CASE_SYM $@49 case_stmt_body else_clause_opt END CASE_SYM */ +#line 4189 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + BACKPATCH: Resolving forward jump from + "case_stmt_action_then" to after END CASE + (jump from instruction 4 to 12, 7 to 12 ... in the example) + */ + Lex->sphead->backpatch(Lex->spcont->pop_label()); + + if ((yyvsp[-3].num)) + Lex->spcont->pop_case_expr_id(); + + Lex->sphead->do_cont_backpatch(); + } +#line 31949 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 432: /* $@50: %empty */ +#line 4206 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_expr())) + MYSQL_YYABORT; + } +#line 31958 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 433: /* case_stmt_body: expr_lex $@50 simple_when_clause_list */ +#line 4211 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 31964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 434: /* case_stmt_body: searched_when_clause_list */ +#line 4213 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 31970 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 439: /* $@51: %empty */ +#line 4228 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Simple case: = */ + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_when(true))) + MYSQL_YYABORT; + } +#line 31980 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 440: /* simple_when_clause: WHEN_SYM expr_lex $@51 THEN_SYM sp_case_then_statements */ +#line 4235 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->case_stmt_action_then())) + MYSQL_YYABORT; + } +#line 31989 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 441: /* $@52: %empty */ +#line 4243 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_when(false))) + MYSQL_YYABORT; + } +#line 31998 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 442: /* searched_when_clause: WHEN_SYM expr_lex $@52 THEN_SYM sp_case_then_statements */ +#line 4249 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->case_stmt_action_then())) + MYSQL_YYABORT; + } +#line 32007 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 443: /* else_clause_opt: %empty */ +#line 4257 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint ip= sp->instructions(); + sp_instr_error *i= new (thd->mem_root) + sp_instr_error(ip, lex->spcont, ER_SP_CASE_NOT_FOUND); + if (unlikely(i == NULL) || + unlikely(sp->add_instr(i))) + MYSQL_YYABORT; + } +#line 32022 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 445: /* sp_opt_label: %empty */ +#line 4271 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 32028 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 446: /* sp_opt_label: label_ident */ +#line 4272 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 32034 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 447: /* opt_sp_for_loop_direction: %empty */ +#line 4277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 32040 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 448: /* opt_sp_for_loop_direction: REVERSE_SYM */ +#line 4278 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= -1; } +#line 32046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 449: /* sp_for_loop_index_and_bounds: ident_for_loop_index sp_for_loop_bounds */ +#line 4283 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_declarations(thd, &(yyval.for_loop), &(yyvsp[-1].ident_sys), (yyvsp[0].for_loop_bounds)))) + MYSQL_YYABORT; + } +#line 32055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 450: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction for_loop_bound_expr DOT_DOT_SYM for_loop_bound_expr */ +#line 4292 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.for_loop_bounds)= Lex_for_loop_bounds_intrange((yyvsp[-3].num), (yyvsp[-2].assignment_lex), (yyvsp[0].assignment_lex)); + } +#line 32063 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 451: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction for_loop_bound_expr */ +#line 4296 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.for_loop_bounds).m_direction= (yyvsp[-1].num); + (yyval.for_loop_bounds).m_index= (yyvsp[0].assignment_lex); + (yyval.for_loop_bounds).m_target_bound= NULL; + (yyval.for_loop_bounds).m_implicit_cursor= false; + } +#line 32074 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 452: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction '(' sp_cursor_stmt ')' */ +#line 4303 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_implicit_cursor_statement(thd, &(yyval.for_loop_bounds), + (yyvsp[-1].sp_cursor_stmt)))) + MYSQL_YYABORT; + } +#line 32084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 453: /* loop_body: sp_proc_stmts1 END LOOP_SYM */ +#line 4312 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + uint ip= lex->sphead->instructions(); + sp_label *lab= lex->spcont->last_label(); /* Jumping back */ + sp_instr_jump *i= new (thd->mem_root) + sp_instr_jump(ip, lex->spcont, lab->ip); + if (unlikely(i == NULL) || + unlikely(lex->sphead->add_instr(i))) + MYSQL_YYABORT; + } +#line 32099 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 454: /* repeat_body: sp_proc_stmts1 UNTIL_SYM expr_lex END REPEAT_SYM */ +#line 4326 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-2].expr_lex)->sp_repeat_loop_finalize(thd)) + MYSQL_YYABORT; + } +#line 32108 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 455: /* pop_sp_loop_label: sp_opt_label */ +#line 4334 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_pop_loop_label(thd, &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 32117 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 456: /* $@53: %empty */ +#line 4342 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32126 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 457: /* sp_labeled_control: sp_control_label LOOP_SYM $@53 loop_body pop_sp_loop_label */ +#line 4347 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32132 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 458: /* $@54: %empty */ +#line 4349 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32141 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 459: /* sp_labeled_control: sp_control_label WHILE_SYM $@54 while_body pop_sp_loop_label */ +#line 4354 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32147 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 460: /* $@55: %empty */ +#line 4356 "/home/buildbot/git/sql/sql_yacc.yy" + { + // See "The FOR LOOP statement" comments in sql_lex.cc + Lex->sp_block_init(thd); // The outer DECLARE..BEGIN..END block + } +#line 32156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 461: /* $@56: %empty */ +#line 4361 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-3].lex_str)))) // The inner WHILE block + MYSQL_YYABORT; + if (unlikely(Lex->sp_for_loop_condition_test(thd, (yyvsp[0].for_loop)))) + MYSQL_YYABORT; + } +#line 32167 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 462: /* $@57: %empty */ +#line 4368 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + } +#line 32176 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 463: /* sp_labeled_control: sp_control_label FOR_SYM $@55 sp_for_loop_index_and_bounds $@56 for_loop_statements $@57 pop_sp_loop_label */ +#line 4373 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_outer_block_finalize(thd, (yyvsp[-4].for_loop)))) + MYSQL_YYABORT; + } +#line 32185 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 464: /* $@58: %empty */ +#line 4378 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32194 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 465: /* sp_labeled_control: sp_control_label REPEAT_SYM $@58 repeat_body pop_sp_loop_label */ +#line 4383 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32200 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 466: /* $@59: %empty */ +#line 4388 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 32209 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 467: /* sp_unlabeled_control: LOOP_SYM $@59 loop_body */ +#line 4393 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 32217 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 468: /* $@60: %empty */ +#line 4397 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 32226 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 469: /* sp_unlabeled_control: WHILE_SYM $@60 while_body */ +#line 4402 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 32234 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 470: /* $@61: %empty */ +#line 4406 "/home/buildbot/git/sql/sql_yacc.yy" + { + // See "The FOR LOOP statement" comments in sql_lex.cc + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sp_block_init(thd); // The outer DECLARE..BEGIN..END block + } +#line 32245 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 471: /* $@62: %empty */ +#line 4413 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) // The inner WHILE block + MYSQL_YYABORT; + if (unlikely(Lex->sp_for_loop_condition_test(thd, (yyvsp[0].for_loop)))) + MYSQL_YYABORT; + } +#line 32256 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 472: /* sp_unlabeled_control: FOR_SYM $@61 sp_for_loop_index_and_bounds $@62 for_loop_statements */ +#line 4420 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + Lex->sp_pop_loop_empty_label(thd); // The inner WHILE block + if (unlikely(Lex->sp_for_loop_outer_block_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + } +#line 32268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 473: /* $@63: %empty */ +#line 4428 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 32277 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 474: /* sp_unlabeled_control: REPEAT_SYM $@63 repeat_body */ +#line 4433 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 32285 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 475: /* trg_action_time: BEFORE_SYM */ +#line 4440 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.action_time= TRG_ACTION_BEFORE; } +#line 32291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 476: /* trg_action_time: AFTER_SYM */ +#line 4442 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.action_time= TRG_ACTION_AFTER; } +#line 32297 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 477: /* trg_event: INSERT */ +#line 4447 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_INSERT; } +#line 32303 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 478: /* trg_event: UPDATE_SYM */ +#line 4449 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_UPDATE; } +#line 32309 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 479: /* trg_event: DELETE_SYM */ +#line 4451 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_DELETE; } +#line 32315 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 480: /* $@64: %empty */ +#line 4456 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.option_list= NULL; } +#line 32321 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 481: /* create_body: create_field_list_parens $@64 opt_create_table_options opt_create_partitioning opt_create_select */ +#line 4457 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32327 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 482: /* create_body: opt_create_table_options opt_create_partitioning opt_create_select */ +#line 4458 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32333 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 483: /* create_body: create_like */ +#line 4460 "/home/buildbot/git/sql/sql_yacc.yy" + { + + Lex->create_info.add(DDL_options_st::OPT_LIKE); + TABLE_LIST *src_table= Lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, 0, TL_READ, MDL_SHARED_READ); + if (unlikely(! src_table)) + MYSQL_YYABORT; + /* CREATE TABLE ... LIKE is not allowed for views. */ + src_table->required_type= TABLE_TYPE_NORMAL; + } +#line 32348 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 484: /* create_like: LIKE table_ident */ +#line 4473 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table)= (yyvsp[0].table); } +#line 32354 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 485: /* create_like: LEFT_PAREN_LIKE LIKE table_ident ')' */ +#line 4474 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table)= (yyvsp[-1].table); } +#line 32360 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 486: /* opt_create_select: %empty */ +#line 4478 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32366 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 487: /* opt_create_select: opt_duplicate opt_as create_select_query_expression opt_versioning_option */ +#line 4481 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.add(DDL_options_st::OPT_CREATE_SELECT); + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 32376 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 488: /* create_select_query_expression: query_expression */ +#line 4490 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_insert_select((yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 32385 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 489: /* create_select_query_expression: LEFT_PAREN_WITH with_clause query_expression_no_with_clause ')' */ +#line 4495 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *first_select= (yyvsp[-1].select_lex_unit)->first_select(); + (yyvsp[-1].select_lex_unit)->set_with_clause((yyvsp[-2].with_clause)); + (yyvsp[-2].with_clause)->attach_to(first_select); + if (Lex->parsed_insert_select(first_select)) + MYSQL_YYABORT; + } +#line 32397 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 490: /* opt_create_partitioning: opt_partitioning */ +#line 4506 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Remove all tables used in PARTITION clause from the global table + list. Partitioning with subqueries is not allowed anyway. + */ + TABLE_LIST *last_non_sel_table= Lex->create_last_non_select_table; + last_non_sel_table->next_global= 0; + Lex->query_tables_last= &last_non_sel_table->next_global; + } +#line 32411 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 491: /* opt_partitioning: %empty */ +#line 4542 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32417 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 493: /* $@65: %empty */ +#line 4548 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + if (lex->sql_command == SQLCOM_ALTER_TABLE) + { + lex->alter_info.partition_flags|= ALTER_PARTITION_INFO; + } + } +#line 32432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 495: /* have_partitioning: %empty */ +#line 4563 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + LEX_CSTRING partition_name={STRING_WITH_LEN("partition")}; + if (unlikely(!plugin_is_ready(&partition_name, MYSQL_STORAGE_ENGINE_PLUGIN))) + my_yyabort_error((ER_OPTION_PREVENTS_STATEMENT, MYF(0), + "--skip-partition")); +#else + my_yyabort_error((ER_FEATURE_DISABLED, MYF(0), "partitioning", + "--with-plugin-partition")); +#endif + } +#line 32448 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 496: /* $@66: %empty */ +#line 4578 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->part_info)) + { + thd->parse_error(ER_PARTITION_ENTRY_ERROR); + MYSQL_YYABORT; + } + if (Lex->main_select_push()) + MYSQL_YYABORT; + /* + We enter here when opening the frm file to translate + partition info string into part_info data structure. + */ + } +#line 32466 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 497: /* partition_entry: PARTITION_SYM $@66 partition */ +#line 4592 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 32474 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 498: /* $@67: %empty */ +#line 4599 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->safe_to_cache_query= 1; } +#line 32480 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 500: /* part_type_def: opt_linear KEY_SYM opt_key_algo '(' part_field_list ')' */ +#line 4605 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->list_of_part_fields= TRUE; + part_info->column_list= FALSE; + part_info->part_type= HASH_PARTITION; + } +#line 32491 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 501: /* $@68: %empty */ +#line 4612 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= HASH_PARTITION; } +#line 32497 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 502: /* part_type_def: opt_linear HASH_SYM $@68 part_func */ +#line 4613 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32503 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 503: /* part_type_def: RANGE_SYM part_func */ +#line 4615 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= RANGE_PARTITION; } +#line 32509 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 504: /* part_type_def: RANGE_SYM part_column_list */ +#line 4617 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= RANGE_PARTITION; } +#line 32515 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 505: /* $@69: %empty */ +#line 4619 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_PART_FUNC; + } +#line 32523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 506: /* part_type_def: LIST_SYM $@69 part_func */ +#line 4623 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->part_info->part_type= LIST_PARTITION; + Select->parsing_place= NO_MATTER; + } +#line 32532 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 507: /* part_type_def: LIST_SYM part_column_list */ +#line 4628 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= LIST_PARTITION; } +#line 32538 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 508: /* $@70: %empty */ +#line 4630 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->part_info->vers_init_info(thd))) + MYSQL_YYABORT; + } +#line 32547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 510: /* opt_linear: %empty */ +#line 4638 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32553 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 511: /* opt_linear: LINEAR_SYM */ +#line 4640 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->linear_hash_ind= TRUE;} +#line 32559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 512: /* opt_key_algo: %empty */ +#line 4645 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_NONE;} +#line 32565 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 513: /* opt_key_algo: ALGORITHM_SYM '=' real_ulong_num */ +#line 4647 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch ((yyvsp[0].ulong_num)) { + case 1: + Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_51; + break; + case 2: + Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_55; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 32583 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 514: /* part_field_list: %empty */ +#line 4663 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32589 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 515: /* part_field_list: part_field_item_list */ +#line 4664 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32595 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 516: /* part_field_item_list: part_field_item */ +#line 4668 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32601 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 517: /* part_field_item_list: part_field_item_list ',' part_field_item */ +#line 4669 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32607 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 518: /* part_field_item: ident */ +#line 4674 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->num_columns++; + if (unlikely(part_info->part_field_list.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + if (unlikely(part_info->num_columns > MAX_REF_PARTS)) + my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), + "list of partition fields")); + } +#line 32622 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 519: /* part_column_list: COLUMNS '(' part_field_list ')' */ +#line 4688 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->column_list= TRUE; + part_info->list_of_part_fields= TRUE; + } +#line 32632 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 520: /* part_func: '(' part_func_expr ')' */ +#line 4698 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->set_part_expr(thd, (yyvsp[-1].item), FALSE))) + MYSQL_YYABORT; + part_info->num_columns= 1; + part_info->column_list= FALSE; + } +#line 32644 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 521: /* sub_part_func: '(' part_func_expr ')' */ +#line 4709 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->part_info->set_part_expr(thd, (yyvsp[-1].item), TRUE))) + MYSQL_YYABORT; + } +#line 32653 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 522: /* opt_num_parts: %empty */ +#line 4717 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32659 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 523: /* opt_num_parts: PARTITIONS_SYM real_ulong_num */ +#line 4719 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint num_parts= (yyvsp[0].ulong_num); + partition_info *part_info= Lex->part_info; + if (unlikely(num_parts == 0)) + my_yyabort_error((ER_NO_PARTS_ERROR, MYF(0), "partitions")); + + part_info->num_parts= num_parts; + part_info->use_default_num_partitions= FALSE; + } +#line 32673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 524: /* opt_sub_part: %empty */ +#line 4731 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32679 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 525: /* $@71: %empty */ +#line 4733 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->subpart_type= HASH_PARTITION; } +#line 32685 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 526: /* opt_sub_part: SUBPARTITION_SYM BY opt_linear HASH_SYM sub_part_func $@71 opt_num_subparts */ +#line 4734 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 527: /* $@72: %empty */ +#line 4737 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->subpart_type= HASH_PARTITION; + part_info->list_of_subpart_fields= TRUE; + } +#line 32701 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 528: /* opt_sub_part: SUBPARTITION_SYM BY opt_linear KEY_SYM opt_key_algo '(' sub_part_field_list ')' $@72 opt_num_subparts */ +#line 4742 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32707 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 529: /* sub_part_field_list: sub_part_field_item */ +#line 4746 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32713 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 530: /* sub_part_field_list: sub_part_field_list ',' sub_part_field_item */ +#line 4747 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32719 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 531: /* sub_part_field_item: ident */ +#line 4752 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->subpart_field_list.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + + if (unlikely(part_info->subpart_field_list.elements > MAX_REF_PARTS)) + my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), + "list of subpartition fields")); + } +#line 32734 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 532: /* part_func_expr: bit_expr */ +#line 4766 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->safe_to_cache_query)) + { + thd->parse_error(ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR); + MYSQL_YYABORT; + } + (yyval.item)=(yyvsp[0].item); + } +#line 32747 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 533: /* opt_num_subparts: %empty */ +#line 4777 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32753 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 534: /* opt_num_subparts: SUBPARTITIONS_SYM real_ulong_num */ +#line 4779 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint num_parts= (yyvsp[0].ulong_num); + LEX *lex= Lex; + if (unlikely(num_parts == 0)) + my_yyabort_error((ER_NO_PARTS_ERROR, MYF(0), "subpartitions")); + lex->part_info->num_subparts= num_parts; + lex->part_info->use_default_num_subpartitions= FALSE; + } +#line 32766 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 535: /* part_defs: %empty */ +#line 4791 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->part_type == RANGE_PARTITION)) + my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), + "RANGE")); + if (unlikely(part_info->part_type == LIST_PARTITION)) + my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), + "LIST")); + } +#line 32780 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 536: /* part_defs: '(' part_def_list ')' */ +#line 4801 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + uint count_curr_parts= part_info->partitions.elements; + if (part_info->num_parts != 0) + { + if (unlikely(part_info->num_parts != + count_curr_parts)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_PART_ERROR); + MYSQL_YYABORT; + } + } + else if (count_curr_parts > 0) + { + part_info->num_parts= count_curr_parts; + } + part_info->count_curr_subparts= 0; + } +#line 32803 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 537: /* part_def_list: part_definition */ +#line 4822 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32809 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 538: /* part_def_list: part_def_list ',' part_definition */ +#line 4823 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32815 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 541: /* $@73: %empty */ +#line 4833 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *p_elem= new (thd->mem_root) partition_element(); + + if (unlikely(!p_elem) || + unlikely(part_info->partitions.push_back(p_elem, thd->mem_root))) + MYSQL_YYABORT; + + p_elem->part_state= PART_NORMAL; + p_elem->id= part_info->partitions.elements - 1; + part_info->curr_part_elem= p_elem; + part_info->current_partition= p_elem; + part_info->use_default_partitions= FALSE; + part_info->use_default_num_partitions= FALSE; + } +#line 32835 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 542: /* part_definition: opt_partition $@73 part_name opt_part_values opt_part_options opt_sub_partition */ +#line 4852 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32841 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 543: /* part_name: ident */ +#line 4857 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *p_elem= part_info->curr_part_elem; + if (unlikely(check_ident_length(&(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + p_elem->partition_name= (yyvsp[0].ident_sys).str; + } +#line 32853 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 544: /* opt_part_values: %empty */ +#line 4868 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->error_if_requires_values())) + MYSQL_YYABORT; + if (unlikely(part_info->part_type == VERSIONING_PARTITION)) + my_yyabort_error((ER_VERS_WRONG_PARTS, MYF(0), + lex->create_last_non_select_table-> + table_name.str)); + } + else + part_info->part_type= HASH_PARTITION; + } +#line 32873 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 545: /* $@74: %empty */ +#line 4884 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != RANGE_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "RANGE", "LESS THAN")); + } + else + part_info->part_type= RANGE_PARTITION; + } +#line 32890 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 546: /* opt_part_values: VALUES_LESS_SYM THAN_SYM $@74 part_func_max */ +#line 4896 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32896 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 547: /* $@75: %empty */ +#line 4898 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != LIST_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "LIST", "IN")); + } + else + part_info->part_type= LIST_PARTITION; + } +#line 32913 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 548: /* opt_part_values: VALUES_IN_SYM $@75 part_values_in */ +#line 4910 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32919 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 549: /* opt_part_values: CURRENT_SYM */ +#line 4912 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (Lex->part_values_current(thd)) + MYSQL_YYABORT; +#endif + } +#line 32930 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 550: /* opt_part_values: HISTORY_SYM */ +#line 4919 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (Lex->part_values_history(thd)) + MYSQL_YYABORT; +#endif + } +#line 32941 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 551: /* opt_part_values: DEFAULT */ +#line 4926 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != LIST_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "LIST", "DEFAULT")); + } + else + part_info->part_type= LIST_PARTITION; + if (unlikely(part_info->init_column_part(thd))) + MYSQL_YYABORT; + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 32962 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 552: /* part_func_max: MAXVALUE_SYM */ +#line 4946 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + + if (unlikely(part_info->num_columns && + part_info->num_columns != 1U)) + { + part_info->print_debug("Kilroy II", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + else + part_info->num_columns= 1U; + if (unlikely(part_info->init_column_part(thd))) + MYSQL_YYABORT; + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 32984 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 553: /* part_func_max: part_value_item */ +#line 4963 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32990 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 554: /* part_values_in: part_value_item */ +#line 4968 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + part_info->print_debug("part_values_in: part_value_item", NULL); + + if (part_info->num_columns != 1U) + { + if (unlikely(!lex->is_partition_management() || + part_info->num_columns == 0 || + part_info->num_columns > MAX_REF_PARTS)) + { + part_info->print_debug("Kilroy III", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + /* + Reorganize the current large array into a list of small + arrays with one entry in each array. This can happen + in the first partition of an ALTER TABLE statement where + we ADD or REORGANIZE partitions. Also can only happen + for LIST partitions. + */ + if (unlikely(part_info->reorganize_into_single_field_col_val(thd))) + MYSQL_YYABORT; + } + } +#line 33021 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 555: /* part_values_in: '(' part_value_list ')' */ +#line 4995 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->num_columns < 2U)) + { + thd->parse_error(ER_ROW_SINGLE_PARTITION_FIELD_ERROR); + MYSQL_YYABORT; + } + } +#line 33034 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 556: /* part_value_list: part_value_item */ +#line 5006 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33040 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 557: /* part_value_list: part_value_list ',' part_value_item */ +#line 5007 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 558: /* $@76: %empty */ +#line 5012 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->print_debug("( part_value_item", NULL); + /* Initialisation code needed for each list of value expressions */ + if (unlikely(!(part_info->part_type == LIST_PARTITION && + part_info->num_columns == 1U) && + part_info->init_column_part(thd))) + MYSQL_YYABORT; + } +#line 33060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 559: /* $@77: %empty */ +#line 5021 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 560: /* part_value_item: '(' $@76 part_value_item_list $@77 ')' */ +#line 5023 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->print_debug(") part_value_item", NULL); + if (part_info->num_columns == 0) + part_info->num_columns= part_info->curr_list_object; + if (unlikely(part_info->num_columns != part_info->curr_list_object)) + { + /* + All value items lists must be of equal length, in some cases + which is covered by the above if-statement we don't know yet + how many columns is in the partition so the assignment above + ensures that we only report errors when we know we have an + error. + */ + part_info->print_debug("Kilroy I", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + part_info->curr_list_object= 0; + } +#line 33091 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 561: /* part_value_item_list: part_value_expr_item */ +#line 5046 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33097 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 562: /* part_value_item_list: part_value_item_list ',' part_value_expr_item */ +#line 5047 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33103 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 563: /* part_value_expr_item: MAXVALUE_SYM */ +#line 5052 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->part_type == LIST_PARTITION)) + { + thd->parse_error(ER_MAXVALUE_IN_VALUES_IN); + MYSQL_YYABORT; + } + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 33118 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 564: /* part_value_expr_item: bit_expr */ +#line 5063 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + Item *part_expr= (yyvsp[0].item); + + if (unlikely(!lex->safe_to_cache_query)) + { + thd->parse_error(ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR); + MYSQL_YYABORT; + } + if (unlikely(part_info->add_column_list_value(thd, part_expr))) + MYSQL_YYABORT; + } +#line 33136 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 565: /* opt_sub_partition: %empty */ +#line 5081 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->num_subparts != 0 && + !part_info->use_default_subpartitions)) + { + /* + We come here when we have defined subpartitions on the first + partition but not on all the subsequent partitions. + */ + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + } +#line 33154 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 566: /* opt_sub_partition: '(' sub_part_list ')' */ +#line 5095 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (part_info->num_subparts != 0) + { + if (unlikely(part_info->num_subparts != + part_info->count_curr_subparts)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + } + else if (part_info->count_curr_subparts > 0) + { + if (unlikely(part_info->partitions.elements > 1)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + part_info->num_subparts= part_info->count_curr_subparts; + } + part_info->count_curr_subparts= 0; + } +#line 33181 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 567: /* sub_part_list: sub_part_definition */ +#line 5120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33187 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 568: /* sub_part_list: sub_part_list ',' sub_part_definition */ +#line 5121 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33193 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 569: /* $@78: %empty */ +#line 5126 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *curr_part= part_info->current_partition; + partition_element *sub_p_elem= new (thd->mem_root) + partition_element(curr_part); + if (unlikely(part_info->use_default_subpartitions && + part_info->partitions.elements >= 2)) + { + /* + create table t1 (a int) + partition by list (a) subpartition by hash (a) + (partition p0 values in (1), + partition p1 values in (2) subpartition sp11); + causes use to arrive since we are on the second + partition, but still use_default_subpartitions + is set. When we come here we're processing at least + the second partition (the current partition processed + have already been put into the partitions list. + */ + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + if (unlikely(!sub_p_elem) || + unlikely(curr_part->subpartitions.push_back(sub_p_elem, thd->mem_root))) + MYSQL_YYABORT; + + sub_p_elem->id= curr_part->subpartitions.elements - 1; + part_info->curr_part_elem= sub_p_elem; + part_info->use_default_subpartitions= FALSE; + part_info->use_default_num_subpartitions= FALSE; + part_info->count_curr_subparts++; + } +#line 33230 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 570: /* sub_part_definition: SUBPARTITION_SYM $@78 sub_name opt_subpart_options */ +#line 5158 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33236 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 571: /* sub_name: ident_or_text */ +#line 5163 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(check_ident_length(&(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + Lex->part_info->curr_part_elem->partition_name= (yyvsp[0].lex_str).str; + } +#line 33246 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 572: /* opt_part_options: %empty */ +#line 5171 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33252 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 573: /* opt_part_options: part_option_list */ +#line 5172 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33258 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 574: /* part_option_list: part_option_list part_option */ +#line 5176 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33264 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 575: /* part_option_list: part_option */ +#line 5177 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33270 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 576: /* part_option: server_part_option */ +#line 5181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33276 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 577: /* part_option: engine_defined_option */ +#line 5183 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->part_info->curr_part_elem->option_list, + &Lex->option_list_last); + } +#line 33285 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 578: /* opt_subpart_options: %empty */ +#line 5190 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 579: /* opt_subpart_options: subpart_option_list */ +#line 5191 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33297 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 580: /* subpart_option_list: subpart_option_list server_part_option */ +#line 5195 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33303 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 581: /* subpart_option_list: server_part_option */ +#line 5196 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33309 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 582: /* server_part_option: TABLESPACE opt_equal ident_or_text */ +#line 5201 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Compatibility with MySQL */ } +#line 33315 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 583: /* server_part_option: opt_storage ENGINE_SYM opt_equal storage_engines */ +#line 5203 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->curr_part_elem->engine_type= (yyvsp[0].db_type); + part_info->default_engine_type= (yyvsp[0].db_type); + } +#line 33325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 584: /* server_part_option: CONNECTION_SYM opt_equal TEXT_STRING_sys */ +#line 5209 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info->curr_part_elem->connect_string.str= (yyvsp[0].lex_str).str; + lex->part_info->curr_part_elem->connect_string.length= (yyvsp[0].lex_str).length; + } +#line 33335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 585: /* server_part_option: NODEGROUP_SYM opt_equal real_ulong_num */ +#line 5215 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->nodegroup_id= (uint16) (yyvsp[0].ulong_num); } +#line 33341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 586: /* server_part_option: MAX_ROWS opt_equal real_ulonglong_num */ +#line 5217 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_max_rows= (ha_rows) (yyvsp[0].ulonglong_number); } +#line 33347 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 587: /* server_part_option: MIN_ROWS opt_equal real_ulonglong_num */ +#line 5219 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_min_rows= (ha_rows) (yyvsp[0].ulonglong_number); } +#line 33353 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 588: /* server_part_option: DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5221 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->data_file_name= (yyvsp[0].lex_str).str; } +#line 33359 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 589: /* server_part_option: INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5223 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->index_file_name= (yyvsp[0].lex_str).str; } +#line 33365 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 590: /* server_part_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5225 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_comment= (yyvsp[0].lex_str).str; } +#line 33371 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 591: /* opt_versioning_rotation: %empty */ +#line 5229 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33377 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 592: /* $@79: %empty */ +#line 5230 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "INTERVAL"; } +#line 33383 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 593: /* opt_versioning_rotation: $@79 INTERVAL_SYM expr interval opt_versioning_interval_start opt_vers_auto_part */ +#line 5232 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + const char *table_name= Lex->create_last_non_select_table->table_name.str; + if (unlikely(part_info->vers_set_interval(thd, (yyvsp[-3].item), (yyvsp[-2].interval), (yyvsp[-1].item), (yyvsp[0].num), + table_name))) + MYSQL_YYABORT; + } +#line 33395 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 594: /* opt_versioning_rotation: LIMIT ulonglong_num opt_vers_auto_part */ +#line 5240 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + const char *table_name= Lex->create_last_non_select_table->table_name.str; + if (unlikely(part_info->vers_set_limit((yyvsp[-1].ulonglong_number), (yyvsp[0].num), table_name))) + MYSQL_YYABORT; + } +#line 33406 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 595: /* opt_versioning_interval_start: %empty */ +#line 5251 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= NULL; + } +#line 33414 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 596: /* opt_versioning_interval_start: STARTS_SYM literal */ +#line 5255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 33422 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 597: /* opt_vers_auto_part: %empty */ +#line 5262 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 0; + } +#line 33430 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 598: /* opt_vers_auto_part: AUTO_SYM */ +#line 5266 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 1; + } +#line 33438 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 599: /* opt_as: %empty */ +#line 5275 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33444 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 600: /* opt_as: AS */ +#line 5276 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33450 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 601: /* opt_create_database_options: %empty */ +#line 5280 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33456 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 602: /* opt_create_database_options: create_database_options */ +#line 5281 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33462 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 603: /* create_database_options: create_database_option */ +#line 5285 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33468 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 604: /* create_database_options: create_database_options create_database_option */ +#line 5286 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33474 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 605: /* create_database_option: default_collation */ +#line 5290 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33480 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 606: /* create_database_option: default_charset */ +#line 5291 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33486 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 607: /* create_database_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5293 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.schema_comment= thd->make_clex_string((yyvsp[0].lex_str)); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 33495 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 608: /* opt_if_not_exists_table_element: %empty */ +#line 5301 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= FALSE; + } +#line 33503 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 609: /* opt_if_not_exists_table_element: IF_SYM not EXISTS */ +#line 5305 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= TRUE; + } +#line 33511 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 610: /* opt_if_not_exists: %empty */ +#line 5312 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).init(); + } +#line 33519 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 611: /* opt_if_not_exists: IF_SYM not EXISTS */ +#line 5316 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_IF_NOT_EXISTS); + } +#line 33527 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 612: /* create_or_replace: CREATE */ +#line 5323 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).init(); + } +#line 33535 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 613: /* create_or_replace: CREATE OR_SYM REPLACE */ +#line 5327 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_OR_REPLACE); + } +#line 33543 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 621: /* create_table_option: ENGINE_SYM opt_equal ident_or_text */ +#line 5350 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!lex->m_sql_cmd) + { + DBUG_ASSERT(lex->sql_command == SQLCOM_ALTER_TABLE); + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table())) + MYSQL_YYABORT; + } + Storage_engine_name *opt= + lex->m_sql_cmd->option_storage_engine_name(); + DBUG_ASSERT(opt); // Expect a proper Sql_cmd + *opt= Storage_engine_name((yyvsp[0].lex_str)); + lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; + } +#line 33562 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 622: /* create_table_option: MAX_ROWS opt_equal ulonglong_num */ +#line 5365 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.max_rows= (yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS; + } +#line 33571 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 623: /* create_table_option: MIN_ROWS opt_equal ulonglong_num */ +#line 5370 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.min_rows= (yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS; + } +#line 33580 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 624: /* create_table_option: AVG_ROW_LENGTH opt_equal ulong_num */ +#line 5375 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.avg_row_length=(yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH; + } +#line 33589 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 625: /* create_table_option: PASSWORD_SYM opt_equal TEXT_STRING_sys */ +#line 5380 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.password=(yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_PASSWORD; + } +#line 33598 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 626: /* create_table_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5385 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.comment=(yyvsp[0].lex_str); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 33607 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 627: /* create_table_option: AUTO_INC opt_equal ulonglong_num */ +#line 5390 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.auto_increment_value=(yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_AUTO; + } +#line 33616 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 628: /* create_table_option: PACK_KEYS_SYM opt_equal ulong_num */ +#line 5395 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.table_options|= HA_OPTION_NO_PACK_KEYS; + break; + case 1: + Lex->create_info.table_options|= HA_OPTION_PACK_KEYS; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; + } +#line 33635 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 629: /* create_table_option: PACK_KEYS_SYM opt_equal DEFAULT */ +#line 5410 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options&= + ~(HA_OPTION_PACK_KEYS | HA_OPTION_NO_PACK_KEYS); + Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; + } +#line 33645 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 630: /* create_table_option: STATS_AUTO_RECALC_SYM opt_equal ulong_num */ +#line 5416 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_OFF; + break; + case 1: + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_ON; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; + } +#line 33664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 631: /* create_table_option: STATS_AUTO_RECALC_SYM opt_equal DEFAULT */ +#line 5431 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_DEFAULT; + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; + } +#line 33673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 632: /* create_table_option: STATS_PERSISTENT_SYM opt_equal ulong_num */ +#line 5436 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.table_options|= HA_OPTION_NO_STATS_PERSISTENT; + break; + case 1: + Lex->create_info.table_options|= HA_OPTION_STATS_PERSISTENT; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; + } +#line 33692 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 633: /* create_table_option: STATS_PERSISTENT_SYM opt_equal DEFAULT */ +#line 5451 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options&= + ~(HA_OPTION_STATS_PERSISTENT | HA_OPTION_NO_STATS_PERSISTENT); + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; + } +#line 33702 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 634: /* create_table_option: STATS_SAMPLE_PAGES_SYM opt_equal ulong_num */ +#line 5457 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* From user point of view STATS_SAMPLE_PAGES can be specified as + STATS_SAMPLE_PAGES=N (where 0 0xffff)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.stats_sample_pages=(yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; + } +#line 33724 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 635: /* create_table_option: STATS_SAMPLE_PAGES_SYM opt_equal DEFAULT */ +#line 5475 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.stats_sample_pages=0; + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; + } +#line 33733 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 636: /* create_table_option: CHECKSUM_SYM opt_equal ulong_num */ +#line 5480 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; + Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; + } +#line 33742 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 637: /* create_table_option: TABLE_CHECKSUM_SYM opt_equal ulong_num */ +#line 5485 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; + Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; + } +#line 33751 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 638: /* create_table_option: PAGE_CHECKSUM_SYM opt_equal choice */ +#line 5490 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_PAGE_CHECKSUM; + Lex->create_info.page_checksum= (yyvsp[0].choice); + } +#line 33760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 639: /* create_table_option: DELAY_KEY_WRITE_SYM opt_equal ulong_num */ +#line 5495 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE; + Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE; + } +#line 33769 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 640: /* create_table_option: ROW_FORMAT_SYM opt_equal row_types */ +#line 5500 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.row_type= (yyvsp[0].row_type); + Lex->create_info.used_fields|= HA_CREATE_USED_ROW_FORMAT; + } +#line 33778 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 641: /* $@80: %empty */ +#line 5505 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->first_select_lex()->table_list.save_and_clear(&Lex->save_list); + } +#line 33786 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 642: /* create_table_option: UNION_SYM opt_equal $@80 '(' opt_table_list ')' */ +#line 5509 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Move the union list to the merge_list and exclude its tables + from the global list. + */ + LEX *lex=Lex; + lex->create_info.merge_list= lex->first_select_lex()->table_list.first; + lex->first_select_lex()->table_list= lex->save_list; + /* + When excluding union list from the global list we assume that + elements of the former immediately follow elements which represent + table being created/altered and parent tables. + */ + TABLE_LIST *last_non_sel_table= lex->create_last_non_select_table; + DBUG_ASSERT(last_non_sel_table->next_global == + lex->create_info.merge_list); + last_non_sel_table->next_global= 0; + Lex->query_tables_last= &last_non_sel_table->next_global; + + lex->create_info.used_fields|= HA_CREATE_USED_UNION; + } +#line 33812 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 645: /* create_table_option: INSERT_METHOD opt_equal merge_insert_types */ +#line 5533 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.merge_insert_method= (yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD; + } +#line 33821 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 646: /* create_table_option: DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5538 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.data_file_name= (yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_DATADIR; + } +#line 33830 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 647: /* create_table_option: INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5543 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.index_file_name= (yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_INDEXDIR; + } +#line 33839 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 648: /* create_table_option: TABLESPACE ident */ +#line 5548 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Compatiblity with MySQL */ } +#line 33845 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 649: /* create_table_option: STORAGE_SYM DISK_SYM */ +#line 5550 "/home/buildbot/git/sql/sql_yacc.yy" + {Lex->create_info.storage_media= HA_SM_DISK;} +#line 33851 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 650: /* create_table_option: STORAGE_SYM MEMORY_SYM */ +#line 5552 "/home/buildbot/git/sql/sql_yacc.yy" + {Lex->create_info.storage_media= HA_SM_MEMORY;} +#line 33857 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 651: /* create_table_option: CONNECTION_SYM opt_equal TEXT_STRING_sys */ +#line 5554 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.connect_string.str= (yyvsp[0].lex_str).str; + Lex->create_info.connect_string.length= (yyvsp[0].lex_str).length; + Lex->create_info.used_fields|= HA_CREATE_USED_CONNECTION; + } +#line 33867 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 652: /* create_table_option: KEY_BLOCK_SIZE opt_equal ulong_num */ +#line 5560 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE; + Lex->create_info.key_block_size= (yyvsp[0].ulong_num); + } +#line 33876 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 653: /* create_table_option: TRANSACTIONAL_SYM opt_equal choice */ +#line 5565 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_TRANSACTIONAL; + Lex->create_info.transactional= (yyvsp[0].choice); + } +#line 33885 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 654: /* create_table_option: engine_defined_option */ +#line 5570 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->create_info.option_list, &Lex->option_list_last); + } +#line 33893 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 655: /* create_table_option: SEQUENCE_SYM opt_equal choice */ +#line 5574 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE; + Lex->create_info.sequence= ((yyvsp[0].choice) == HA_CHOICE_YES); + } +#line 33902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 657: /* engine_defined_option: IDENT_sys equal TEXT_STRING_sys */ +#line 5583 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].lex_str).length > ENGINE_OPTION_MAX_LENGTH)) + my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].lex_str), true); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 33913 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 658: /* engine_defined_option: IDENT_sys equal ident */ +#line 5590 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].ident_sys).length > ENGINE_OPTION_MAX_LENGTH)) + my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].ident_sys), false); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 33924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 659: /* engine_defined_option: IDENT_sys equal real_ulonglong_num */ +#line 5597 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].ulonglong_number), thd->mem_root); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 33933 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 660: /* engine_defined_option: IDENT_sys equal DEFAULT */ +#line 5602 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys)); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 33942 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 663: /* versioning_option: WITH_SYSTEM_SYM VERSIONING_SYM */ +#line 5615 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) + { + if (!DBUG_IF("sysvers_force")) + { + my_error(ER_VERS_NOT_SUPPORTED, MYF(0), "CREATE TEMPORARY TABLE"); + MYSQL_YYABORT; + } + } + else + { + Lex->alter_info.flags|= ALTER_ADD_SYSTEM_VERSIONING; + Lex->create_info.options|= HA_VERSIONED_TABLE; + } + } +#line 33962 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 664: /* default_charset: opt_default charset opt_equal charset_name_or_default */ +#line 5634 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.add_table_option_default_charset((yyvsp[0].charset)))) + MYSQL_YYABORT; + } +#line 33971 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 665: /* default_collation: opt_default COLLATE_SYM opt_equal collation_name_or_default */ +#line 5642 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_specification_st *cinfo= &Lex->create_info; + if (unlikely(cinfo->add_table_option_default_collation((yyvsp[0].Lex_extended_collation)))) + MYSQL_YYABORT; + } +#line 33981 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 666: /* storage_engines: ident_or_text */ +#line 5651 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Storage_engine_name((yyvsp[0].lex_str)). + resolve_storage_engine_with_error(thd, &(yyval.db_type), + thd->lex->create_info.tmp_table())) + MYSQL_YYABORT; + } +#line 33992 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 667: /* known_storage_engines: ident_or_text */ +#line 5661 "/home/buildbot/git/sql/sql_yacc.yy" + { + plugin_ref plugin; + if (likely((plugin= ha_resolve_by_name(thd, &(yyvsp[0].lex_str), false)))) + (yyval.db_type)= plugin_hton(plugin); + else + my_yyabort_error((ER_UNKNOWN_STORAGE_ENGINE, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 34004 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 668: /* row_types: DEFAULT */ +#line 5671 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_DEFAULT; } +#line 34010 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 669: /* row_types: FIXED_SYM */ +#line 5672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_FIXED; } +#line 34016 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 670: /* row_types: DYNAMIC_SYM */ +#line 5673 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_DYNAMIC; } +#line 34022 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 671: /* row_types: COMPRESSED_SYM */ +#line 5674 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_COMPRESSED; } +#line 34028 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 672: /* row_types: REDUNDANT_SYM */ +#line 5675 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_REDUNDANT; } +#line 34034 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 673: /* row_types: COMPACT_SYM */ +#line 5676 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_COMPACT; } +#line 34040 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 674: /* row_types: PAGE_SYM */ +#line 5677 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_PAGE; } +#line 34046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 675: /* merge_insert_types: NO_SYM */ +#line 5681 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_DISABLED; } +#line 34052 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 676: /* merge_insert_types: FIRST_SYM */ +#line 5682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_TO_FIRST; } +#line 34058 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 677: /* merge_insert_types: LAST_SYM */ +#line 5683 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_TO_LAST; } +#line 34064 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 678: /* udf_type: STRING_SYM */ +#line 5687 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) STRING_RESULT; } +#line 34070 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 679: /* udf_type: REAL */ +#line 5688 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) REAL_RESULT; } +#line 34076 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 680: /* udf_type: DECIMAL_SYM */ +#line 5689 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) DECIMAL_RESULT; } +#line 34082 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 681: /* udf_type: INT_SYM */ +#line 5690 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) INT_RESULT; } +#line 34088 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 682: /* create_field_list: field_list */ +#line 5696 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + } +#line 34096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 683: /* create_field_list_parens: LEFT_PAREN_ALT field_list ')' */ +#line 5703 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + } +#line 34104 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 686: /* field_list_item: column_def */ +#line 5714 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34110 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 690: /* field_list_item: PERIOD_SYM period_for_application_time */ +#line 5718 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34116 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 691: /* column_def: field_spec */ +#line 5723 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.create_field)= (yyvsp[0].create_field); } +#line 34122 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 692: /* column_def: field_spec opt_constraint references */ +#line 5725 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_column_foreign_key(&((yyvsp[-2].create_field)->field_name), &(yyvsp[-1].lex_str), + (yyvsp[0].table), DDL_options()))) + MYSQL_YYABORT; + (yyval.create_field)= (yyvsp[-2].create_field); + } +#line 34133 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 693: /* $@81: %empty */ +#line 5735 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key(Key::MULTIPLE, &(yyvsp[-1].lex_str), (yyvsp[0].key_alg), (yyvsp[-2].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34143 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 694: /* key_def: key_or_index opt_if_not_exists opt_ident opt_USING_key_algorithm $@81 '(' key_list ')' normal_key_options */ +#line 5740 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34149 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 695: /* $@82: %empty */ +#line 5742 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key(Key::MULTIPLE, &(yyvsp[-2].ident_sys), (yyvsp[0].key_alg), (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34159 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 696: /* key_def: key_or_index opt_if_not_exists ident TYPE_SYM btree_or_rtree $@82 '(' key_list ')' normal_key_options */ +#line 5747 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34165 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 697: /* $@83: %empty */ +#line 5749 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), &(yyvsp[0].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34175 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 698: /* key_def: fulltext opt_key_or_index opt_if_not_exists opt_ident $@83 '(' key_list ')' fulltext_key_options */ +#line 5754 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34181 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 699: /* $@84: %empty */ +#line 5756 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), &(yyvsp[0].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34191 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 700: /* key_def: spatial opt_key_or_index opt_if_not_exists opt_ident $@84 '(' key_list ')' spatial_key_options */ +#line 5761 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34197 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 701: /* $@85: %empty */ +#line 5765 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), (yyvsp[-1].lex_str).str ? &(yyvsp[-1].lex_str) : &(yyvsp[-4].lex_str), (yyvsp[0].key_alg), (yyvsp[-2].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34207 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 702: /* key_def: opt_constraint constraint_key_type opt_if_not_exists opt_ident opt_USING_key_algorithm $@85 '(' key_list opt_without_overlaps ')' normal_key_options */ +#line 5770 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34213 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 703: /* $@86: %empty */ +#line 5773 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-4].key_type), (yyvsp[-2].ident_sys).str ? &(yyvsp[-2].ident_sys) : &(yyvsp[-5].lex_str), (yyvsp[0].key_alg), (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34223 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 704: /* key_def: opt_constraint constraint_key_type opt_if_not_exists ident TYPE_SYM btree_or_rtree $@86 '(' key_list opt_without_overlaps ')' normal_key_options */ +#line 5778 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34229 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 705: /* $@87: %empty */ +#line 5780 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->check_add_key((yyvsp[-1].object_ddl_options))) || + unlikely(!(Lex->last_key= (new (thd->mem_root) + Key(Key::MULTIPLE, + (yyvsp[-4].lex_str).str ? &(yyvsp[-4].lex_str) : &(yyvsp[0].lex_str), + HA_KEY_ALG_UNDEF, true, (yyvsp[-1].object_ddl_options)))))) + MYSQL_YYABORT; + Lex->option_list= NULL; + } +#line 34243 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 706: /* key_def: opt_constraint FOREIGN KEY_SYM opt_if_not_exists opt_ident $@87 '(' key_list ')' references */ +#line 5790 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_table_foreign_key((yyvsp[-5].lex_str).str ? &(yyvsp[-5].lex_str) : &(yyvsp[-9].lex_str), + (yyvsp[-9].lex_str).str ? &(yyvsp[-9].lex_str) : &(yyvsp[-5].lex_str), (yyvsp[0].table), (yyvsp[-6].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34253 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 707: /* constraint_def: opt_constraint check_constraint */ +#line 5799 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->add_constraint((yyvsp[-1].lex_str), (yyvsp[0].virtual_column), FALSE); + } +#line 34261 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 708: /* period_for_system_time: PERIOD_SYM FOR_SYSTEM_TIME_SYM '(' ident ',' ident ')' */ +#line 5807 "/home/buildbot/git/sql/sql_yacc.yy" + { + Vers_parse_info &info= Lex->vers_get_info(); + info.set_period((yyvsp[-3].ident_sys), (yyvsp[-1].ident_sys)); + } +#line 34270 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 709: /* period_for_application_time: FOR_SYM ident '(' ident ',' ident ')' */ +#line 5815 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_period((yyvsp[-5].ident_sys), (yyvsp[-3].ident_sys), (yyvsp[-1].ident_sys))) + MYSQL_YYABORT; + } +#line 34279 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 710: /* opt_check_constraint: %empty */ +#line 5822 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.virtual_column)= (Virtual_column_info*) 0; } +#line 34285 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 711: /* opt_check_constraint: check_constraint */ +#line 5823 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.virtual_column)= (yyvsp[0].virtual_column);} +#line 34291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 712: /* check_constraint: CHECK_SYM '(' expr ')' */ +#line 5828 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= add_virtual_expression(thd, (yyvsp[-1].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 34302 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 713: /* opt_constraint_no_id: %empty */ +#line 5837 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34308 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 714: /* opt_constraint_no_id: CONSTRAINT */ +#line 5838 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34314 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 715: /* opt_constraint: %empty */ +#line 5842 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 34320 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 716: /* opt_constraint: constraint */ +#line 5843 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 34326 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 717: /* constraint: CONSTRAINT opt_ident */ +#line 5847 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 34332 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 718: /* @88: %empty */ +#line 5852 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Create_field *f= new (thd->mem_root) Create_field(); + + if (unlikely(check_string_char_length(&(yyvsp[0].lex_str), 0, NAME_CHAR_LEN, + system_charset_info, 1))) + my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), (yyvsp[0].lex_str).str)); + + if (unlikely(!f)) + MYSQL_YYABORT; + + lex->init_last_field(f, &(yyvsp[0].lex_str)); + (yyval.create_field)= f; + lex->parsing_options.lookup_keywords_after_qualifier= true; + } +#line 34352 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 719: /* field_spec: field_ident @88 field_type_or_serial opt_check_constraint */ +#line 5868 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->parsing_options.lookup_keywords_after_qualifier= false; + (yyval.create_field)= (yyvsp[-2].create_field); + + (yyval.create_field)->check_constraint= (yyvsp[0].virtual_column); + + if (unlikely((yyval.create_field)->check(thd))) + MYSQL_YYABORT; + + lex->alter_info.create_list.push_back((yyval.create_field), thd->mem_root); + + (yyval.create_field)->create_if_not_exists= Lex->check_exists; + if ((yyval.create_field)->flags & PRI_KEY_FLAG) + lex->add_key_to_list(&(yyvsp[-3].lex_str), Key::PRIMARY, lex->check_exists); + else if ((yyval.create_field)->flags & UNIQUE_KEY_FLAG) + lex->add_key_to_list(&(yyvsp[-3].lex_str), Key::UNIQUE, lex->check_exists); + } +#line 34375 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 720: /* $@89: %empty */ +#line 5890 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + } +#line 34384 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 721: /* field_type_or_serial: qualified_field_type $@89 field_def */ +#line 5895 "/home/buildbot/git/sql/sql_yacc.yy" + { + auto tmp= (yyvsp[-2].Lex_field_type).charset_collation_attrs(); + if (tmp.merge_column_charset_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + Lex->last_field->set_charset_collation_attrs(tmp); + } +#line 34395 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 722: /* $@90: %empty */ +#line 5902 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_handler(&type_handler_ulonglong); + Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG + | UNSIGNED_FLAG | UNIQUE_KEY_FLAG; + Lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 34406 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 724: /* opt_serial_attribute: %empty */ +#line 5912 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34412 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 725: /* opt_serial_attribute: opt_serial_attribute_list */ +#line 5913 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34418 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 726: /* opt_serial_attribute_list: opt_serial_attribute_list serial_attribute */ +#line 5917 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 728: /* opt_asrow_attribute: %empty */ +#line 5922 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34430 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 729: /* opt_asrow_attribute: opt_asrow_attribute_list */ +#line 5923 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34436 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 730: /* opt_asrow_attribute_list: opt_asrow_attribute_list asrow_attribute */ +#line 5927 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34442 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 732: /* field_def: %empty */ +#line 5932 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 34448 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 734: /* field_def: attribute_list compressed_deprecated_column_attribute */ +#line 5934 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs); } +#line 34454 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 735: /* field_def: attribute_list compressed_deprecated_column_attribute attribute_list */ +#line 5936 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-2].Lex_exact_charset_extended_collation_attrs)).merge_column_collate_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + } +#line 34463 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 736: /* $@91: %empty */ +#line 5941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info= (yyvsp[0].virtual_column); + } +#line 34471 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 737: /* field_def: opt_generated_always AS virtual_column_func $@91 vcol_opt_specifier vcol_opt_attribute */ +#line 5945 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 34479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 738: /* field_def: opt_generated_always AS ROW_SYM START_SYM opt_asrow_attribute */ +#line 5949 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->last_field_generated_always_as_row_start()) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 34489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 739: /* field_def: opt_generated_always AS ROW_SYM END opt_asrow_attribute */ +#line 5955 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->last_field_generated_always_as_row_end()) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 34499 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 740: /* opt_generated_always: %empty */ +#line 5963 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34505 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 741: /* opt_generated_always: GENERATED_SYM ALWAYS_SYM */ +#line 5964 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34511 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 742: /* vcol_opt_specifier: %empty */ +#line 5969 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); + } +#line 34519 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 743: /* vcol_opt_specifier: VIRTUAL_SYM */ +#line 5973 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); + } +#line 34527 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 744: /* vcol_opt_specifier: PERSISTENT_SYM */ +#line 5977 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); + } +#line 34535 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 745: /* vcol_opt_specifier: STORED_SYM */ +#line 5981 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); + } +#line 34543 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 746: /* vcol_opt_attribute: %empty */ +#line 5987 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34549 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 747: /* vcol_opt_attribute: vcol_opt_attribute_list */ +#line 5988 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34555 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 748: /* vcol_opt_attribute_list: vcol_opt_attribute_list vcol_attribute */ +#line 5992 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34561 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 750: /* vcol_attribute: UNIQUE_SYM */ +#line 5998 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 34571 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 751: /* vcol_attribute: UNIQUE_SYM KEY_SYM */ +#line 6004 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 34581 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 752: /* vcol_attribute: COMMENT_SYM TEXT_STRING_sys */ +#line 6009 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->comment= (yyvsp[0].lex_str); } +#line 34587 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 753: /* vcol_attribute: INVISIBLE_SYM */ +#line 6011 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->invisible= INVISIBLE_USER; + } +#line 34595 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 754: /* $@92: %empty */ +#line 6018 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + "PARSE_VCOL_EXPR" can only be used by the SQL server + when reading a '*.frm' file. + Prevent the end user from invoking this command. + */ + MYSQL_YYABORT_UNLESS(Lex->parse_vcol_expr); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 34610 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 755: /* parse_vcol_expr: PARSE_VCOL_EXPR_SYM $@92 expr */ +#line 6029 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= add_virtual_expression(thd, (yyvsp[0].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + Lex->last_field->vcol_info= v; + Lex->pop_select(); //main select + } +#line 34622 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 757: /* parenthesized_expr: expr ',' expr_list */ +#line 6041 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_row(thd, *(yyvsp[0].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 34633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 758: /* virtual_column_func: '(' parenthesized_expr ')' */ +#line 6051 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= + add_virtual_expression(thd, (yyvsp[-1].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 34645 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 759: /* virtual_column_func: subquery */ +#line 6059 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item; + if (!(item= new (thd->mem_root) Item_singlerow_subselect(thd, (yyvsp[0].select_lex)))) + MYSQL_YYABORT; + Virtual_column_info *v= add_virtual_expression(thd, item); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 34659 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 763: /* column_default_expr: expr_or_literal */ +#line 6075 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.virtual_column)= add_virtual_expression(thd, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 34668 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 764: /* field_type: field_type_all */ +#line 6082 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->map_data_type(Lex_ident_sys(), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type))); + } +#line 34676 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 765: /* qualified_field_type: field_type_all */ +#line 6089 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->map_data_type(Lex_ident_sys(), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type))); + } +#line 34684 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 766: /* qualified_field_type: sp_decl_ident '.' field_type_all */ +#line 6093 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->map_data_type((yyvsp[-2].ident_sys), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 34693 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 767: /* udt_name: IDENT_sys */ +#line 6100 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 34699 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 768: /* udt_name: reserved_keyword_udt */ +#line 6101 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].kwd); } +#line 34705 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 769: /* udt_name: non_reserved_keyword_udt */ +#line 6102 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].kwd); } +#line 34711 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 775: /* field_type_all: udt_name float_options srid_option */ +#line 6112 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_field_type_udt(&(yyval.Lex_field_type), (yyvsp[-2].lex_str), (yyvsp[-1].Lex_length_and_dec))) + MYSQL_YYABORT; + } +#line 34720 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 776: /* field_type_numeric: int_type opt_field_length last_field_options */ +#line 6120 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length_flags((yyvsp[-2].type_handler), (yyvsp[-1].Lex_length_and_dec), (uint32) (yyvsp[0].ulong_num)); + } +#line 34728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 777: /* field_type_numeric: real_type opt_precision last_field_options */ +#line 6123 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set((yyvsp[-2].type_handler), (yyvsp[-1].Lex_length_and_dec)); } +#line 34734 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 778: /* field_type_numeric: FLOAT_SYM float_options last_field_options */ +#line 6125 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_float, (yyvsp[-1].Lex_length_and_dec)); + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length() && !(yyvsp[-1].Lex_length_and_dec).has_explicit_dec()) + { + if (unlikely((yyvsp[-1].Lex_length_and_dec).length() > PRECISION_FOR_DOUBLE)) + my_yyabort_error((ER_WRONG_FIELD_SPEC, MYF(0), + Lex->last_field->field_name.str)); + if ((yyvsp[-1].Lex_length_and_dec).length() > PRECISION_FOR_FLOAT) + (yyval.Lex_field_type).set(&type_handler_double); + else + (yyval.Lex_field_type).set(&type_handler_float); + } + } +#line 34752 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 779: /* field_type_numeric: BIT_SYM opt_field_length */ +#line 6139 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_bit, (yyvsp[0].Lex_length_and_dec)); + } +#line 34760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 780: /* field_type_numeric: BOOL_SYM */ +#line 6143 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length(&type_handler_stiny, 1); + } +#line 34768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 781: /* field_type_numeric: BOOLEAN_SYM */ +#line 6147 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length(&type_handler_stiny, 1); + } +#line 34776 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 782: /* field_type_numeric: DECIMAL_SYM float_options last_field_options */ +#line 6151 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 34782 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 783: /* field_type_numeric: NUMBER_ORACLE_SYM float_options last_field_options */ +#line 6153 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length()) + (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec)); + else + (yyval.Lex_field_type).set(&type_handler_double); + } +#line 34793 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 784: /* field_type_numeric: NUMERIC_SYM float_options last_field_options */ +#line 6160 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 34799 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 785: /* field_type_numeric: FIXED_SYM float_options last_field_options */ +#line 6162 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 34805 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 786: /* opt_binary_and_compression: %empty */ +#line 6167 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 34811 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 787: /* opt_binary_and_compression: binary */ +#line 6168 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[0].Lex_exact_charset_extended_collation_attrs); } +#line 34817 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 788: /* opt_binary_and_compression: binary compressed_deprecated_data_type_attribute */ +#line 6169 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs); } +#line 34823 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 789: /* opt_binary_and_compression: compressed opt_binary */ +#line 6170 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[0].Lex_exact_charset_extended_collation_attrs); } +#line 34829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 790: /* field_type_string: char opt_field_length opt_binary */ +#line 6175 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 34837 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 791: /* field_type_string: nchar opt_field_length opt_bin_mod */ +#line 6179 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[-1].Lex_length_and_dec), + Lex_exact_charset_extended_collation_attrs::national((yyvsp[0].num))); + } +#line 34846 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 792: /* field_type_string: BINARY opt_field_length */ +#line 6184 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[0].Lex_length_and_dec), &my_charset_bin); + } +#line 34854 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 793: /* field_type_string: varchar opt_field_length opt_binary_and_compression */ +#line 6188 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 34862 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 794: /* field_type_string: VARCHAR2_ORACLE_SYM opt_field_length opt_binary_and_compression */ +#line 6192 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 34870 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 795: /* field_type_string: nvarchar opt_field_length opt_compressed opt_bin_mod */ +#line 6196 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-2].Lex_length_and_dec), + Lex_exact_charset_extended_collation_attrs::national((yyvsp[0].num))); + } +#line 34879 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 796: /* field_type_string: VARBINARY opt_field_length opt_compressed */ +#line 6201 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 34887 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 797: /* field_type_string: RAW_ORACLE_SYM opt_field_length opt_compressed */ +#line 6205 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 34895 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 798: /* field_type_temporal: YEAR_SYM opt_field_length last_field_options */ +#line 6212 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length()) + { + if ((yyvsp[-1].Lex_length_and_dec).length() != 4) + { + char buff[sizeof("YEAR()") + MY_INT64_NUM_DECIMAL_DIGITS + 1]; + my_snprintf(buff, sizeof(buff), "YEAR(%u)", (uint) (yyvsp[-1].Lex_length_and_dec).length()); + push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, + ER_WARN_DEPRECATED_SYNTAX, + ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), + buff, "YEAR(4)"); + } + } + (yyval.Lex_field_type).set(&type_handler_year, (yyvsp[-1].Lex_length_and_dec)); + } +#line 34915 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 799: /* field_type_temporal: DATE_SYM */ +#line 6227 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdate); } +#line 34921 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 800: /* field_type_temporal: TIME_SYM opt_field_length */ +#line 6229 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(opt_mysql56_temporal_format ? + static_cast(&type_handler_time2) : + static_cast(&type_handler_time), + (yyvsp[0].Lex_length_and_dec)); + } +#line 34932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 801: /* field_type_temporal: TIMESTAMP opt_field_length */ +#line 6236 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(opt_mysql56_temporal_format ? + static_cast(&type_handler_timestamp2): + static_cast(&type_handler_timestamp), + (yyvsp[0].Lex_length_and_dec)); + } +#line 34943 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 802: /* field_type_temporal: DATETIME opt_field_length */ +#line 6243 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(thd->type_handler_for_datetime(), (yyvsp[0].Lex_length_and_dec)); + } +#line 34951 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 803: /* field_type_lob: TINYBLOB opt_compressed */ +#line 6251 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_tiny_blob, &my_charset_bin); + } +#line 34959 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 804: /* field_type_lob: BLOB_MARIADB_SYM opt_field_length opt_compressed */ +#line 6255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 34967 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 805: /* field_type_lob: BLOB_ORACLE_SYM field_length opt_compressed */ +#line 6259 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 34975 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 806: /* field_type_lob: BLOB_ORACLE_SYM opt_compressed */ +#line 6263 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob, &my_charset_bin); + } +#line 34983 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 807: /* field_type_lob: MEDIUMBLOB opt_compressed */ +#line 6267 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_medium_blob, &my_charset_bin); + } +#line 34991 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 808: /* field_type_lob: LONGBLOB opt_compressed */ +#line 6271 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob, &my_charset_bin); + } +#line 34999 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 809: /* field_type_lob: LONG_SYM VARBINARY opt_compressed */ +#line 6275 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_medium_blob, &my_charset_bin); + } +#line 35007 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 810: /* field_type_lob: LONG_SYM varchar opt_binary_and_compression */ +#line 6279 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35013 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 811: /* field_type_lob: TINYTEXT opt_binary_and_compression */ +#line 6281 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_tiny_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35019 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 812: /* field_type_lob: TEXT_SYM opt_field_length opt_binary_and_compression */ +#line 6283 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35025 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 813: /* field_type_lob: MEDIUMTEXT opt_binary_and_compression */ +#line 6285 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35031 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 814: /* field_type_lob: LONGTEXT opt_binary_and_compression */ +#line 6287 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_long_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35037 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 815: /* field_type_lob: CLOB_ORACLE_SYM opt_binary_and_compression */ +#line 6289 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_long_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35043 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 816: /* field_type_lob: LONG_SYM opt_binary_and_compression */ +#line 6291 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35049 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 817: /* field_type_lob: JSON_SYM opt_compressed */ +#line 6293 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob_json, &my_charset_utf8mb4_bin); + } +#line 35057 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 818: /* field_type_misc: ENUM '(' string_list ')' opt_binary */ +#line 6300 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_enum, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35063 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 819: /* field_type_misc: SET '(' string_list ')' opt_binary */ +#line 6302 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_set, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35069 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 820: /* char: CHAR_SYM */ +#line 6306 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35075 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 821: /* nchar: NCHAR_SYM */ +#line 6310 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35081 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 822: /* nchar: NATIONAL_SYM CHAR_SYM */ +#line 6311 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35087 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 823: /* varchar: char VARYING */ +#line 6315 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35093 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 824: /* varchar: VARCHAR */ +#line 6316 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35099 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 825: /* nvarchar: NATIONAL_SYM VARCHAR */ +#line 6320 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35105 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 826: /* nvarchar: NVARCHAR_SYM */ +#line 6321 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35111 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 827: /* nvarchar: NCHAR_SYM VARCHAR */ +#line 6322 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35117 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 828: /* nvarchar: NATIONAL_SYM CHAR_SYM VARYING */ +#line 6323 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35123 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 829: /* nvarchar: NCHAR_SYM VARYING */ +#line 6324 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35129 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 830: /* int_type: INT_SYM */ +#line 6328 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_slong; } +#line 35135 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 831: /* int_type: TINYINT */ +#line 6329 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_stiny; } +#line 35141 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 832: /* int_type: SMALLINT */ +#line 6330 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_sshort; } +#line 35147 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 833: /* int_type: MEDIUMINT */ +#line 6331 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_sint24; } +#line 35153 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 834: /* int_type: BIGINT */ +#line 6332 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_slonglong; } +#line 35159 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 835: /* real_type: REAL */ +#line 6337 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.type_handler)= thd->variables.sql_mode & MODE_REAL_AS_FLOAT ? + static_cast(&type_handler_float) : + static_cast(&type_handler_double); + } +#line 35169 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 836: /* real_type: DOUBLE_SYM */ +#line 6342 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_double; } +#line 35175 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 837: /* real_type: DOUBLE_SYM PRECISION */ +#line 6343 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_double; } +#line 35181 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 838: /* srid_option: %empty */ +#line 6348 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->srid= 0; } +#line 35187 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 839: /* srid_option: REF_SYSTEM_ID_SYM '=' NUM */ +#line 6351 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->srid=atoi((yyvsp[0].lex_str).str); + } +#line 35195 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 840: /* float_options: %empty */ +#line 6357 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 35201 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 843: /* precision: '(' NUM ',' NUM ')' */ +#line 6363 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set((yyvsp[-3].lex_str).str, (yyvsp[-1].lex_str).str); } +#line 35207 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 844: /* field_options: %empty */ +#line 6367 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35213 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 845: /* field_options: SIGNED_SYM */ +#line 6368 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35219 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 846: /* field_options: UNSIGNED */ +#line 6369 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG; } +#line 35225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 847: /* field_options: ZEROFILL */ +#line 6370 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35231 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 848: /* field_options: UNSIGNED ZEROFILL */ +#line 6371 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35237 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 849: /* field_options: ZEROFILL UNSIGNED */ +#line 6372 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35243 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 850: /* last_field_options: field_options */ +#line 6376 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->flags|= ((yyval.ulong_num)= (yyvsp[0].ulong_num)); } +#line 35249 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 851: /* field_length_str: '(' LONG_NUM ')' */ +#line 6380 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 35255 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 852: /* field_length_str: '(' ULONGLONG_NUM ')' */ +#line 6381 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 35261 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 853: /* field_length_str: '(' DECIMAL_NUM ')' */ +#line 6382 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 35267 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 854: /* field_length_str: '(' NUM ')' */ +#line 6383 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 35273 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 855: /* field_length: field_length_str */ +#line 6386 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set((yyvsp[0].const_simple_string), NULL); } +#line 35279 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 856: /* field_scale: field_length_str */ +#line 6390 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set(NULL, (yyvsp[0].const_simple_string)); } +#line 35285 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 857: /* opt_field_length: %empty */ +#line 6395 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); /* use default length */ } +#line 35291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 859: /* opt_field_scale: %empty */ +#line 6400 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 35297 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 861: /* opt_precision: %empty */ +#line 6405 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 35303 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 862: /* opt_precision: precision */ +#line 6406 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec)= (yyvsp[0].Lex_length_and_dec); } +#line 35309 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 863: /* attribute_list: attribute_list attribute */ +#line 6412 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs)).merge_column_collate_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + } +#line 35318 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 865: /* attribute: NULL_SYM */ +#line 6421 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->flags&= ~NOT_NULL_FLAG; + Lex->last_field->explicitly_nullable= true; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35328 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 866: /* attribute: DEFAULT column_default_expr */ +#line 6427 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->default_value= (yyvsp[0].virtual_column); + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35337 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 867: /* attribute: ON UPDATE_SYM NOW_SYM opt_default_time_precision */ +#line 6432 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + Lex->last_field->on_update= item; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35349 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 868: /* attribute: AUTO_INC */ +#line 6439 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 35355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 869: /* attribute: SERIAL_SYM DEFAULT VALUE_SYM */ +#line 6441 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35366 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 870: /* attribute: COLLATE_SYM collation_name */ +#line 6448 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 35374 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 871: /* attribute: serial_attribute */ +#line 6451 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 35380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 872: /* opt_compression_method: %empty */ +#line 6455 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= NULL; } +#line 35386 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 873: /* opt_compression_method: equal ident */ +#line 6456 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[0].ident_sys).str; } +#line 35392 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 874: /* opt_compressed: %empty */ +#line 6460 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35398 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 875: /* opt_compressed: compressed */ +#line 6461 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 35404 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 876: /* opt_enable: %empty */ +#line 6465 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35410 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 877: /* opt_enable: ENABLE_SYM */ +#line 6466 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 35416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 878: /* compressed: COMPRESSED_SYM opt_compression_method */ +#line 6471 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field->set_compressed((yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 35425 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 879: /* compressed_deprecated_data_type_attribute: COMPRESSED_SYM opt_compression_method */ +#line 6479 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field->set_compressed_deprecated(thd, (yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 35434 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 880: /* compressed_deprecated_column_attribute: COMPRESSED_SYM opt_compression_method */ +#line 6487 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field-> + set_compressed_deprecated_column_attribute(thd, (yyvsp[-1].kwd).pos(), (yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 35444 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 881: /* asrow_attribute: not NULL_SYM opt_enable */ +#line 6496 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->flags|= NOT_NULL_FLAG; + } +#line 35452 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 882: /* asrow_attribute: opt_primary KEY_SYM */ +#line 6500 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= PRI_KEY_FLAG | NOT_NULL_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 35462 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 885: /* serial_attribute: engine_defined_option */ +#line 6511 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->last_field->option_list, &Lex->option_list_last); + } +#line 35470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 886: /* serial_attribute: with_or_without_system VERSIONING_SYM */ +#line 6515 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->versioning= (yyvsp[-1].vers_column_versioning); + Lex->create_info.options|= HA_VERSIONED_TABLE; + if (Lex->alter_info.flags & ALTER_DROP_SYSTEM_VERSIONING) + { + my_yyabort_error((ER_VERS_NOT_VERSIONED, MYF(0), + Lex->create_last_non_select_table->table_name.str)); + } + } +#line 35484 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 887: /* with_or_without_system: WITH_SYSTEM_SYM */ +#line 6528 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_COLUMN_UNVERSIONED; + Lex->create_info.vers_info.versioned_fields= true; + (yyval.vers_column_versioning)= Column_definition::WITH_VERSIONING; + } +#line 35494 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 888: /* with_or_without_system: WITHOUT SYSTEM */ +#line 6534 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_COLUMN_UNVERSIONED; + Lex->create_info.vers_info.unversioned_fields= true; + (yyval.vers_column_versioning)= Column_definition::WITHOUT_VERSIONING; + } +#line 35504 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 889: /* charset: CHAR_SYM SET */ +#line 6543 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.kwd)= (yyvsp[-1].kwd); } +#line 35510 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 890: /* charset: CHARSET */ +#line 6544 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.kwd)= (yyvsp[0].kwd); } +#line 35516 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 891: /* charset_name: ident_or_text */ +#line 6549 "/home/buildbot/git/sql/sql_yacc.yy" + { + myf utf8_flag= thd->get_utf8_flag(); + if (unlikely(!((yyval.charset)=get_charset_by_csname((yyvsp[0].lex_str).str, MY_CS_PRIMARY, + MYF(utf8_flag))))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 35527 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 892: /* charset_name: BINARY */ +#line 6555 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_bin; } +#line 35533 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 893: /* charset_name_or_default: charset_name */ +#line 6559 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=(yyvsp[0].charset); } +#line 35539 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 894: /* charset_name_or_default: DEFAULT */ +#line 6560 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=NULL; } +#line 35545 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 895: /* opt_load_data_charset: %empty */ +#line 6564 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= NULL; } +#line 35551 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 896: /* opt_load_data_charset: charset charset_name_or_default */ +#line 6565 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= (yyvsp[0].charset); } +#line 35557 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 897: /* old_or_new_charset_name: ident_or_text */ +#line 6570 "/home/buildbot/git/sql/sql_yacc.yy" + { + myf utf8_flag= thd->get_utf8_flag(); + if (unlikely(!((yyval.charset)=get_charset_by_csname((yyvsp[0].lex_str).str, + MY_CS_PRIMARY, + MYF(utf8_flag))) && + !((yyval.charset)=get_old_charset_by_name((yyvsp[0].lex_str).str)))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 35570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 898: /* old_or_new_charset_name: BINARY */ +#line 6578 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_bin; } +#line 35576 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 899: /* old_or_new_charset_name_or_default: old_or_new_charset_name */ +#line 6582 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=(yyvsp[0].charset); } +#line 35582 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 900: /* old_or_new_charset_name_or_default: DEFAULT */ +#line 6583 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=NULL; } +#line 35588 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 901: /* collation_name: ident_or_text */ +#line 6588 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_extended_collation).set_by_name((yyvsp[0].lex_str).str, thd->get_utf8_flag())) + MYSQL_YYABORT; + } +#line 35597 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 902: /* collation_name_or_default: collation_name */ +#line 6595 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_extended_collation)=(yyvsp[0].Lex_extended_collation); } +#line 35603 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 903: /* collation_name_or_default: DEFAULT */ +#line 6596 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_extended_collation).set_collate_default(); } +#line 35609 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 904: /* opt_default: %empty */ +#line 6600 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35615 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 905: /* opt_default: DEFAULT */ +#line 6601 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35621 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 906: /* charset_or_alias: charset charset_name */ +#line 6605 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= (yyvsp[0].charset); } +#line 35627 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 907: /* charset_or_alias: ASCII_SYM */ +#line 6606 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_latin1; } +#line 35633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 908: /* charset_or_alias: UNICODE_SYM */ +#line 6608 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.charset)= get_charset_by_csname("ucs2", MY_CS_PRIMARY,MYF(0))))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), "ucs2")); + } +#line 35642 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 909: /* opt_binary: %empty */ +#line 6615 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 35648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 911: /* binary: BYTE_SYM */ +#line 6621 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset(Lex_exact_charset(&my_charset_bin)); + } +#line 35656 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 912: /* binary: charset_or_alias */ +#line 6625 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset(Lex_exact_charset((yyvsp[0].charset))); + } +#line 35664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 913: /* binary: charset_or_alias BINARY */ +#line 6629 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_binary(Lex_exact_charset((yyvsp[-1].charset)))) + MYSQL_YYABORT; + } +#line 35673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 914: /* binary: BINARY */ +#line 6633 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).set_contextually_typed_binary_style(); } +#line 35679 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 915: /* binary: BINARY charset_or_alias */ +#line 6635 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_binary(Lex_exact_charset((yyvsp[0].charset)))) + MYSQL_YYABORT; + } +#line 35688 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 916: /* binary: charset_or_alias COLLATE_SYM DEFAULT */ +#line 6640 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_default(Lex_exact_charset((yyvsp[-2].charset))); + } +#line 35696 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 917: /* binary: charset_or_alias COLLATE_SYM collation_name */ +#line 6644 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].Lex_extended_collation).merge_exact_charset(Lex_exact_charset((yyvsp[-2].charset)))) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 35706 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 918: /* binary: COLLATE_SYM collation_name */ +#line 6650 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 35714 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 919: /* binary: COLLATE_SYM DEFAULT */ +#line 6654 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_collate_default(); + } +#line 35722 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 920: /* opt_bin_mod: %empty */ +#line 6660 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 35728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 921: /* opt_bin_mod: BINARY */ +#line 6661 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 35734 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 922: /* $@93: %empty */ +#line 6666 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].ulong_num) == 0)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 35746 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 923: /* ws_nweights: '(' real_ulong_num $@93 ')' */ +#line 6674 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[-2].ulong_num); } +#line 35752 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 924: /* ws_level_flag_desc: ASC */ +#line 6678 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35758 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 925: /* ws_level_flag_desc: DESC */ +#line 6679 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1 << MY_STRXFRM_DESC_SHIFT; } +#line 35764 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 926: /* ws_level_flag_reverse: REVERSE_SYM */ +#line 6683 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1 << MY_STRXFRM_REVERSE_SHIFT; } +#line 35770 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 927: /* ws_level_flags: %empty */ +#line 6686 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35776 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 928: /* ws_level_flags: ws_level_flag_desc */ +#line 6687 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 35782 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 929: /* ws_level_flags: ws_level_flag_desc ws_level_flag_reverse */ +#line 6688 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[-1].ulong_num) | (yyvsp[0].ulong_num); } +#line 35788 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 930: /* ws_level_flags: ws_level_flag_reverse */ +#line 6689 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num) ; } +#line 35794 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 931: /* ws_level_number: real_ulong_num */ +#line 6694 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ulong_num)= (yyvsp[0].ulong_num) < 1 ? 1 : ((yyvsp[0].ulong_num) > MY_STRXFRM_NLEVELS ? MY_STRXFRM_NLEVELS : (yyvsp[0].ulong_num)); + (yyval.ulong_num)--; + } +#line 35803 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 932: /* ws_level_list_item: ws_level_number ws_level_flags */ +#line 6702 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ulong_num)= (1 | (yyvsp[0].ulong_num)) << (yyvsp[-1].ulong_num); + } +#line 35811 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 933: /* ws_level_list: ws_level_list_item */ +#line 6708 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 35817 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 934: /* ws_level_list: ws_level_list ',' ws_level_list_item */ +#line 6709 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)|= (yyvsp[0].ulong_num); } +#line 35823 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 935: /* ws_level_range: ws_level_number '-' ws_level_number */ +#line 6714 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint start= (yyvsp[-2].ulong_num); + uint end= (yyvsp[0].ulong_num); + for ((yyval.ulong_num)= 0; start <= end; start++) + (yyval.ulong_num)|= (1 << start); + } +#line 35834 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 936: /* ws_level_list_or_range: ws_level_list */ +#line 6723 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 35840 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 937: /* ws_level_list_or_range: ws_level_range */ +#line 6724 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 35846 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 938: /* opt_ws_levels: %empty */ +#line 6728 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 939: /* opt_ws_levels: LEVEL_SYM ws_level_list_or_range */ +#line 6729 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 35858 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 942: /* references: REFERENCES table_ident opt_ref_list opt_match_clause opt_on_update_delete */ +#line 6743 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)=(yyvsp[-3].table); + } +#line 35866 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 943: /* opt_ref_list: %empty */ +#line 6750 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ref_list.empty(); } +#line 35872 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 945: /* ref_list: ref_list ',' ident */ +#line 6756 "/home/buildbot/git/sql/sql_yacc.yy" + { + Key_part_spec *key= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely(key == NULL)) + MYSQL_YYABORT; + Lex->ref_list.push_back(key, thd->mem_root); + } +#line 35883 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 946: /* ref_list: ident */ +#line 6763 "/home/buildbot/git/sql/sql_yacc.yy" + { + Key_part_spec *key= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely(key == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->ref_list.empty(); + lex->ref_list.push_back(key, thd->mem_root); + } +#line 35896 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 947: /* opt_match_clause: %empty */ +#line 6775 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_UNDEF; } +#line 35902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 948: /* opt_match_clause: MATCH FULL */ +#line 6777 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_FULL; } +#line 35908 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 949: /* opt_match_clause: MATCH PARTIAL */ +#line 6779 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_PARTIAL; } +#line 35914 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 950: /* opt_match_clause: MATCH SIMPLE_SYM */ +#line 6781 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_SIMPLE; } +#line 35920 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 951: /* opt_on_update_delete: %empty */ +#line 6786 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= FK_OPTION_UNDEF; + lex->fk_delete_opt= FK_OPTION_UNDEF; + } +#line 35930 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 952: /* opt_on_update_delete: ON UPDATE_SYM delete_option */ +#line 6792 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[0].m_fk_option); + lex->fk_delete_opt= FK_OPTION_UNDEF; + } +#line 35940 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 953: /* opt_on_update_delete: ON DELETE_SYM delete_option */ +#line 6798 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= FK_OPTION_UNDEF; + lex->fk_delete_opt= (yyvsp[0].m_fk_option); + } +#line 35950 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 954: /* opt_on_update_delete: ON UPDATE_SYM delete_option ON DELETE_SYM delete_option */ +#line 6805 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[-3].m_fk_option); + lex->fk_delete_opt= (yyvsp[0].m_fk_option); + } +#line 35960 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 955: /* opt_on_update_delete: ON DELETE_SYM delete_option ON UPDATE_SYM delete_option */ +#line 6812 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[0].m_fk_option); + lex->fk_delete_opt= (yyvsp[-3].m_fk_option); + } +#line 35970 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 956: /* delete_option: RESTRICT */ +#line 6820 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_RESTRICT; } +#line 35976 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 957: /* delete_option: CASCADE */ +#line 6821 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_CASCADE; } +#line 35982 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 958: /* delete_option: SET NULL_SYM */ +#line 6822 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_SET_NULL; } +#line 35988 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 959: /* delete_option: NO_SYM ACTION */ +#line 6823 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_NO_ACTION; } +#line 35994 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 960: /* delete_option: SET DEFAULT */ +#line 6824 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_SET_DEFAULT; } +#line 36000 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 961: /* constraint_key_type: PRIMARY_SYM KEY_SYM */ +#line 6828 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::PRIMARY; } +#line 36006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 962: /* constraint_key_type: UNIQUE_SYM opt_key_or_index */ +#line 6829 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::UNIQUE; } +#line 36012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 963: /* key_or_index: KEY_SYM */ +#line 6833 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 964: /* key_or_index: INDEX_SYM */ +#line 6834 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36024 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 965: /* opt_key_or_index: %empty */ +#line 6838 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36030 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 967: /* keys_or_index: KEYS */ +#line 6843 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36036 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 968: /* keys_or_index: INDEX_SYM */ +#line 6844 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 969: /* keys_or_index: INDEXES */ +#line 6845 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 970: /* fulltext: FULLTEXT_SYM */ +#line 6849 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::FULLTEXT;} +#line 36054 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 971: /* spatial: SPATIAL_SYM */ +#line 6854 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef HAVE_SPATIAL + (yyval.key_type)= Key::SPATIAL; +#else + my_yyabort_error((ER_FEATURE_DISABLED, MYF(0), sym_group_geom.name, + sym_group_geom.needed_define)); +#endif + } +#line 36067 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 972: /* normal_key_options: %empty */ +#line 6865 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36073 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 973: /* normal_key_options: normal_key_opts */ +#line 6866 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36079 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 974: /* fulltext_key_options: %empty */ +#line 6870 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36085 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 975: /* fulltext_key_options: fulltext_key_opts */ +#line 6871 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36091 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 976: /* spatial_key_options: %empty */ +#line 6875 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36097 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 977: /* spatial_key_options: spatial_key_opts */ +#line 6876 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36103 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 984: /* opt_USING_key_algorithm: %empty */ +#line 6895 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_UNDEF; } +#line 36109 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 985: /* opt_USING_key_algorithm: USING btree_or_rtree */ +#line 6896 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36115 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 986: /* opt_key_algorithm_clause: %empty */ +#line 6901 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_UNDEF; } +#line 36121 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 987: /* opt_key_algorithm_clause: USING btree_or_rtree */ +#line 6902 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36127 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 988: /* opt_key_algorithm_clause: TYPE_SYM btree_or_rtree */ +#line 6903 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36133 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 989: /* key_using_alg: USING btree_or_rtree */ +#line 6908 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.algorithm= (yyvsp[0].key_alg); } +#line 36139 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 990: /* key_using_alg: TYPE_SYM btree_or_rtree */ +#line 6910 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.algorithm= (yyvsp[0].key_alg); } +#line 36145 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 991: /* all_key_opt: KEY_BLOCK_SIZE opt_equal ulong_num */ +#line 6915 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->key_create_info.block_size= (yyvsp[0].ulong_num); + Lex->last_key->key_create_info.flags|= HA_USES_BLOCK_SIZE; + } +#line 36154 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 992: /* all_key_opt: COMMENT_SYM TEXT_STRING_sys */ +#line 6920 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.comment= (yyvsp[0].lex_str); } +#line 36160 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 993: /* all_key_opt: VISIBLE_SYM */ +#line 6922 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* This is mainly for MySQL 8.0 compatibility */ + } +#line 36168 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 994: /* all_key_opt: ignorability */ +#line 6926 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->key_create_info.is_ignored= (yyvsp[0].num); + } +#line 36176 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 995: /* all_key_opt: engine_defined_option */ +#line 6930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->option_list, &Lex->option_list_last); + } +#line 36184 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1000: /* fulltext_key_opt: WITH PARSER_SYM IDENT_sys */ +#line 6947 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (likely(plugin_is_ready(&(yyvsp[0].ident_sys), MYSQL_FTPARSER_PLUGIN))) + Lex->last_key->key_create_info.parser_name= (yyvsp[0].ident_sys); + else + my_yyabort_error((ER_FUNCTION_NOT_DEFINED, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 36195 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1001: /* btree_or_rtree: BTREE_SYM */ +#line 6956 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_BTREE; } +#line 36201 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1002: /* btree_or_rtree: RTREE_SYM */ +#line 6957 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_RTREE; } +#line 36207 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1003: /* btree_or_rtree: HASH_SYM */ +#line 6958 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_HASH; } +#line 36213 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1004: /* ignorability: IGNORED_SYM */ +#line 6962 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 36219 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1005: /* ignorability: NOT_SYM IGNORED_SYM */ +#line 6963 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 36225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1006: /* key_list: key_list ',' key_part order_dir */ +#line 6968 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].key_part)->asc= (yyvsp[0].num); + Lex->last_key->columns.push_back((yyvsp[-1].key_part), thd->mem_root); + } +#line 36234 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1007: /* key_list: key_part order_dir */ +#line 6973 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].key_part)->asc= (yyvsp[0].num); + Lex->last_key->columns.push_back((yyvsp[-1].key_part), thd->mem_root); + } +#line 36243 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1008: /* opt_without_overlaps: %empty */ +#line 6980 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36249 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1009: /* opt_without_overlaps: ',' ident WITHOUT OVERLAPS_SYM */ +#line 6982 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->without_overlaps= true; + Lex->last_key->period= (yyvsp[-2].ident_sys); + } +#line 36258 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1010: /* key_part: ident */ +#line 6990 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.key_part)= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.key_part) == NULL)) + MYSQL_YYABORT; + } +#line 36268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1011: /* key_part: ident '(' NUM ')' */ +#line 6996 "/home/buildbot/git/sql/sql_yacc.yy" + { + int key_part_len= atoi((yyvsp[-1].lex_str).str); + if (unlikely(!key_part_len)) + my_yyabort_error((ER_KEY_PART_0, MYF(0), (yyvsp[-3].ident_sys).str)); + (yyval.key_part)= new (thd->mem_root) Key_part_spec(&(yyvsp[-3].ident_sys), (uint) key_part_len); + if (unlikely((yyval.key_part) == NULL)) + MYSQL_YYABORT; + } +#line 36281 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1012: /* opt_ident: %empty */ +#line 7007 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 36287 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1013: /* opt_ident: field_ident */ +#line 7008 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 36293 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1014: /* string_list: text_string */ +#line 7013 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->interval_list.push_back((yyvsp[0].string), thd->mem_root); } +#line 36299 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1015: /* string_list: string_list ',' text_string */ +#line 7015 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->interval_list.push_back((yyvsp[0].string), thd->mem_root); } +#line 36305 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1016: /* $@94: %empty */ +#line 7024 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->name= null_clex_str; + Lex->table_type= TABLE_TYPE_UNKNOWN; + Lex->sql_command= SQLCOM_ALTER_TABLE; + Lex->duplicates= DUP_ERROR; + Lex->first_select_lex()->order_list.empty(); + Lex->create_info.init(); + Lex->create_info.row_type= ROW_TYPE_NOT_USED; + Lex->alter_info.reset(); + Lex->no_write_to_binlog= 0; + Lex->create_info.storage_media= HA_SM_DEFAULT; + if (Lex->main_select_push()) + MYSQL_YYABORT; + DBUG_ASSERT(!Lex->m_sql_cmd); + } +#line 36325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1017: /* $@95: %empty */ +#line 7040 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + if (!Lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + TL_READ_NO_INSERT, MDL_SHARED_UPGRADABLE)) + MYSQL_YYABORT; + Lex->first_select_lex()->db= + (Lex->first_select_lex()->table_list.first)->db; + Lex->create_last_non_select_table= Lex->last_table(); + Lex->mark_first_table_as_inserting(); + } +#line 36341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1018: /* alter: ALTER $@94 alter_options TABLE_SYM opt_if_exists table_ident opt_lock_wait_timeout $@95 alter_commands */ +#line 7052 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (likely(!Lex->m_sql_cmd)) + { + /* Create a generic ALTER TABLE statment. */ + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } + Lex->pop_select(); //main select + } +#line 36356 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1019: /* $@96: %empty */ +#line 7063 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 36366 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1020: /* alter: ALTER DATABASE ident_or_empty $@96 create_database_options */ +#line 7069 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name= (yyvsp[-2].ident_sys); + if (lex->name.str == NULL && + unlikely(lex->copy_db_to(&lex->name))) + MYSQL_YYABORT; + Lex->pop_select(); //main select + } +#line 36380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1021: /* $@97: %empty */ +#line 7079 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + Lex->create_info.schema_comment= thd->make_clex_string((yyvsp[0].lex_str)); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 36390 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1022: /* alter: ALTER DATABASE COMMENT_SYM opt_equal TEXT_STRING_sys $@97 opt_create_database_options */ +#line 7085 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name= Lex_ident_sys(); + if (lex->name.str == NULL && + unlikely(lex->copy_db_to(&lex->name))) + MYSQL_YYABORT; + } +#line 36403 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1023: /* alter: ALTER DATABASE ident UPGRADE_SYM DATA_SYM DIRECTORY_SYM NAME_SYM */ +#line 7094 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "DATABASE")); + lex->sql_command= SQLCOM_ALTER_DB_UPGRADE; + lex->name= (yyvsp[-4].ident_sys); + } +#line 36415 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1024: /* $@98: %empty */ +#line 7102 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_procedure_start((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 36424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1025: /* alter: ALTER PROCEDURE_SYM sp_name $@98 sp_a_chistics stmt_end */ +#line 7107 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36430 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1026: /* $@99: %empty */ +#line 7109 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_function_start((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 36439 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1027: /* alter: ALTER FUNCTION_SYM sp_name $@99 sp_a_chistics stmt_end */ +#line 7114 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36445 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1028: /* $@100: %empty */ +#line 7116 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + if (Lex->add_alter_view(thd, (yyvsp[-4].num), (yyvsp[-2].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 36456 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1029: /* alter: ALTER view_algorithm definer_opt opt_view_suid VIEW_SYM table_ident $@100 view_list_opt AS view_select stmt_end */ +#line 7122 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36462 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1030: /* $@101: %empty */ +#line 7129 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + if (Lex->add_alter_view(thd, VIEW_ALGORITHM_INHERIT, (yyvsp[-2].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 36473 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1031: /* alter: ALTER definer_opt opt_view_suid VIEW_SYM table_ident $@101 view_list_opt AS view_select stmt_end */ +#line 7135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1032: /* $@102: %empty */ +#line 7137 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + /* + It is safe to use Lex->spname because + ALTER EVENT xxx RENATE TO yyy DO ALTER EVENT RENAME TO + is not allowed. Lex->spname is used in the case of RENAME TO + If it had to be supported spname had to be added to + Event_parse_data. + */ + + if (unlikely(!(Lex->event_parse_data= Event_parse_data::new_instance(thd)))) + MYSQL_YYABORT; + Lex->event_parse_data->identifier= (yyvsp[0].spname); + + Lex->sql_command= SQLCOM_ALTER_EVENT; + Lex->stmt_definition_begin= (yyvsp[-2].simple_string); + } +#line 36502 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1033: /* alter: ALTER definer_opt remember_name EVENT_SYM sp_name $@102 ev_alter_on_schedule_completion opt_ev_rename_to opt_ev_status opt_ev_comment opt_ev_sql_stmt */ +#line 7160 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyvsp[-4].num) || (yyvsp[-3].num) || (yyvsp[-2].num) || (yyvsp[-1].num) || (yyvsp[0].num)))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + /* + sql_command is set here because some rules in ev_sql_stmt + can overwrite it + */ + Lex->sql_command= SQLCOM_ALTER_EVENT; + Lex->stmt_definition_end= (char*)YYLIP->get_cpp_ptr(); + + Lex->pop_select(); //main select + } +#line 36522 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1034: /* $@103: %empty */ +#line 7176 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_ALTER_SERVER; + lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 36532 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1035: /* alter: ALTER SERVER_SYM ident_or_text $@103 OPTIONS_SYM '(' server_options_list ')' */ +#line 7180 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 36538 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1036: /* alter: ALTER USER_SYM opt_if_exists clear_privileges grant_list opt_require_clause opt_resource_options opt_account_locking_and_opt_password_expiration */ +#line 7184 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.set((yyvsp[-5].object_ddl_options)); + Lex->sql_command= SQLCOM_ALTER_USER; + } +#line 36547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1037: /* $@104: %empty */ +#line 7189 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_ALTER_SEQUENCE; + DBUG_ASSERT(!lex->m_sql_cmd); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 36559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1038: /* $@105: %empty */ +#line 7197 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!(lex->create_info.seq_create_info= new (thd->mem_root) + sequence_definition()) || + !lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_SEQUENCE, + TL_WRITE, MDL_EXCLUSIVE)) + MYSQL_YYABORT; + } +#line 36573 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1039: /* $@106: %empty */ +#line 7207 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Create a generic ALTER SEQUENCE statment. */ + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_sequence((yyvsp[-4].object_ddl_options)); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36584 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1040: /* alter: ALTER SEQUENCE_SYM opt_if_exists $@104 table_ident $@105 sequence_defs $@106 stmt_end */ +#line 7212 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36590 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1041: /* account_locking_option: LOCK_SYM */ +#line 7217 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.account_locked= ACCOUNTLOCK_LOCKED; + } +#line 36598 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1042: /* account_locking_option: UNLOCK_SYM */ +#line 7221 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.account_locked= ACCOUNTLOCK_UNLOCKED; + } +#line 36606 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1043: /* opt_password_expire_option: %empty */ +#line 7228 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_NOW; + } +#line 36614 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1044: /* opt_password_expire_option: NEVER_SYM */ +#line 7232 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_NEVER; + } +#line 36622 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1045: /* opt_password_expire_option: DEFAULT */ +#line 7236 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_DEFAULT; + } +#line 36630 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1046: /* opt_password_expire_option: INTERVAL_SYM NUM DAY_SYM */ +#line 7240 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_INTERVAL; + if (!(Lex->account_options.num_expiration_days= atoi((yyvsp[-1].lex_str).str))) + my_yyabort_error((ER_WRONG_VALUE, MYF(0), "DAY", (yyvsp[-1].lex_str).str)); + } +#line 36640 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1052: /* ev_alter_on_schedule_completion: %empty */ +#line 7256 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 36646 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1053: /* ev_alter_on_schedule_completion: ON SCHEDULE_SYM ev_schedule_time */ +#line 7257 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 36652 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1054: /* ev_alter_on_schedule_completion: ev_on_completion */ +#line 7258 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 36658 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1055: /* ev_alter_on_schedule_completion: ON SCHEDULE_SYM ev_schedule_time ev_on_completion */ +#line 7259 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 36664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1056: /* opt_ev_rename_to: %empty */ +#line 7263 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 36670 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1057: /* opt_ev_rename_to: RENAME TO_SYM sp_name */ +#line 7265 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Use lex's spname to hold the new name. + The original name is in the Event_parse_data object + */ + Lex->spname= (yyvsp[0].spname); + (yyval.num)= 1; + } +#line 36683 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1058: /* opt_ev_sql_stmt: %empty */ +#line 7276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 36689 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1059: /* opt_ev_sql_stmt: DO_SYM ev_sql_stmt */ +#line 7277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 36695 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1060: /* ident_or_empty: %empty */ +#line 7282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys)= Lex_ident_sys(); } +#line 36701 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1063: /* alter_commands: DISCARD TABLESPACE */ +#line 7289 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_discard_import_tablespace( + Sql_cmd_discard_import_tablespace::DISCARD_TABLESPACE); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36713 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1064: /* alter_commands: IMPORT TABLESPACE */ +#line 7297 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_discard_import_tablespace( + Sql_cmd_discard_import_tablespace::IMPORT_TABLESPACE); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36725 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1070: /* alter_commands: DROP PARTITION_SYM opt_if_exists alt_part_name_list */ +#line 7319 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_DROP; + DBUG_ASSERT(!Lex->if_exists()); + Lex->create_info.add((yyvsp[-1].object_ddl_options)); + } +#line 36735 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1071: /* alter_commands: REBUILD_SYM PARTITION_SYM opt_no_write_to_binlog all_or_alt_part_name_list */ +#line 7326 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->alter_info.partition_flags|= ALTER_PARTITION_REBUILD; + lex->no_write_to_binlog= (yyvsp[-1].num); + } +#line 36745 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1072: /* $@107: %empty */ +#line 7333 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_optimize_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1074: /* alter_commands: ANALYZE_SYM PARTITION_SYM opt_no_write_to_binlog all_or_alt_part_name_list */ +#line 7346 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_analyze_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36775 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1075: /* $@108: %empty */ +#line 7357 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_check_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36789 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1077: /* $@109: %empty */ +#line 7369 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_repair_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36804 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1079: /* alter_commands: COALESCE PARTITION_SYM opt_no_write_to_binlog real_ulong_num */ +#line 7381 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->alter_info.partition_flags|= ALTER_PARTITION_COALESCE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->alter_info.num_parts= (yyvsp[0].ulong_num); + } +#line 36815 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1080: /* alter_commands: TRUNCATE_SYM PARTITION_SYM all_or_alt_part_name_list */ +#line 7388 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_truncate_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1082: /* alter_commands: EXCHANGE_SYM PARTITION_SYM alt_part_name_item WITH TABLE_SYM table_ident have_partitioning */ +#line 7400 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_table_exchange_partition((yyvsp[-1].table))) + MYSQL_YYABORT; + } +#line 36838 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1083: /* alter_commands: CONVERT_SYM PARTITION_SYM alt_part_name_item TO_SYM TABLE_SYM table_ident have_partitioning */ +#line 7406 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (Lex->stmt_alter_table((yyvsp[-1].table))) + MYSQL_YYABORT; + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + lex->alter_info.partition_flags|= ALTER_PARTITION_CONVERT_OUT; + } +#line 36852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1084: /* $@110: %empty */ +#line 7416 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), nullptr, 0, + TL_READ_NO_INSERT, + MDL_SHARED_NO_WRITE)) + MYSQL_YYABORT; + + /* + This will appear as (new_db, new_name) in alter_ctx. + new_db will be IX-locked and new_name X-locked. + */ + lex->first_select_lex()->db= (yyvsp[0].table)->db; + lex->name= (yyvsp[0].table)->table; + if (lex->first_select_lex()->db.str == NULL && + lex->copy_db_to(&lex->first_select_lex()->db)) + MYSQL_YYABORT; + + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->part_info->num_parts= 1; + /* + OR-ed with ALTER_PARTITION_ADD because too many checks of + ALTER_PARTITION_ADD required. + */ + lex->alter_info.partition_flags|= ALTER_PARTITION_ADD | + ALTER_PARTITION_CONVERT_IN; + } +#line 36886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1085: /* alter_commands: CONVERT_SYM TABLE_SYM table_ident $@110 TO_SYM PARTITION_SYM part_definition */ +#line 7446 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36897 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1086: /* remove_partitioning: REMOVE_SYM PARTITIONING_SYM */ +#line 7456 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_REMOVE; + } +#line 36905 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1087: /* all_or_alt_part_name_list: ALL */ +#line 7463 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_ALL; + } +#line 36913 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1089: /* $@111: %empty */ +#line 7472 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->alter_info.partition_flags|= ALTER_PARTITION_ADD; + DBUG_ASSERT(!Lex->create_info.if_not_exists()); + lex->create_info.set((yyvsp[-1].object_ddl_options)); + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 36929 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1090: /* add_partition_rule: ADD PARTITION_SYM opt_if_not_exists opt_no_write_to_binlog $@111 add_part_extra */ +#line 7484 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36935 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1092: /* add_part_extra: '(' part_def_list ')' */ +#line 7490 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info->num_parts= lex->part_info->partitions.elements; + } +#line 36944 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1093: /* add_part_extra: PARTITIONS_SYM real_ulong_num */ +#line 7495 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->part_info->num_parts= (yyvsp[0].ulong_num); + } +#line 36952 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1094: /* $@112: %empty */ +#line 7502 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 36965 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1096: /* reorg_parts_rule: %empty */ +#line 7515 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_TABLE_REORG; + } +#line 36973 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1097: /* $@113: %empty */ +#line 7519 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_REORGANIZE; + } +#line 36981 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1098: /* reorg_parts_rule: alt_part_name_list $@113 INTO '(' part_def_list ')' */ +#line 7523 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->num_parts= part_info->partitions.elements; + } +#line 36990 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1099: /* alt_part_name_list: alt_part_name_item */ +#line 7530 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36996 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1100: /* alt_part_name_list: alt_part_name_list ',' alt_part_name_item */ +#line 7531 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37002 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1101: /* alt_part_name_item: ident */ +#line 7536 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.partition_names.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 37012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1105: /* alter_list_item: add_column column_def opt_place */ +#line 7558 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->create_last_non_select_table= lex->last_table(); + lex->alter_info.flags|= ALTER_PARSER_ADD_COLUMN; + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37023 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1106: /* alter_list_item: ADD key_def */ +#line 7565 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + Lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 37032 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1107: /* alter_list_item: ADD period_for_system_time */ +#line 7570 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_PERIOD; + } +#line 37040 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1108: /* alter_list_item: ADD PERIOD_SYM opt_if_not_exists_table_element period_for_application_time */ +#line 7575 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_period_info &period= Lex->create_info.period_info; + period.create_if_not_exists= Lex->check_exists; + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + } +#line 37050 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1109: /* alter_list_item: add_column '(' create_field_list ')' */ +#line 7581 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_PARSER_ADD_COLUMN; + if (!lex->alter_info.key_list.is_empty()) + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 37061 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1110: /* alter_list_item: ADD constraint_def */ +#line 7588 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + } +#line 37069 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1111: /* alter_list_item: ADD CONSTRAINT IF_SYM not EXISTS field_ident check_constraint */ +#line 7592 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + Lex->add_constraint((yyvsp[-1].lex_str), (yyvsp[0].virtual_column), TRUE); + } +#line 37078 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1112: /* alter_list_item: CHANGE opt_column opt_if_exists_table_element field_ident field_spec opt_place */ +#line 7598 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_CHANGE_COLUMN | ALTER_RENAME_COLUMN; + Lex->create_last_non_select_table= Lex->last_table(); + (yyvsp[-1].create_field)->change= (yyvsp[-2].lex_str); + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37089 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1113: /* alter_list_item: MODIFY_SYM opt_column opt_if_exists_table_element field_spec opt_place */ +#line 7606 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_CHANGE_COLUMN; + Lex->create_last_non_select_table= Lex->last_table(); + (yyvsp[-1].create_field)->change= (yyvsp[-1].create_field)->field_name; + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37100 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1114: /* alter_list_item: DROP opt_column opt_if_exists_table_element field_ident opt_restrict */ +#line 7613 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::COLUMN, (yyvsp[-1].lex_str).str, (yyvsp[-2].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_PARSER_DROP_COLUMN; + } +#line 37114 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1115: /* alter_list_item: DROP CONSTRAINT opt_if_exists_table_element field_ident */ +#line 7623 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::CHECK_CONSTRAINT, + (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_CHECK_CONSTRAINT; + } +#line 37129 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1116: /* alter_list_item: DROP FOREIGN KEY_SYM opt_if_exists_table_element field_ident */ +#line 7634 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::FOREIGN_KEY, (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_FOREIGN_KEY; + } +#line 37143 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1117: /* alter_list_item: DROP opt_constraint_no_id PRIMARY_SYM KEY_SYM */ +#line 7644 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, primary_key_name.str, + FALSE)); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_INDEX; + } +#line 37158 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1118: /* alter_list_item: DROP key_or_index opt_if_exists_table_element field_ident */ +#line 7655 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_INDEX; + } +#line 37172 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1119: /* alter_list_item: DISABLE_SYM KEYS */ +#line 7665 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.keys_onoff= Alter_info::DISABLE; + lex->alter_info.flags|= ALTER_KEYS_ONOFF; + } +#line 37182 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1120: /* alter_list_item: ENABLE_SYM KEYS */ +#line 7671 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.keys_onoff= Alter_info::ENABLE; + lex->alter_info.flags|= ALTER_KEYS_ONOFF; + } +#line 37192 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1121: /* alter_list_item: ALTER opt_column opt_if_exists_table_element field_ident SET DEFAULT column_default_expr */ +#line 7677 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (check_expression((yyvsp[0].virtual_column), &(yyvsp[-3].lex_str), VCOL_DEFAULT)) + MYSQL_YYABORT; + if (unlikely(Lex->add_alter_list((yyvsp[-3].lex_str), (yyvsp[0].virtual_column), (yyvsp[-4].num)))) + MYSQL_YYABORT; + } +#line 37203 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1122: /* alter_list_item: ALTER key_or_index opt_if_exists_table_element ident ignorability */ +#line 7684 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + Alter_index_ignorability *ac= new (thd->mem_root) + Alter_index_ignorability((yyvsp[-1].ident_sys).str, (yyvsp[0].num), (yyvsp[-2].num)); + if (ac == NULL) + MYSQL_YYABORT; + lex->alter_info.alter_index_ignorability_list.push_back(ac); + lex->alter_info.flags|= ALTER_INDEX_IGNORABILITY; + } +#line 37217 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1123: /* alter_list_item: ALTER opt_column opt_if_exists_table_element field_ident DROP DEFAULT */ +#line 7694 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_alter_list((yyvsp[-2].lex_str), (Virtual_column_info*) 0, (yyvsp[-3].num)))) + MYSQL_YYABORT; + } +#line 37226 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1124: /* alter_list_item: RENAME opt_to table_ident */ +#line 7699 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_table((yyvsp[0].table))) + MYSQL_YYABORT; + Lex->alter_info.flags|= ALTER_RENAME; + } +#line 37236 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1125: /* alter_list_item: RENAME COLUMN_SYM opt_if_exists_table_element ident TO_SYM ident */ +#line 7705 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_alter_list((yyvsp[-2].ident_sys), (yyvsp[0].ident_sys), (yyvsp[-3].num)))) + MYSQL_YYABORT; + } +#line 37245 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1126: /* alter_list_item: RENAME key_or_index opt_if_exists_table_element field_ident TO_SYM field_ident */ +#line 7710 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_rename_key *ak= new (thd->mem_root) + Alter_rename_key((yyvsp[-2].lex_str), (yyvsp[0].lex_str), (yyvsp[-3].num)); + if (ak == NULL) + MYSQL_YYABORT; + lex->alter_info.alter_rename_key_list.push_back(ak); + lex->alter_info.flags|= ALTER_RENAME_INDEX; + } +#line 37259 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1127: /* alter_list_item: CONVERT_SYM TO_SYM charset charset_name_or_default */ +#line 7720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_alter_list_item_convert_to_charset((yyvsp[0].charset))) + MYSQL_YYABORT; + } +#line 37268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1128: /* alter_list_item: CONVERT_SYM TO_SYM charset charset_name_or_default COLLATE_SYM collation_name_or_default */ +#line 7726 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_alter_list_item_convert_to_charset((yyvsp[-2].charset), (yyvsp[0].Lex_extended_collation))) + MYSQL_YYABORT; + } +#line 37277 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1129: /* alter_list_item: create_table_options_space_separated */ +#line 7731 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_OPTIONS; + } +#line 37286 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1130: /* alter_list_item: FORCE_SYM */ +#line 7736 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_RECREATE; + } +#line 37294 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1131: /* alter_list_item: alter_order_clause */ +#line 7740 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_ORDER; + } +#line 37303 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1134: /* alter_list_item: ADD SYSTEM VERSIONING_SYM */ +#line 7747 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_SYSTEM_VERSIONING; + Lex->create_info.options|= HA_VERSIONED_TABLE; + } +#line 37312 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1135: /* alter_list_item: DROP SYSTEM VERSIONING_SYM */ +#line 7752 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_DROP_SYSTEM_VERSIONING; + Lex->create_info.options&= ~HA_VERSIONED_TABLE; + } +#line 37321 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1136: /* alter_list_item: DROP PERIOD_SYM FOR_SYSTEM_TIME_SYM */ +#line 7757 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_DROP_PERIOD; + } +#line 37329 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1137: /* alter_list_item: DROP PERIOD_SYM opt_if_exists_table_element FOR_SYM ident */ +#line 7761 "/home/buildbot/git/sql/sql_yacc.yy" + { + Alter_drop *ad= new Alter_drop(Alter_drop::PERIOD, (yyvsp[0].ident_sys).str, (yyvsp[-2].num)); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + Lex->alter_info.drop_list.push_back(ad, thd->mem_root); + Lex->alter_info.flags|= ALTER_DROP_CHECK_CONSTRAINT; + } +#line 37341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1143: /* alter_algorithm_option: ALGORITHM_SYM opt_equal DEFAULT */ +#line 7780 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.set_requested_algorithm( + Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT); + } +#line 37350 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1144: /* alter_algorithm_option: ALGORITHM_SYM opt_equal ident */ +#line 7785 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.set_requested_algorithm(&(yyvsp[0].ident_sys)))) + my_yyabort_error((ER_UNKNOWN_ALTER_ALGORITHM, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 37359 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1145: /* alter_lock_option: LOCK_SYM opt_equal DEFAULT */ +#line 7793 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.requested_lock= + Alter_info::ALTER_TABLE_LOCK_DEFAULT; + } +#line 37368 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1146: /* alter_lock_option: LOCK_SYM opt_equal ident */ +#line 7798 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.set_requested_lock(&(yyvsp[0].ident_sys)))) + my_yyabort_error((ER_UNKNOWN_ALTER_LOCK, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 37377 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1147: /* opt_column: %empty */ +#line 7805 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37383 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1148: /* opt_column: COLUMN_SYM */ +#line 7806 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37389 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1149: /* opt_ignore: %empty */ +#line 7810 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 0;} +#line 37395 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1150: /* opt_ignore: IGNORE_SYM */ +#line 7811 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1;} +#line 37401 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1151: /* $@114: %empty */ +#line 7815 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 0;} +#line 37407 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1157: /* alter_option: IGNORE_SYM */ +#line 7829 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1;} +#line 37413 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1158: /* alter_option: ONLINE_SYM */ +#line 7831 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.requested_lock= + Alter_info::ALTER_TABLE_LOCK_NONE; + } +#line 37422 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1159: /* opt_restrict: %empty */ +#line 7838 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_DEFAULT; } +#line 37428 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1160: /* opt_restrict: RESTRICT */ +#line 7839 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_RESTRICT; } +#line 37434 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1161: /* opt_restrict: CASCADE */ +#line 7840 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_CASCADE; } +#line 37440 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1162: /* opt_place: %empty */ +#line 7844 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 37446 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1163: /* opt_place: AFTER_SYM ident */ +#line 7846 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str)= (yyvsp[0].ident_sys); + Lex->alter_info.flags |= ALTER_COLUMN_ORDER; + } +#line 37455 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1164: /* opt_place: FIRST_SYM */ +#line 7851 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str).str= first_keyword; + (yyval.lex_str).length= 5; /* Length of "first" */ + Lex->alter_info.flags |= ALTER_COLUMN_ORDER; + } +#line 37465 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1165: /* opt_to: %empty */ +#line 7859 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37471 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1166: /* opt_to: TO_SYM */ +#line 7860 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37477 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1167: /* opt_to: '=' */ +#line 7861 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37483 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1168: /* opt_to: AS */ +#line 7862 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1169: /* $@115: %empty */ +#line 7867 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_START; + lex->type = 0; + /* If you change this code don't forget to update SLAVE START too */ + } +#line 37500 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1170: /* slave: START_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel $@115 slave_until */ +#line 7874 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37506 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1171: /* $@116: %empty */ +#line 7876 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_ALL_START; + lex->type = 0; + /* If you change this code don't forget to update STOP SLAVE too */ + } +#line 37517 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1172: /* slave: START_SYM ALL SLAVES slave_thread_opts $@116 */ +#line 7882 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1173: /* slave: STOP_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel */ +#line 7884 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_STOP; + lex->type = 0; + /* If you change this code don't forget to update SLAVE STOP too */ + } +#line 37534 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1174: /* slave: STOP_SYM ALL SLAVES slave_thread_opts */ +#line 7891 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_ALL_STOP; + lex->type = 0; + /* If you change this code don't forget to update SLAVE STOP too */ + } +#line 37545 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1175: /* start: START_SYM TRANSACTION_SYM opt_start_transaction_option_list */ +#line 7901 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_BEGIN; + /* READ ONLY and READ WRITE are mutually exclusive. */ + if (unlikely(((yyvsp[0].num) & MYSQL_START_TRANS_OPT_READ_WRITE) && + ((yyvsp[0].num) & MYSQL_START_TRANS_OPT_READ_ONLY))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + lex->start_transaction_opt= (yyvsp[0].num); + } +#line 37562 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1176: /* opt_start_transaction_option_list: %empty */ +#line 7917 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 0; + } +#line 37570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1177: /* opt_start_transaction_option_list: start_transaction_option_list */ +#line 7921 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[0].num); + } +#line 37578 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1178: /* start_transaction_option_list: start_transaction_option */ +#line 7928 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[0].num); + } +#line 37586 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1179: /* start_transaction_option_list: start_transaction_option_list ',' start_transaction_option */ +#line 7932 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[-2].num) | (yyvsp[0].num); + } +#line 37594 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1180: /* start_transaction_option: WITH CONSISTENT_SYM SNAPSHOT_SYM */ +#line 7939 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT; + } +#line 37602 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1181: /* start_transaction_option: READ_SYM ONLY_SYM */ +#line 7943 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_READ_ONLY; + } +#line 37610 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1182: /* start_transaction_option: READ_SYM WRITE_SYM */ +#line 7947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_READ_WRITE; + } +#line 37618 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1183: /* $@117: %empty */ +#line 7953 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt= 0; } +#line 37624 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1184: /* slave_thread_opts: $@117 slave_thread_opt_list */ +#line 7955 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37630 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1187: /* slave_thread_opt: %empty */ +#line 7964 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37636 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1188: /* slave_thread_opt: SQL_THREAD */ +#line 7965 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt|=SLAVE_SQL; } +#line 37642 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1189: /* slave_thread_opt: RELAY_THREAD */ +#line 7966 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt|=SLAVE_IO; } +#line 37648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1190: /* slave_until: %empty */ +#line 7970 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37654 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1191: /* slave_until: UNTIL_SYM slave_until_opts */ +#line 7972 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(((lex->mi.log_file_name || lex->mi.pos) && + (lex->mi.relay_log_name || lex->mi.relay_log_pos)) || + !((lex->mi.log_file_name && lex->mi.pos) || + (lex->mi.relay_log_name && lex->mi.relay_log_pos)))) + my_yyabort_error((ER_BAD_SLAVE_UNTIL_COND, MYF(0))); + } +#line 37667 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1192: /* slave_until: UNTIL_SYM MASTER_GTID_POS_SYM '=' TEXT_STRING_sys */ +#line 7981 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.gtid_pos_str = (yyvsp[0].lex_str); + } +#line 37675 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1195: /* $@118: %empty */ +#line 7993 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_CHECKSUM; + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 37686 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1196: /* checksum: CHECKSUM_SYM table_or_tables $@118 table_list opt_checksum_type */ +#line 8000 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37692 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1197: /* opt_checksum_type: %empty */ +#line 8004 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= 0; } +#line 37698 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1198: /* opt_checksum_type: QUICK */ +#line 8005 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= T_QUICK; } +#line 37704 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1199: /* opt_checksum_type: EXTENDED_SYM */ +#line 8006 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= T_EXTEND; } +#line 37710 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1201: /* $@119: %empty */ +#line 8012 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->table_type= TABLE_TYPE_VIEW; } +#line 37716 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1203: /* $@120: %empty */ +#line 8018 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_REPAIR; + lex->no_write_to_binlog= (yyvsp[0].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 37730 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1204: /* repair: REPAIR opt_no_write_to_binlog $@120 repair_table_or_view */ +#line 8028 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_repair_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37742 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1205: /* opt_mi_repair_type: %empty */ +#line 8038 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags = T_MEDIUM; } +#line 37748 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1206: /* opt_mi_repair_type: mi_repair_types */ +#line 8039 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37754 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1207: /* mi_repair_types: mi_repair_type */ +#line 8043 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1208: /* mi_repair_types: mi_repair_type mi_repair_types */ +#line 8044 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37766 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1209: /* mi_repair_type: QUICK */ +#line 8048 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_QUICK; } +#line 37772 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1210: /* mi_repair_type: EXTENDED_SYM */ +#line 8049 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_EXTEND; } +#line 37778 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1211: /* mi_repair_type: USE_FRM */ +#line 8050 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_USEFRM; } +#line 37784 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1212: /* opt_view_repair_type: %empty */ +#line 8054 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 37790 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1213: /* opt_view_repair_type: FOR_SYM UPGRADE_SYM */ +#line 8055 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 37796 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1214: /* opt_view_repair_type: FROM MYSQL_SYM */ +#line 8056 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FROM_MYSQL; } +#line 37802 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1215: /* $@121: %empty */ +#line 8061 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_ANALYZE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 37816 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1216: /* analyze: ANALYZE_SYM opt_no_write_to_binlog table_or_tables $@121 analyze_table_list */ +#line 8071 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_analyze_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37828 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1220: /* opt_persistent_stat_clause: %empty */ +#line 8091 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37834 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1221: /* opt_persistent_stat_clause: PERSISTENT_SYM FOR_SYM persistent_stat_spec */ +#line 8093 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->with_persistent_for_clause= TRUE; + } +#line 37842 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1222: /* persistent_stat_spec: ALL */ +#line 8100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37848 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1223: /* persistent_stat_spec: COLUMNS persistent_column_stat_spec INDEXES persistent_index_stat_spec */ +#line 8102 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37854 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1224: /* persistent_column_stat_spec: ALL */ +#line 8106 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37860 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1225: /* $@122: %empty */ +#line 8108 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + lex->column_list= new (thd->mem_root) List; + if (unlikely(lex->column_list == NULL)) + MYSQL_YYABORT; + } +#line 37871 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1226: /* persistent_column_stat_spec: '(' $@122 table_column_list ')' */ +#line 8116 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 37877 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1227: /* persistent_index_stat_spec: ALL */ +#line 8120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37883 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1228: /* $@123: %empty */ +#line 8122 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + lex->index_list= new (thd->mem_root) List; + if (unlikely(lex->index_list == NULL)) + MYSQL_YYABORT; + } +#line 37894 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1229: /* persistent_index_stat_spec: '(' $@123 table_index_list ')' */ +#line 8130 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 37900 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1230: /* table_column_list: %empty */ +#line 8135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37906 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1231: /* table_column_list: ident */ +#line 8137 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->column_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), thd->mem_root); + } +#line 37915 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1232: /* table_column_list: table_column_list ',' ident */ +#line 8142 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->column_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), thd->mem_root); + } +#line 37924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1233: /* table_index_list: %empty */ +#line 8150 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37930 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1236: /* table_index_name: ident */ +#line 8157 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->index_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), + thd->mem_root); + } +#line 37940 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1237: /* table_index_name: PRIMARY_SYM */ +#line 8164 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_STRING str= {(char*) "PRIMARY", 7}; + Lex->index_list->push_back((LEX_STRING*) + thd->memdup(&str, sizeof(LEX_STRING)), + thd->mem_root); + } +#line 37951 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1238: /* binlog_base64_event: BINLOG_SYM TEXT_STRING_sys */ +#line 8174 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; + Lex->comment= (yyvsp[0].lex_str); + Lex->ident.str= NULL; + Lex->ident.length= 0; + } +#line 37962 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1239: /* binlog_base64_event: BINLOG_SYM '@' ident_or_text ',' '@' ident_or_text */ +#line 8182 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; + Lex->comment= (yyvsp[-3].lex_str); + Lex->ident= (yyvsp[0].lex_str); + } +#line 37972 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1241: /* $@124: %empty */ +#line 8192 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->table_type= TABLE_TYPE_VIEW; } +#line 37978 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1243: /* $@125: %empty */ +#line 8197 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->sql_command = SQLCOM_CHECK; + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 37992 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1244: /* check: CHECK_SYM $@125 check_view_or_table */ +#line 8207 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "CHECK")); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_check_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1245: /* opt_mi_check_type: %empty */ +#line 8219 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags = T_MEDIUM; } +#line 38012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1246: /* opt_mi_check_type: mi_check_types */ +#line 8220 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1247: /* mi_check_types: mi_check_type */ +#line 8224 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38024 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1248: /* mi_check_types: mi_check_type mi_check_types */ +#line 8225 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38030 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1249: /* mi_check_type: QUICK */ +#line 8229 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_QUICK; } +#line 38036 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1250: /* mi_check_type: FAST_SYM */ +#line 8230 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_FAST; } +#line 38042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1251: /* mi_check_type: MEDIUM_SYM */ +#line 8231 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_MEDIUM; } +#line 38048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1252: /* mi_check_type: EXTENDED_SYM */ +#line 8232 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_EXTEND; } +#line 38054 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1253: /* mi_check_type: CHANGED */ +#line 8233 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; } +#line 38060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1254: /* mi_check_type: FOR_SYM UPGRADE_SYM */ +#line 8234 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 38066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1255: /* opt_view_check_type: %empty */ +#line 8238 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1256: /* opt_view_check_type: FOR_SYM UPGRADE_SYM */ +#line 8239 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 38078 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1257: /* $@126: %empty */ +#line 8244 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_OPTIMIZE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38092 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1258: /* optimize: OPTIMIZE opt_no_write_to_binlog table_or_tables $@126 table_list opt_lock_wait_timeout */ +#line 8254 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_optimize_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38104 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1259: /* opt_no_write_to_binlog: %empty */ +#line 8264 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 38110 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1260: /* opt_no_write_to_binlog: NO_WRITE_TO_BINLOG */ +#line 8265 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 38116 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1261: /* opt_no_write_to_binlog: LOCAL_SYM */ +#line 8266 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 38122 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1262: /* $@127: %empty */ +#line 8271 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_RENAME_TABLE; + Lex->create_info.set((yyvsp[0].object_ddl_options)); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 38133 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1263: /* rename: RENAME table_or_tables opt_if_exists $@127 table_to_table_list */ +#line 8278 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 38141 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1264: /* rename: RENAME USER_SYM clear_privileges rename_list */ +#line 8282 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_RENAME_USER; + } +#line 38149 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1265: /* rename_list: user TO_SYM user */ +#line 8289 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[-2].lex_user), thd->mem_root) || + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 38159 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1266: /* rename_list: rename_list ',' user TO_SYM user */ +#line 8295 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[-2].lex_user), thd->mem_root) || + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 38169 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1269: /* table_to_table: table_ident opt_lock_wait_timeout TO_SYM table_ident */ +#line 8309 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *sl= lex->current_select; + if (unlikely(!sl->add_table_to_list(thd, (yyvsp[-3].table),NULL, + TL_OPTION_UPDATING, + TL_IGNORE, MDL_EXCLUSIVE)) || + unlikely(!sl->add_table_to_list(thd, (yyvsp[0].table), NULL, + TL_OPTION_UPDATING, + TL_IGNORE, MDL_EXCLUSIVE))) + MYSQL_YYABORT; + } +#line 38185 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1270: /* $@128: %empty */ +#line 8324 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.reset(); + } +#line 38193 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1271: /* keycache: CACHE_SYM INDEX_SYM $@128 keycache_list_or_parts IN_SYM key_cache_name */ +#line 8328 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ASSIGN_TO_KEYCACHE; + lex->ident= (yyvsp[0].lex_str); + } +#line 38203 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1276: /* assign_to_keycache: table_ident cache_keys_spec */ +#line 8347 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, 0, TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38215 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1277: /* assign_to_keycache_parts: table_ident adm_partition cache_keys_spec */ +#line 8358 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-2].table), NULL, 0, TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38227 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1278: /* key_cache_name: ident */ +#line 8368 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 38233 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1279: /* key_cache_name: DEFAULT */ +#line 8369 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str) = default_key_cache_base; } +#line 38239 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1280: /* $@129: %empty */ +#line 8374 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_PRELOAD_KEYS; + lex->alter_info.reset(); + if (lex->main_select_push()) + MYSQL_YYABORT; + } +#line 38251 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1281: /* preload: LOAD INDEX_SYM INTO CACHE_SYM $@129 preload_list_or_parts */ +#line 8382 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 38259 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1286: /* preload_keys: table_ident cache_keys_spec opt_ignore_leaves */ +#line 8399 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-2].table), NULL, (yyvsp[0].num), TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38271 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1287: /* preload_keys_parts: table_ident adm_partition cache_keys_spec opt_ignore_leaves */ +#line 8410 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-3].table), NULL, (yyvsp[0].num), TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38283 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1288: /* $@130: %empty */ +#line 8421 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_ADMIN; + } +#line 38291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1290: /* $@131: %empty */ +#line 8428 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->first_select_lex()->alloc_index_hints(thd); + Select->set_index_hint_type(INDEX_HINT_USE, + INDEX_HINT_MASK_ALL); + } +#line 38301 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1292: /* cache_key_list_or_empty: %empty */ +#line 8437 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38307 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1294: /* opt_ignore_leaves: %empty */ +#line 8443 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 38313 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1295: /* opt_ignore_leaves: IGNORE_SYM LEAVES */ +#line 8444 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_OPTION_IGNORE_LEAVES; } +#line 38319 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1296: /* $@132: %empty */ +#line 8454 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex_unit)->fake_select_lex ? + (yyvsp[0].select_lex_unit)->fake_select_lex : + (yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 38330 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1297: /* select: query_expression_no_with_clause $@132 opt_procedure_or_into */ +#line 8461 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyvsp[-2].select_lex_unit)->set_with_clause(NULL); + if (Lex->select_finalize((yyvsp[-2].select_lex_unit), (yyvsp[0].select_lock))) + MYSQL_YYABORT; + } +#line 38341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1298: /* $@133: %empty */ +#line 8468 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex_unit)->fake_select_lex ? + (yyvsp[0].select_lex_unit)->fake_select_lex : + (yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 38352 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1299: /* select: with_clause query_expression_no_with_clause $@133 opt_procedure_or_into */ +#line 8475 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyvsp[-2].select_lex_unit)->set_with_clause((yyvsp[-3].with_clause)); + (yyvsp[-3].with_clause)->attach_to((yyvsp[-2].select_lex_unit)->first_select()); + if (Lex->select_finalize((yyvsp[-2].select_lex_unit), (yyvsp[0].select_lock))) + MYSQL_YYABORT; + } +#line 38364 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1300: /* $@134: %empty */ +#line 8486 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex))) + MYSQL_YYABORT; + } +#line 38373 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1301: /* select_into: select_into_query_specification $@134 opt_order_limit_lock */ +#line 8491 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX_UNIT *unit; + if (!(unit = Lex->create_unit((yyvsp[-2].select_lex)))) + MYSQL_YYABORT; + if ((yyvsp[0].order_limit_lock)) + unit= Lex->add_tail_to_query_expression_body(unit, (yyvsp[0].order_limit_lock)); + if (Lex->select_finalize(unit)) + MYSQL_YYABORT; + } +#line 38387 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1302: /* $@135: %empty */ +#line 8502 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex))) + MYSQL_YYABORT; + } +#line 38396 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1303: /* select_into: with_clause select_into_query_specification $@135 opt_order_limit_lock */ +#line 8507 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX_UNIT *unit; + if (!(unit = Lex->create_unit((yyvsp[-2].select_lex)))) + MYSQL_YYABORT; + if ((yyvsp[0].order_limit_lock)) + unit= Lex->add_tail_to_query_expression_body(unit, (yyvsp[0].order_limit_lock)); + unit->set_with_clause((yyvsp[-3].with_clause)); + (yyvsp[-3].with_clause)->attach_to((yyvsp[-2].select_lex)); + if (Lex->select_finalize(unit)) + MYSQL_YYABORT; + } +#line 38412 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1304: /* simple_table: query_specification */ +#line 8521 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 38418 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1305: /* simple_table: table_value_constructor */ +#line 8522 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 38424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1306: /* $@136: %empty */ +#line 8527 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_TVC_start()) + MYSQL_YYABORT; + } +#line 38433 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1307: /* table_value_constructor: VALUES $@136 values_list */ +#line 8532 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex)= Lex->parsed_TVC_end())) + MYSQL_YYABORT; + } +#line 38442 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1308: /* $@137: %empty */ +#line 8540 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel; + LEX *lex= Lex; + if (!(sel= lex->alloc_select(TRUE)) || lex->push_select(sel)) + MYSQL_YYABORT; + sel->init_select(); + sel->braces= FALSE; + } +#line 38455 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1309: /* $@138: %empty */ +#line 8549 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= SELECT_LIST; + } +#line 38463 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1310: /* query_specification_start: SELECT_SYM $@137 select_options $@138 select_item_list */ +#line 8553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + } +#line 38471 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1311: /* query_specification: query_specification_start opt_from_clause opt_where_clause opt_group_clause opt_having_clause opt_window_clause */ +#line 8565 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lex)= Lex->pop_select(); + } +#line 38479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1312: /* select_into_query_specification: query_specification_start into opt_from_clause opt_where_clause opt_group_clause opt_having_clause opt_window_clause */ +#line 8578 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lex)= Lex->pop_select(); + } +#line 38487 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1313: /* query_expression: query_expression_no_with_clause */ +#line 8636 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].select_lex_unit)->set_with_clause(NULL); + (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); + } +#line 38496 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1314: /* query_expression: with_clause query_expression_no_with_clause */ +#line 8642 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].select_lex_unit)->set_with_clause((yyvsp[-1].with_clause)); + (yyvsp[-1].with_clause)->attach_to((yyvsp[0].select_lex_unit)->first_select()); + (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); + } +#line 38506 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1315: /* query_expression_no_with_clause: query_expression_body_ext */ +#line 8655 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); } +#line 38512 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1316: /* query_expression_no_with_clause: query_expression_body_ext_parens */ +#line 8656 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); } +#line 38518 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1317: /* $@139: %empty */ +#line 8671 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].select_lex_unit)->first_select()->next_select()) + { + if (Lex->parsed_multi_operand_query_expression_body((yyvsp[0].select_lex_unit))) + MYSQL_YYABORT; + } + } +#line 38530 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1318: /* query_expression_body_ext: query_expression_body $@139 opt_query_expression_tail */ +#line 8679 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].order_limit_lock)) + (yyval.select_lex_unit)= (yyvsp[-2].select_lex_unit); + else + (yyval.select_lex_unit)= Lex->add_tail_to_query_expression_body((yyvsp[-2].select_lex_unit), (yyvsp[0].order_limit_lock)); + } +#line 38541 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1319: /* $@140: %empty */ +#line 8686 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->push_select(!(yyvsp[0].select_lex_unit)->first_select()->next_select() ? + (yyvsp[0].select_lex_unit)->first_select() : (yyvsp[0].select_lex_unit)->fake_select_lex); + } +#line 38550 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1320: /* query_expression_body_ext: query_expression_body_ext_parens $@140 query_expression_tail */ +#line 8691 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_tail_to_query_expression_body_ext_parens((yyvsp[-2].select_lex_unit), (yyvsp[0].order_limit_lock)))) + MYSQL_YYABORT; + } +#line 38559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1321: /* query_expression_body_ext_parens: '(' query_expression_body_ext_parens ')' */ +#line 8699 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[-1].select_lex_unit); } +#line 38565 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1322: /* query_expression_body_ext_parens: '(' query_expression_body_ext ')' */ +#line 8701 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= (yyvsp[-1].select_lex_unit)->first_select()->next_select() ? + (yyvsp[-1].select_lex_unit)->fake_select_lex : (yyvsp[-1].select_lex_unit)->first_select(); + sel->braces= true; + (yyval.select_lex_unit)= (yyvsp[-1].select_lex_unit); + } +#line 38576 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1323: /* query_expression_body: query_simple */ +#line 8716 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->push_select((yyvsp[0].select_lex)); + if (!((yyval.select_lex_unit)= Lex->create_unit((yyvsp[0].select_lex)))) + MYSQL_YYABORT; + } +#line 38586 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1324: /* $@141: %empty */ +#line 8723 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[-1].select_lex_unit)->first_select()->next_select()) + { + Lex->pop_select(); + } + } +#line 38597 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1325: /* query_expression_body: query_expression_body unit_type_decl $@141 query_primary */ +#line 8730 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_primary_to_query_expression_body((yyvsp[-3].select_lex_unit), (yyvsp[0].select_lex), + (yyvsp[-2].unit_operation).unit_type, + (yyvsp[-2].unit_operation).distinct))) + MYSQL_YYABORT; + } +#line 38608 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1326: /* query_expression_body: query_expression_body_ext_parens unit_type_decl query_primary */ +#line 8739 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_primary_to_query_expression_body_ext_parens( + (yyvsp[-2].select_lex_unit), (yyvsp[0].select_lex), + (yyvsp[-1].unit_operation).unit_type, + (yyvsp[-1].unit_operation).distinct))) + MYSQL_YYABORT; + } +#line 38620 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1327: /* query_primary: query_simple */ +#line 8755 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 38626 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1328: /* query_primary: query_expression_body_ext_parens */ +#line 8757 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex_unit)->first_select(); } +#line 38632 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1329: /* query_simple: simple_table */ +#line 8766 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex);} +#line 38638 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1330: /* subselect: query_expression */ +#line 8771 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[0].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 38647 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1331: /* subquery: query_expression_body_ext_parens */ +#line 8812 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].select_lex_unit)->fake_select_lex) + (yyvsp[0].select_lex_unit)->first_select()->braces= false; + else + (yyvsp[0].select_lex_unit)->fake_select_lex->braces= false; + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[0].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 38660 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1332: /* subquery: '(' with_clause query_expression_no_with_clause ')' */ +#line 8821 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].select_lex_unit)->set_with_clause((yyvsp[-2].with_clause)); + (yyvsp[-2].with_clause)->attach_to((yyvsp[-1].select_lex_unit)->first_select()); + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[-1].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 38671 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1336: /* table_reference_list: join_table_list */ +#line 8840 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->context.table_list= + Select->context.first_name_resolution_table= + Select->table_list.first; + } +#line 38681 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1339: /* select_options: select_option_list */ +#line 8855 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((Select->options & SELECT_DISTINCT) && + (Select->options & SELECT_ALL))) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "ALL", "DISTINCT")); + } +#line 38691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1340: /* opt_history_unit: %empty */ +#line 8864 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TIMESTAMP; + } +#line 38699 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1341: /* opt_history_unit: TRANSACTION_SYM */ +#line 8868 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TRX_ID; + } +#line 38707 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1342: /* opt_history_unit: TIMESTAMP */ +#line 8872 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TIMESTAMP; + } +#line 38715 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1343: /* history_point: TIMESTAMP TEXT_STRING */ +#line 8879 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item; + if (!(item= type_handler_datetime.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true))) + MYSQL_YYABORT; + (yyval.vers_history_point)= Vers_history_point(VERS_TIMESTAMP, item); + } +#line 38728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1344: /* history_point: function_call_keyword_timestamp */ +#line 8888 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_history_point)= Vers_history_point(VERS_TIMESTAMP, (yyvsp[0].item)); + } +#line 38736 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1345: /* history_point: opt_history_unit bit_expr */ +#line 8892 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_history_point)= Vers_history_point((yyvsp[-1].vers_range_unit), (yyvsp[0].item)); + } +#line 38744 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1346: /* for_portion_of_time_clause: FOR_SYM PORTION_SYM OF_SYM remember_tok_start ident FROM bit_expr TO_SYM bit_expr */ +#line 8900 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(0 == strcasecmp((yyvsp[-4].ident_sys).str, "SYSTEM_TIME"))) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[-5].simple_string)); + MYSQL_YYABORT; + } + Lex->period_conditions.init(SYSTEM_TIME_FROM_TO, + Vers_history_point(VERS_TIMESTAMP, (yyvsp[-2].item)), + Vers_history_point(VERS_TIMESTAMP, (yyvsp[0].item)), + (yyvsp[-4].ident_sys)); + } +#line 38760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1347: /* opt_for_portion_of_time_clause: %empty */ +#line 8915 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= false; + } +#line 38768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1348: /* opt_for_portion_of_time_clause: for_portion_of_time_clause */ +#line 8919 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= true; + } +#line 38776 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1349: /* opt_for_system_time_clause: %empty */ +#line 8926 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= false; + } +#line 38784 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1350: /* opt_for_system_time_clause: FOR_SYSTEM_TIME_SYM system_time_expr */ +#line 8930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= true; + } +#line 38792 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1351: /* system_time_expr: AS OF_SYM history_point */ +#line 8937 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_AS_OF, (yyvsp[0].vers_history_point)); + } +#line 38800 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1352: /* system_time_expr: ALL */ +#line 8941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_ALL); + } +#line 38808 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1353: /* system_time_expr: FROM history_point TO_SYM history_point */ +#line 8945 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_FROM_TO, (yyvsp[-2].vers_history_point), (yyvsp[0].vers_history_point)); + } +#line 38816 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1354: /* system_time_expr: BETWEEN_SYM history_point AND_SYM history_point */ +#line 8949 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_BETWEEN, (yyvsp[-2].vers_history_point), (yyvsp[0].vers_history_point)); + } +#line 38824 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1358: /* select_option: SQL_NO_CACHE_SYM */ +#line 8962 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Allow this flag once per query. + */ + if (Select->options & OPTION_NO_QUERY_CACHE) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SQL_NO_CACHE")); + Select->options|= OPTION_NO_QUERY_CACHE; + } +#line 38837 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1359: /* select_option: SQL_CACHE_SYM */ +#line 8971 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Allow this flag once per query. + */ + if (Select->options & OPTION_TO_QUERY_CACHE) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SQL_CACHE")); + Select->options|= OPTION_TO_QUERY_CACHE; + } +#line 38850 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1360: /* select_lock_type: FOR_SYM UPDATE_SYM opt_lock_wait_timeout_new */ +#line 8984 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + (yyval.select_lock).defined_lock= TRUE; + (yyval.select_lock).update_lock= TRUE; + } +#line 38860 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1361: /* select_lock_type: LOCK_SYM IN_SYM SHARE_SYM MODE_SYM opt_lock_wait_timeout_new */ +#line 8990 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + (yyval.select_lock).defined_lock= TRUE; + (yyval.select_lock).update_lock= FALSE; + } +#line 38870 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1362: /* opt_select_lock_type: %empty */ +#line 9000 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 38878 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1363: /* opt_select_lock_type: select_lock_type */ +#line 9004 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 38886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1364: /* opt_lock_wait_timeout_new: %empty */ +#line 9011 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 38894 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1365: /* opt_lock_wait_timeout_new: WAIT_SYM ulong_num */ +#line 9015 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).defined_timeout= TRUE; + (yyval.select_lock).timeout= (yyvsp[0].ulong_num); + } +#line 38904 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1366: /* opt_lock_wait_timeout_new: NOWAIT_SYM */ +#line 9021 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).defined_timeout= TRUE; + (yyval.select_lock).timeout= 0; + } +#line 38914 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1367: /* opt_lock_wait_timeout_new: SKIP_SYM LOCKED_SYM */ +#line 9027 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).skip_locked= 1; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SKIP_LOCKED); + } +#line 38924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1370: /* select_item_list: '*' */ +#line 9038 "/home/buildbot/git/sql/sql_yacc.yy" + { + bool is_parsing_returning= + thd->lex->current_select->parsing_place == + IN_RETURNING; + SELECT_LEX *correct_select= is_parsing_returning ? + thd->lex->returning() : + thd->lex->current_select; + Item *item= new (thd->mem_root) + Item_field(thd, &correct_select->context, + star_clex_str); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + if (unlikely(add_item_to_list(thd, item))) + MYSQL_YYABORT; + correct_select->with_wild++; + } +#line 38945 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1371: /* select_item: remember_name select_sublist_qualified_asterisk remember_end */ +#line 9058 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_item_to_list(thd, (yyvsp[-1].item)))) + MYSQL_YYABORT; + } +#line 38954 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1372: /* select_item: remember_name expr remember_end select_alias */ +#line 9063 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-3].simple_string) < (yyvsp[-1].simple_string)); + + if (unlikely(add_item_to_list(thd, (yyvsp[-2].item)))) + MYSQL_YYABORT; + if ((yyvsp[0].lex_str).str) + { + if (unlikely(Lex->sql_command == SQLCOM_CREATE_VIEW && + check_column_name((yyvsp[0].lex_str).str))) + my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), (yyvsp[0].lex_str).str)); + (yyvsp[-2].item)->base_flags|= item_base_t::IS_EXPLICIT_NAME; + (yyvsp[-2].item)->set_name(thd, (yyvsp[0].lex_str)); + } + else if (!(yyvsp[-2].item)->name.str || (yyvsp[-2].item)->name.str == item_empty_name) + { + (yyvsp[-2].item)->set_name(thd, (yyvsp[-3].simple_string), (uint) ((yyvsp[-1].simple_string) - (yyvsp[-3].simple_string)), thd->charset()); + } + } +#line 38977 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1373: /* remember_tok_start: %empty */ +#line 9084 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_tok_start(); + } +#line 38985 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1374: /* remember_name: %empty */ +#line 9090 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_start(); + } +#line 38993 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1375: /* remember_end: %empty */ +#line 9096 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_end_rtrim(); + } +#line 39001 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1376: /* select_alias: %empty */ +#line 9102 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=null_clex_str;} +#line 39007 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1377: /* select_alias: AS ident */ +#line 9103 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys); } +#line 39013 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1378: /* select_alias: AS TEXT_STRING_sys */ +#line 9104 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 39019 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1379: /* select_alias: ident */ +#line 9105 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys); } +#line 39025 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1380: /* select_alias: TEXT_STRING_sys */ +#line 9106 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 39031 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1381: /* opt_default_time_precision: %empty */ +#line 9110 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= NOT_FIXED_DEC; } +#line 39037 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1382: /* opt_default_time_precision: '(' ')' */ +#line 9111 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= NOT_FIXED_DEC; } +#line 39043 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1383: /* opt_default_time_precision: '(' real_ulong_num ')' */ +#line 9112 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].ulong_num); } +#line 39049 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1384: /* opt_time_precision: %empty */ +#line 9116 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 39055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1385: /* opt_time_precision: '(' ')' */ +#line 9117 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 39061 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1386: /* opt_time_precision: '(' real_ulong_num ')' */ +#line 9118 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].ulong_num); } +#line 39067 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1387: /* optional_braces: %empty */ +#line 9122 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 39073 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1388: /* optional_braces: '(' ')' */ +#line 9123 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 39079 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1389: /* expr: expr or expr */ +#line 9129 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Design notes: + Do not use a manually maintained stack like thd->lex->xxx_list, + but use the internal bison stack ($$, $1 and $3) instead. + Using the bison stack is: + - more robust to changes in the grammar, + - guaranteed to be in sync with the parser state, + - better for performances (no memory allocation). + */ + Item_cond_or *item1; + Item_cond_or *item3; + if (is_cond_or((yyvsp[-2].item))) + { + item1= (Item_cond_or*) (yyvsp[-2].item); + if (is_cond_or((yyvsp[0].item))) + { + item3= (Item_cond_or*) (yyvsp[0].item); + /* + (X1 OR X2) OR (Y1 OR Y2) ==> OR (X1, X2, Y1, Y2) + */ + item3->add_at_head(item1->argument_list()); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* + (X1 OR X2) OR Y ==> OR (X1, X2, Y) + */ + item1->add((yyvsp[0].item), thd->mem_root); + (yyval.item) = (yyvsp[-2].item); + } + } + else if (is_cond_or((yyvsp[0].item))) + { + item3= (Item_cond_or*) (yyvsp[0].item); + /* + X OR (Y1 OR Y2) ==> OR (X, Y1, Y2) + */ + item3->add_at_head((yyvsp[-2].item), thd->mem_root); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* X OR Y */ + (yyval.item)= new (thd->mem_root) Item_cond_or(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } + } +#line 39134 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1390: /* expr: expr XOR expr */ +#line 9180 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* XOR is a proprietary extension */ + (yyval.item)= new (thd->mem_root) Item_func_xor(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39145 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1391: /* expr: expr and expr */ +#line 9187 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* See comments in rule expr: expr or expr */ + Item_cond_and *item1; + Item_cond_and *item3; + if (is_cond_and((yyvsp[-2].item))) + { + item1= (Item_cond_and*) (yyvsp[-2].item); + if (is_cond_and((yyvsp[0].item))) + { + item3= (Item_cond_and*) (yyvsp[0].item); + /* + (X1 AND X2) AND (Y1 AND Y2) ==> AND (X1, X2, Y1, Y2) + */ + item3->add_at_head(item1->argument_list()); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* + (X1 AND X2) AND Y ==> AND (X1, X2, Y) + */ + item1->add((yyvsp[0].item), thd->mem_root); + (yyval.item) = (yyvsp[-2].item); + } + } + else if (is_cond_and((yyvsp[0].item))) + { + item3= (Item_cond_and*) (yyvsp[0].item); + /* + X AND (Y1 AND Y2) ==> AND (X, Y1, Y2) + */ + item3->add_at_head((yyvsp[-2].item), thd->mem_root); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* X AND Y */ + (yyval.item)= new (thd->mem_root) Item_cond_and(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } + } +#line 39192 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1392: /* expr: NOT_SYM expr */ +#line 9230 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= negate_expression(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39202 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1394: /* boolean_test: boolean_test IS TRUE_SYM */ +#line 9240 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_istrue(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39212 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1395: /* boolean_test: boolean_test IS not TRUE_SYM */ +#line 9246 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnottrue(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39222 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1396: /* boolean_test: boolean_test IS FALSE_SYM */ +#line 9252 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isfalse(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39232 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1397: /* boolean_test: boolean_test IS not FALSE_SYM */ +#line 9258 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotfalse(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39242 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1398: /* boolean_test: boolean_test IS UNKNOWN_SYM */ +#line 9264 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnull(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39252 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1399: /* boolean_test: boolean_test IS not UNKNOWN_SYM */ +#line 9270 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotnull(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39262 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1400: /* boolean_test: boolean_test IS NULL_SYM */ +#line 9276 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnull(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39272 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1401: /* boolean_test: boolean_test IS not NULL_SYM */ +#line 9282 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotnull(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39282 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1402: /* boolean_test: boolean_test EQUAL_SYM predicate */ +#line 9288 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_equal(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39292 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1403: /* boolean_test: boolean_test comp_op predicate */ +#line 9294 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (*(yyvsp[-1].boolfunc2creator))(0)->create(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39302 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1404: /* boolean_test: boolean_test comp_op all_or_any '(' subselect ')' */ +#line 9300 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= all_any_subquery_creator(thd, (yyvsp[-5].item), (yyvsp[-4].boolfunc2creator), (yyvsp[-3].num), (yyvsp[-1].select_lex)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39312 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1406: /* predicate: predicate IN_SYM subquery */ +#line 9310 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_in_subselect(thd, (yyvsp[-2].item), (yyvsp[0].select_lex)); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 39322 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1407: /* predicate: predicate not IN_SYM subquery */ +#line 9316 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_in_subselect(thd, (yyvsp[-3].item), (yyvsp[0].select_lex)); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= negate_expression(thd, item); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 39335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1408: /* predicate: predicate IN_SYM '(' expr ')' */ +#line 9325 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= handle_sql2003_note184_exception(thd, (yyvsp[-4].item), true, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39345 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1409: /* predicate: predicate IN_SYM '(' expr ',' expr_list ')' */ +#line 9331 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-6].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_func_in(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39357 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1410: /* predicate: predicate not IN_SYM '(' expr ')' */ +#line 9339 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= handle_sql2003_note184_exception(thd, (yyvsp[-5].item), false, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39367 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1411: /* predicate: predicate not IN_SYM '(' expr ',' expr_list ')' */ +#line 9345 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-7].item), thd->mem_root); + Item_func_in *item= new (thd->mem_root) Item_func_in(thd, *(yyvsp[-1].item_list)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 39380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1412: /* predicate: predicate BETWEEN_SYM predicate AND_SYM predicate */ +#line 9354 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_between(thd, (yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39390 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1413: /* predicate: predicate not BETWEEN_SYM predicate AND_SYM predicate */ +#line 9360 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_func_between *item; + item= new (thd->mem_root) Item_func_between(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 39402 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1414: /* predicate: predicate SOUNDS_SYM LIKE predicate */ +#line 9368 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item1= new (thd->mem_root) Item_func_soundex(thd, (yyvsp[-3].item)); + Item *item4= new (thd->mem_root) Item_func_soundex(thd, (yyvsp[0].item)); + if (unlikely(item1 == NULL) || unlikely(item4 == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_eq(thd, item1, item4); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1415: /* predicate: predicate LIKE predicate */ +#line 9378 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_like(thd, (yyvsp[-2].item), (yyvsp[0].item), escape(thd), false); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 39426 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1416: /* predicate: predicate LIKE predicate ESCAPE_SYM predicate */ +#line 9384 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->escape_used= true; + (yyval.item)= new (thd->mem_root) Item_func_like(thd, (yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item), true); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 39437 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1417: /* predicate: predicate not LIKE predicate */ +#line 9391 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_like(thd, (yyvsp[-3].item), (yyvsp[0].item), escape(thd), false); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 39448 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1418: /* predicate: predicate not LIKE predicate ESCAPE_SYM predicate */ +#line 9398 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->escape_used= true; + Item *item= new (thd->mem_root) Item_func_like(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[0].item), true); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 39460 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1419: /* predicate: predicate REGEXP predicate */ +#line 9406 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_regex(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1420: /* predicate: predicate not REGEXP predicate */ +#line 9412 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_regex(thd, (yyvsp[-3].item), (yyvsp[0].item)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= negate_expression(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39483 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1422: /* bit_expr: bit_expr '|' bit_expr */ +#line 9425 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_or(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39493 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1423: /* bit_expr: bit_expr '&' bit_expr */ +#line 9431 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_and(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39503 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1424: /* bit_expr: bit_expr SHIFT_LEFT bit_expr */ +#line 9437 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_shift_left(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39513 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1425: /* bit_expr: bit_expr SHIFT_RIGHT bit_expr */ +#line 9443 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_shift_right(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1426: /* bit_expr: bit_expr ORACLE_CONCAT_SYM bit_expr */ +#line 9449 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_concat_operator_oracle(thd, + (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39534 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1427: /* bit_expr: bit_expr '+' bit_expr */ +#line 9456 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_plus(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39544 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1428: /* bit_expr: bit_expr '-' bit_expr */ +#line 9462 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_minus(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39554 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1429: /* bit_expr: bit_expr '+' INTERVAL_SYM expr interval */ +#line 9468 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39564 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1430: /* bit_expr: bit_expr '-' INTERVAL_SYM expr interval */ +#line 9474 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39574 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1431: /* bit_expr: INTERVAL_SYM expr interval '+' expr */ +#line 9481 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39584 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1432: /* bit_expr: '+' INTERVAL_SYM expr interval '+' expr */ +#line 9487 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39594 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1433: /* bit_expr: '-' INTERVAL_SYM expr interval '+' expr */ +#line 9493 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39604 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1434: /* bit_expr: bit_expr '*' bit_expr */ +#line 9499 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mul(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39614 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1435: /* bit_expr: bit_expr '/' bit_expr */ +#line 9505 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_div(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39624 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1436: /* bit_expr: bit_expr '%' bit_expr */ +#line 9511 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39634 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1437: /* bit_expr: bit_expr DIV_SYM bit_expr */ +#line 9517 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_int_div(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39644 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1438: /* bit_expr: bit_expr MOD_SYM bit_expr */ +#line 9523 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39654 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1439: /* bit_expr: bit_expr '^' bit_expr */ +#line 9529 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_xor(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1449: /* comp_op: '=' */ +#line 9558 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_eq_creator; } +#line 39670 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1450: /* comp_op: GE */ +#line 9559 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_ge_creator; } +#line 39676 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1451: /* comp_op: '>' */ +#line 9560 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_gt_creator; } +#line 39682 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1452: /* comp_op: LE */ +#line 9561 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_le_creator; } +#line 39688 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1453: /* comp_op: '<' */ +#line 9562 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_lt_creator; } +#line 39694 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1454: /* comp_op: NE */ +#line 9563 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_ne_creator; } +#line 39700 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1455: /* all_or_any: ALL */ +#line 9567 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 39706 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1456: /* all_or_any: ANY_SYM */ +#line 9568 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 39712 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1457: /* opt_dyncol_type: %empty */ +#line 9573 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_dyncol_type).set(DYN_COL_NULL); /* automatic type */ + } +#line 39720 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1458: /* opt_dyncol_type: AS dyncol_type */ +#line 9576 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type)= (yyvsp[0].Lex_dyncol_type); } +#line 39726 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1462: /* numeric_dyncol_type: INT_SYM */ +#line 9586 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_INT); } +#line 39732 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1463: /* numeric_dyncol_type: UNSIGNED INT_SYM */ +#line 9587 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_UINT); } +#line 39738 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1464: /* numeric_dyncol_type: DOUBLE_SYM */ +#line 9588 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 39744 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1465: /* numeric_dyncol_type: REAL */ +#line 9589 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 39750 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1466: /* numeric_dyncol_type: FLOAT_SYM */ +#line 9590 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 39756 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1467: /* numeric_dyncol_type: DECIMAL_SYM float_options */ +#line 9591 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DECIMAL, (yyvsp[0].Lex_length_and_dec)); } +#line 39762 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1468: /* temporal_dyncol_type: DATE_SYM */ +#line 9595 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DATE); } +#line 39768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1469: /* temporal_dyncol_type: TIME_SYM opt_field_scale */ +#line 9596 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_TIME, (yyvsp[0].Lex_length_and_dec)); } +#line 39774 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1470: /* temporal_dyncol_type: DATETIME opt_field_scale */ +#line 9597 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DATETIME, (yyvsp[0].Lex_length_and_dec)); } +#line 39780 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1471: /* string_dyncol_type: char opt_binary */ +#line 9602 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_dyncol_type).set(DYN_COL_STRING, (yyvsp[0].Lex_exact_charset_extended_collation_attrs), thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 39789 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1472: /* string_dyncol_type: nchar */ +#line 9607 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_dyncol_type).set(DYN_COL_STRING, national_charset_info); + } +#line 39797 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1473: /* dyncall_create_element: expr ',' expr opt_dyncol_type */ +#line 9614 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.dyncol_def)= (DYNCALL_CREATE_DEF *) + alloc_root(thd->mem_root, sizeof(DYNCALL_CREATE_DEF)); + if (unlikely((yyval.dyncol_def) == NULL)) + MYSQL_YYABORT; + (yyval.dyncol_def)->key= (yyvsp[-3].item); + (yyval.dyncol_def)->value= (yyvsp[-1].item); + (yyval.dyncol_def)->type= (DYNAMIC_COLUMN_TYPE)(yyvsp[0].Lex_dyncol_type).dyncol_type(); + (yyval.dyncol_def)->cs= (yyvsp[0].Lex_dyncol_type).charset_collation(); + if ((yyvsp[0].Lex_dyncol_type).has_explicit_length()) + (yyval.dyncol_def)->len= (yyvsp[0].Lex_dyncol_type).length(); + else + (yyval.dyncol_def)->len= 0; + if ((yyvsp[0].Lex_dyncol_type).has_explicit_dec()) + (yyval.dyncol_def)->frac= (yyvsp[0].Lex_dyncol_type).dec(); + else + (yyval.dyncol_def)->len= 0; + } +#line 39820 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1474: /* dyncall_create_list: dyncall_create_element */ +#line 9636 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.dyncol_def_list)= new (thd->mem_root) List; + if (unlikely((yyval.dyncol_def_list) == NULL)) + MYSQL_YYABORT; + (yyval.dyncol_def_list)->push_back((yyvsp[0].dyncol_def), thd->mem_root); + } +#line 39831 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1475: /* dyncall_create_list: dyncall_create_list ',' dyncall_create_element */ +#line 9643 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].dyncol_def_list)->push_back((yyvsp[0].dyncol_def), thd->mem_root); + (yyval.dyncol_def_list)= (yyvsp[-2].dyncol_def_list); + } +#line 39840 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1476: /* plsql_cursor_attr: ISOPEN_SYM */ +#line 9651 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_ISOPEN; } +#line 39846 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1477: /* plsql_cursor_attr: FOUND_SYM */ +#line 9652 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_FOUND; } +#line 39852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1478: /* plsql_cursor_attr: NOTFOUND_SYM */ +#line 9653 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_NOTFOUND; } +#line 39858 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1479: /* plsql_cursor_attr: ROWCOUNT_SYM */ +#line 9654 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_ROWCOUNT; } +#line 39864 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1480: /* explicit_cursor_attr: ident PERCENT_ORACLE_SYM plsql_cursor_attr */ +#line 9659 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_plsql_cursor_attr(thd, &(yyvsp[-2].ident_sys), (yyvsp[0].plsql_cursor_attr))))) + MYSQL_YYABORT; + } +#line 39873 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1483: /* trim_operands_regular: expr */ +#line 9672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[0].item)); } +#line 39879 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1484: /* trim_operands_special: LEADING expr FROM expr */ +#line 9676 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_LEADING, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 39885 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1485: /* trim_operands_special: TRAILING expr FROM expr */ +#line 9677 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_TRAILING, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 39891 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1486: /* trim_operands_special: BOTH expr FROM expr */ +#line 9678 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 39897 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1487: /* trim_operands_special: LEADING FROM expr */ +#line 9679 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_LEADING, (yyvsp[0].item)); } +#line 39903 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1488: /* trim_operands_special: TRAILING FROM expr */ +#line 9680 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_TRAILING, (yyvsp[0].item)); } +#line 39909 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1489: /* trim_operands_special: BOTH FROM expr */ +#line 9681 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[0].item)); } +#line 39915 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1490: /* trim_operands_special: expr FROM expr */ +#line 9682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 39921 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1497: /* column_default_non_parenthesized_expr: param_marker */ +#line 9720 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item_param); } +#line 39927 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1499: /* column_default_non_parenthesized_expr: sum_expr */ +#line 9723 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->select_stack_top || Lex->json_table) + { + my_error(ER_INVALID_GROUP_FUNC_USE, MYF(0)); + MYSQL_YYABORT; + } + } +#line 39939 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1500: /* column_default_non_parenthesized_expr: window_func_expr */ +#line 9731 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->select_stack_top) + { + my_error(ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION, MYF(0)); + MYSQL_YYABORT; + } + } +#line 39951 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1502: /* column_default_non_parenthesized_expr: ROW_SYM '(' expr ',' expr_list ')' */ +#line 9740 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_row(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39962 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1503: /* column_default_non_parenthesized_expr: EXISTS '(' subselect ')' */ +#line 9747 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_exists_subselect(thd, (yyvsp[-1].select_lex)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39972 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1504: /* column_default_non_parenthesized_expr: '{' ident expr '}' */ +#line 9753 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].item)->make_odbc_literal(thd, &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 39981 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1505: /* column_default_non_parenthesized_expr: MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')' */ +#line 9758 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-5].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + Item_func_match *i1= new (thd->mem_root) Item_func_match(thd, *(yyvsp[-5].item_list), + (yyvsp[-1].num)); + if (unlikely(i1 == NULL)) + MYSQL_YYABORT; + Select->add_ftfunc_to_list(thd, i1); + (yyval.item)= i1; + } +#line 39995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1506: /* column_default_non_parenthesized_expr: CAST_SYM '(' expr AS cast_type ')' */ +#line 9768 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].Lex_cast_type).create_typecast_item_or_error(thd, (yyvsp[-3].item))))) + MYSQL_YYABORT; + } +#line 40004 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1507: /* column_default_non_parenthesized_expr: CASE_SYM when_list_opt_else END */ +#line 9773 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= new(thd->mem_root) Item_func_case_searched(thd, *(yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 40013 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1508: /* column_default_non_parenthesized_expr: CASE_SYM expr when_list_opt_else END */ +#line 9778 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + if (unlikely(!((yyval.item)= new (thd->mem_root) Item_func_case_simple(thd, *(yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 40023 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1509: /* column_default_non_parenthesized_expr: CONVERT_SYM '(' expr ',' cast_type ')' */ +#line 9784 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].Lex_cast_type).create_typecast_item_or_error(thd, (yyvsp[-3].item))))) + MYSQL_YYABORT; + } +#line 40032 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1510: /* column_default_non_parenthesized_expr: CONVERT_SYM '(' expr USING charset_name ')' */ +#line 9789 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_conv_charset(thd, (yyvsp[-3].item), (yyvsp[-1].charset)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1511: /* column_default_non_parenthesized_expr: DEFAULT '(' simple_ident ')' */ +#line 9795 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_splocal *il= (yyvsp[-1].item)->get_item_splocal(); + if (unlikely(il)) + my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str)); + (yyval.item)= new (thd->mem_root) Item_default_value(thd, Lex->current_context(), + (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->default_used= TRUE; + } +#line 40057 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1512: /* column_default_non_parenthesized_expr: VALUE_SYM '(' simple_ident_nospvar ')' */ +#line 9806 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_insert_value(thd, Lex->current_context(), + (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40068 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1513: /* column_default_non_parenthesized_expr: NEXT_SYM VALUE_SYM FOR_SYM table_ident */ +#line 9813 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_nextval(thd, (yyvsp[0].table))))) + MYSQL_YYABORT; + } +#line 40077 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1514: /* column_default_non_parenthesized_expr: NEXTVAL_SYM '(' table_ident ')' */ +#line 9818 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_nextval(thd, (yyvsp[-1].table))))) + MYSQL_YYABORT; + } +#line 40086 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1515: /* column_default_non_parenthesized_expr: PREVIOUS_SYM VALUE_SYM FOR_SYM table_ident */ +#line 9823 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_lastval(thd, (yyvsp[0].table))))) + MYSQL_YYABORT; + } +#line 40095 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1516: /* column_default_non_parenthesized_expr: LASTVAL_SYM '(' table_ident ')' */ +#line 9828 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_lastval(thd, (yyvsp[-1].table))))) + MYSQL_YYABORT; + } +#line 40104 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1517: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ')' */ +#line 9833 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-3].table), (yyvsp[-1].longlong_number), 0, 1)))) + MYSQL_YYABORT; + } +#line 40113 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1518: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ',' bool ')' */ +#line 9838 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-5].table), (yyvsp[-3].longlong_number), 0, (yyvsp[-1].ulong_num))))) + MYSQL_YYABORT; + } +#line 40122 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1519: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ',' bool ',' ulonglong_num ')' */ +#line 9843 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-7].table), (yyvsp[-5].longlong_number), (yyvsp[-1].ulonglong_number), (yyvsp[-3].ulong_num))))) + MYSQL_YYABORT; + } +#line 40131 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1522: /* primary_expr: '(' parenthesized_expr ')' */ +#line 9852 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[-1].item); } +#line 40137 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1523: /* primary_expr: subquery */ +#line 9854 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->create_item_query_expression(thd, (yyvsp[0].select_lex)->master_unit()))) + MYSQL_YYABORT; + } +#line 40146 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1525: /* string_factor_expr: string_factor_expr COLLATE_SYM collation_name */ +#line 9863 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= new (thd->mem_root) + Item_func_set_collation(thd, (yyvsp[-2].item), (yyvsp[0].Lex_extended_collation))))) + MYSQL_YYABORT; + } +#line 40156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1527: /* simple_expr: BINARY simple_expr */ +#line 9873 "/home/buildbot/git/sql/sql_yacc.yy" + { + Type_cast_attributes at(&my_charset_bin); + if (unlikely(!((yyval.item)= type_handler_long_blob.create_typecast_item(thd, (yyvsp[0].item), at)))) + MYSQL_YYABORT; + } +#line 40166 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1528: /* simple_expr: '+' simple_expr */ +#line 9879 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 40174 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1529: /* simple_expr: '-' simple_expr */ +#line 9883 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item)->neg(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40184 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1530: /* simple_expr: '~' simple_expr */ +#line 9889 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_neg(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40194 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1531: /* simple_expr: not2 simple_expr */ +#line 9895 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= negate_expression(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40204 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1533: /* mysql_concatenation_expr: mysql_concatenation_expr MYSQL_CONCAT_SYM simple_expr */ +#line 9905 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_concat(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40214 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1534: /* function_call_keyword_timestamp: TIMESTAMP '(' expr ')' */ +#line 9914 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_datetime_typecast(thd, (yyvsp[-1].item), + AUTO_SEC_PART_DIGITS); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1535: /* function_call_keyword_timestamp: TIMESTAMP '(' expr ',' expr ')' */ +#line 9921 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_timestamp(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40235 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1536: /* function_call_keyword: CHAR_SYM '(' expr_list ')' */ +#line 9935 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_char(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40245 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1537: /* function_call_keyword: CHAR_SYM '(' expr_list USING charset_name ')' */ +#line 9941 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_char(thd, *(yyvsp[-3].item_list), (yyvsp[-1].charset)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40255 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1538: /* function_call_keyword: CURRENT_USER optional_braces */ +#line 9947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_current_user(thd, + Lex->current_context()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 40268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1539: /* function_call_keyword: CURRENT_ROLE optional_braces */ +#line 9956 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_current_role(thd, + Lex->current_context()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 40281 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1540: /* function_call_keyword: DATE_SYM '(' expr ')' */ +#line 9965 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_typecast(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1541: /* function_call_keyword: DAY_SYM '(' expr ')' */ +#line 9971 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_dayofmonth(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40301 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1542: /* function_call_keyword: HOUR_SYM '(' expr ')' */ +#line 9977 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_hour(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40311 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1543: /* function_call_keyword: INSERT '(' expr ',' expr ',' expr ',' expr ')' */ +#line 9983 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_insert(thd, (yyvsp[-7].item), (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40321 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1544: /* function_call_keyword: INTERVAL_SYM '(' expr ',' expr ')' */ +#line 9989 "/home/buildbot/git/sql/sql_yacc.yy" + { + List *list= new (thd->mem_root) List; + if (unlikely(list == NULL)) + MYSQL_YYABORT; + if (unlikely(list->push_front((yyvsp[-1].item), thd->mem_root)) || + unlikely(list->push_front((yyvsp[-3].item), thd->mem_root))) + MYSQL_YYABORT; + Item_row *item= new (thd->mem_root) Item_row(thd, *list); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_interval(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40340 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1545: /* function_call_keyword: INTERVAL_SYM '(' expr ',' expr ',' expr_list ')' */ +#line 10004 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-5].item), thd->mem_root); + Item_row *item= new (thd->mem_root) Item_row(thd, *(yyvsp[-1].item_list)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_interval(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1546: /* function_call_keyword: LEFT '(' expr ',' expr ')' */ +#line 10015 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_left(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40365 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1547: /* function_call_keyword: MINUTE_SYM '(' expr ')' */ +#line 10021 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_minute(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40375 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1548: /* function_call_keyword: MONTH_SYM '(' expr ')' */ +#line 10027 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_month(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40385 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1549: /* function_call_keyword: RIGHT '(' expr ',' expr ')' */ +#line 10033 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_right(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40395 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1550: /* function_call_keyword: SECOND_SYM '(' expr ')' */ +#line 10039 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_second(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40405 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1551: /* function_call_keyword: SQL_SYM PERCENT_ORACLE_SYM ROWCOUNT_SYM */ +#line 10045 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_oracle_sql_rowcount(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 40417 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1552: /* function_call_keyword: TIME_SYM '(' expr ')' */ +#line 10053 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_time_typecast(thd, (yyvsp[-1].item), + AUTO_SEC_PART_DIGITS); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40428 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1553: /* function_call_keyword: function_call_keyword_timestamp */ +#line 10060 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 40436 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1554: /* function_call_keyword: TRIM '(' trim_operands ')' */ +#line 10064 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_trim(thd, (yyvsp[-1].trim))))) + MYSQL_YYABORT; + } +#line 40446 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1555: /* function_call_keyword: USER_SYM '(' ')' */ +#line 10070 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_user(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query=0; + } +#line 40458 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1556: /* function_call_keyword: YEAR_SYM '(' expr ')' */ +#line 10078 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_year(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40468 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1559: /* substring_operands_regular: expr ',' expr ',' expr */ +#line 10092 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + } +#line 40476 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1560: /* substring_operands_regular: expr ',' expr */ +#line 10096 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-2].item), (yyvsp[0].item)); + } +#line 40484 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1561: /* substring_operands_special: expr FROM expr FOR_SYM expr */ +#line 10103 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + } +#line 40492 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1562: /* substring_operands_special: expr FROM expr */ +#line 10107 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-2].item), (yyvsp[0].item)); + } +#line 40500 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1563: /* function_call_nonkeyword: ADDDATE_SYM '(' expr ',' expr ')' */ +#line 10127 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-3].item), (yyvsp[-1].item), + INTERVAL_DAY, 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40511 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1564: /* function_call_nonkeyword: ADDDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10134 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40521 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1565: /* function_call_nonkeyword: CURDATE optional_braces */ +#line 10140 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curdate_local(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40532 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1566: /* function_call_nonkeyword: CURTIME opt_time_precision */ +#line 10147 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curtime_local(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40543 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1567: /* function_call_nonkeyword: DATE_ADD_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10154 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40553 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1568: /* function_call_nonkeyword: DATE_SUB_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10160 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40563 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1569: /* function_call_nonkeyword: EXTRACT_SYM '(' interval FROM expr ')' */ +#line 10166 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_extract(thd, (yyvsp[-3].interval), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40573 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1570: /* function_call_nonkeyword: GET_FORMAT '(' date_time_type ',' expr ')' */ +#line 10172 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_get_format(thd, (yyvsp[-3].date_time_type), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40583 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1571: /* function_call_nonkeyword: NOW_SYM opt_time_precision */ +#line 10178 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40594 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1572: /* function_call_nonkeyword: POSITION_SYM '(' bit_expr IN_SYM expr ')' */ +#line 10185 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_locate(thd, (yyvsp[-1].item), (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40604 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1573: /* function_call_nonkeyword: ROWNUM_SYM optional_braces */ +#line 10196 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_rownum(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40614 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1574: /* function_call_nonkeyword: SUBDATE_SYM '(' expr ',' expr ')' */ +#line 10202 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-3].item), (yyvsp[-1].item), + INTERVAL_DAY, 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40625 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1575: /* function_call_nonkeyword: SUBDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10209 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40635 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1576: /* function_call_nonkeyword: SUBSTRING '(' substring_operands ')' */ +#line 10215 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_substr(thd, (yyvsp[-1].substring_spec))))) + MYSQL_YYABORT; + } +#line 40645 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1577: /* function_call_nonkeyword: SYSDATE */ +#line 10222 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_sysdate(thd, 0)))) + MYSQL_YYABORT; + } +#line 40654 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1578: /* function_call_nonkeyword: SYSDATE '(' ')' */ +#line 10228 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_sysdate(thd, 0)))) + MYSQL_YYABORT; + } +#line 40663 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1579: /* function_call_nonkeyword: SYSDATE '(' real_ulong_num ')' */ +#line 10233 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_sysdate(thd, (uint) (yyvsp[-1].ulong_num))))) + MYSQL_YYABORT; + } +#line 40672 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1580: /* function_call_nonkeyword: TIMESTAMP_ADD '(' interval_time_stamp ',' expr ',' expr ')' */ +#line 10238 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-1].item), (yyvsp[-3].item), (yyvsp[-5].interval_time_st), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40682 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1581: /* function_call_nonkeyword: TIMESTAMP_DIFF '(' interval_time_stamp ',' expr ',' expr ')' */ +#line 10244 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_timestamp_diff(thd, (yyvsp[-3].item), (yyvsp[-1].item), (yyvsp[-5].interval_time_st)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40692 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1582: /* function_call_nonkeyword: TRIM_ORACLE '(' trim_operands ')' */ +#line 10250 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].trim).make_item_func_trim_oracle(thd)))) + MYSQL_YYABORT; + } +#line 40701 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1583: /* function_call_nonkeyword: UTC_DATE_SYM optional_braces */ +#line 10255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curdate_utc(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40712 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1584: /* function_call_nonkeyword: UTC_TIME_SYM opt_time_precision */ +#line 10262 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curtime_utc(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40723 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1585: /* function_call_nonkeyword: UTC_TIMESTAMP_SYM opt_time_precision */ +#line 10269 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_now_utc(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40734 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1586: /* function_call_nonkeyword: COLUMN_ADD_SYM '(' expr ',' dyncall_create_list ')' */ +#line 10277 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_add(thd, (yyvsp[-3].item), *(yyvsp[-1].dyncol_def_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40744 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1587: /* function_call_nonkeyword: COLUMN_DELETE_SYM '(' expr ',' expr_list ')' */ +#line 10284 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_delete(thd, (yyvsp[-3].item), *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40754 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1588: /* function_call_nonkeyword: COLUMN_CREATE_SYM '(' dyncall_create_list ')' */ +#line 10291 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_create(thd, *(yyvsp[-1].dyncol_def_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40764 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1589: /* function_call_nonkeyword: COLUMN_GET_SYM '(' expr ',' expr AS cast_type ')' */ +#line 10298 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_get(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].Lex_cast_type).type_handler(), + (yyvsp[-1].Lex_cast_type), (yyvsp[-1].Lex_cast_type).charset()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40775 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1590: /* function_call_conflict: ASCII_SYM '(' expr ')' */ +#line 10313 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_ascii(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40785 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1591: /* function_call_conflict: CHARSET '(' expr ')' */ +#line 10319 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_charset(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40795 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1592: /* function_call_conflict: IF_SYM '(' expr ',' expr ',' expr ')' */ +#line 10325 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_if(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40805 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1593: /* function_call_conflict: LAST_VALUE '(' expr ')' */ +#line 10334 "/home/buildbot/git/sql/sql_yacc.yy" + { + List *list= new (thd->mem_root) List; + if (unlikely(list == NULL)) + MYSQL_YYABORT; + list->push_back((yyvsp[-1].item), thd->mem_root); + + (yyval.item)= new (thd->mem_root) Item_func_last_value(thd, *list); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40820 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1594: /* function_call_conflict: LAST_VALUE '(' expr_list ',' expr ')' */ +#line 10345 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-3].item_list)->push_back((yyvsp[-1].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_func_last_value(thd, *(yyvsp[-3].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40831 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1595: /* function_call_conflict: MOD_SYM '(' expr ',' expr ')' */ +#line 10352 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40841 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1596: /* function_call_conflict: PASSWORD_SYM '(' expr ')' */ +#line 10358 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item* i1; + i1= new (thd->mem_root) Item_func_password(thd, (yyvsp[-1].item)); + if (unlikely(i1 == NULL)) + MYSQL_YYABORT; + (yyval.item)= i1; + } +#line 40853 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1597: /* function_call_conflict: REPEAT_SYM '(' expr ',' expr ')' */ +#line 10366 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_repeat(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40863 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1598: /* function_call_conflict: REPLACE '(' expr ',' expr ',' expr ')' */ +#line 10372 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_replace(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item))))) + MYSQL_YYABORT; + } +#line 40873 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1599: /* function_call_conflict: TRUNCATE_SYM '(' expr ',' expr ')' */ +#line 10378 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_round(thd, (yyvsp[-3].item), (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40883 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1600: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr opt_ws_levels ')' */ +#line 10384 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-2].item), 0, 0, (yyvsp[-1].ulong_num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40893 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1601: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr AS CHAR_SYM ws_nweights opt_ws_levels ')' */ +#line 10390 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) + Item_func_weight_string(thd, (yyvsp[-5].item), 0, (yyvsp[-2].ulong_num), + (yyvsp[-1].ulong_num) | MY_STRXFRM_PAD_WITH_SPACE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40905 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1602: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr AS BINARY ws_nweights ')' */ +#line 10398 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_char_typecast(thd, (yyvsp[-4].item), (yyvsp[-1].ulong_num), + &my_charset_bin); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) + Item_func_weight_string(thd, item, 0, (yyvsp[-1].ulong_num), + MY_STRXFRM_PAD_WITH_SPACE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40921 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1603: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr ',' ulong_num ',' ulong_num ',' ulong_num ')' */ +#line 10410 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-7].item), (yyvsp[-5].ulong_num), (yyvsp[-3].ulong_num), + (yyvsp[-1].ulong_num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1604: /* @142: %empty */ +#line 10429 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef HAVE_DLOPEN + udf_func *udf= 0; + LEX *lex= Lex; + if (using_udf_functions && + (udf= find_udf((yyvsp[-1].ident_sys).str, (yyvsp[-1].ident_sys).length)) && + udf->type == UDFTYPE_AGGREGATE) + { + if (unlikely(lex->current_select->inc_in_sum_expr())) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } + /* Temporary placing the result of find_udf in $3 */ + (yyval.udf)= udf; +#endif + } +#line 40955 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1605: /* function_call_generic: ident_func '(' @142 opt_udf_expr_list ')' */ +#line 10448 "/home/buildbot/git/sql/sql_yacc.yy" + { + const Type_handler *h; + Create_func *builder; + Item *item= NULL; + + if (unlikely(check_routine_name(&(yyvsp[-4].ident_sys)))) + MYSQL_YYABORT; + + /* + Implementation note: + names are resolved with the following order: + - MySQL native functions, + - User Defined Functions, + - Constructors, like POINT(1,1) + - Stored Functions (assuming the current database) + + This will be revised with WL#2128 (SQL PATH) + */ + builder= Schema::find_implied(thd)-> + find_native_function_builder(thd, (yyvsp[-4].ident_sys)); + if (builder) + { + item= builder->create_func(thd, &(yyvsp[-4].ident_sys), (yyvsp[-1].item_list)); + } + else if ((h= Type_handler::handler_by_name(thd, (yyvsp[-4].ident_sys))) && + (item= h->make_constructor_item(thd, (yyvsp[-1].item_list)))) + { + // Found a constructor with a proper argument count + } + else + { +#ifdef HAVE_DLOPEN + /* Retrieving the result of find_udf */ + udf_func *udf= (yyvsp[-2].udf); + + if (udf) + { + if (udf->type == UDFTYPE_AGGREGATE) + { + Select->in_sum_expr--; + } + + item= Create_udf_func::s_singleton.create(thd, udf, (yyvsp[-1].item_list)); + } + else +#endif + { + builder= find_qualified_function_builder(thd); + DBUG_ASSERT(builder); + item= builder->create_func(thd, &(yyvsp[-4].ident_sys), (yyvsp[-1].item_list)); + } + } + + if (unlikely(! ((yyval.item)= item))) + MYSQL_YYABORT; + } +#line 41016 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1606: /* function_call_generic: CONTAINS_SYM '(' opt_expr_list ')' */ +#line 10505 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41026 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1607: /* function_call_generic: OVERLAPS_SYM '(' opt_expr_list ')' */ +#line 10511 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41036 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1608: /* function_call_generic: WITHIN '(' opt_expr_list ')' */ +#line 10517 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1609: /* function_call_generic: ident_cli '.' ident_cli '(' opt_expr_list ')' */ +#line 10523 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_call_generic(thd, &(yyvsp[-5].ident_cli), &(yyvsp[-3].ident_cli), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1610: /* function_call_generic: ident_cli '.' ident_cli '.' ident_cli '(' opt_expr_list ')' */ +#line 10528 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_call_generic(thd, &(yyvsp[-7].ident_cli), &(yyvsp[-5].ident_cli), &(yyvsp[-3].ident_cli), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41064 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1611: /* function_call_generic: ident_cli '.' REPLACE '(' opt_expr_list ')' */ +#line 10533 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_replace(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41073 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1612: /* function_call_generic: ident_cli '.' SUBSTRING '(' opt_expr_list ')' */ +#line 10538 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_substr(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41082 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1613: /* function_call_generic: ident_cli '.' SUBSTRING '(' substring_operands_special ')' */ +#line 10543 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_substr(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].substring_spec))))) + MYSQL_YYABORT; + } +#line 41091 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1614: /* function_call_generic: ident_cli '.' TRIM '(' opt_expr_list ')' */ +#line 10548 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_trim(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41100 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1615: /* function_call_generic: ident_cli '.' TRIM '(' trim_operands_special ')' */ +#line 10553 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_trim(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].trim))))) + MYSQL_YYABORT; + } +#line 41109 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1616: /* fulltext_options: opt_natural_language_mode opt_query_expansion */ +#line 10573 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].num) | (yyvsp[0].num); } +#line 41115 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1617: /* fulltext_options: IN_SYM BOOLEAN_SYM MODE_SYM */ +#line 10575 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_BOOL; } +#line 41121 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1618: /* opt_natural_language_mode: %empty */ +#line 10579 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_NL; } +#line 41127 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1619: /* opt_natural_language_mode: IN_SYM NATURAL LANGUAGE_SYM MODE_SYM */ +#line 10580 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_NL; } +#line 41133 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1620: /* opt_query_expansion: %empty */ +#line 10584 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 41139 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1621: /* opt_query_expansion: WITH QUERY_SYM EXPANSION_SYM */ +#line 10585 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_EXPAND; } +#line 41145 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1622: /* opt_udf_expr_list: %empty */ +#line 10589 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 41151 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1623: /* opt_udf_expr_list: udf_expr_list */ +#line 10590 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list); } +#line 41157 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1624: /* udf_expr_list: udf_expr */ +#line 10595 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL)) + MYSQL_YYABORT; + (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root); + } +#line 41168 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1625: /* udf_expr_list: udf_expr_list ',' udf_expr */ +#line 10602 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 41177 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1626: /* udf_expr: remember_name expr remember_end select_alias */ +#line 10610 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Use Item::name as a storage for the attribute value of user + defined function argument. It is safe to use Item::name + because the syntax will not allow having an explicit name here. + See WL#1017 re. udf attributes. + */ + if ((yyvsp[0].lex_str).str) + { + (yyvsp[-2].item)->base_flags|= item_base_t::IS_EXPLICIT_NAME; + (yyvsp[-2].item)->set_name(thd, (yyvsp[0].lex_str)); + } + /* + A field has to have its proper name in order for name + resolution to work, something we are only guaranteed if we + parse it out. If we hijack the input stream with + remember_name we may get quoted or escaped names. + */ + else if ((yyvsp[-2].item)->type() != Item::FIELD_ITEM && + (yyvsp[-2].item)->type() != Item::REF_ITEM /* For HAVING */ ) + (yyvsp[-2].item)->set_name(thd, (yyvsp[-3].simple_string), (uint) ((yyvsp[-1].simple_string) - (yyvsp[-3].simple_string)), thd->charset()); + (yyval.item)= (yyvsp[-2].item); + } +#line 41205 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1627: /* sum_expr: AVG_SYM '(' in_sum_expr ')' */ +#line 10637 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_avg(thd, (yyvsp[-1].item), FALSE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41215 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1628: /* sum_expr: AVG_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10643 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_avg(thd, (yyvsp[-1].item), TRUE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1629: /* sum_expr: BIT_AND '(' in_sum_expr ')' */ +#line 10649 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_and(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41235 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1630: /* sum_expr: BIT_OR '(' in_sum_expr ')' */ +#line 10655 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_or(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41245 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1631: /* sum_expr: BIT_XOR '(' in_sum_expr ')' */ +#line 10661 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_xor(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41255 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1632: /* sum_expr: COUNT_SYM '(' opt_all '*' ')' */ +#line 10667 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_int(thd, (int32) 0L, 1); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1633: /* sum_expr: COUNT_SYM '(' in_sum_expr ')' */ +#line 10676 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41278 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1634: /* $@143: %empty */ +#line 10682 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 41284 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1635: /* $@144: %empty */ +#line 10684 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr--; } +#line 41290 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1636: /* sum_expr: COUNT_SYM '(' DISTINCT $@143 expr_list $@144 ')' */ +#line 10686 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, *(yyvsp[-2].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41300 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1637: /* sum_expr: MIN_SYM '(' in_sum_expr ')' */ +#line 10692 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_min(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41310 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1638: /* sum_expr: MIN_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10703 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_min(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41320 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1639: /* sum_expr: MAX_SYM '(' in_sum_expr ')' */ +#line 10709 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_max(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41330 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1640: /* sum_expr: MAX_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10715 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_max(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41340 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1641: /* sum_expr: STD_SYM '(' in_sum_expr ')' */ +#line 10721 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_std(thd, (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41350 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1642: /* sum_expr: VARIANCE_SYM '(' in_sum_expr ')' */ +#line 10727 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_variance(thd, (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41360 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1643: /* sum_expr: STDDEV_SAMP_SYM '(' in_sum_expr ')' */ +#line 10733 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_std(thd, (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41370 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1644: /* sum_expr: VAR_SAMP_SYM '(' in_sum_expr ')' */ +#line 10739 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_variance(thd, (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1645: /* sum_expr: SUM_SYM '(' in_sum_expr ')' */ +#line 10745 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_sum(thd, (yyvsp[-1].item), FALSE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41390 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1646: /* sum_expr: SUM_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10751 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_sum(thd, (yyvsp[-1].item), TRUE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41400 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1647: /* $@145: %empty */ +#line 10757 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 41406 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1648: /* sum_expr: GROUP_CONCAT_SYM '(' opt_distinct $@145 expr_list opt_gorder_clause opt_gconcat_separator opt_glimit_clause ')' */ +#line 10761 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->in_sum_expr--; + (yyval.item)= new (thd->mem_root) + Item_func_group_concat(thd, Lex->current_context(), + (yyvsp[-6].num), (yyvsp[-4].item_list), + sel->gorder_list, (yyvsp[-2].string), (yyvsp[-1].num), + sel->limit_params.select_limit, + sel->limit_params.offset_limit); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + sel->limit_params.clear(); + (yyvsp[-4].item_list)->empty(); + sel->gorder_list.empty(); + } +#line 41426 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1649: /* $@146: %empty */ +#line 10777 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 41432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1650: /* sum_expr: JSON_ARRAYAGG_SYM '(' opt_distinct $@146 expr_list opt_gorder_clause opt_glimit_clause ')' */ +#line 10780 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + List *args= (yyvsp[-3].item_list); + sel->in_sum_expr--; + if (args && args->elements > 1) + { + /* JSON_ARRAYAGG supports only one parameter */ + my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), "JSON_ARRAYAGG"); + MYSQL_YYABORT; + } + String* s= new (thd->mem_root) String(",", 1, &my_charset_latin1); + if (unlikely(s == NULL)) + MYSQL_YYABORT; + + (yyval.item)= new (thd->mem_root) + Item_func_json_arrayagg(thd, Lex->current_context(), + (yyvsp[-5].num), args, + sel->gorder_list, s, (yyvsp[-1].num), + sel->limit_params.select_limit, + sel->limit_params.offset_limit); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + sel->limit_params.clear(); + (yyvsp[-3].item_list)->empty(); + sel->gorder_list.empty(); + } +#line 41463 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1651: /* $@147: %empty */ +#line 10807 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 41469 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1652: /* sum_expr: JSON_OBJECTAGG_SYM '(' $@147 expr ',' expr ')' */ +#line 10809 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->in_sum_expr--; + + (yyval.item)= new (thd->mem_root) Item_func_json_objectagg(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41482 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1653: /* window_func_expr: window_func OVER_SYM window_name */ +#line 10821 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-2].item), (yyvsp[0].lex_str_ptr)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 41494 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1654: /* window_func_expr: window_func OVER_SYM window_spec */ +#line 10830 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_spec(thd, lex->win_ref, + Select->group_list, + Select->order_list, + lex->win_frame))) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-2].item), + thd->lex->win_spec); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 41513 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1657: /* window_func: function_call_generic */ +#line 10852 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item* item = (Item*)(yyvsp[0].item); + /* Only UDF aggregate here possible */ + if ((item == NULL) || + (item->type() != Item::SUM_FUNC_ITEM) + || (((Item_sum *)item)->sum_func() != Item_sum::UDF_SUM_FUNC)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 41529 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1658: /* simple_window_func: ROW_NUMBER_SYM '(' ')' */ +#line 10867 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_row_number(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41539 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1659: /* simple_window_func: RANK_SYM '(' ')' */ +#line 10874 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41549 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1660: /* simple_window_func: DENSE_RANK_SYM '(' ')' */ +#line 10881 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_dense_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1661: /* simple_window_func: PERCENT_RANK_SYM '(' ')' */ +#line 10888 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percent_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41569 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1662: /* simple_window_func: CUME_DIST_SYM '(' ')' */ +#line 10895 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_cume_dist(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41579 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1663: /* simple_window_func: NTILE_SYM '(' expr ')' */ +#line 10902 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_ntile(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41589 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1664: /* simple_window_func: FIRST_VALUE_SYM '(' expr ')' */ +#line 10909 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_first_value(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41599 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1665: /* simple_window_func: LAST_VALUE '(' expr ')' */ +#line 10916 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_last_value(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41609 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1666: /* simple_window_func: NTH_VALUE_SYM '(' expr ',' expr ')' */ +#line 10923 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_nth_value(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41619 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1667: /* simple_window_func: LEAD_SYM '(' expr ')' */ +#line 10930 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* No second argument defaults to 1. */ + Item* item_offset= new (thd->mem_root) Item_uint(thd, 1); + if (unlikely(item_offset == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_lead(thd, (yyvsp[-1].item), item_offset); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1668: /* simple_window_func: LEAD_SYM '(' expr ',' expr ')' */ +#line 10941 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_lead(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41643 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1669: /* simple_window_func: LAG_SYM '(' expr ')' */ +#line 10948 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* No second argument defaults to 1. */ + Item* item_offset= new (thd->mem_root) Item_uint(thd, 1); + if (unlikely(item_offset == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_lag(thd, (yyvsp[-1].item), item_offset); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41657 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1670: /* simple_window_func: LAG_SYM '(' expr ',' expr ')' */ +#line 10959 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_lag(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41667 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1671: /* inverse_distribution_function: percentile_function OVER_SYM '(' opt_window_partition_clause ')' */ +#line 10971 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_spec(thd, lex->win_ref, + Select->group_list, + Select->order_list, + NULL))) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-4].item), + thd->lex->win_spec); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 41686 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1672: /* $@148: %empty */ +#line 10989 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->prepare_add_window_spec(thd); } +#line 41692 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1673: /* percentile_function: inverse_distribution_function_def WITHIN GROUP_SYM '(' $@148 order_by_single_element_list ')' */ +#line 10991 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[-6].item); + } +#line 41700 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1674: /* percentile_function: MEDIAN_SYM '(' expr ')' */ +#line 10995 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *args= new (thd->mem_root) Item_decimal(thd, "0.5", 3, + thd->charset()); + if (unlikely(args == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + Select->prepare_add_window_spec(thd); + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item),FALSE))) + MYSQL_YYABORT; + + (yyval.item)= new (thd->mem_root) Item_sum_percentile_cont(thd, args); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41718 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1675: /* inverse_distribution_function_def: PERCENTILE_CONT_SYM '(' expr ')' */ +#line 11012 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percentile_cont(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1676: /* inverse_distribution_function_def: PERCENTILE_DISC_SYM '(' expr ')' */ +#line 11018 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percentile_disc(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41738 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1677: /* order_by_single_element_list: ORDER_SYM BY order_ident order_dir */ +#line 11027 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 41747 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1678: /* window_name: ident */ +#line 11036 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str_ptr)= (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + if (unlikely((yyval.lex_str_ptr) == NULL)) + MYSQL_YYABORT; + } +#line 41757 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1679: /* $@149: %empty */ +#line 11045 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(! Lex->parsing_options.allows_variable)) + my_yyabort_error((ER_VIEW_SELECT_VARIABLE, MYF(0))); + } +#line 41766 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1680: /* variable: '@' $@149 variable_aux */ +#line 11050 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 41774 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1681: /* variable_aux: ident_or_text SET_VAR expr */ +#line 11057 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_func_set_user_var *item; + if (!(yyvsp[-2].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= item= new (thd->mem_root) Item_func_set_user_var(thd, &(yyvsp[-2].lex_str), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + lex->set_var_list.push_back(item, thd->mem_root); + } +#line 41793 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1682: /* variable_aux: ident_or_text */ +#line 11072 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= new (thd->mem_root) Item_func_get_user_var(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + } +#line 41810 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1683: /* variable_aux: '@' opt_var_ident_type ident_sysvar_name */ +#line 11085 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_sysvar(thd, (yyvsp[-1].var_type), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 41819 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1684: /* variable_aux: '@' opt_var_ident_type ident_sysvar_name '.' ident */ +#line 11090 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_sysvar(thd, (yyvsp[-3].var_type), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 41828 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1685: /* opt_distinct: %empty */ +#line 11097 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 41834 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1686: /* opt_distinct: DISTINCT */ +#line 11098 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 41840 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1687: /* opt_gconcat_separator: %empty */ +#line 11103 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string)= new (thd->mem_root) String(",", 1, &my_charset_latin1); + if (unlikely((yyval.string) == NULL)) + MYSQL_YYABORT; + } +#line 41850 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1688: /* opt_gconcat_separator: SEPARATOR_SYM text_string */ +#line 11108 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string) = (yyvsp[0].string); } +#line 41856 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1691: /* gorder_list: gorder_list ',' order_ident order_dir */ +#line 11118 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_gorder_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 41865 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1692: /* gorder_list: order_ident order_dir */ +#line 11123 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_gorder_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 41874 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1693: /* opt_glimit_clause: %empty */ +#line 11130 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 41880 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1694: /* opt_glimit_clause: glimit_clause */ +#line 11131 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 41886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1695: /* glimit_clause: LIMIT glimit_options */ +#line 11137 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 41894 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1696: /* glimit_options: limit_options */ +#line 11144 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->limit_params= (yyvsp[0].select_limit); + } +#line 41902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1697: /* $@150: %empty */ +#line 11153 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->current_select->inc_in_sum_expr())) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 41915 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1698: /* in_sum_expr: opt_all $@150 expr */ +#line 11162 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->in_sum_expr--; + (yyval.item)= (yyvsp[0].item); + } +#line 41924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1699: /* cast_type: BINARY opt_field_length */ +#line 11170 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[0].Lex_length_and_dec), &my_charset_bin); } +#line 41930 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1700: /* cast_type: CHAR_SYM opt_field_length opt_binary */ +#line 11172 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 41940 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1701: /* cast_type: VARCHAR field_length opt_binary */ +#line 11178 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 41950 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1702: /* cast_type: VARCHAR2_ORACLE_SYM field_length opt_binary */ +#line 11184 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 41960 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1703: /* cast_type: NCHAR_SYM opt_field_length */ +#line 11190 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[0].Lex_length_and_dec), national_charset_info); + } +#line 41968 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1704: /* cast_type: cast_type_numeric */ +#line 11193 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type)= (yyvsp[0].Lex_cast_type); } +#line 41974 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1705: /* cast_type: cast_type_temporal */ +#line 11194 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type)= (yyvsp[0].Lex_cast_type); } +#line 41980 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1706: /* cast_type: udt_name */ +#line 11196 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_cast_type_udt(&(yyval.Lex_cast_type), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 41989 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1707: /* cast_type_numeric: INT_SYM */ +#line 11203 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 41995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1708: /* cast_type_numeric: SIGNED_SYM */ +#line 11204 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 42001 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1709: /* cast_type_numeric: SIGNED_SYM INT_SYM */ +#line 11205 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 42007 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1710: /* cast_type_numeric: UNSIGNED */ +#line 11206 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_ulonglong); } +#line 42013 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1711: /* cast_type_numeric: UNSIGNED INT_SYM */ +#line 11207 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_ulonglong); } +#line 42019 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1712: /* cast_type_numeric: DECIMAL_SYM float_options */ +#line 11208 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_newdecimal, (yyvsp[0].Lex_length_and_dec)); } +#line 42025 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1713: /* cast_type_numeric: FLOAT_SYM */ +#line 11209 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_float); } +#line 42031 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1714: /* cast_type_numeric: DOUBLE_SYM opt_precision */ +#line 11210 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_double, (yyvsp[0].Lex_length_and_dec)); } +#line 42037 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1715: /* cast_type_temporal: DATE_SYM */ +#line 11214 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_newdate); } +#line 42043 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1716: /* cast_type_temporal: TIME_SYM opt_field_scale */ +#line 11215 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_time2, (yyvsp[0].Lex_length_and_dec)); } +#line 42049 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1717: /* cast_type_temporal: DATETIME opt_field_scale */ +#line 11216 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_datetime2, (yyvsp[0].Lex_length_and_dec)); } +#line 42055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1718: /* cast_type_temporal: INTERVAL_SYM DAY_SECOND_SYM field_scale */ +#line 11218 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_cast_type).set(&type_handler_interval_DDhhmmssff, (yyvsp[0].Lex_length_and_dec)); + } +#line 42063 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1719: /* opt_expr_list: %empty */ +#line 11224 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 42069 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1720: /* opt_expr_list: expr_list */ +#line 11225 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list);} +#line 42075 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1721: /* expr_list: expr */ +#line 11230 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_list)= List::make(thd->mem_root, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 42084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1722: /* expr_list: expr_list ',' expr */ +#line 11235 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42093 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1723: /* ident_list_arg: ident_list */ +#line 11242 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list); } +#line 42099 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1724: /* ident_list_arg: '(' ident_list ')' */ +#line 11243 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[-1].item_list); } +#line 42105 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1725: /* ident_list: simple_ident */ +#line 11248 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL) || + unlikely((yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 42116 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1726: /* ident_list: ident_list ',' simple_ident */ +#line 11255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42125 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1727: /* when_list: WHEN_SYM expr THEN_SYM expr */ +#line 11263 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL)) + MYSQL_YYABORT; + if (unlikely((yyval.item_list)->push_back((yyvsp[-2].item), thd->mem_root) || + (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 42138 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1728: /* when_list: when_list WHEN_SYM expr THEN_SYM expr */ +#line 11272 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-4].item_list)->push_back((yyvsp[-2].item), thd->mem_root) || + (yyvsp[-4].item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.item_list)= (yyvsp[-4].item_list); + } +#line 42149 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1730: /* when_list_opt_else: when_list ELSE expr */ +#line 11283 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42159 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1731: /* table_ref: table_factor */ +#line 11293 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42165 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1732: /* table_ref: join_table */ +#line 11295 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->nest_last_join(thd)))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 42178 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1733: /* json_text_literal: TEXT_STRING */ +#line 11307 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42186 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1734: /* json_text_literal: NCHAR_STRING */ +#line 11311 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= national_charset_info; + } +#line 42194 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1735: /* json_text_literal: UNDERSCORE_CHARSET TEXT_STRING */ +#line 11315 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= (yyvsp[-1].charset); + (yyval.lex_string_with_metadata)= (yyvsp[0].lex_string_with_metadata); + } +#line 42203 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1737: /* json_text_literal_or_num: NUM */ +#line 11324 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42211 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1738: /* json_text_literal_or_num: LONG_NUM */ +#line 11328 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42219 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1739: /* json_text_literal_or_num: DECIMAL_NUM */ +#line 11332 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42227 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1740: /* json_text_literal_or_num: FLOAT_NUM */ +#line 11336 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42235 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1741: /* join_table_list: derived_table_list */ +#line 11342 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT_UNLESS((yyval.table_list)=(yyvsp[0].table_list)); } +#line 42241 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1742: /* json_table_columns_clause: COLUMNS '(' json_table_columns_list ')' */ +#line 11347 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42247 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1744: /* json_table_columns_list: json_table_columns_list ',' json_table_column */ +#line 11353 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42253 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1745: /* $@151: %empty */ +#line 11358 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Create_field *f= new (thd->mem_root) Create_field(); + + if (unlikely(check_string_char_length(&(yyvsp[0].ident_sys), 0, NAME_CHAR_LEN, + system_charset_info, 1))) + my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), (yyvsp[0].ident_sys).str)); + + lex->json_table->m_cur_json_table_column= + new (thd->mem_root) Json_table_column(f, + lex->json_table->get_cur_nested_path()); + + if (unlikely(!f || + !lex->json_table->m_cur_json_table_column)) + MYSQL_YYABORT; + + lex->init_last_field(f, &(yyvsp[0].ident_sys)); + } +#line 42276 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1746: /* json_table_column: ident $@151 json_table_column_type */ +#line 11377 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->json_table-> + m_cur_json_table_column->m_field->check(thd))) + MYSQL_YYABORT; + lex->json_table->m_columns.push_back( + lex->json_table->m_cur_json_table_column, thd->mem_root); + } +#line 42289 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1747: /* $@152: %empty */ +#line 11386 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Json_table_nested_path *np= new (thd->mem_root) + Json_table_nested_path(); + np->set_path(thd, (yyvsp[0].lex_string_with_metadata)); + lex->json_table->start_nested_path(np); + } +#line 42301 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1748: /* json_table_column: NESTED_SYM PATH_SYM json_text_literal $@152 json_table_columns_clause */ +#line 11394 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->json_table->end_nested_path(); + } +#line 42310 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1749: /* json_table_column_type: FOR_SYM ORDINALITY_SYM */ +#line 11402 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_field_type_st type; + type.set(&type_handler_slong); + Lex->last_field->set_attributes(thd, type, + COLUMN_DEFINITION_TABLE_FIELD); + Lex->json_table->m_cur_json_table_column-> + set(Json_table_column::FOR_ORDINALITY); + } +#line 42323 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1750: /* json_table_column_type: json_table_field_type PATH_SYM json_text_literal json_opt_on_empty_or_error */ +#line 11412 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[-3].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + if (Lex->json_table->m_cur_json_table_column-> + set(thd, Json_table_column::PATH, (yyvsp[-1].lex_string_with_metadata), + (yyvsp[-3].Lex_field_type).charset_collation_attrs())) + { + MYSQL_YYABORT; + } + } +#line 42338 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1751: /* json_table_column_type: json_table_field_type EXISTS PATH_SYM json_text_literal */ +#line 11423 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[-3].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + if (Lex->json_table->m_cur_json_table_column-> + set(thd, Json_table_column::EXISTS_PATH, (yyvsp[0].lex_string_with_metadata), + (yyvsp[-3].Lex_field_type).charset_collation_attrs())) + MYSQL_YYABORT; + } +#line 42351 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1756: /* json_opt_on_empty_or_error: %empty */ +#line 11442 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42357 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1761: /* json_on_response: ERROR_SYM */ +#line 11451 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_ERROR; + } +#line 42365 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1762: /* json_on_response: NULL_SYM */ +#line 11455 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_NULL; + } +#line 42373 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1763: /* json_on_response: DEFAULT json_text_literal_or_num */ +#line 11459 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_DEFAULT; + (yyval.json_on_response).m_default= (yyvsp[0].lex_string_with_metadata); + Lex->json_table->m_cur_json_table_column->m_defaults_cs= + thd->variables.collation_connection; + } +#line 42384 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1764: /* json_on_error_response: json_on_response ON ERROR_SYM */ +#line 11469 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_cur_json_table_column->m_on_error= (yyvsp[-2].json_on_response); + } +#line 42392 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1765: /* json_on_empty_response: json_on_response ON EMPTY_SYM */ +#line 11476 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_cur_json_table_column->m_on_empty= (yyvsp[-2].json_on_response); + } +#line 42400 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1766: /* $@153: %empty */ +#line 11483 "/home/buildbot/git/sql/sql_yacc.yy" + { + push_table_function_arg_context(Lex, thd->mem_root); + //TODO: introduce IN_TABLE_FUNC_ARGUMENT? + Select->parsing_place= IN_ON; + } +#line 42410 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1767: /* $@154: %empty */ +#line 11489 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_function_json_table *jt= + new (thd->mem_root) Table_function_json_table((yyvsp[-1].item)); + if (unlikely(!jt)) + MYSQL_YYABORT; + /* See comment for class Table_function_json_table: */ + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->json_table= jt; + + Select->parsing_place= NO_MATTER; + jt->set_name_resolution_context(Lex->pop_context()); + } +#line 42427 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1768: /* table_function: JSON_TABLE_SYM '(' $@153 expr ',' $@154 json_text_literal json_table_columns_clause ')' opt_table_alias_clause */ +#line 11502 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + if (unlikely((yyvsp[0].lex_str_ptr) == NULL)) + { + /* Alias is not optional. */ + my_error(ER_JSON_TABLE_ALIAS_REQUIRED, MYF(0)); + MYSQL_YYABORT; + } + if (unlikely(Lex->json_table->m_nested_path.set_path(thd, (yyvsp[-3].lex_string_with_metadata)))) + MYSQL_YYABORT; + if (!((yyval.table_list)= sel->add_table_to_list(thd, + new (thd->mem_root) Table_ident(thd, &any_db, + (yyvsp[0].lex_str_ptr), TRUE), + NULL, + TL_OPTION_TABLE_FUNCTION, + YYPS->m_lock_type, + YYPS->m_mdl_type, + 0,0,0))) + MYSQL_YYABORT; + (yyval.table_list)->table_function= Lex->json_table; + Lex->json_table= 0; + status_var_increment(thd->status_var.feature_json); + } +#line 42455 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1769: /* esc_table_ref: table_ref */ +#line 11535 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)=(yyvsp[0].table_list); } +#line 42461 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1770: /* esc_table_ref: '{' ident table_ref '}' */ +#line 11536 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)=(yyvsp[-1].table_list); } +#line 42467 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1771: /* derived_table_list: esc_table_ref */ +#line 11543 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table_list)=(yyvsp[0].table_list); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 42476 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1772: /* derived_table_list: derived_table_list ',' esc_table_ref */ +#line 11548 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 42485 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1773: /* join_table: table_ref normal_join table_ref */ +#line 11562 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + if (unlikely(Select->add_cross_joined_table((yyvsp[-2].table_list), (yyvsp[0].table_list), (yyvsp[-1].num)))) + MYSQL_YYABORT; + } +#line 42495 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1774: /* $@155: %empty */ +#line 11569 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-3].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 42509 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1775: /* join_table: table_ref normal_join table_ref ON $@155 expr */ +#line 11579 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-3].table_list)->straight=(yyvsp[-4].num); + add_join_on(thd, (yyvsp[-3].table_list), (yyvsp[0].item)); + (yyvsp[-3].table_list)->on_context= Lex->pop_context(); + Select->parsing_place= NO_MATTER; + } +#line 42520 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1776: /* $@156: %empty */ +#line 11587 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + } +#line 42530 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1777: /* join_table: table_ref normal_join table_ref USING $@156 '(' using_list ')' */ +#line 11593 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-5].table_list)->straight=(yyvsp[-6].num); + add_join_natural((yyvsp[-7].table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + (yyval.table_list)=(yyvsp[-5].table_list); + } +#line 42540 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1778: /* join_table: table_ref NATURAL inner_join table_factor */ +#line 11599 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + (yyvsp[0].table_list)->straight=(yyvsp[-1].num); + add_join_natural((yyvsp[-3].table_list),(yyvsp[0].table_list),NULL,Select); + } +#line 42552 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1779: /* $@157: %empty */ +#line 11610 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-5].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 42566 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1780: /* join_table: table_ref LEFT opt_outer JOIN_SYM table_ref ON $@157 expr */ +#line 11620 "/home/buildbot/git/sql/sql_yacc.yy" + { + add_join_on(thd, (yyvsp[-3].table_list), (yyvsp[0].item)); + (yyvsp[-3].table_list)->on_context= Lex->pop_context(); + (yyvsp[-3].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[-3].table_list); + Select->parsing_place= NO_MATTER; + } +#line 42578 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1781: /* $@158: %empty */ +#line 11628 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-4].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 42588 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1782: /* join_table: table_ref LEFT opt_outer JOIN_SYM table_factor $@158 USING '(' using_list ')' */ +#line 11634 "/home/buildbot/git/sql/sql_yacc.yy" + { + add_join_natural((yyvsp[-9].table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + (yyvsp[-5].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[-5].table_list); + } +#line 42598 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1783: /* join_table: table_ref NATURAL LEFT opt_outer JOIN_SYM table_factor */ +#line 11640 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + add_join_natural((yyvsp[-5].table_list),(yyvsp[0].table_list),NULL,Select); + (yyvsp[0].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[0].table_list); + } +#line 42611 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1784: /* $@159: %empty */ +#line 11652 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-5].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 42625 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1785: /* join_table: table_ref RIGHT opt_outer JOIN_SYM table_ref ON $@159 expr */ +#line 11662 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + add_join_on(thd, (yyval.table_list), (yyvsp[0].item)); + (yyvsp[-7].table_list)->on_context= Lex->pop_context(); + Select->parsing_place= NO_MATTER; + } +#line 42638 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1786: /* $@160: %empty */ +#line 11671 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-4].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 42648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1787: /* join_table: table_ref RIGHT opt_outer JOIN_SYM table_factor $@160 USING '(' using_list ')' */ +#line 11677 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + add_join_natural((yyval.table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + } +#line 42659 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1788: /* join_table: table_ref NATURAL RIGHT opt_outer JOIN_SYM table_factor */ +#line 11684 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + add_join_natural((yyvsp[0].table_list),(yyvsp[-5].table_list),NULL,Select); + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + } +#line 42673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1789: /* inner_join: JOIN_SYM */ +#line 11697 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 42679 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1790: /* inner_join: INNER_SYM JOIN_SYM */ +#line 11698 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 42685 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1791: /* inner_join: STRAIGHT_JOIN */ +#line 11699 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 42691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1792: /* normal_join: inner_join */ +#line 11703 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = (yyvsp[0].num); } +#line 42697 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1793: /* normal_join: CROSS JOIN_SYM */ +#line 11704 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 42703 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1794: /* opt_use_partition: %empty */ +#line 11712 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string_list)= 0;} +#line 42709 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1796: /* use_partition: PARTITION_SYM '(' using_list ')' have_partitioning */ +#line 11718 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string_list)= (yyvsp[-2].string_list); + Select->parsing_place= Select->save_parsing_place; + Select->save_parsing_place= NO_MATTER; + } +#line 42719 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1797: /* table_factor: table_primary_ident_opt_parens */ +#line 11726 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42725 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1798: /* table_factor: table_primary_derived_opt_parens */ +#line 11727 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42731 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1799: /* table_factor: join_table_parens */ +#line 11729 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].table_list)->nested_join->nest_type= 0; + (yyval.table_list)= (yyvsp[0].table_list); + } +#line 42740 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1800: /* table_factor: table_reference_list_parens */ +#line 11733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42746 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1801: /* table_factor: table_function */ +#line 11734 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42752 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1802: /* table_primary_ident_opt_parens: table_primary_ident */ +#line 11738 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42758 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1803: /* table_primary_ident_opt_parens: '(' table_primary_ident_opt_parens ')' */ +#line 11739 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 42764 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1804: /* table_primary_derived_opt_parens: table_primary_derived */ +#line 11743 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42770 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1805: /* table_primary_derived_opt_parens: '(' table_primary_derived_opt_parens ')' */ +#line 11744 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 42776 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1806: /* table_reference_list_parens: '(' table_reference_list_parens ')' */ +#line 11748 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 42782 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1807: /* table_reference_list_parens: '(' nested_table_reference_list ')' */ +#line 11750 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->end_nested_join(thd))) + MYSQL_YYABORT; + } +#line 42791 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1808: /* nested_table_reference_list: table_ref ',' table_ref */ +#line 11758 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Select->init_nested_join(thd)) + MYSQL_YYABORT; + Select->add_joined_table((yyvsp[-2].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + (yyval.table_list)= (yyvsp[-2].table_list)->embedding; + } +#line 42803 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1809: /* nested_table_reference_list: nested_table_reference_list ',' table_ref */ +#line 11766 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->add_joined_table((yyvsp[0].table_list)); + (yyval.table_list)= (yyvsp[-2].table_list); + } +#line 42812 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1810: /* join_table_parens: '(' join_table_parens ')' */ +#line 11773 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 42818 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1811: /* join_table_parens: '(' join_table ')' */ +#line 11775 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!((yyval.table_list)= lex->current_select->nest_last_join(thd))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 42831 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1812: /* table_primary_ident: table_ident opt_use_partition opt_for_system_time_clause opt_table_alias_clause opt_key_definition */ +#line 11789 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->add_table_to_list(thd, (yyvsp[-4].table), (yyvsp[-1].lex_str_ptr), + 0, + YYPS->m_lock_type, + YYPS->m_mdl_type, + Select->pop_index_hints(), + (yyvsp[-3].string_list)))) + MYSQL_YYABORT; + if ((yyvsp[-2].num)) + (yyval.table_list)->vers_conditions= Lex->vers_conditions; + } +#line 42847 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1813: /* table_primary_derived: subquery opt_for_system_time_clause table_alias_clause */ +#line 11805 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Lex->parsed_derived_table((yyvsp[-2].select_lex)->master_unit(), (yyvsp[-1].num), (yyvsp[0].lex_str_ptr)))) + MYSQL_YYABORT; + } +#line 42856 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1814: /* table_primary_derived: subquery opt_for_system_time_clause */ +#line 11812 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING alias; + if ((yyvsp[-1].select_lex)->make_unique_derived_name(thd, &alias) || + !((yyval.table_list)= Lex->parsed_derived_table((yyvsp[-1].select_lex)->master_unit(), (yyvsp[0].num), &alias))) + MYSQL_YYABORT; + } +#line 42867 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1815: /* opt_outer: %empty */ +#line 11822 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42873 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1816: /* opt_outer: OUTER */ +#line 11823 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42879 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1817: /* index_hint_clause: %empty */ +#line 11828 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (thd->variables.old_behavior & OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN) ? + INDEX_HINT_MASK_JOIN : INDEX_HINT_MASK_ALL; + } +#line 42888 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1818: /* index_hint_clause: FOR_SYM JOIN_SYM */ +#line 11832 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_JOIN; } +#line 42894 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1819: /* index_hint_clause: FOR_SYM ORDER_SYM BY */ +#line 11833 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_ORDER; } +#line 42900 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1820: /* index_hint_clause: FOR_SYM GROUP_SYM BY */ +#line 11834 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_GROUP; } +#line 42906 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1821: /* index_hint_type: FORCE_SYM */ +#line 11838 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.index_hint)= INDEX_HINT_FORCE; } +#line 42912 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1822: /* index_hint_type: IGNORE_SYM */ +#line 11839 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.index_hint)= INDEX_HINT_IGNORE; } +#line 42918 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1823: /* $@161: %empty */ +#line 11844 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_index_hint_type((yyvsp[-2].index_hint), (yyvsp[0].num)); + } +#line 42926 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1825: /* $@162: %empty */ +#line 11849 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_index_hint_type(INDEX_HINT_USE, (yyvsp[0].num)); + } +#line 42934 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1830: /* $@163: %empty */ +#line 11862 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->alloc_index_hints(thd); } +#line 42940 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1832: /* $@164: %empty */ +#line 11866 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->clear_index_hints(); } +#line 42946 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1834: /* opt_key_usage_list: %empty */ +#line 11871 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, NULL, 0); } +#line 42952 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1835: /* opt_key_usage_list: key_usage_list */ +#line 11872 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42958 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1836: /* key_usage_element: ident */ +#line 11877 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, (yyvsp[0].ident_sys).str, (yyvsp[0].ident_sys).length); } +#line 42964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1837: /* key_usage_element: PRIMARY_SYM */ +#line 11879 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, "PRIMARY", 7); } +#line 42970 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1840: /* using_list: ident */ +#line 11889 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.string_list)= new (thd->mem_root) List))) + MYSQL_YYABORT; + String *s= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(unlikely(s == NULL))) + MYSQL_YYABORT; + (yyval.string_list)->push_back(s, thd->mem_root); + } +#line 42985 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1841: /* using_list: using_list ',' ident */ +#line 11900 "/home/buildbot/git/sql/sql_yacc.yy" + { + String *s= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(unlikely(s == NULL))) + MYSQL_YYABORT; + if (unlikely((yyvsp[-2].string_list)->push_back(s, thd->mem_root))) + MYSQL_YYABORT; + (yyval.string_list)= (yyvsp[-2].string_list); + } +#line 43000 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1842: /* interval: interval_time_stamp */ +#line 11913 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1843: /* interval: DAY_HOUR_SYM */ +#line 11914 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_HOUR; } +#line 43012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1844: /* interval: DAY_MICROSECOND_SYM */ +#line 11915 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_MICROSECOND; } +#line 43018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1845: /* interval: DAY_MINUTE_SYM */ +#line 11916 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_MINUTE; } +#line 43024 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1846: /* interval: DAY_SECOND_SYM */ +#line 11917 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_SECOND; } +#line 43030 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1847: /* interval: HOUR_MICROSECOND_SYM */ +#line 11918 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_MICROSECOND; } +#line 43036 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1848: /* interval: HOUR_MINUTE_SYM */ +#line 11919 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_MINUTE; } +#line 43042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1849: /* interval: HOUR_SECOND_SYM */ +#line 11920 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_SECOND; } +#line 43048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1850: /* interval: MINUTE_MICROSECOND_SYM */ +#line 11921 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_MINUTE_MICROSECOND; } +#line 43054 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1851: /* interval: MINUTE_SECOND_SYM */ +#line 11922 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_MINUTE_SECOND; } +#line 43060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1852: /* interval: SECOND_MICROSECOND_SYM */ +#line 11923 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_SECOND_MICROSECOND; } +#line 43066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1853: /* interval: YEAR_MONTH_SYM */ +#line 11924 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_YEAR_MONTH; } +#line 43072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1854: /* interval_time_stamp: DAY_SYM */ +#line 11928 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_DAY; } +#line 43078 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1855: /* interval_time_stamp: WEEK_SYM */ +#line 11929 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_WEEK; } +#line 43084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1856: /* interval_time_stamp: HOUR_SYM */ +#line 11930 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_HOUR; } +#line 43090 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1857: /* interval_time_stamp: MINUTE_SYM */ +#line 11931 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MINUTE; } +#line 43096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1858: /* interval_time_stamp: MONTH_SYM */ +#line 11932 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MONTH; } +#line 43102 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1859: /* interval_time_stamp: QUARTER_SYM */ +#line 11933 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_QUARTER; } +#line 43108 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1860: /* interval_time_stamp: SECOND_SYM */ +#line 11934 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_SECOND; } +#line 43114 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1861: /* interval_time_stamp: MICROSECOND_SYM */ +#line 11935 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MICROSECOND; } +#line 43120 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1862: /* interval_time_stamp: YEAR_SYM */ +#line 11936 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_YEAR; } +#line 43126 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1863: /* date_time_type: DATE_SYM */ +#line 11940 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATE;} +#line 43132 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1864: /* date_time_type: TIME_SYM */ +#line 11941 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_TIME;} +#line 43138 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1865: /* date_time_type: DATETIME */ +#line 11942 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATETIME;} +#line 43144 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1866: /* date_time_type: TIMESTAMP */ +#line 11943 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATETIME;} +#line 43150 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1870: /* opt_table_alias_clause: %empty */ +#line 11953 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str_ptr)=0; } +#line 43156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1871: /* opt_table_alias_clause: table_alias_clause */ +#line 11954 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str_ptr)= (yyvsp[0].lex_str_ptr); } +#line 43162 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1872: /* table_alias_clause: table_alias ident_table_alias */ +#line 11959 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str_ptr)= (LEX_CSTRING*) thd->memdup(&(yyvsp[0].ident_sys),sizeof(LEX_STRING)); + if (unlikely((yyval.lex_str_ptr) == NULL)) + MYSQL_YYABORT; + } +#line 43172 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1875: /* opt_where_clause: %empty */ +#line 11972 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->where= 0; } +#line 43178 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1876: /* $@165: %empty */ +#line 11974 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_WHERE; + } +#line 43186 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1877: /* opt_where_clause: WHERE $@165 expr */ +#line 11978 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *select= Select; + select->where= normalize_cond(thd, (yyvsp[0].item)); + select->parsing_place= NO_MATTER; + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + } +#line 43198 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1879: /* $@166: %empty */ +#line 11990 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_HAVING; + } +#line 43206 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1880: /* opt_having_clause: HAVING $@166 expr */ +#line 11994 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->having= normalize_cond(thd, (yyvsp[0].item)); + sel->parsing_place= NO_MATTER; + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + } +#line 43218 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1883: /* group_list: group_list ',' order_ident order_dir */ +#line 12014 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_group_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 43227 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1884: /* group_list: order_ident order_dir */ +#line 12019 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_group_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 43236 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1885: /* olap_opt: %empty */ +#line 12026 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43242 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1886: /* olap_opt: WITH_CUBE_SYM */ +#line 12028 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + 'WITH CUBE' is reserved in the MySQL syntax, but not implemented, + and cause LALR(2) conflicts. + This syntax is not standard. + MySQL syntax: GROUP BY col1, col2, col3 WITH CUBE + SQL-2003: GROUP BY ... CUBE(col1, col2, col3) + */ + LEX *lex=Lex; + if (unlikely(lex->current_select->get_linkage() == GLOBAL_OPTIONS_TYPE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "WITH CUBE", + "global union parameters")); + lex->current_select->olap= CUBE_TYPE; + + my_yyabort_error((ER_NOT_SUPPORTED_YET, MYF(0), "CUBE")); + } +#line 43263 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1887: /* olap_opt: WITH_ROLLUP_SYM */ +#line 12045 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + 'WITH ROLLUP' is needed for backward compatibility, + and cause LALR(2) conflicts. + This syntax is not standard. + MySQL syntax: GROUP BY col1, col2, col3 WITH ROLLUP + SQL-2003: GROUP BY ... ROLLUP(col1, col2, col3) + */ + LEX *lex= Lex; + if (unlikely(lex->current_select->get_linkage() == GLOBAL_OPTIONS_TYPE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "WITH ROLLUP", + "global union parameters")); + lex->current_select->olap= ROLLUP_TYPE; + } +#line 43282 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1888: /* opt_window_clause: %empty */ +#line 12067 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43288 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1889: /* opt_window_clause: WINDOW_SYM window_def_list */ +#line 12070 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43294 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1892: /* window_def: window_name AS window_spec */ +#line 12080 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_def(thd, (yyvsp[-2].lex_str_ptr), lex->win_ref, + Select->group_list, + Select->order_list, + lex->win_frame))) + MYSQL_YYABORT; + } +#line 43307 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1893: /* $@167: %empty */ +#line 12092 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->prepare_add_window_spec(thd); } +#line 43313 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1894: /* window_spec: '(' $@167 opt_window_ref opt_window_partition_clause opt_window_order_clause opt_window_frame_clause ')' */ +#line 12096 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 43319 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1895: /* opt_window_ref: %empty */ +#line 12100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1896: /* opt_window_ref: ident */ +#line 12102 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->win_ref= (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + if (unlikely(thd->lex->win_ref == NULL)) + MYSQL_YYABORT; + } +#line 43335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1897: /* opt_window_partition_clause: %empty */ +#line 12110 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 43341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1899: /* opt_window_order_clause: %empty */ +#line 12115 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 43347 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1900: /* opt_window_order_clause: ORDER_SYM BY order_list */ +#line 12116 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->order_list= *((yyvsp[0].select_order)); } +#line 43353 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1901: /* opt_window_frame_clause: %empty */ +#line 12120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43359 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1902: /* opt_window_frame_clause: window_frame_units window_frame_extent opt_window_frame_exclusion */ +#line 12122 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->win_frame= + new (thd->mem_root) Window_frame((yyvsp[-2].frame_units), + lex->frame_top_bound, + lex->frame_bottom_bound, + (yyvsp[0].frame_exclusion)); + if (unlikely(lex->win_frame == NULL)) + MYSQL_YYABORT; + } +#line 43374 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1903: /* window_frame_units: ROWS_SYM */ +#line 12135 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_units)= Window_frame::UNITS_ROWS; } +#line 43380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1904: /* window_frame_units: RANGE_SYM */ +#line 12136 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_units)= Window_frame::UNITS_RANGE; } +#line 43386 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1905: /* window_frame_extent: window_frame_start */ +#line 12141 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->frame_top_bound= (yyvsp[0].window_frame_bound); + lex->frame_bottom_bound= + new (thd->mem_root) + Window_frame_bound(Window_frame_bound::CURRENT, NULL); + if (unlikely(lex->frame_bottom_bound == NULL)) + MYSQL_YYABORT; + } +#line 43400 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1906: /* window_frame_extent: BETWEEN_SYM window_frame_bound AND_SYM window_frame_bound */ +#line 12151 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->frame_top_bound= (yyvsp[-2].window_frame_bound); + lex->frame_bottom_bound= (yyvsp[0].window_frame_bound); + } +#line 43410 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1907: /* window_frame_start: UNBOUNDED_SYM PRECEDING_SYM */ +#line 12160 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::PRECEDING, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 43421 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1908: /* window_frame_start: CURRENT_SYM ROW_SYM */ +#line 12167 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::CURRENT, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 43432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1909: /* window_frame_start: literal PRECEDING_SYM */ +#line 12174 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::PRECEDING, (yyvsp[-1].item)); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 43443 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1910: /* window_frame_bound: window_frame_start */ +#line 12183 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.window_frame_bound)= (yyvsp[0].window_frame_bound); } +#line 43449 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1911: /* window_frame_bound: UNBOUNDED_SYM FOLLOWING_SYM */ +#line 12185 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::FOLLOWING, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 43460 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1912: /* window_frame_bound: literal FOLLOWING_SYM */ +#line 12192 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::FOLLOWING, (yyvsp[-1].item)); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 43471 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1913: /* opt_window_frame_exclusion: %empty */ +#line 12201 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 43477 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1914: /* opt_window_frame_exclusion: EXCLUDE_SYM CURRENT_SYM ROW_SYM */ +#line 12203 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_CURRENT_ROW; } +#line 43483 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1915: /* opt_window_frame_exclusion: EXCLUDE_SYM GROUP_SYM */ +#line 12205 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_GROUP; } +#line 43489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1916: /* opt_window_frame_exclusion: EXCLUDE_SYM TIES_SYM */ +#line 12207 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_TIES; } +#line 43495 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1917: /* opt_window_frame_exclusion: EXCLUDE_SYM NO_SYM OTHERS_MARIADB_SYM */ +#line 12209 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 43501 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1918: /* opt_window_frame_exclusion: EXCLUDE_SYM NO_SYM OTHERS_ORACLE_SYM */ +#line 12211 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 43507 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1922: /* alter_order_item: simple_ident_nospvar order_dir */ +#line 12229 "/home/buildbot/git/sql/sql_yacc.yy" + { + bool ascending= ((yyvsp[0].num) == 1) ? true : false; + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item), ascending))) + MYSQL_YYABORT; + } +#line 43517 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1923: /* opt_order_clause: %empty */ +#line 12242 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_order)= NULL; } +#line 43523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1924: /* opt_order_clause: order_clause */ +#line 12244 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_order)= (yyvsp[0].select_order); } +#line 43529 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1925: /* $@168: %empty */ +#line 12249 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->where= "ORDER clause"; + } +#line 43537 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1926: /* order_clause: ORDER_SYM BY $@168 order_list */ +#line 12253 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= (yyvsp[0].select_order); + } +#line 43545 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1927: /* order_list: order_list ',' order_ident order_dir */ +#line 12260 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= (yyvsp[-3].select_order); + if (add_to_list(thd, *(yyval.select_order), (yyvsp[-1].item),(bool) (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 43555 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1928: /* order_list: order_ident order_dir */ +#line 12266 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= new (thd->mem_root) SQL_I_List(); + if (add_to_list(thd, *(yyval.select_order), (yyvsp[-1].item), (bool) (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 43565 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1929: /* order_dir: %empty */ +#line 12274 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 43571 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1930: /* order_dir: ASC */ +#line 12275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 43577 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1931: /* order_dir: DESC */ +#line 12276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 43583 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1932: /* opt_limit_clause: %empty */ +#line 12282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_limit).clear(); } +#line 43589 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1933: /* opt_limit_clause: limit_clause */ +#line 12284 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_limit)= (yyvsp[0].select_limit); } +#line 43595 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1934: /* limit_clause: LIMIT limit_options */ +#line 12289 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[0].select_limit); + if (!(yyval.select_limit).select_limit->basic_const_item() || + (yyval.select_limit).select_limit->val_int() > 0) + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 43606 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1935: /* limit_clause: LIMIT limit_options ROWS_SYM EXAMINED_SYM limit_rows_option */ +#line 12297 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[-3].select_limit); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 43615 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1936: /* limit_clause: LIMIT ROWS_SYM EXAMINED_SYM limit_rows_option */ +#line 12302 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).clear(); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 43624 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1937: /* limit_clause: fetch_first_clause */ +#line 12307 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[0].select_limit); + if (!(yyval.select_limit).select_limit || + !(yyval.select_limit).select_limit->basic_const_item() || + (yyval.select_limit).select_limit->val_int() > 0) + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 43636 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1938: /* fetch_first_clause: FETCH_SYM first_or_next row_or_rows only_or_with_ties */ +#line 12318 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + (yyval.select_limit).select_limit= one; + (yyval.select_limit).offset_limit= 0; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 43650 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1939: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows FETCH_SYM first_or_next row_or_rows only_or_with_ties */ +#line 12329 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + (yyval.select_limit).select_limit= one; + (yyval.select_limit).offset_limit= (yyvsp[-5].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 43664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1940: /* fetch_first_clause: FETCH_SYM first_or_next limit_option row_or_rows only_or_with_ties */ +#line 12339 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= 0; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 43675 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1941: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows FETCH_SYM first_or_next limit_option row_or_rows only_or_with_ties */ +#line 12347 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= (yyvsp[-6].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 43686 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1942: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows */ +#line 12354 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= 0; + (yyval.select_limit).offset_limit= (yyvsp[-1].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 43697 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1947: /* only_or_with_ties: ONLY_SYM */ +#line 12373 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 43703 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1948: /* only_or_with_ties: WITH TIES_SYM */ +#line 12374 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 43709 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1949: /* opt_global_limit_clause: opt_limit_clause */ +#line 12380 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->limit_params= (yyvsp[0].select_limit); + } +#line 43717 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1950: /* limit_options: limit_option */ +#line 12387 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[0].item); + (yyval.select_limit).offset_limit= NULL; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 43728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1951: /* limit_options: limit_option ',' limit_option */ +#line 12394 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[0].item); + (yyval.select_limit).offset_limit= (yyvsp[-2].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 43739 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1952: /* limit_options: limit_option OFFSET_SYM limit_option */ +#line 12401 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= (yyvsp[0].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 43750 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1953: /* limit_option: ident_cli */ +#line 12411 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_limit(thd, &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 43759 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1954: /* limit_option: ident_cli '.' ident_cli */ +#line 12416 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_limit(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 43768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1955: /* limit_option: param_marker */ +#line 12421 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_param)->limit_clause_param= TRUE; + } +#line 43776 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1956: /* limit_option: ULONGLONG_NUM */ +#line 12425 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 43786 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1957: /* limit_option: LONG_NUM */ +#line 12431 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 43796 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1958: /* limit_option: NUM */ +#line 12437 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 43806 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1959: /* limit_rows_option: limit_option */ +#line 12446 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->limit_rows_examined= (yyvsp[0].item); + } +#line 43814 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1960: /* delete_limit_clause: %empty */ +#line 12453 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->current_select->limit_params.select_limit= 0; + } +#line 43823 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1961: /* delete_limit_clause: LIMIT limit_option */ +#line 12458 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->limit_params.select_limit= (yyvsp[0].item); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + sel->limit_params.explicit_limit= 1; + } +#line 43834 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1962: /* delete_limit_clause: LIMIT ROWS_SYM EXAMINED_SYM */ +#line 12464 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(); MYSQL_YYABORT; } +#line 43840 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1963: /* delete_limit_clause: LIMIT limit_option ROWS_SYM EXAMINED_SYM */ +#line 12465 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(); MYSQL_YYABORT; } +#line 43846 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1964: /* order_limit_lock: order_or_limit */ +#line 12470 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= (yyvsp[0].order_limit_lock); + (yyval.order_limit_lock)->lock.empty(); + } +#line 43855 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1965: /* order_limit_lock: order_or_limit select_lock_type */ +#line 12475 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= (yyvsp[-1].order_limit_lock); + (yyval.order_limit_lock)->lock= (yyvsp[0].select_lock); + } +#line 43864 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1966: /* order_limit_lock: select_lock_type */ +#line 12480 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= NULL; + (yyval.order_limit_lock)->limit.clear(); + (yyval.order_limit_lock)->lock= (yyvsp[0].select_lock); + } +#line 43877 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1967: /* opt_order_limit_lock: %empty */ +#line 12492 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyval.order_limit_lock)= NULL; + } +#line 43886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1968: /* opt_order_limit_lock: order_limit_lock */ +#line 12496 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.order_limit_lock)= (yyvsp[0].order_limit_lock); } +#line 43892 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1971: /* opt_procedure_or_into: %empty */ +#line 12509 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 43900 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1972: /* opt_procedure_or_into: procedure_clause opt_select_lock_type */ +#line 12513 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 43908 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1973: /* opt_procedure_or_into: into opt_select_lock_type */ +#line 12517 "/home/buildbot/git/sql/sql_yacc.yy" + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), + " INTO " + " FROM...'"); + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 43922 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1974: /* order_or_limit: order_clause opt_limit_clause */ +#line 12531 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= (yyvsp[-1].select_order); + (yyval.order_limit_lock)->limit= (yyvsp[0].select_limit); + } +#line 43934 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1975: /* order_or_limit: limit_clause */ +#line 12539 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= NULL; + (yyval.order_limit_lock)->limit= (yyvsp[0].select_limit); + } +#line 43946 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1978: /* int_num: opt_plus NUM */ +#line 12555 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.num)= (int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43952 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1979: /* int_num: '-' NUM */ +#line 12556 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.num)= -(int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43958 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1980: /* ulong_num: opt_plus NUM */ +#line 12560 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1981: /* ulong_num: HEX_NUM */ +#line 12561 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= strtoul((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 43970 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1982: /* ulong_num: opt_plus LONG_NUM */ +#line 12562 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43976 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1983: /* ulong_num: opt_plus ULONGLONG_NUM */ +#line 12563 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43982 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1984: /* ulong_num: opt_plus DECIMAL_NUM */ +#line 12564 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43988 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1985: /* ulong_num: opt_plus FLOAT_NUM */ +#line 12565 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43994 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1986: /* real_ulong_num: NUM */ +#line 12569 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44000 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1987: /* real_ulong_num: HEX_NUM */ +#line 12570 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (ulong) strtol((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 44006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1988: /* real_ulong_num: LONG_NUM */ +#line 12571 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1989: /* real_ulong_num: ULONGLONG_NUM */ +#line 12572 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1990: /* real_ulong_num: dec_num_error */ +#line 12573 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT; } +#line 44024 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1991: /* longlong_num: opt_plus NUM */ +#line 12577 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= (longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44030 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1992: /* longlong_num: LONG_NUM */ +#line 12578 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= (longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44036 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1993: /* longlong_num: '-' NUM */ +#line 12579 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= -(longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1994: /* longlong_num: '-' LONG_NUM */ +#line 12580 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= -(longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1995: /* ulonglong_num: opt_plus NUM */ +#line 12584 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44054 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1996: /* ulonglong_num: opt_plus ULONGLONG_NUM */ +#line 12585 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1997: /* ulonglong_num: opt_plus LONG_NUM */ +#line 12586 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1998: /* ulonglong_num: opt_plus DECIMAL_NUM */ +#line 12587 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1999: /* ulonglong_num: opt_plus FLOAT_NUM */ +#line 12588 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44078 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2000: /* real_ulonglong_num: NUM */ +#line 12592 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2001: /* real_ulonglong_num: ULONGLONG_NUM */ +#line 12593 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44090 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2002: /* real_ulonglong_num: HEX_NUM */ +#line 12594 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulonglong_number)= strtoull((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 44096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2003: /* real_ulonglong_num: LONG_NUM */ +#line 12595 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44102 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2004: /* real_ulonglong_num: dec_num_error */ +#line 12596 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT; } +#line 44108 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2005: /* dec_num_error: dec_num */ +#line 12601 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(ER_ONLY_INTEGERS_ALLOWED); } +#line 44114 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2008: /* choice: ulong_num */ +#line 12610 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.choice)= (yyvsp[0].ulong_num) != 0 ? HA_CHOICE_YES : HA_CHOICE_NO; } +#line 44120 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2009: /* choice: DEFAULT */ +#line 12611 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.choice)= HA_CHOICE_UNDEF; } +#line 44126 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2010: /* bool: ulong_num */ +#line 12615 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num) != 0; } +#line 44132 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2011: /* bool: TRUE_SYM */ +#line 12616 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1; } +#line 44138 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2012: /* bool: FALSE_SYM */ +#line 12617 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 44144 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2013: /* $@169: %empty */ +#line 12622 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->proc_list.elements=0; + lex->proc_list.first=0; + lex->proc_list.next= &lex->proc_list.first; + Item_field *item= new (thd->mem_root) + Item_field(thd, &lex->current_select->context, + (yyvsp[0].ident_sys)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + if (unlikely(add_proc_to_list(thd, item))) + MYSQL_YYABORT; + Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + + /* + PROCEDURE CLAUSE cannot handle subquery as one of its parameter, + so disallow any subqueries further. + Alow subqueries back once the parameters are reduced. + */ + Lex->clause_that_disallows_subselect= "PROCEDURE"; + Select->options|= OPTION_PROCEDURE_CLAUSE; + } +#line 44172 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2014: /* procedure_clause: PROCEDURE_SYM ident $@169 '(' procedure_list ')' */ +#line 12646 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Subqueries are allowed from now.*/ + Lex->clause_that_disallows_subselect= NULL; + } +#line 44181 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2015: /* procedure_list: %empty */ +#line 12653 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44187 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2016: /* procedure_list: procedure_list2 */ +#line 12654 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44193 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2019: /* procedure_item: remember_name expr remember_end */ +#line 12664 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_proc_to_list(thd, (yyvsp[-1].item)))) + MYSQL_YYABORT; + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 44204 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2020: /* $@170: %empty */ +#line 12673 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (!lex->describe && + unlikely((!(lex->result= new (thd->mem_root) + select_dumpvar(thd))))) + MYSQL_YYABORT; + } +#line 44216 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2021: /* select_var_list_init: $@170 select_var_list */ +#line 12681 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44222 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2023: /* select_var_list: select_var_ident */ +#line 12686 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44228 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2024: /* select_var_ident: select_outvar */ +#line 12690 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->result) + { + if (unlikely((yyvsp[0].myvar) == NULL)) + MYSQL_YYABORT; + ((select_dumpvar *)Lex->result)->var_list.push_back((yyvsp[0].myvar), thd->mem_root); + } + else + { + /* + The parser won't create select_result instance only + if it's an EXPLAIN. + */ + DBUG_ASSERT(Lex->describe); + } + } +#line 44249 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2025: /* select_outvar: '@' ident_or_text */ +#line 12710 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + (yyval.myvar) = Lex->result ? new (thd->mem_root) my_var_user(&(yyvsp[0].lex_str)) : NULL; + } +#line 44263 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2026: /* select_outvar: ident_or_text */ +#line 12720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.myvar)= Lex->create_outvar(thd, &(yyvsp[0].lex_str))) && Lex->result)) + MYSQL_YYABORT; + } +#line 44272 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2027: /* select_outvar: ident '.' ident */ +#line 12725 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.myvar)= Lex->create_outvar(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))) && Lex->result)) + MYSQL_YYABORT; + } +#line 44281 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2028: /* into: INTO into_destination */ +#line 12733 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44287 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2029: /* $@171: %empty */ +#line 12738 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + if (unlikely(!(lex->exchange= + new (thd->mem_root) sql_exchange((yyvsp[0].lex_str).str, 0))) || + unlikely(!(lex->result= + new (thd->mem_root) + select_export(thd, lex->exchange)))) + MYSQL_YYABORT; + } +#line 44302 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2030: /* $@172: %empty */ +#line 12749 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->cs= (yyvsp[0].charset); } +#line 44308 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2032: /* into_destination: DUMPFILE TEXT_STRING_filesystem */ +#line 12752 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (!lex->describe) + { + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + if (unlikely(!(lex->exchange= + new (thd->mem_root) sql_exchange((yyvsp[0].lex_str).str,1)))) + MYSQL_YYABORT; + if (unlikely(!(lex->result= + new (thd->mem_root) + select_dump(thd, lex->exchange)))) + MYSQL_YYABORT; + } + } +#line 44327 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2033: /* into_destination: select_var_list_init */ +#line 12767 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + } +#line 44335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2034: /* $@173: %empty */ +#line 12778 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_DO; + if (lex->main_select_push(true)) + MYSQL_YYABORT; + lex->init_select(); + } +#line 44347 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2035: /* do: DO_SYM $@173 expr_list */ +#line 12786 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->insert_list= (yyvsp[0].item_list); + Lex->pop_select(); //main select + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 44358 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2036: /* $@174: %empty */ +#line 12800 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_command(SQLCOM_DROP_TABLE, (yyvsp[-2].num), (yyvsp[0].object_ddl_options)); + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 44369 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2037: /* drop: DROP opt_temporary table_or_tables opt_if_exists $@174 table_list opt_lock_wait_timeout opt_restrict */ +#line 12807 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44375 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2038: /* $@175: %empty */ +#line 12809 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 44384 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2039: /* drop: DROP INDEX_SYM $@175 opt_if_exists_table_element ident ON table_ident opt_lock_wait_timeout */ +#line 12814 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, (yyvsp[-3].ident_sys).str, (yyvsp[-4].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->sql_command= SQLCOM_DROP_INDEX; + lex->alter_info.reset(); + lex->alter_info.flags= ALTER_DROP_INDEX; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + if (unlikely(!lex->current_select-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + TL_READ_NO_INSERT, + MDL_SHARED_UPGRADABLE))) + MYSQL_YYABORT; + Lex->pop_select(); //main select + } +#line 44406 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2040: /* drop: DROP DATABASE opt_if_exists ident */ +#line 12832 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_command(SQLCOM_DROP_DB, (yyvsp[-1].object_ddl_options)); + lex->name= (yyvsp[0].ident_sys); + } +#line 44416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2041: /* drop: DROP USER_SYM opt_if_exists clear_privileges user_list */ +#line 12838 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_USER, (yyvsp[-2].object_ddl_options)); + } +#line 44424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2042: /* drop: DROP ROLE_SYM opt_if_exists clear_privileges role_list */ +#line 12842 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_ROLE, (yyvsp[-2].object_ddl_options)); + } +#line 44432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2043: /* $@176: %empty */ +#line 12846 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_VIEW, (yyvsp[0].object_ddl_options)); + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 44443 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2044: /* drop: DROP VIEW_SYM opt_if_exists $@176 table_list opt_restrict */ +#line 12853 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44449 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2045: /* drop: DROP EVENT_SYM opt_if_exists sp_name */ +#line 12855 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->spname= (yyvsp[0].spname); + Lex->set_command(SQLCOM_DROP_EVENT, (yyvsp[-1].object_ddl_options)); + } +#line 44458 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2046: /* drop: DROP TRIGGER_SYM opt_if_exists sp_name */ +#line 12860 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_TRIGGER, (yyvsp[-1].object_ddl_options)); + lex->spname= (yyvsp[0].spname); + } +#line 44468 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2047: /* drop: DROP SERVER_SYM opt_if_exists ident_or_text */ +#line 12866 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_SERVER, (yyvsp[-1].object_ddl_options)); + Lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 44477 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2048: /* $@177: %empty */ +#line 12872 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_SEQUENCE, (yyvsp[-2].num), (yyvsp[0].object_ddl_options)); + lex->table_type= TABLE_TYPE_SEQUENCE; + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 44489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2049: /* drop: DROP opt_temporary SEQUENCE_SYM opt_if_exists $@177 table_list */ +#line 12880 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44495 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2053: /* table_name: table_ident */ +#line 12891 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!thd->lex->current_select_or_default()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, + TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type)) + MYSQL_YYABORT; + } +#line 44508 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2054: /* table_name_with_opt_use_partition: table_ident opt_use_partition */ +#line 12903 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, + TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type, + NULL, + (yyvsp[0].string_list)))) + MYSQL_YYABORT; + } +#line 44522 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2057: /* table_alias_ref: table_ident_opt_wild */ +#line 12921 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select-> + add_table_to_list(thd, (yyvsp[0].table), NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 44536 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2058: /* opt_if_exists_table_element: %empty */ +#line 12934 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= FALSE; + (yyval.num)= 0; + } +#line 44545 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2059: /* opt_if_exists_table_element: IF_SYM EXISTS */ +#line 12939 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= TRUE; + (yyval.num)= 1; + } +#line 44554 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2060: /* opt_if_exists: %empty */ +#line 12947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_NONE); + } +#line 44562 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2061: /* opt_if_exists: IF_SYM EXISTS */ +#line 12951 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_IF_EXISTS); + } +#line 44570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2062: /* opt_temporary: %empty */ +#line 12957 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 44576 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2063: /* opt_temporary: TEMPORARY */ +#line 12958 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= HA_LEX_CREATE_TMP_TABLE; } +#line 44582 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2064: /* $@178: %empty */ +#line 12966 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_INSERT; + Lex->duplicates= DUP_ERROR; + thd->get_stmt_da()->opt_clear_warning_info(thd->query_id); + thd->get_stmt_da()->reset_current_row_for_warning(1); + } +#line 44593 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2065: /* $@179: %empty */ +#line 12973 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_lock_for_tables((yyvsp[-3].lock_type), true, false); + } +#line 44601 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2066: /* insert: INSERT $@178 insert_start insert_lock_option opt_ignore opt_into insert_table $@179 insert_field_spec opt_insert_update opt_returning stmt_end */ +#line 12978 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + thd->get_stmt_da()->reset_current_row_for_warning(0); + } +#line 44610 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2067: /* $@180: %empty */ +#line 12986 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_REPLACE; + Lex->duplicates= DUP_REPLACE; + thd->get_stmt_da()->opt_clear_warning_info(thd->query_id); + thd->get_stmt_da()->reset_current_row_for_warning(1); + } +#line 44621 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2068: /* $@181: %empty */ +#line 12993 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_lock_for_tables((yyvsp[-2].lock_type), true, false); + } +#line 44629 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2069: /* replace: REPLACE $@180 insert_start replace_lock_option opt_into insert_table $@181 insert_field_spec opt_returning stmt_end */ +#line 12998 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + thd->get_stmt_da()->reset_current_row_for_warning(0); + } +#line 44638 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2070: /* insert_start: %empty */ +#line 13004 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->init_select(); + Lex->inc_select_stack_outer_barrier(); + Lex->current_select->parsing_place= BEFORE_OPT_LIST; + } +#line 44650 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2071: /* stmt_end: %empty */ +#line 13013 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 44660 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2072: /* insert_lock_option: %empty */ +#line 13022 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + If it is SP we do not allow insert optimisation when result of + insert visible only after the table unlocking but everyone can + read table. + */ + (yyval.lock_type)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 44673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2074: /* insert_lock_option: HIGH_PRIORITY */ +#line 13031 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE; } +#line 44679 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2075: /* replace_lock_option: %empty */ +#line 13035 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 44685 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2077: /* insert_replace_option: LOW_PRIORITY */ +#line 13040 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 44691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2078: /* insert_replace_option: DELAYED_SYM */ +#line 13042 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->keyword_delayed_begin_offset= (uint)((yyvsp[0].kwd).pos() - thd->query()); + Lex->keyword_delayed_end_offset= (uint)((yyvsp[0].kwd).end() - thd->query()); + (yyval.lock_type)= TL_WRITE_DELAYED; + } +#line 44701 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2081: /* $@182: %empty */ +#line 13052 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->save_parsing_place= Select->parsing_place; + } +#line 44709 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2082: /* insert_table: $@182 table_name_with_opt_use_partition */ +#line 13056 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + //lex->field_list.empty(); + lex->many_values.empty(); + lex->insert_list=0; + } +#line 44720 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2083: /* insert_field_spec: insert_values */ +#line 13065 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44726 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2084: /* insert_field_spec: insert_field_list insert_values */ +#line 13066 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44732 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2085: /* $@183: %empty */ +#line 13068 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item)) || + unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + lex->current_select->parsing_place= NO_MATTER; + } +#line 44745 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2087: /* insert_field_list: LEFT_PAREN_ALT opt_fields ')' */ +#line 13081 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->current_select->parsing_place= AFTER_LIST; + } +#line 44753 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2090: /* fields: fields ',' insert_ident */ +#line 13093 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 44759 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2091: /* fields: insert_ident */ +#line 13094 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 44765 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2092: /* insert_values: create_select_query_expression */ +#line 13100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44771 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2097: /* ident_eq_value: simple_ident_nospvar equal expr_or_ignore_or_default */ +#line 13115 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->field_list.push_back((yyvsp[-2].item), thd->mem_root)) || + unlikely(lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 44782 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2098: /* equal: '=' */ +#line 13124 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44788 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2099: /* equal: SET_VAR */ +#line 13125 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44794 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2100: /* opt_equal: %empty */ +#line 13129 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44800 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2101: /* opt_equal: equal */ +#line 13130 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44806 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2102: /* opt_with: opt_equal */ +#line 13134 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44812 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2103: /* opt_with: WITH */ +#line 13135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44818 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2104: /* opt_by: opt_equal */ +#line 13139 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44824 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2105: /* opt_by: BY */ +#line 13140 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44830 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2106: /* $@184: %empty */ +#line 13145 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 44839 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2107: /* no_braces: '(' $@184 opt_values ')' */ +#line 13150 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + thd->get_stmt_da()->inc_current_row_for_warning(); + if (unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 44851 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2108: /* $@185: %empty */ +#line 13161 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 44860 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2109: /* no_braces_with_names: '(' $@185 opt_values_with_names ')' */ +#line 13166 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + thd->get_stmt_da()->inc_current_row_for_warning(); + if (unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 44872 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2110: /* opt_values: %empty */ +#line 13176 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44878 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2112: /* opt_values_with_names: %empty */ +#line 13181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44884 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2114: /* values: values ',' expr_or_ignore_or_default */ +#line 13187 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 44893 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2115: /* values: expr_or_ignore_or_default */ +#line 13192 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 44902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2116: /* values_with_names: values_with_names ',' remember_name expr_or_ignore_or_default remember_end */ +#line 13200 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + // give some name in case of using in table value constuctor (TVC) + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 44914 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2117: /* values_with_names: remember_name expr_or_ignore_or_default remember_end */ +#line 13208 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + // give some name in case of using in table value constuctor (TVC) + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 44926 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2118: /* expr_or_ignore: expr */ +#line 13218 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item);} +#line 44932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2119: /* expr_or_ignore: IGNORE_SYM */ +#line 13220 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_ignore_specification(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 44942 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2120: /* expr_or_ignore_or_default: expr_or_ignore */ +#line 13228 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item);} +#line 44948 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2121: /* expr_or_ignore_or_default: DEFAULT */ +#line 13230 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_default_specification(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 44958 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2123: /* $@186: %empty */ +#line 13239 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates= DUP_UPDATE; } +#line 44964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2124: /* $@187: %empty */ +#line 13241 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_UPDATE_ON_DUP_KEY; + } +#line 44972 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2125: /* opt_insert_update: ON DUPLICATE_SYM $@186 KEY_SYM UPDATE_SYM $@187 insert_update_list */ +#line 13245 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + } +#line 44980 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2126: /* update_table_list: table_ident opt_use_partition for_portion_of_time_clause opt_table_alias_clause opt_key_definition */ +#line 13253 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->add_table_to_list(thd, (yyvsp[-4].table), (yyvsp[-1].lex_str_ptr), + 0, + YYPS->m_lock_type, + YYPS->m_mdl_type, + Select->pop_index_hints(), + (yyvsp[-3].string_list)))) + MYSQL_YYABORT; + (yyval.table_list)->period_conditions= Lex->period_conditions; + } +#line 44995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2127: /* update_table_list: join_table_list */ +#line 13263 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 45001 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2128: /* $@188: %empty */ +#line 13270 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->sql_command= SQLCOM_UPDATE; + lex->duplicates= DUP_ERROR; + } +#line 45014 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2129: /* $@189: %empty */ +#line 13280 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *slex= Lex->first_select_lex(); + if (slex->table_list.elements > 1) + Lex->sql_command= SQLCOM_UPDATE_MULTI; + else if (slex->get_table_list()->derived) + { + /* it is single table update and it is update of derived table */ + my_error(ER_NON_UPDATABLE_TABLE, MYF(0), + slex->get_table_list()->alias.str, "UPDATE"); + MYSQL_YYABORT; + } + /* + In case of multi-update setting write lock for all tables may + be too pessimistic. We will decrease lock level if possible in + mysql_multi_update(). + */ + slex->set_lock_for_tables((yyvsp[-4].lock_type), slex->table_list.elements == 1, false); + } +#line 45037 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2130: /* $@190: %empty */ +#line 13299 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].select_order)) + Select->order_list= *((yyvsp[-1].select_order)); + } +#line 45046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2131: /* update: UPDATE_SYM $@188 opt_low_priority opt_ignore update_table_list SET update_list $@189 opt_where_clause opt_order_clause delete_limit_clause $@190 stmt_end */ +#line 13302 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45052 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2134: /* update_elem: simple_ident_nospvar equal DEFAULT */ +#line 13312 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *def= new (thd->mem_root) Item_default_value(thd, + Lex->current_context(), (yyvsp[-2].item), 1); + if (!def || add_item_to_list(thd, (yyvsp[-2].item)) || add_value_to_list(thd, def)) + MYSQL_YYABORT; + } +#line 45063 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2135: /* update_elem: simple_ident_nospvar equal expr_or_ignore */ +#line 13319 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (add_item_to_list(thd, (yyvsp[-2].item)) || add_value_to_list(thd, (yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 45072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2138: /* insert_update_elem: simple_ident_nospvar equal expr_or_ignore_or_default */ +#line 13332 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->update_list.push_back((yyvsp[-2].item), thd->mem_root)) || + unlikely(lex->value_list.push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 45083 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2139: /* opt_low_priority: %empty */ +#line 13341 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 45089 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2140: /* opt_low_priority: LOW_PRIORITY */ +#line 13342 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 45095 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2141: /* $@191: %empty */ +#line 13349 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_DELETE; + YYPS->m_lock_type= TL_WRITE_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_WRITE; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->ignore= 0; + lex->first_select_lex()->order_list.empty(); + } +#line 45111 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2142: /* delete: DELETE_SYM $@191 delete_part2 */ +#line 13361 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 45120 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2143: /* opt_delete_system_time: %empty */ +#line 13369 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_HISTORY); + } +#line 45128 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2144: /* opt_delete_system_time: BEFORE_SYM SYSTEM_TIME_SYM history_point */ +#line 13373 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_BEFORE, (yyvsp[0].vers_history_point)); + } +#line 45136 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2145: /* delete_part2: opt_delete_options single_multi */ +#line 13379 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45142 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2146: /* delete_part2: HISTORY_SYM delete_single_table opt_delete_system_time */ +#line 13381 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_table()->vers_conditions= Lex->vers_conditions; + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 45153 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2147: /* delete_single_table: FROM table_ident opt_use_partition */ +#line 13391 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type, + NULL, + (yyvsp[0].string_list)))) + MYSQL_YYABORT; + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45169 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2148: /* delete_single_table_for_period: delete_single_table opt_for_portion_of_time_clause */ +#line 13406 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].num)) + Lex->last_table()->period_conditions= Lex->period_conditions; + } +#line 45178 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2149: /* single_multi: delete_single_table_for_period opt_where_clause opt_order_clause delete_limit_clause opt_returning */ +#line 13418 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-2].select_order)) + Select->order_list= *((yyvsp[-2].select_order)); + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 45190 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2150: /* $@192: %empty */ +#line 13426 "/home/buildbot/git/sql/sql_yacc.yy" + { + mysql_init_multi_delete(Lex); + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45200 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2151: /* $@193: %empty */ +#line 13432 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(multi_delete_set_locks_and_link_aux_tables(Lex))) + MYSQL_YYABORT; + } +#line 45209 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2152: /* single_multi: table_wild_list $@192 FROM join_table_list opt_where_clause $@193 stmt_end */ +#line 13435 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45215 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2153: /* $@194: %empty */ +#line 13437 "/home/buildbot/git/sql/sql_yacc.yy" + { + mysql_init_multi_delete(Lex); + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2154: /* $@195: %empty */ +#line 13443 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(multi_delete_set_locks_and_link_aux_tables(Lex))) + MYSQL_YYABORT; + } +#line 45234 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2155: /* single_multi: FROM table_alias_ref_list $@194 USING join_table_list opt_where_clause $@195 stmt_end */ +#line 13446 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45240 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2156: /* opt_returning: %empty */ +#line 13451 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(!Lex->has_returning()); + } +#line 45248 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2157: /* $@196: %empty */ +#line 13455 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(!Lex->has_returning()); + /* + When parsing_place is IN_RETURNING, we push select items to + item_list of builtin_select instead of current_select. + But set parsing_place of current_select to true. + + Because parsing_place for builtin_select will be IN_RETURNING, + regardless there is SELECT in RETURNING. Example, if + there is RETURNING (SELECT...), then when we parse + SELECT inside RETURNING, builtin_select->parsing_place + will still be true. So the select items of SELECT inside + RETURNING will be added to item_list of builtin_select which + is incorrect. We want to prevent this from happening. + Since for every new select, a new SELECT_LEX + object is created and pushed to select stack, current_select + will point to SELECT inside RETURNING, and also has + parsing_place not set to IN_RETURNING by default. + So items are correctly added to item_list of SELECT inside + RETURNING instead of builtin_select. + */ + + thd->lex->current_select->parsing_place= IN_RETURNING; + thd->lex->push_context(&thd->lex->returning()->context); + } +#line 45278 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2158: /* opt_returning: RETURNING_SYM $@196 select_item_list */ +#line 13481 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->pop_context(); + thd->lex->current_select->parsing_place= NO_MATTER; + } +#line 45287 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2161: /* table_wild_one: ident opt_wild */ +#line 13494 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_ident *ti= new (thd->mem_root) Table_ident(&(yyvsp[-1].ident_sys)); + if (unlikely(ti == NULL)) + MYSQL_YYABORT; + if (unlikely(!Select-> + add_table_to_list(thd, + ti, + NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 45306 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2162: /* table_wild_one: ident '.' ident opt_wild */ +#line 13509 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_ident *ti= new (thd->mem_root) Table_ident(thd, &(yyvsp[-3].ident_sys), &(yyvsp[-1].ident_sys), 0); + if (unlikely(ti == NULL)) + MYSQL_YYABORT; + if (unlikely(!Select-> + add_table_to_list(thd, + ti, + NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 45325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2163: /* opt_wild: %empty */ +#line 13526 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45331 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2164: /* opt_wild: '.' '*' */ +#line 13527 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45337 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2165: /* opt_delete_options: %empty */ +#line 13531 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45343 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2166: /* opt_delete_options: opt_delete_option opt_delete_options */ +#line 13532 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45349 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2167: /* opt_delete_option: QUICK */ +#line 13536 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_QUICK; } +#line 45355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2168: /* opt_delete_option: LOW_PRIORITY */ +#line 13537 "/home/buildbot/git/sql/sql_yacc.yy" + { YYPS->m_lock_type= TL_WRITE_LOW_PRIORITY; } +#line 45361 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2169: /* opt_delete_option: IGNORE_SYM */ +#line 13538 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1; } +#line 45367 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2170: /* $@197: %empty */ +#line 13543 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= Lex; + lex->sql_command= SQLCOM_TRUNCATE; + lex->alter_info.reset(); + lex->first_select_lex()->options= 0; + lex->sql_cache= LEX::SQL_CACHE_UNSPECIFIED; + lex->first_select_lex()->order_list.empty(); + YYPS->m_lock_type= TL_WRITE; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 45382 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2171: /* $@198: %empty */ +#line 13554 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_truncate_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 45394 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2172: /* truncate: TRUNCATE_SYM $@197 opt_table_sym table_name opt_lock_wait_timeout $@198 opt_truncate_table_storage_clause */ +#line 13561 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 45400 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2179: /* profile_def: CPU_SYM */ +#line 13579 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_CPU; + } +#line 45408 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2180: /* profile_def: MEMORY_SYM */ +#line 13583 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_MEMORY; + } +#line 45416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2181: /* profile_def: BLOCK_SYM IO_SYM */ +#line 13587 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_BLOCK_IO; + } +#line 45424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2182: /* profile_def: CONTEXT_SYM SWITCHES_SYM */ +#line 13591 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_CONTEXT; + } +#line 45432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2183: /* profile_def: PAGE_SYM FAULTS_SYM */ +#line 13595 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_PAGE_FAULTS; + } +#line 45440 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2184: /* profile_def: IPC_SYM */ +#line 13599 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_IPC; + } +#line 45448 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2185: /* profile_def: SWAPS_SYM */ +#line 13603 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_SWAPS; + } +#line 45456 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2186: /* profile_def: SOURCE_SYM */ +#line 13607 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_SOURCE; + } +#line 45464 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2187: /* profile_def: ALL */ +#line 13611 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_ALL; + } +#line 45472 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2188: /* opt_profile_args: %empty */ +#line 13618 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_query_id= 0; + } +#line 45480 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2189: /* opt_profile_args: FOR_SYM QUERY_SYM NUM */ +#line 13622 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_query_id= atoi((yyvsp[0].lex_str).str); + } +#line 45488 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2190: /* $@199: %empty */ +#line 13631 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->wild=0; + lex->ident= null_clex_str; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->create_info.init(); + } +#line 45503 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2191: /* show: SHOW $@199 show_param */ +#line 13642 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + } +#line 45512 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2192: /* show_param: DATABASES wild_and_where */ +#line 13650 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_DATABASES; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SCHEMATA))) + MYSQL_YYABORT; + } +#line 45523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2193: /* show_param: opt_full TABLES opt_db wild_and_where */ +#line 13657 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TABLES; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TABLE_NAMES)) + MYSQL_YYABORT; + } +#line 45535 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2194: /* show_param: opt_full TRIGGERS_SYM opt_db wild_and_where */ +#line 13665 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TRIGGERS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TRIGGERS)) + MYSQL_YYABORT; + } +#line 45547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2195: /* show_param: EVENTS_SYM opt_db wild_and_where */ +#line 13673 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_EVENTS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_EVENTS)) + MYSQL_YYABORT; + } +#line 45559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2196: /* show_param: TABLE_SYM STATUS_SYM opt_db wild_and_where */ +#line 13681 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TABLE_STATUS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TABLES)) + MYSQL_YYABORT; + } +#line 45571 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2197: /* show_param: OPEN_SYM TABLES opt_db wild_and_where */ +#line 13689 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_OPEN_TABLES; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_OPEN_TABLES)) + MYSQL_YYABORT; + } +#line 45583 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2198: /* show_param: PLUGINS_SYM */ +#line 13697 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PLUGINS))) + MYSQL_YYABORT; + } +#line 45594 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2199: /* show_param: PLUGINS_SYM SONAME_SYM TEXT_STRING_sys */ +#line 13704 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->ident= (yyvsp[0].lex_str); + Lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS))) + MYSQL_YYABORT; + } +#line 45605 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2200: /* show_param: PLUGINS_SYM SONAME_SYM wild_and_where */ +#line 13711 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS))) + MYSQL_YYABORT; + } +#line 45615 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2201: /* show_param: ENGINE_SYM known_storage_engines show_engine_param */ +#line 13717 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.db_type= (yyvsp[-1].db_type); } +#line 45621 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2202: /* show_param: ENGINE_SYM ALL show_engine_param */ +#line 13719 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.db_type= NULL; } +#line 45627 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2203: /* show_param: opt_full COLUMNS from_or_in table_ident opt_db wild_and_where */ +#line 13721 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_FIELDS; + if ((yyvsp[-1].lex_str).str) + (yyvsp[-2].table)->change_db(&(yyvsp[-1].lex_str)); + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[-2].table), SCH_COLUMNS))) + MYSQL_YYABORT; + } +#line 45640 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2204: /* show_param: master_or_binary LOGS_SYM */ +#line 13730 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOGS; + } +#line 45648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2205: /* show_param: SLAVE HOSTS_SYM */ +#line 13734 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_SLAVE_HOSTS; + } +#line 45656 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2206: /* $@200: %empty */ +#line 13738 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_BINLOG_EVENTS; + } +#line 45665 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2208: /* $@201: %empty */ +#line 13744 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_RELAYLOG_EVENTS; + } +#line 45674 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2209: /* show_param: RELAYLOG_SYM optional_connection_name EVENTS_SYM binlog_in binlog_from $@201 opt_global_limit_clause optional_for_channel */ +#line 13749 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 45680 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2210: /* show_param: keys_or_index from_or_in table_ident opt_db opt_where_clause */ +#line 13751 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_KEYS; + if ((yyvsp[-1].lex_str).str) + (yyvsp[-2].table)->change_db(&(yyvsp[-1].lex_str)); + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[-2].table), SCH_STATISTICS))) + MYSQL_YYABORT; + } +#line 45693 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2211: /* show_param: opt_storage ENGINES_SYM */ +#line 13760 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_ENGINES))) + MYSQL_YYABORT; + } +#line 45704 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2212: /* show_param: AUTHORS_SYM */ +#line 13767 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_AUTHORS; + } +#line 45713 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2213: /* show_param: CONTRIBUTORS_SYM */ +#line 13772 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS; + } +#line 45722 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2214: /* show_param: PRIVILEGES */ +#line 13777 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_PRIVILEGES; + } +#line 45731 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2215: /* show_param: COUNT_SYM '(' '*' ')' WARNINGS */ +#line 13782 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING var= {STRING_WITH_LEN("warning_count")}; + (void) create_select_for_variable(thd, &var); + } +#line 45740 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2216: /* show_param: COUNT_SYM '(' '*' ')' ERRORS */ +#line 13787 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING var= {STRING_WITH_LEN("error_count")}; + (void) create_select_for_variable(thd, &var); + } +#line 45749 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2217: /* show_param: WARNINGS opt_global_limit_clause */ +#line 13792 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_WARNS;} +#line 45755 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2218: /* show_param: ERRORS opt_global_limit_clause */ +#line 13794 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_ERRORS;} +#line 45761 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2219: /* show_param: PROFILES_SYM */ +#line 13796 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_PROFILES; } +#line 45767 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2220: /* show_param: PROFILE_SYM opt_profile_defs opt_profile_args opt_global_limit_clause */ +#line 13798 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_PROFILE; + if (unlikely(prepare_schema_table(thd, lex, NULL, SCH_PROFILES))) + MYSQL_YYABORT; + } +#line 45778 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2221: /* show_param: opt_var_type STATUS_SYM wild_and_where */ +#line 13805 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS; + lex->option_type= (yyvsp[-2].var_type); + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SESSION_STATUS))) + MYSQL_YYABORT; + } +#line 45790 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2222: /* show_param: opt_full PROCESSLIST_SYM */ +#line 13813 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} +#line 45796 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2223: /* show_param: opt_var_type VARIABLES wild_and_where */ +#line 13815 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_VARIABLES; + lex->option_type= (yyvsp[-2].var_type); + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SESSION_VARIABLES))) + MYSQL_YYABORT; + } +#line 45808 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2224: /* show_param: charset wild_and_where */ +#line 13823 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_CHARSETS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_CHARSETS))) + MYSQL_YYABORT; + } +#line 45819 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2225: /* show_param: COLLATION_SYM wild_and_where */ +#line 13830 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_COLLATIONS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_COLLATIONS))) + MYSQL_YYABORT; + } +#line 45830 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2226: /* show_param: GRANTS */ +#line 13837 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_GRANTS; + if (unlikely(!(Lex->grant_user= + (LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + Lex->grant_user->user= current_user_and_current_role; + } +#line 45842 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2227: /* show_param: GRANTS FOR_SYM user_or_role clear_privileges */ +#line 13845 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_GRANTS; + lex->grant_user=(yyvsp[-1].lex_user); + } +#line 45852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2228: /* show_param: CREATE DATABASE opt_if_not_exists ident */ +#line 13851 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_SHOW_CREATE_DB, (yyvsp[-1].object_ddl_options)); + Lex->name= (yyvsp[0].ident_sys); + } +#line 45861 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2229: /* show_param: CREATE TABLE_SYM table_ident */ +#line 13856 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL,0)) + MYSQL_YYABORT; + lex->create_info.storage_media= HA_SM_DEFAULT; + } +#line 45873 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2230: /* show_param: CREATE VIEW_SYM table_ident */ +#line 13864 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL, 0)) + MYSQL_YYABORT; + lex->table_type= TABLE_TYPE_VIEW; + } +#line 45885 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2231: /* show_param: CREATE SEQUENCE_SYM table_ident */ +#line 13872 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL, 0)) + MYSQL_YYABORT; + lex->table_type= TABLE_TYPE_SEQUENCE; + } +#line 45897 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2232: /* show_param: BINLOG_SYM STATUS_SYM */ +#line 13880 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOG_STAT; + } +#line 45905 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2233: /* show_param: MASTER_SYM STATUS_SYM */ +#line 13884 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOG_STAT; + } +#line 45913 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2234: /* show_param: ALL SLAVES STATUS_SYM */ +#line 13888 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_show_slave_status(true))) + MYSQL_YYABORT; + Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; + } +#line 45924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2235: /* show_param: SLAVE optional_connection_name STATUS_SYM optional_for_channel */ +#line 13895 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_show_slave_status())) + MYSQL_YYABORT; + Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; + } +#line 45935 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2236: /* show_param: CREATE PROCEDURE_SYM sp_name */ +#line 13902 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sql_command = SQLCOM_SHOW_CREATE_PROC; + lex->spname= (yyvsp[0].spname); + } +#line 45946 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2237: /* show_param: CREATE FUNCTION_SYM sp_name */ +#line 13909 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sql_command = SQLCOM_SHOW_CREATE_FUNC; + lex->spname= (yyvsp[0].spname); + } +#line 45957 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2238: /* show_param: CREATE PACKAGE_MARIADB_SYM sp_name */ +#line 13916 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE; + lex->spname= (yyvsp[0].spname); + } +#line 45967 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2239: /* show_param: CREATE PACKAGE_ORACLE_SYM sp_name */ +#line 13922 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE; + lex->spname= (yyvsp[0].spname); + } +#line 45977 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2240: /* show_param: CREATE PACKAGE_MARIADB_SYM BODY_MARIADB_SYM sp_name */ +#line 13928 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE_BODY; + lex->spname= (yyvsp[0].spname); + } +#line 45987 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2241: /* show_param: CREATE PACKAGE_ORACLE_SYM BODY_ORACLE_SYM sp_name */ +#line 13934 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE_BODY; + lex->spname= (yyvsp[0].spname); + } +#line 45997 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2242: /* show_param: CREATE TRIGGER_SYM sp_name */ +#line 13940 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_CREATE_TRIGGER; + lex->spname= (yyvsp[0].spname); + } +#line 46007 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2243: /* show_param: CREATE USER_SYM */ +#line 13946 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_CREATE_USER; + if (unlikely(!(Lex->grant_user= + (LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + Lex->grant_user->user= current_user; + } +#line 46019 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2244: /* show_param: CREATE USER_SYM user */ +#line 13954 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_CREATE_USER; + Lex->grant_user= (yyvsp[0].lex_user); + } +#line 46028 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2245: /* show_param: PROCEDURE_SYM STATUS_SYM wild_and_where */ +#line 13959 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PROC; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46039 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2246: /* show_param: FUNCTION_SYM STATUS_SYM wild_and_where */ +#line 13966 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_FUNC; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46050 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2247: /* show_param: PACKAGE_MARIADB_SYM STATUS_SYM wild_and_where */ +#line 13973 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46061 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2248: /* show_param: PACKAGE_ORACLE_SYM STATUS_SYM wild_and_where */ +#line 13980 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2249: /* show_param: PACKAGE_MARIADB_SYM BODY_MARIADB_SYM STATUS_SYM wild_and_where */ +#line 13987 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE_BODY; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46083 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2250: /* show_param: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM STATUS_SYM wild_and_where */ +#line 13994 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE_BODY; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46094 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2251: /* show_param: PROCEDURE_SYM CODE_SYM sp_name */ +#line 14001 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PROC_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46103 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2252: /* show_param: FUNCTION_SYM CODE_SYM sp_name */ +#line 14006 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_FUNC_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46112 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2253: /* show_param: PACKAGE_MARIADB_SYM BODY_MARIADB_SYM CODE_SYM sp_name */ +#line 14011 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PACKAGE_BODY_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46121 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2254: /* show_param: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM CODE_SYM sp_name */ +#line 14016 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PACKAGE_BODY_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46130 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2255: /* show_param: CREATE EVENT_SYM sp_name */ +#line 14021 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->spname= (yyvsp[0].spname); + Lex->sql_command = SQLCOM_SHOW_CREATE_EVENT; + } +#line 46139 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2256: /* show_param: describe_command opt_format_json FOR_SYM expr */ +#line 14030 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_EXPLAIN; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_EXPLAIN_JSON : SCH_EXPLAIN_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 46151 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2257: /* show_param: ANALYZE_SYM opt_format_json FOR_SYM expr */ +#line 14038 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_ANALYZE; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_ANALYZE_JSON : SCH_ANALYZE_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 46163 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2258: /* show_param: IDENT_sys remember_tok_start wild_and_where */ +#line 14046 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + bool in_plugin; + lex->sql_command= SQLCOM_SHOW_GENERIC; + ST_SCHEMA_TABLE *table= find_schema_table(thd, &(yyvsp[-2].ident_sys), &in_plugin); + if (unlikely(!table || !table->old_format || !in_plugin)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[-1].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(lex->wild && table->idx_field1 < 0)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(make_schema_select(thd, Lex->current_select, table))) + MYSQL_YYABORT; + } +#line 46186 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2259: /* show_engine_param: STATUS_SYM */ +#line 14068 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_STATUS; } +#line 46192 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2260: /* show_engine_param: MUTEX_SYM */ +#line 14070 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_MUTEX; } +#line 46198 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2261: /* show_engine_param: LOGS_SYM */ +#line 14072 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_LOGS; } +#line 46204 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2266: /* opt_db: %empty */ +#line 14086 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 46210 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2267: /* opt_db: from_or_in ident */ +#line 14087 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 46216 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2268: /* opt_full: %empty */ +#line 14091 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->verbose=0; } +#line 46222 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2269: /* opt_full: FULL */ +#line 14092 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->verbose=1; } +#line 46228 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2272: /* binlog_in: %empty */ +#line 14101 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.log_file_name = 0; } +#line 46234 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2273: /* binlog_in: IN_SYM TEXT_STRING_sys */ +#line 14102 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.log_file_name = (yyvsp[0].lex_str).str; } +#line 46240 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2274: /* binlog_from: %empty */ +#line 14106 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.pos = 4; /* skip magic number */ } +#line 46246 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2275: /* binlog_from: FROM ulonglong_num */ +#line 14107 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.pos = (yyvsp[0].ulonglong_number); } +#line 46252 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2276: /* wild_and_where: %empty */ +#line 14111 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.simple_string)= 0; } +#line 46258 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2277: /* wild_and_where: LIKE remember_tok_start TEXT_STRING_sys */ +#line 14113 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->wild= new (thd->mem_root) String((const char*) (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length, + system_charset_info); + if (unlikely(Lex->wild == NULL)) + MYSQL_YYABORT; + (yyval.simple_string)= (yyvsp[-1].simple_string); + } +#line 46271 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2278: /* wild_and_where: WHERE remember_tok_start expr */ +#line 14122 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->where= normalize_cond(thd, (yyvsp[0].item)); + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + (yyval.simple_string)= (yyvsp[-1].simple_string); + } +#line 46282 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2279: /* $@202: %empty */ +#line 14133 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->sql_command= SQLCOM_SHOW_FIELDS; + lex->first_select_lex()->db= null_clex_str; + lex->verbose= 0; + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[0].table), SCH_COLUMNS))) + MYSQL_YYABORT; + } +#line 46299 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2280: /* describe: describe_command table_ident $@202 opt_describe_column */ +#line 14146 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + } +#line 46308 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2281: /* $@203: %empty */ +#line 14151 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_NORMAL; } +#line 46314 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2282: /* describe: describe_command opt_extended_describe $@203 explainable_command */ +#line 14153 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->first_select_lex()->options|= SELECT_DESCRIBE; + } +#line 46323 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2291: /* analyze_stmt_command: ANALYZE_SYM opt_format_json explainable_command */ +#line 14175 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->analyze_stmt= true; + } +#line 46331 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2292: /* opt_extended_describe: EXTENDED_SYM */ +#line 14181 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_EXTENDED; } +#line 46337 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2293: /* opt_extended_describe: EXTENDED_SYM ALL */ +#line 14183 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_EXTENDED | DESCRIBE_EXTENDED2; } +#line 46343 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2294: /* opt_extended_describe: PARTITIONS_SYM */ +#line 14184 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_PARTITIONS; } +#line 46349 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2295: /* opt_extended_describe: opt_format_json */ +#line 14185 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2296: /* opt_format_json: %empty */ +#line 14189 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46361 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2297: /* opt_format_json: FORMAT_SYM '=' ident_or_text */ +#line 14191 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("JSON"))) + Lex->explain_json= true; + else if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("TRADITIONAL"))) + DBUG_ASSERT(Lex->explain_json==false); + else + my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), + "EXPLAIN/ANALYZE", (yyvsp[0].lex_str).str)); + } +#line 46375 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2298: /* opt_describe_column: %empty */ +#line 14203 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46381 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2299: /* opt_describe_column: text_string */ +#line 14204 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->wild= (yyvsp[0].string); } +#line 46387 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2300: /* opt_describe_column: ident */ +#line 14206 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->wild= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(Lex->wild == NULL)) + MYSQL_YYABORT; + } +#line 46399 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2301: /* explain_for_connection: describe_command opt_format_json FOR_SYM CONNECTION_SYM expr */ +#line 14222 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->wild=0; + lex->ident= null_clex_str; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->create_info.init(); + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + Lex->sql_command= SQLCOM_SHOW_EXPLAIN; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_EXPLAIN_JSON : SCH_EXPLAIN_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 46421 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2302: /* $@204: %empty */ +#line 14245 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_FLUSH; + lex->type= 0; + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 46432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2303: /* flush: FLUSH_SYM opt_no_write_to_binlog $@204 flush_options */ +#line 14251 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46438 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2304: /* $@205: %empty */ +#line 14256 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_TABLES; + /* + Set type of metadata and table locks for + FLUSH TABLES table_list [WITH READ LOCK]. + */ + YYPS->m_lock_type= TL_READ_NO_INSERT; + YYPS->m_mdl_type= MDL_SHARED_HIGH_PRIO; + } +#line 46452 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2305: /* flush_options: table_or_tables $@205 opt_table_list opt_flush_lock */ +#line 14266 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46458 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2306: /* flush_options: flush_options_list */ +#line 14268 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46464 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2307: /* opt_flush_lock: %empty */ +#line 14272 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2308: /* opt_flush_lock: flush_lock */ +#line 14274 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *tables= Lex->query_tables; + for (; tables; tables= tables->next_global) + { + tables->mdl_request.set_type(MDL_SHARED_NO_WRITE); + /* Ignore temporary tables. */ + tables->open_type= OT_BASE_ONLY; + } + } +#line 46484 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2309: /* flush_lock: WITH READ_SYM LOCK_SYM optional_flush_tables_arguments */ +#line 14287 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_READ_LOCK | (yyvsp[0].num); } +#line 46490 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2310: /* $@206: %empty */ +#line 14289 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->query_tables == NULL)) + { + // Table list can't be empty + thd->parse_error(ER_NO_TABLES_USED); + MYSQL_YYABORT; + } + Lex->type|= REFRESH_FOR_EXPORT; + } +#line 46504 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2311: /* flush_lock: FOR_SYM $@206 EXPORT_SYM */ +#line 14297 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46510 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2313: /* flush_options_list: flush_option */ +#line 14303 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46516 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2314: /* flush_option: ERROR_SYM LOGS_SYM */ +#line 14308 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_ERROR_LOG; } +#line 46522 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2315: /* flush_option: ENGINE_SYM LOGS_SYM */ +#line 14310 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_ENGINE_LOG; } +#line 46528 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2316: /* flush_option: GENERAL LOGS_SYM */ +#line 14312 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_GENERAL_LOG; } +#line 46534 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2317: /* flush_option: SLOW LOGS_SYM */ +#line 14314 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SLOW_LOG; } +#line 46540 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2318: /* flush_option: BINARY LOGS_SYM opt_delete_gtid_domain */ +#line 14316 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_BINARY_LOG; } +#line 46546 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2319: /* flush_option: RELAY LOGS_SYM optional_connection_name optional_for_channel */ +#line 14318 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->type & REFRESH_RELAY_LOG)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "FLUSH", "RELAY LOGS")); + lex->type|= REFRESH_RELAY_LOG; + lex->relay_log_connection_name= lex->mi.connection_name; + } +#line 46558 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2320: /* flush_option: QUERY_SYM CACHE_SYM */ +#line 14326 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_QUERY_CACHE_FREE; } +#line 46564 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2321: /* flush_option: HOSTS_SYM */ +#line 14328 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_HOSTS; } +#line 46570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2322: /* flush_option: PRIVILEGES */ +#line 14330 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_GRANT; } +#line 46576 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2323: /* flush_option: LOGS_SYM */ +#line 14332 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_LOG; + Lex->relay_log_connection_name= empty_clex_str; + } +#line 46585 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2324: /* flush_option: STATUS_SYM */ +#line 14337 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_STATUS; } +#line 46591 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2325: /* flush_option: SLAVE optional_connection_name */ +#line 14339 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->type & REFRESH_SLAVE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "FLUSH","SLAVE")); + lex->type|= REFRESH_SLAVE; + lex->reset_slave_info.all= false; + } +#line 46603 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2326: /* flush_option: MASTER_SYM */ +#line 14347 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_MASTER; } +#line 46609 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2327: /* flush_option: DES_KEY_FILE */ +#line 14349 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_DES_KEY_FILE; } +#line 46615 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2328: /* flush_option: RESOURCES */ +#line 14351 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_USER_RESOURCES; } +#line 46621 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2329: /* flush_option: SSL_SYM */ +#line 14353 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SSL;} +#line 46627 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2330: /* flush_option: THREADS_SYM */ +#line 14355 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_THREADS;} +#line 46633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2331: /* flush_option: IDENT_sys remember_tok_start */ +#line 14357 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_GENERIC; + ST_SCHEMA_TABLE *table= find_schema_table(thd, &(yyvsp[-1].ident_sys)); + if (unlikely(!table || !table->reset_table)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[-1].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root))) + MYSQL_YYABORT; + } +#line 46651 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2332: /* opt_table_list: %empty */ +#line 14373 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46657 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2333: /* opt_table_list: table_list */ +#line 14374 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46663 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2334: /* backup: BACKUP_SYM backup_statements */ +#line 14378 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46669 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2335: /* backup_statements: STAGE_SYM ident */ +#line 14383 "/home/buildbot/git/sql/sql_yacc.yy" + { + int type; + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP STAGE")); + if ((type= find_type((yyvsp[0].ident_sys).str, &backup_stage_names, + FIND_TYPE_NO_PREFIX)) <= 0) + my_yyabort_error((ER_BACKUP_UNKNOWN_STAGE, MYF(0), (yyvsp[0].ident_sys).str)); + Lex->sql_command= SQLCOM_BACKUP; + Lex->backup_stage= (backup_stages) (type-1); + break; + } +#line 46685 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2336: /* $@207: %empty */ +#line 14395 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP LOCK")); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 46696 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2337: /* backup_statements: LOCK_SYM $@207 table_ident */ +#line 14402 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[0].table), NULL, 0, + TL_READ, MDL_SHARED_HIGH_PRIO))) + MYSQL_YYABORT; + Lex->sql_command= SQLCOM_BACKUP_LOCK; + Lex->pop_select(); //main select + } +#line 46708 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2338: /* backup_statements: UNLOCK_SYM */ +#line 14410 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP UNLOCK")); + /* Table list is empty for unlock */ + Lex->sql_command= SQLCOM_BACKUP_LOCK; + } +#line 46719 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2339: /* opt_delete_gtid_domain: %empty */ +#line 14419 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46725 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2340: /* opt_delete_gtid_domain: DELETE_DOMAIN_ID_SYM '=' '(' delete_domain_id_list ')' */ +#line 14421 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46731 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2344: /* delete_domain_id: ulonglong_num */ +#line 14431 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint32 value= (uint32) (yyvsp[0].ulonglong_number); + if ((yyvsp[0].ulonglong_number) > UINT_MAX32) + { + my_printf_error(ER_BINLOG_CANT_DELETE_GTID_DOMAIN, + "The value of gtid domain being deleted ('%llu') " + "exceeds its maximum size " + "of 32 bit unsigned integer", MYF(0), (yyvsp[0].ulonglong_number)); + MYSQL_YYABORT; + } + insert_dynamic(&Lex->delete_gtid_domain, (uchar*) &value); + } +#line 46748 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2345: /* optional_flush_tables_arguments: %empty */ +#line 14446 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num)= 0;} +#line 46754 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2346: /* optional_flush_tables_arguments: AND_SYM DISABLE_SYM CHECKPOINT_SYM */ +#line 14447 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num)= REFRESH_CHECKPOINT; } +#line 46760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2347: /* $@208: %empty */ +#line 14452 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_RESET; lex->type=0; + } +#line 46769 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2348: /* reset: RESET_SYM $@208 reset_options */ +#line 14457 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46775 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2351: /* $@209: %empty */ +#line 14466 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SLAVE; } +#line 46781 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2352: /* reset_option: SLAVE $@209 optional_connection_name slave_reset_options optional_for_channel */ +#line 14469 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 46787 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2353: /* $@210: %empty */ +#line 14471 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_MASTER; + Lex->next_binlog_file_number= 0; + } +#line 46796 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2355: /* reset_option: QUERY_SYM CACHE_SYM */ +#line 14476 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_QUERY_CACHE;} +#line 46802 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2356: /* slave_reset_options: %empty */ +#line 14480 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->reset_slave_info.all= false; } +#line 46808 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2357: /* slave_reset_options: ALL */ +#line 14481 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->reset_slave_info.all= true; } +#line 46814 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2358: /* master_reset_options: %empty */ +#line 14485 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46820 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2359: /* master_reset_options: TO_SYM ulong_num */ +#line 14487 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->next_binlog_file_number = (yyvsp[0].ulong_num); + } +#line 46828 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2360: /* purge: PURGE master_or_binary LOGS_SYM TO_SYM TEXT_STRING_sys */ +#line 14494 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_purge_to((yyvsp[0].lex_str)); + } +#line 46836 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2361: /* $@211: %empty */ +#line 14498 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "PURGE..BEFORE"; } +#line 46842 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2362: /* purge: PURGE master_or_binary LOGS_SYM BEFORE_SYM $@211 expr */ +#line 14500 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->clause_that_disallows_subselect= NULL; + if (Lex->stmt_purge_before((yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 46852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2363: /* $@212: %empty */ +#line 14512 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->value_list.empty(); + lex->users_list.empty(); + lex->sql_command= SQLCOM_KILL; + lex->kill_type= KILL_TYPE_ID; + } +#line 46864 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2364: /* kill: KILL_SYM $@212 kill_type kill_option */ +#line 14520 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->kill_signal= (killed_state) ((yyvsp[-1].num) | (yyvsp[0].num)); + } +#line 46872 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2365: /* kill_type: %empty */ +#line 14526 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_HARD_BIT; } +#line 46878 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2366: /* kill_type: HARD_SYM */ +#line 14527 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_HARD_BIT; } +#line 46884 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2367: /* kill_type: SOFT_SYM */ +#line 14528 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 46890 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2368: /* kill_option: opt_connection kill_expr */ +#line 14532 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_CONNECTION; } +#line 46896 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2369: /* kill_option: QUERY_SYM kill_expr */ +#line 14533 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_QUERY; } +#line 46902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2370: /* kill_option: QUERY_SYM ID_SYM expr */ +#line 14535 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (int) KILL_QUERY; + Lex->kill_type= KILL_TYPE_QUERY; + Lex->value_list.push_front((yyvsp[0].item), thd->mem_root); + } +#line 46912 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2371: /* opt_connection: %empty */ +#line 14543 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 46918 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2372: /* opt_connection: CONNECTION_SYM */ +#line 14544 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 46924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2373: /* kill_expr: expr */ +#line 14549 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_front((yyval.item), thd->mem_root); + } +#line 46932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2374: /* kill_expr: USER_SYM user */ +#line 14553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root); + Lex->kill_type= KILL_TYPE_USER; + } +#line 46941 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2375: /* $@213: %empty */ +#line 14560 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHUTDOWN; } +#line 46947 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2376: /* shutdown: SHUTDOWN $@213 shutdown_option */ +#line 14561 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46953 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2377: /* shutdown_option: %empty */ +#line 14565 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->is_shutdown_wait_for_slaves= false; } +#line 46959 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2378: /* shutdown_option: WAIT_SYM FOR_SYM ALL SLAVES */ +#line 14567 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->is_shutdown_wait_for_slaves= true; + } +#line 46967 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2379: /* use: USE_SYM ident */ +#line 14576 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_CHANGE_DB; + lex->first_select_lex()->db= (yyvsp[0].ident_sys); + } +#line 46977 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2380: /* $@214: %empty */ +#line 14587 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + + if (unlikely(lex->sphead)) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), + (yyvsp[0].filetype) == FILETYPE_CSV ? "LOAD DATA" : "LOAD XML"); + MYSQL_YYABORT; + } + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + } +#line 46995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2381: /* $@215: %empty */ +#line 14601 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_LOAD; + lex->local_file= (yyvsp[-2].num); + lex->duplicates= DUP_ERROR; + lex->ignore= 0; + if (unlikely(!(lex->exchange= new (thd->mem_root) + sql_exchange((yyvsp[0].lex_str).str, 0, (yyvsp[-5].filetype))))) + MYSQL_YYABORT; + } +#line 47010 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2382: /* $@216: %empty */ +#line 14612 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, + TL_OPTION_UPDATING, + (yyvsp[-9].lock_type), MDL_SHARED_WRITE, + NULL, (yyvsp[0].string_list)))) + MYSQL_YYABORT; + lex->field_list.empty(); + lex->update_list.empty(); + lex->value_list.empty(); + lex->many_values.empty(); + } +#line 47027 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2383: /* $@217: %empty */ +#line 14625 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->cs= (yyvsp[0].charset); } +#line 47033 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2384: /* load: LOAD data_or_xml $@214 load_data_lock opt_local INFILE TEXT_STRING_filesystem $@215 opt_duplicate INTO TABLE_SYM table_ident opt_use_partition $@216 opt_load_data_charset $@217 opt_xml_rows_identified_by opt_field_term opt_line_term opt_ignore_lines opt_field_or_var_spec opt_load_data_set_spec stmt_end */ +#line 14630 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + } +#line 47041 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2385: /* data_or_xml: DATA_SYM */ +#line 14636 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.filetype)= FILETYPE_CSV; } +#line 47047 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2386: /* data_or_xml: XML_SYM */ +#line 14637 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.filetype)= FILETYPE_XML; } +#line 47053 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2387: /* opt_local: %empty */ +#line 14641 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=0;} +#line 47059 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2388: /* opt_local: LOCAL_SYM */ +#line 14642 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1;} +#line 47065 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2389: /* load_data_lock: %empty */ +#line 14646 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 47071 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2390: /* load_data_lock: CONCURRENT */ +#line 14648 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Ignore this option in SP to avoid problem with query cache and + triggers with non default priority locks + */ + (yyval.lock_type)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 47083 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2391: /* load_data_lock: LOW_PRIORITY */ +#line 14655 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 47089 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2392: /* opt_duplicate: %empty */ +#line 14659 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates=DUP_ERROR; } +#line 47095 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2393: /* opt_duplicate: REPLACE */ +#line 14660 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates=DUP_REPLACE; } +#line 47101 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2394: /* opt_duplicate: IGNORE_SYM */ +#line 14661 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1; } +#line 47107 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2399: /* field_term: TERMINATED BY text_string */ +#line 14676 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->field_term= (yyvsp[0].string); + } +#line 47116 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2400: /* field_term: OPTIONALLY ENCLOSED BY text_string */ +#line 14681 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + DBUG_ASSERT(lex->exchange != 0); + lex->exchange->enclosed= (yyvsp[0].string); + lex->exchange->opt_enclosed= 1; + } +#line 47127 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2401: /* field_term: ENCLOSED BY text_string */ +#line 14688 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->enclosed= (yyvsp[0].string); + } +#line 47136 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2402: /* field_term: ESCAPED BY text_string */ +#line 14693 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->escaped= (yyvsp[0].string); + } +#line 47145 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2407: /* line_term: TERMINATED BY text_string */ +#line 14711 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->line_term= (yyvsp[0].string); + } +#line 47154 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2408: /* line_term: STARTING BY text_string */ +#line 14716 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->line_start= (yyvsp[0].string); + } +#line 47163 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2409: /* opt_xml_rows_identified_by: %empty */ +#line 14723 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47169 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2410: /* opt_xml_rows_identified_by: ROWS_SYM IDENTIFIED_SYM BY text_string */ +#line 14725 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->line_term = (yyvsp[0].string); } +#line 47175 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2412: /* opt_ignore_lines: IGNORE_SYM NUM lines_or_rows */ +#line 14731 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->skip_lines= atol((yyvsp[-1].lex_str).str); + } +#line 47184 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2413: /* lines_or_rows: LINES */ +#line 14738 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47190 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2414: /* lines_or_rows: ROWS_SYM */ +#line 14739 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47196 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2415: /* opt_field_or_var_spec: %empty */ +#line 14743 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47202 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2416: /* opt_field_or_var_spec: '(' fields_or_vars ')' */ +#line 14744 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47208 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2417: /* opt_field_or_var_spec: '(' ')' */ +#line 14745 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47214 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2418: /* fields_or_vars: fields_or_vars ',' field_or_var */ +#line 14750 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 47220 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2419: /* fields_or_vars: field_or_var */ +#line 14752 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 47226 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2420: /* field_or_var: simple_ident_nospvar */ +#line 14756 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.item)= (yyvsp[0].item);} +#line 47232 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2421: /* field_or_var: '@' ident_or_text */ +#line 14758 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + (yyval.item)= new (thd->mem_root) Item_user_var_as_out_param(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47248 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2422: /* opt_load_data_set_spec: %empty */ +#line 14772 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47254 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2423: /* opt_load_data_set_spec: SET load_data_set_list */ +#line 14773 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47260 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2426: /* load_data_set_elem: simple_ident_nospvar equal remember_name expr_or_ignore_or_default remember_end */ +#line 14783 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->update_list.push_back((yyvsp[-4].item), thd->mem_root)) || + unlikely(lex->value_list.push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + (yyvsp[-1].item)->set_name_no_truncate(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 47272 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2427: /* text_literal: TEXT_STRING */ +#line 14796 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal((yyvsp[0].lex_string_with_metadata))))) + MYSQL_YYABORT; + } +#line 47281 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2428: /* text_literal: NCHAR_STRING */ +#line 14801 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal_nchar((yyvsp[0].lex_string_with_metadata))))) + MYSQL_YYABORT; + } +#line 47290 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2429: /* text_literal: UNDERSCORE_CHARSET TEXT_STRING */ +#line 14806 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal_charset((yyvsp[0].lex_string_with_metadata), (yyvsp[-1].charset))))) + MYSQL_YYABORT; + } +#line 47299 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2430: /* text_literal: text_literal TEXT_STRING_literal */ +#line 14811 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= (yyvsp[-1].item_basic_constant)->make_string_literal_concat(thd, &(yyvsp[0].lex_str))))) + MYSQL_YYABORT; + } +#line 47308 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2431: /* text_string: TEXT_STRING_literal */ +#line 14819 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string)= new (thd->mem_root) String((const char*) (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length, + thd->variables.collation_connection); + if (unlikely((yyval.string) == NULL)) + MYSQL_YYABORT; + } +#line 47320 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2432: /* text_string: hex_or_bin_String */ +#line 14826 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string)= (yyvsp[0].string); } +#line 47326 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2433: /* hex_or_bin_String: HEX_NUM */ +#line 14832 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_hex_hybrid(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + (yyval.string)= tmp->val_str((String*) 0); + } +#line 47338 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2434: /* hex_or_bin_String: HEX_STRING */ +#line 14840 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_hex_string(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + (yyval.string)= tmp->val_str((String*) 0); + } +#line 47350 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2435: /* hex_or_bin_String: BIN_NUM */ +#line 14848 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_bin_string(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + /* + it is OK only emulate fix_fields, because we need only + value of constant + */ + (yyval.string)= tmp->val_str((String*) 0); + } +#line 47366 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2436: /* param_marker: PARAM_MARKER */ +#line 14863 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, ¶m_clex_str, + YYLIP->get_tok_start(), + YYLIP->get_tok_start() + 1)))) + MYSQL_YYABORT; + } +#line 47377 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2437: /* param_marker: COLON_ORACLE_SYM ident_cli */ +#line 14870 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, &null_clex_str, + (yyvsp[-1].kwd).pos(), (yyvsp[0].ident_cli).end())))) + MYSQL_YYABORT; + } +#line 47387 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2438: /* param_marker: COLON_ORACLE_SYM NUM */ +#line 14876 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, &null_clex_str, + (yyvsp[-1].kwd).pos(), + YYLIP->get_ptr())))) + MYSQL_YYABORT; + } +#line 47398 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2439: /* signed_literal: '+' NUM_literal */ +#line 14885 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_num); } +#line 47404 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2440: /* signed_literal: '-' NUM_literal */ +#line 14887 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_num)->max_length++; + (yyval.item)= (yyvsp[0].item_num)->neg(thd); + } +#line 47413 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2441: /* literal: text_literal */ +#line 14894 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_basic_constant); } +#line 47419 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2442: /* literal: NUM_literal */ +#line 14895 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_num); } +#line 47425 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2443: /* literal: temporal_literal */ +#line 14896 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 47431 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2444: /* literal: NULL_SYM */ +#line 14898 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + For the digest computation, in this context only, + NULL is considered a literal, hence reduced to '?' + REDUCE: + TOK_GENERIC_VALUE := NULL_SYM + */ + YYLIP->reduce_digest_token(TOK_GENERIC_VALUE, NULL_SYM); + (yyval.item)= new (thd->mem_root) Item_null(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + YYLIP->next_state= MY_LEX_OPERATOR_OR_IDENT; + } +#line 47449 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2445: /* literal: FALSE_SYM */ +#line 14912 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bool(thd, (char*) "FALSE",0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47459 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2446: /* literal: TRUE_SYM */ +#line 14918 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bool(thd, (char*) "TRUE",1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47469 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2447: /* literal: HEX_NUM */ +#line 14924 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_hex_hybrid(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2448: /* literal: HEX_STRING */ +#line 14930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_hex_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2449: /* literal: BIN_NUM */ +#line 14936 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bin_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47499 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2450: /* literal: UNDERSCORE_CHARSET hex_or_bin_String */ +#line 14942 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_string_with_introducer *item_str; + LEX_CSTRING tmp; + (yyvsp[0].string)->get_value(&tmp); + /* + Pass NULL as name. Name will be set in the "select_item" rule and + will include the introducer and the original hex/bin notation. + */ + item_str= new (thd->mem_root) + Item_string_with_introducer(thd, null_clex_str, + tmp, (yyvsp[-1].charset)); + if (unlikely(!item_str || + !item_str->check_well_formed_result(true))) + MYSQL_YYABORT; + + (yyval.item)= item_str; + } +#line 47521 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2451: /* NUM_literal: NUM */ +#line 14963 "/home/buildbot/git/sql/sql_yacc.yy" + { + int error; + (yyval.item_num)= new (thd->mem_root) + Item_int(thd, (yyvsp[0].lex_str).str, + (longlong) my_strtoll10((yyvsp[0].lex_str).str, NULL, &error), + (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 47535 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2452: /* NUM_literal: LONG_NUM */ +#line 14973 "/home/buildbot/git/sql/sql_yacc.yy" + { + int error; + (yyval.item_num)= new (thd->mem_root) + Item_int(thd, (yyvsp[0].lex_str).str, + (longlong) my_strtoll10((yyvsp[0].lex_str).str, NULL, &error), + (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 47549 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2453: /* NUM_literal: ULONGLONG_NUM */ +#line 14983 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 47559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2454: /* NUM_literal: DECIMAL_NUM */ +#line 14989 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_decimal(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, + thd->charset()); + if (unlikely((yyval.item_num) == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + } +#line 47570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2455: /* NUM_literal: FLOAT_NUM */ +#line 14996 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_float(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + } +#line 47580 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2456: /* temporal_literal: DATE_SYM TEXT_STRING */ +#line 15006 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_newdate.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 47591 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2457: /* temporal_literal: TIME_SYM TEXT_STRING */ +#line 15013 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_time2.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 47602 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2458: /* temporal_literal: TIMESTAMP TEXT_STRING */ +#line 15020 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_datetime.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 47613 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2459: /* $@218: %empty */ +#line 15030 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + With_clause *with_clause= + new With_clause((yyvsp[0].num), Lex->curr_with_clause); + if (unlikely(with_clause == NULL)) + MYSQL_YYABORT; + lex->derived_tables|= DERIVED_WITH; + lex->with_cte_resolution= true; + lex->curr_with_clause= with_clause; + with_clause->add_to_list(&lex->with_clauses_list, + lex->with_clauses_list_last_next); + if (lex->current_select && + lex->current_select->parsing_place == BEFORE_OPT_LIST) + lex->current_select->parsing_place= NO_MATTER; + } +#line 47633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2460: /* with_clause: WITH opt_recursive $@218 with_list */ +#line 15046 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.with_clause)= Lex->curr_with_clause; + Lex->curr_with_clause= Lex->curr_with_clause->pop(); + } +#line 47642 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2461: /* opt_recursive: %empty */ +#line 15054 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 47648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2462: /* opt_recursive: RECURSIVE_SYM */ +#line 15055 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 47654 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2465: /* with_list_element: with_element_head opt_with_column_list AS '(' query_expression ')' opt_cycle */ +#line 15069 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + const char *query_start= lex->sphead ? lex->sphead->m_tmp_query + : thd->query(); + const char *spec_start= (yyvsp[-3].kwd).pos() + 1; + With_element *elem= new With_element((yyvsp[-6].with_element_head), *(yyvsp[-5].ident_sys_list), (yyvsp[-2].select_lex_unit)); + if (elem == NULL || Lex->curr_with_clause->add_with_element(elem)) + MYSQL_YYABORT; + if (elem->set_unparsed_spec(thd, spec_start, (yyvsp[-1].kwd).pos(), + spec_start - query_start)) + MYSQL_YYABORT; + if ((yyvsp[0].ident_sys_list)) + { + elem->set_cycle_list((yyvsp[0].ident_sys_list)); + } + elem->set_tables_end_pos(lex->query_tables_last); + } +#line 47676 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2466: /* opt_cycle: %empty */ +#line 15090 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys_list)= NULL; } +#line 47682 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2467: /* $@219: %empty */ +#line 15093 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->curr_with_clause->with_recursive) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].kwd).pos()); + } + } +#line 47693 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2468: /* opt_cycle: CYCLE_SYM $@219 comma_separated_ident_list RESTRICT */ +#line 15100 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_list)= (yyvsp[-1].ident_sys_list); + } +#line 47701 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2469: /* opt_with_column_list: %empty */ +#line 15108 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.ident_sys_list)= new (thd->mem_root) List) == NULL) + MYSQL_YYABORT; + } +#line 47710 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2470: /* opt_with_column_list: '(' with_column_list ')' */ +#line 15113 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys_list)= (yyvsp[-1].ident_sys_list); } +#line 47716 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2472: /* ident_sys_alloc: ident_cli */ +#line 15122 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_ptr)= new (thd->mem_root) Lex_ident_sys(thd, &(yyvsp[0].ident_cli)); + } +#line 47724 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2473: /* comma_separated_ident_list: ident_sys_alloc */ +#line 15129 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_list)= new (thd->mem_root) List; + if (unlikely((yyval.ident_sys_list) == NULL || (yyval.ident_sys_list)->push_back((yyvsp[0].ident_sys_ptr)))) + MYSQL_YYABORT; + } +#line 47734 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2474: /* comma_separated_ident_list: comma_separated_ident_list ',' ident_sys_alloc */ +#line 15135 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.ident_sys_list)= (yyvsp[-2].ident_sys_list))->push_back((yyvsp[0].ident_sys_ptr))) + MYSQL_YYABORT; + } +#line 47743 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2475: /* with_element_head: ident */ +#line 15144 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING *name= + (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + (yyval.with_element_head)= new (thd->mem_root) With_element_head(name); + if (unlikely(name == NULL || (yyval.with_element_head) == NULL)) + MYSQL_YYABORT; + (yyval.with_element_head)->tables_pos.set_start_pos(Lex->query_tables_last); + } +#line 47756 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2476: /* insert_ident: simple_ident_nospvar */ +#line 15161 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 47762 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2477: /* insert_ident: table_wild */ +#line 15162 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 47768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2478: /* table_wild: ident '.' '*' */ +#line 15167 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 47777 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2479: /* table_wild: ident '.' ident '.' '*' */ +#line 15172 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 47786 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2480: /* select_sublist_qualified_asterisk: ident_cli '.' '*' */ +#line 15180 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-2].ident_cli))))) + MYSQL_YYABORT; + } +#line 47795 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2481: /* select_sublist_qualified_asterisk: ident_cli '.' ident_cli '.' '*' */ +#line 15185 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-4].ident_cli), &(yyvsp[-2].ident_cli))))) + MYSQL_YYABORT; + } +#line 47804 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2482: /* order_ident: expr */ +#line 15192 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 47810 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2483: /* simple_ident: ident_cli */ +#line 15198 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47819 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2484: /* simple_ident: ident_cli '.' ident_cli */ +#line 15203 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47828 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2485: /* simple_ident: '.' ident_cli '.' ident_cli */ +#line 15208 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_cli empty((yyvsp[-2].ident_cli).pos(), 0); + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &empty, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47838 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2486: /* simple_ident: ident_cli '.' ident_cli '.' ident_cli */ +#line 15214 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-4].ident_cli), &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47847 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2487: /* simple_ident: COLON_ORACLE_SYM ident_cli '.' ident_cli */ +#line 15219 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_colon_ident_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47856 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2488: /* simple_ident_nospvar: ident */ +#line 15227 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident_nosp(thd, &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 47865 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2489: /* simple_ident_nospvar: ident '.' ident */ +#line 15232 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident_nospvar(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 47874 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2490: /* simple_ident_nospvar: COLON_ORACLE_SYM ident_cli '.' ident_cli */ +#line 15237 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_colon_ident_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47883 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2491: /* simple_ident_nospvar: '.' ident '.' ident */ +#line 15242 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys none; + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &none, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 47893 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2492: /* simple_ident_nospvar: ident '.' ident '.' ident */ +#line 15248 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 47902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2493: /* field_ident: ident */ +#line 15255 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 47908 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2494: /* field_ident: ident '.' ident '.' ident */ +#line 15257 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *table= Select->table_list.first; + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-4].ident_sys).str, + table->db.str))) + my_yyabort_error((ER_WRONG_DB_NAME, MYF(0), (yyvsp[-4].ident_sys).str)); + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-2].ident_sys).str, + table->table_name.str))) + my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.lex_str)=(yyvsp[0].ident_sys); + } +#line 47923 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2495: /* field_ident: ident '.' ident */ +#line 15268 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *table= Select->table_list.first; + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-2].ident_sys).str, + table->alias.str))) + my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.lex_str)=(yyvsp[0].ident_sys); + } +#line 47935 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2496: /* field_ident: '.' ident */ +#line 15275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 47941 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2497: /* table_ident: ident */ +#line 15280 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[0].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 47951 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2498: /* table_ident: ident '.' ident */ +#line 15286 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 47961 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2499: /* table_ident: '.' ident */ +#line 15292 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* For Delphi */ + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[0].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 47972 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2500: /* table_ident_opt_wild: ident opt_wild */ +#line 15302 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[-1].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 47982 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2501: /* table_ident_opt_wild: ident '.' ident opt_wild */ +#line 15308 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(thd, &(yyvsp[-3].ident_sys), &(yyvsp[-1].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 47992 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2502: /* table_ident_nodb: ident */ +#line 15317 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING db= any_db; + (yyval.table)= new (thd->mem_root) Table_ident(thd, &db, &(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48003 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2507: /* ident_cli: keyword_ident */ +#line 15333 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48009 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2508: /* IDENT_sys: IDENT_cli */ +#line 15338 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->to_ident_sys_alloc(&(yyval.ident_sys), &(yyvsp[0].ident_cli)))) + MYSQL_YYABORT; + } +#line 48018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2511: /* ident_cli_func: keyword_func_sp_var_and_label */ +#line 15347 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48024 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2512: /* ident_cli_func: keyword_func_sp_var_not_label */ +#line 15348 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48030 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2513: /* ident_func: ident_cli_func */ +#line 15353 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->to_ident_sys_alloc(&(yyval.ident_sys), &(yyvsp[0].ident_cli)))) + MYSQL_YYABORT; + } +#line 48039 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2514: /* TEXT_STRING_sys: TEXT_STRING */ +#line 15362 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_sys(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2515: /* TEXT_STRING_literal: TEXT_STRING */ +#line 15370 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_connection(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48057 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2516: /* TEXT_STRING_filesystem: TEXT_STRING */ +#line 15378 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_filesystem(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2518: /* ident_table_alias: keyword_table_alias */ +#line 15387 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48075 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2519: /* ident_cli_set_usual_case: IDENT_cli */ +#line 15394 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].ident_cli); } +#line 48081 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2520: /* ident_cli_set_usual_case: keyword_set_usual_case */ +#line 15395 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48087 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2522: /* ident_sysvar_name: keyword_sysvar_name */ +#line 15401 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2523: /* ident_sysvar_name: TEXT_STRING_sys */ +#line 15406 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_sys(thd, &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 48105 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2525: /* ident: keyword_ident */ +#line 15416 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48114 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2527: /* label_ident: keyword_label */ +#line 15425 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48123 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2528: /* ident_or_text: ident */ +#line 15432 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 48129 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2529: /* ident_or_text: TEXT_STRING_sys */ +#line 15433 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str);} +#line 48135 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2530: /* ident_or_text: LEX_HOSTNAME */ +#line 15434 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str);} +#line 48141 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2531: /* user_maybe_role: ident_or_text */ +#line 15439 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user = (yyvsp[0].lex_str); + + if (unlikely(check_string_char_length(&(yyval.lex_user)->user, ER_USERNAME, + username_char_length, + system_charset_info, 0))) + MYSQL_YYABORT; + } +#line 48156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2532: /* user_maybe_role: ident_or_text '@' ident_or_text */ +#line 15450 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user = (yyvsp[-2].lex_str); (yyval.lex_user)->host=(yyvsp[0].lex_str); + + if (unlikely(check_string_char_length(&(yyval.lex_user)->user, ER_USERNAME, + username_char_length, + system_charset_info, 0)) || + unlikely(check_host_name(&(yyval.lex_user)->host))) + MYSQL_YYABORT; + if ((yyval.lex_user)->host.str[0]) + { + /* + Convert hostname part of username to lowercase. + It's OK to use in-place lowercase as long as + the character set is utf8. + */ + my_casedn_str(system_charset_info, (char*) (yyval.lex_user)->host.str); + } + else + { + /* + fix historical undocumented convention that empty host is the + same as '%' + */ + (yyval.lex_user)->host= host_not_specified; + } + } +#line 48189 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2533: /* user_maybe_role: CURRENT_USER optional_braces */ +#line 15479 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user= current_user; + (yyval.lex_user)->auth= new (thd->mem_root) USER_AUTH(); + } +#line 48200 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2536: /* user: user_maybe_role */ +#line 15490 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].lex_user)->user.str != current_user.str && (yyvsp[0].lex_user)->host.str == 0) + (yyvsp[0].lex_user)->host= host_not_specified; + (yyval.lex_user)= (yyvsp[0].lex_user); + } +#line 48210 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3262: /* $@220: %empty */ +#line 16359 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_stmt_init(); + } +#line 48219 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3263: /* set: SET $@220 set_param */ +#line 16364 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 48228 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3266: /* $@221: %empty */ +#line 16374 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= OPT_DEFAULT; + if (sp_create_assignment_lex(thd, (yyvsp[0].kwd).pos())) + MYSQL_YYABORT; + } +#line 48238 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3267: /* set_param: TRANSACTION_SYM $@221 transaction_characteristics */ +#line 16380 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48247 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3268: /* $@222: %empty */ +#line 16385 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= (yyvsp[0].var_type); + } +#line 48255 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3270: /* $@223: %empty */ +#line 16391 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->table_or_sp_used())) + my_yyabort_error((ER_SUBQUERIES_NOT_SUPPORTED, MYF(0), "SET STATEMENT")); + lex->stmt_var_list= lex->var_list; + lex->var_list.empty(); + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 48269 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3276: /* $@224: %empty */ +#line 16418 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[0].kwd).pos())) + MYSQL_YYABORT; + } +#line 48278 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3277: /* start_option_value_list_following_option_type: TRANSACTION_SYM $@224 transaction_characteristics */ +#line 16423 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48287 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3280: /* $@225: %empty */ +#line 16438 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= (yyvsp[0].var_type); + } +#line 48295 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3283: /* option_type: GLOBAL_SYM */ +#line 16446 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 48301 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3284: /* option_type: LOCAL_SYM */ +#line 16447 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48307 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3285: /* option_type: SESSION_SYM */ +#line 16448 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48313 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3286: /* opt_var_type: %empty */ +#line 16452 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48319 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3287: /* opt_var_type: GLOBAL_SYM */ +#line 16453 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 48325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3288: /* opt_var_type: LOCAL_SYM */ +#line 16454 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48331 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3289: /* opt_var_type: SESSION_SYM */ +#line 16455 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48337 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3290: /* opt_var_ident_type: %empty */ +#line 16459 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_DEFAULT; } +#line 48343 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3291: /* opt_var_ident_type: GLOBAL_SYM '.' */ +#line 16460 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 48349 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3292: /* opt_var_ident_type: LOCAL_SYM '.' */ +#line 16461 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3293: /* opt_var_ident_type: SESSION_SYM '.' */ +#line 16462 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48361 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3294: /* $@226: %empty */ +#line 16471 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 48370 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3295: /* set_stmt_option: ident_cli equal $@226 set_expr_or_default */ +#line 16476 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(Lex->option_type, &tmp, (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 48382 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3296: /* $@227: %empty */ +#line 16484 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 48391 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3297: /* set_stmt_option: ident_cli '.' ident equal $@227 set_expr_or_default */ +#line 16489 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(thd, Lex->option_type, + &tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 48404 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3298: /* $@228: %empty */ +#line 16498 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 48413 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3299: /* set_stmt_option: DEFAULT '.' ident equal $@228 set_expr_or_default */ +#line 16503 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, + &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 48424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3300: /* $@229: %empty */ +#line 16515 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 48433 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3301: /* option_value_following_option_type: ident_cli equal $@229 set_expr_or_default */ +#line 16520 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(Lex->option_type, &tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48445 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3302: /* $@230: %empty */ +#line 16528 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 48454 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3303: /* option_value_following_option_type: ident_cli '.' ident equal $@230 set_expr_or_default */ +#line 16533 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(thd, Lex->option_type, &tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48466 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3304: /* $@231: %empty */ +#line 16541 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].kwd).pos())) + MYSQL_YYABORT; + } +#line 48475 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3305: /* option_value_following_option_type: DEFAULT '.' ident equal $@231 set_expr_or_default */ +#line 16546 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48485 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3306: /* $@232: %empty */ +#line 16556 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 48494 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3307: /* option_value_no_option_type: ident_cli_set_usual_case equal $@232 set_expr_or_default */ +#line 16561 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48506 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3308: /* $@233: %empty */ +#line 16569 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 48515 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3309: /* option_value_no_option_type: ident_cli_set_usual_case '.' ident equal $@233 set_expr_or_default */ +#line 16574 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48527 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3310: /* $@234: %empty */ +#line 16582 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].kwd).pos())) + MYSQL_YYABORT; + } +#line 48536 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3311: /* option_value_no_option_type: DEFAULT '.' ident equal $@234 set_expr_or_default */ +#line 16587 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3312: /* $@235: %empty */ +#line 16594 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[-1].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + if (sp_create_assignment_lex(thd, (yyvsp[-2].lex_str).str)) + MYSQL_YYABORT; + } +#line 48562 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3313: /* option_value_no_option_type: '@' ident_or_text equal $@235 expr */ +#line 16605 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_user_variable(thd, &(yyvsp[-3].lex_str), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48572 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3314: /* $@236: %empty */ +#line 16611 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-4].lex_str).str)) + MYSQL_YYABORT; + } +#line 48581 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3315: /* option_value_no_option_type: '@' '@' opt_var_ident_type ident_sysvar_name equal $@236 set_expr_or_default */ +#line 16616 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_system_variable((yyvsp[-4].var_type), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48591 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3316: /* $@237: %empty */ +#line 16622 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-6].lex_str).str)) + MYSQL_YYABORT; + } +#line 48600 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3317: /* option_value_no_option_type: '@' '@' opt_var_ident_type ident_sysvar_name '.' ident equal $@237 set_expr_or_default */ +#line 16627 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_system_variable(thd, (yyvsp[-6].var_type), &(yyvsp[-5].ident_sys), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48610 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3318: /* $@238: %empty */ +#line 16633 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-6].lex_str).str)) + MYSQL_YYABORT; + } +#line 48619 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3319: /* option_value_no_option_type: '@' '@' opt_var_ident_type DEFAULT '.' ident equal $@238 set_expr_or_default */ +#line 16638 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable((yyvsp[-6].var_type), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48629 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3320: /* option_value_no_option_type: charset old_or_new_charset_name_or_default */ +#line 16644 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + LEX *lex= thd->lex; + CHARSET_INFO *cs2; + cs2= (yyvsp[0].charset) ? (yyvsp[0].charset): global_system_variables.character_set_client; + set_var_collation_client *var; + var= (new (thd->mem_root) + set_var_collation_client(cs2, + thd->variables.collation_database, + cs2)); + if (unlikely(var == NULL)) + MYSQL_YYABORT; + lex->var_list.push_back(var, thd->mem_root); + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48651 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3321: /* option_value_no_option_type: NAMES_SYM equal expr */ +#line 16662 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + LEX_CSTRING names= { STRING_WITH_LEN("names") }; + if (unlikely(spc && spc->find_variable(&names, false))) + my_error(ER_SP_BAD_VAR_SHADOW, MYF(0), names.str); + else + thd->parse_error(); + MYSQL_YYABORT; + } +#line 48666 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3322: /* option_value_no_option_type: NAMES_SYM charset_name_or_default */ +#line 16673 "/home/buildbot/git/sql/sql_yacc.yy" + { + CHARSET_INFO *def= global_system_variables.character_set_client; + Lex_exact_charset_opt_extended_collate tmp((yyvsp[0].charset) ? (yyvsp[0].charset) : def, false); + if (Lex->set_names((yyvsp[-1].kwd).pos(), tmp, yychar == YYEMPTY)) + MYSQL_YYABORT; + } +#line 48677 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3323: /* option_value_no_option_type: NAMES_SYM charset_name_or_default COLLATE_SYM collation_name_or_default */ +#line 16681 "/home/buildbot/git/sql/sql_yacc.yy" + { + CHARSET_INFO *def= global_system_variables.character_set_client; + Lex_exact_charset_opt_extended_collate tmp((yyvsp[-2].charset) ? (yyvsp[-2].charset) : def, false); + if (tmp.merge_collation((yyvsp[0].Lex_extended_collation)) || + Lex->set_names((yyvsp[-3].kwd).pos(), tmp, yychar == YYEMPTY)) + MYSQL_YYABORT; + } +#line 48689 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3324: /* option_value_no_option_type: DEFAULT ROLE_SYM grant_role */ +#line 16689 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-2].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + LEX_USER *user; + if (unlikely(!(user=(LEX_USER *) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + user->user= current_user; + set_var_default_role *var= (new (thd->mem_root) + set_var_default_role(user, + (yyvsp[0].lex_user)->user)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + + thd->lex->autocommit= TRUE; + if (lex->sphead) + lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48715 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3325: /* option_value_no_option_type: DEFAULT ROLE_SYM grant_role FOR_SYM user */ +#line 16711 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-4].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + set_var_default_role *var= (new (thd->mem_root) + set_var_default_role((yyvsp[0].lex_user), (yyvsp[-2].lex_user)->user)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + thd->lex->autocommit= TRUE; + if (lex->sphead) + lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48735 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3326: /* option_value_no_option_type: ROLE_SYM role_name */ +#line 16727 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + set_var_role *var= new (thd->mem_root) set_var_role((yyvsp[0].lex_user)->user); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root)) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48750 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3327: /* $@239: %empty */ +#line 16738 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 48759 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3328: /* option_value_no_option_type: ROLE_SYM equal $@239 set_expr_or_default */ +#line 16743 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].kwd)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48771 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3329: /* $@240: %empty */ +#line 16751 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 48780 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3330: /* option_value_no_option_type: PASSWORD_SYM equal $@240 text_or_password */ +#line 16756 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_create_set_password_instr(thd, (yyvsp[0].user_auth), + yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48790 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3331: /* $@241: %empty */ +#line 16762 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 48799 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3332: /* option_value_no_option_type: PASSWORD_SYM FOR_SYM $@241 user equal text_or_password */ +#line 16767 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_create_set_password_instr(thd, (yyvsp[-2].lex_user), (yyvsp[0].user_auth), + yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48809 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3337: /* transaction_access_mode: transaction_access_mode_types */ +#line 16783 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Item *item= new (thd->mem_root) Item_int(thd, (int32) (yyvsp[0].num)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + set_var *var= (new (thd->mem_root) + set_var(thd, lex->option_type, + find_sys_var(thd, "tx_read_only"), + &null_clex_str, + item)); + if (unlikely(var == NULL)) + MYSQL_YYABORT; + if (unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + } +#line 48829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3338: /* isolation_level: ISOLATION LEVEL_SYM isolation_types */ +#line 16802 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Item *item= new (thd->mem_root) Item_int(thd, (int32) (yyvsp[0].tx_isolation)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + set_var *var= (new (thd->mem_root) + set_var(thd, lex->option_type, + find_sys_var(thd, "tx_isolation"), + &null_clex_str, + item)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + } +#line 48848 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3339: /* transaction_access_mode_types: READ_SYM ONLY_SYM */ +#line 16819 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 48854 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3340: /* transaction_access_mode_types: READ_SYM WRITE_SYM */ +#line 16820 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 48860 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3341: /* isolation_types: READ_SYM UNCOMMITTED_SYM */ +#line 16824 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_READ_UNCOMMITTED; } +#line 48866 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3342: /* isolation_types: READ_SYM COMMITTED_SYM */ +#line 16825 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_READ_COMMITTED; } +#line 48872 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3343: /* isolation_types: REPEATABLE_SYM READ_SYM */ +#line 16826 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_REPEATABLE_READ; } +#line 48878 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3344: /* isolation_types: SERIALIZABLE_SYM */ +#line 16827 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_SERIALIZABLE; } +#line 48884 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3345: /* text_or_password: TEXT_STRING */ +#line 16833 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->auth_str= (yyvsp[0].lex_string_with_metadata); + } +#line 48893 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3346: /* text_or_password: PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 16838 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + } +#line 48902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3347: /* text_or_password: OLD_PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 16843 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + (yyval.user_auth)->auth_str.str= Item_func_password::alloc(thd, + (yyvsp[-1].lex_string_with_metadata).str, (yyvsp[-1].lex_string_with_metadata).length, Item_func_password::OLD); + (yyval.user_auth)->auth_str.length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; + } +#line 48914 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3348: /* set_expr_or_default: expr */ +#line 16853 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 48920 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3349: /* set_expr_or_default: DEFAULT */ +#line 16854 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=0; } +#line 48926 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3350: /* set_expr_or_default: ON */ +#line 16856 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "ON", 2); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48936 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3351: /* set_expr_or_default: ALL */ +#line 16862 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "ALL", 3); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48946 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3352: /* set_expr_or_default: BINARY */ +#line 16868 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "binary", 6); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48956 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3353: /* $@242: %empty */ +#line 16879 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "LOCK")); + lex->sql_command= SQLCOM_LOCK_TABLES; + } +#line 48968 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3354: /* lock: LOCK_SYM table_or_tables $@242 table_lock_list opt_lock_wait_timeout */ +#line 16887 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 48974 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3355: /* opt_lock_wait_timeout: %empty */ +#line 16892 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 48980 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3356: /* opt_lock_wait_timeout: WAIT_SYM ulong_num */ +#line 16894 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("lock_wait_timeout"), (yyvsp[0].ulong_num))) || + unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("innodb_lock_wait_timeout"), (yyvsp[0].ulong_num)))) + MYSQL_YYABORT; + } +#line 48990 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3357: /* opt_lock_wait_timeout: NOWAIT_SYM */ +#line 16900 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("lock_wait_timeout"), 0)) || + unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("innodb_lock_wait_timeout"), 0))) + MYSQL_YYABORT; + } +#line 49000 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3358: /* table_or_tables: TABLE_SYM */ +#line 16908 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 49006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3359: /* table_or_tables: TABLES */ +#line 16909 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 49012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3362: /* table_lock: table_ident opt_table_alias_clause lock_option */ +#line 16919 "/home/buildbot/git/sql/sql_yacc.yy" + { + thr_lock_type lock_type= (thr_lock_type) (yyvsp[0].num); + bool lock_for_write= (lock_type >= TL_FIRST_WRITE); + ulong table_options= lock_for_write ? TL_OPTION_UPDATING : 0; + enum_mdl_type mdl_type= !lock_for_write + ? MDL_SHARED_READ + : lock_type == TL_WRITE_CONCURRENT_INSERT + ? MDL_SHARED_WRITE + : MDL_SHARED_NO_READ_WRITE; + + if (unlikely(!Lex->current_select_or_default()-> + add_table_to_list(thd, (yyvsp[-2].table), (yyvsp[-1].lex_str_ptr), table_options, + lock_type, mdl_type))) + MYSQL_YYABORT; + } +#line 49032 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3363: /* lock_option: READ_SYM */ +#line 16937 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_READ_NO_INSERT; } +#line 49038 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3364: /* lock_option: WRITE_SYM */ +#line 16938 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_WRITE_DEFAULT; } +#line 49044 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3365: /* lock_option: WRITE_SYM CONCURRENT */ +#line 16940 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 49052 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3366: /* lock_option: LOW_PRIORITY WRITE_SYM */ +#line 16944 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_WRITE_LOW_PRIORITY; } +#line 49058 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3367: /* lock_option: READ_SYM LOCAL_SYM */ +#line 16945 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_READ; } +#line 49064 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3368: /* $@243: %empty */ +#line 16950 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "UNLOCK")); + lex->sql_command= SQLCOM_UNLOCK_TABLES; + } +#line 49076 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3369: /* unlock: UNLOCK_SYM $@243 table_or_tables */ +#line 16958 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49082 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3370: /* $@244: %empty */ +#line 16967 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 49091 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3371: /* handler: HANDLER_SYM $@244 handler_tail */ +#line 16972 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 49099 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3372: /* handler_tail: table_ident OPEN_SYM opt_table_alias_clause */ +#line 16979 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->sql_command = SQLCOM_HA_OPEN; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-2].table), (yyvsp[0].lex_str_ptr), 0)) + MYSQL_YYABORT; + } +#line 49112 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3373: /* handler_tail: table_ident_nodb CLOSE_SYM */ +#line 16988 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->sql_command = SQLCOM_HA_CLOSE; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-1].table), 0, 0)) + MYSQL_YYABORT; + } +#line 49125 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3374: /* $@245: %empty */ +#line 16997 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *select= Select; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->clause_that_disallows_subselect= "HANDLER..READ"; + lex->sql_command = SQLCOM_HA_READ; + lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + select->limit_params.select_limit= one; + select->limit_params.offset_limit= 0; + lex->limit_rows_examined= 0; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-1].table), 0, 0)) + MYSQL_YYABORT; + } +#line 49147 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3375: /* handler_tail: table_ident_nodb READ_SYM $@245 handler_read_or_scan opt_where_clause opt_global_limit_clause */ +#line 17015 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *select= Select; + lex->clause_that_disallows_subselect= NULL; + if (!lex->current_select->limit_params.explicit_limit) + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (one == NULL) + MYSQL_YYABORT; + select->limit_params.select_limit= one; + select->limit_params.offset_limit= 0; + lex->limit_rows_examined= 0; + } + /* Stored functions are not supported for HANDLER READ. */ + if (lex->uses_stored_routines()) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "stored functions in HANDLER ... READ"); + MYSQL_YYABORT; + } + } +#line 49173 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3376: /* handler_read_or_scan: handler_scan_function */ +#line 17039 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ident= null_clex_str; } +#line 49179 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3377: /* handler_read_or_scan: ident handler_rkey_function */ +#line 17040 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ident= (yyvsp[-1].ident_sys); } +#line 49185 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3378: /* handler_scan_function: FIRST_SYM */ +#line 17044 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RFIRST; } +#line 49191 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3379: /* handler_scan_function: NEXT_SYM */ +#line 17045 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RNEXT; } +#line 49197 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3380: /* handler_rkey_function: FIRST_SYM */ +#line 17049 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RFIRST; } +#line 49203 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3381: /* handler_rkey_function: NEXT_SYM */ +#line 17050 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RNEXT; } +#line 49209 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3382: /* handler_rkey_function: PREV_SYM */ +#line 17051 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RPREV; } +#line 49215 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3383: /* handler_rkey_function: LAST_SYM */ +#line 17052 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RLAST; } +#line 49221 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3384: /* $@246: %empty */ +#line 17054 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->ha_read_mode = RKEY; + lex->ha_rkey_mode=(yyvsp[0].ha_rkey_mode); + if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 49233 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3385: /* handler_rkey_function: handler_rkey_mode $@246 '(' values ')' */ +#line 17062 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49239 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3386: /* handler_rkey_mode: '=' */ +#line 17066 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_EXACT; } +#line 49245 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3387: /* handler_rkey_mode: GE */ +#line 17067 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_NEXT; } +#line 49251 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3388: /* handler_rkey_mode: LE */ +#line 17068 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_PREV; } +#line 49257 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3389: /* handler_rkey_mode: '>' */ +#line 17069 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_AFTER_KEY; } +#line 49263 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3390: /* handler_rkey_mode: '<' */ +#line 17070 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_BEFORE_KEY; } +#line 49269 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3391: /* revoke: REVOKE clear_privileges revoke_command */ +#line 17077 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49275 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3392: /* revoke_command: grant_privileges ON opt_table grant_ident FROM user_and_role_list */ +#line 17082 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_table(thd, (yyvsp[-5].lex_grant), *(yyvsp[-2].lex_grant_ident))) + MYSQL_YYABORT; + } +#line 49284 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3393: /* revoke_command: grant_privileges ON sp_handler grant_ident FROM user_and_role_list */ +#line 17087 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_sp(thd, (yyvsp[-5].lex_grant), *(yyvsp[-2].lex_grant_ident), *(yyvsp[-3].sp_handler))) + MYSQL_YYABORT; + } +#line 49293 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3394: /* revoke_command: ALL opt_privileges ',' GRANT OPTION FROM user_and_role_list */ +#line 17092 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_REVOKE_ALL; + } +#line 49301 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3395: /* revoke_command: PROXY_SYM ON user FROM user_list */ +#line 17096 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_proxy(thd, (yyvsp[-2].lex_user))) + MYSQL_YYABORT; + } +#line 49310 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3396: /* revoke_command: admin_option_for_role FROM user_and_role_list */ +#line 17101 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_REVOKE_ROLE; + if (unlikely(Lex->users_list.push_front((yyvsp[-2].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49320 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3397: /* admin_option_for_role: ADMIN_SYM OPTION FOR_SYM grant_role */ +#line 17110 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= true; (yyval.lex_user)= (yyvsp[0].lex_user); } +#line 49326 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3398: /* admin_option_for_role: grant_role */ +#line 17112 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= false; (yyval.lex_user)= (yyvsp[0].lex_user); } +#line 49332 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3399: /* grant: GRANT clear_privileges grant_command */ +#line 17117 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49338 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3400: /* grant_command: grant_privileges ON opt_table grant_ident TO_SYM grant_list opt_require_clause opt_grant_options */ +#line 17123 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_table(thd, (yyvsp[-7].lex_grant), *(yyvsp[-4].lex_grant_ident), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 49347 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3401: /* grant_command: grant_privileges ON sp_handler grant_ident TO_SYM grant_list opt_require_clause opt_grant_options */ +#line 17129 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_sp(thd, (yyvsp[-7].lex_grant), *(yyvsp[-4].lex_grant_ident), *(yyvsp[-5].sp_handler), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 49356 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3402: /* grant_command: PROXY_SYM ON user TO_SYM grant_list opt_grant_option */ +#line 17134 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_proxy(thd, (yyvsp[-3].lex_user), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 49365 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3403: /* grant_command: grant_role TO_SYM grant_list opt_with_admin_option */ +#line 17139 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_GRANT_ROLE; + /* The first role is the one that is granted */ + if (unlikely(Lex->users_list.push_front((yyvsp[-3].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49377 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3404: /* opt_with_admin: %empty */ +#line 17150 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->definer = 0; } +#line 49383 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3405: /* opt_with_admin: WITH ADMIN_SYM user_or_role */ +#line 17151 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->definer = (yyvsp[0].lex_user); } +#line 49389 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3406: /* opt_with_admin_option: %empty */ +#line 17155 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= false; } +#line 49395 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3407: /* opt_with_admin_option: WITH ADMIN_SYM OPTION */ +#line 17156 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= true; } +#line 49401 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3408: /* role_list: grant_role */ +#line 17161 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49410 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3409: /* role_list: role_list ',' grant_role */ +#line 17166 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49419 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3410: /* current_role: CURRENT_ROLE optional_braces */ +#line 17174 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user= current_role; + } +#line 49429 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3411: /* role_name: ident_or_text */ +#line 17183 "/home/buildbot/git/sql/sql_yacc.yy" + { + CHARSET_INFO *cs= system_charset_info; + /* trim end spaces (as they'll be lost in mysql.user anyway) */ + (yyvsp[0].lex_str).length= cs->lengthsp((yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + ((char*) (yyvsp[0].lex_str).str)[(yyvsp[0].lex_str).length] = '\0'; + if (unlikely((yyvsp[0].lex_str).length == 0)) + my_yyabort_error((ER_INVALID_ROLE, MYF(0), "")); + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + if (lex_string_eq(&(yyvsp[0].lex_str), &none)) + (yyval.lex_user)->user= none; + else if (lex_string_eq(&(yyvsp[0].lex_str), &public_name)) + (yyval.lex_user)->user= public_name; + else if (check_string_char_length(&((yyval.lex_user)->user= (yyvsp[0].lex_str)), ER_USERNAME, + username_char_length, cs, 0)) + MYSQL_YYABORT; + (yyval.lex_user)->host= empty_clex_str; + } +#line 49452 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3417: /* grant_privileges: ALL opt_privileges */ +#line 17213 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege(GLOBAL_ACLS, true))) + MYSQL_YYABORT; + } +#line 49461 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3420: /* object_privilege_list: object_privilege */ +#line 17226 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege((yyvsp[0].privilege)))) + MYSQL_YYABORT; + } +#line 49470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3421: /* object_privilege_list: column_list_privilege */ +#line 17231 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege()) || + (yyval.lex_grant)->add_column_list_privilege(thd, (yyvsp[0].column_list_privilege).m_columns[0], + (yyvsp[0].column_list_privilege).m_privilege)) + MYSQL_YYABORT; + } +#line 49481 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3422: /* object_privilege_list: object_privilege_list ',' object_privilege */ +#line 17238 "/home/buildbot/git/sql/sql_yacc.yy" + { + ((yyval.lex_grant)= (yyvsp[-2].lex_grant))->add_object_privilege((yyvsp[0].privilege)); + } +#line 49489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3423: /* object_privilege_list: object_privilege_list ',' column_list_privilege */ +#line 17242 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.lex_grant)= (yyvsp[-2].lex_grant))->add_column_list_privilege(thd, (yyvsp[0].column_list_privilege).m_columns[0], + (yyvsp[0].column_list_privilege).m_privilege)) + MYSQL_YYABORT; + } +#line 49499 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3424: /* column_list_privilege: column_privilege '(' comma_separated_ident_list ')' */ +#line 17251 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.column_list_privilege)= Lex_column_list_privilege((yyvsp[-1].ident_sys_list), (yyvsp[-3].privilege)); + } +#line 49507 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3425: /* column_privilege: SELECT_SYM */ +#line 17257 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SELECT_ACL; } +#line 49513 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3426: /* column_privilege: INSERT */ +#line 17258 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INSERT_ACL; } +#line 49519 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3427: /* column_privilege: UPDATE_SYM */ +#line 17259 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= UPDATE_ACL; } +#line 49525 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3428: /* column_privilege: REFERENCES */ +#line 17260 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REFERENCES_ACL; } +#line 49531 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3429: /* object_privilege: SELECT_SYM */ +#line 17264 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SELECT_ACL; } +#line 49537 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3430: /* object_privilege: INSERT */ +#line 17265 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INSERT_ACL; } +#line 49543 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3431: /* object_privilege: UPDATE_SYM */ +#line 17266 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= UPDATE_ACL; } +#line 49549 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3432: /* object_privilege: REFERENCES */ +#line 17267 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REFERENCES_ACL; } +#line 49555 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3433: /* object_privilege: DELETE_SYM */ +#line 17268 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DELETE_ACL;} +#line 49561 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3434: /* object_privilege: USAGE */ +#line 17269 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 49567 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3435: /* object_privilege: INDEX_SYM */ +#line 17270 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INDEX_ACL;} +#line 49573 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3436: /* object_privilege: ALTER */ +#line 17271 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= ALTER_ACL;} +#line 49579 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3437: /* object_privilege: CREATE */ +#line 17272 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_ACL;} +#line 49585 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3438: /* object_privilege: DROP */ +#line 17273 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DROP_ACL;} +#line 49591 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3439: /* object_privilege: EXECUTE_SYM */ +#line 17274 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= EXECUTE_ACL;} +#line 49597 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3440: /* object_privilege: RELOAD */ +#line 17275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= RELOAD_ACL;} +#line 49603 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3441: /* object_privilege: SHUTDOWN */ +#line 17276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHUTDOWN_ACL;} +#line 49609 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3442: /* object_privilege: PROCESS */ +#line 17277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= PROCESS_ACL;} +#line 49615 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3443: /* object_privilege: FILE_SYM */ +#line 17278 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= FILE_ACL;} +#line 49621 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3444: /* object_privilege: GRANT OPTION */ +#line 17279 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL;} +#line 49627 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3445: /* object_privilege: SHOW DATABASES */ +#line 17280 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHOW_DB_ACL;} +#line 49633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3446: /* object_privilege: SUPER_SYM */ +#line 17281 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SUPER_ACL;} +#line 49639 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3447: /* object_privilege: CREATE TEMPORARY TABLES */ +#line 17282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_TMP_ACL;} +#line 49645 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3448: /* object_privilege: LOCK_SYM TABLES */ +#line 17283 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= LOCK_TABLES_ACL; } +#line 49651 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3449: /* object_privilege: REPLICATION SLAVE */ +#line 17284 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_SLAVE_ACL; } +#line 49657 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3450: /* object_privilege: REPLICATION CLIENT_SYM */ +#line 17285 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_MONITOR_ACL; /*Compatibility*/ } +#line 49663 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3451: /* object_privilege: CREATE VIEW_SYM */ +#line 17286 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_VIEW_ACL; } +#line 49669 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3452: /* object_privilege: SHOW VIEW_SYM */ +#line 17287 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHOW_VIEW_ACL; } +#line 49675 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3453: /* object_privilege: CREATE ROUTINE_SYM */ +#line 17288 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_PROC_ACL; } +#line 49681 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3454: /* object_privilege: ALTER ROUTINE_SYM */ +#line 17289 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= ALTER_PROC_ACL; } +#line 49687 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3455: /* object_privilege: CREATE USER_SYM */ +#line 17290 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_USER_ACL; } +#line 49693 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3456: /* object_privilege: EVENT_SYM */ +#line 17291 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= EVENT_ACL;} +#line 49699 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3457: /* object_privilege: TRIGGER_SYM */ +#line 17292 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= TRIGGER_ACL; } +#line 49705 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3458: /* object_privilege: CREATE TABLESPACE */ +#line 17293 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_TABLESPACE_ACL; } +#line 49711 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3459: /* object_privilege: DELETE_SYM HISTORY_SYM */ +#line 17294 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DELETE_HISTORY_ACL; } +#line 49717 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3460: /* object_privilege: SET USER_SYM */ +#line 17295 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SET_USER_ACL; } +#line 49723 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3461: /* object_privilege: FEDERATED_SYM ADMIN_SYM */ +#line 17296 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= FEDERATED_ADMIN_ACL; } +#line 49729 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3462: /* object_privilege: CONNECTION_SYM ADMIN_SYM */ +#line 17297 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CONNECTION_ADMIN_ACL; } +#line 49735 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3463: /* object_privilege: READ_SYM ONLY_SYM ADMIN_SYM */ +#line 17298 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= READ_ONLY_ADMIN_ACL; } +#line 49741 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3464: /* object_privilege: READ_ONLY_SYM ADMIN_SYM */ +#line 17299 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= READ_ONLY_ADMIN_ACL; } +#line 49747 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3465: /* object_privilege: BINLOG_SYM MONITOR_SYM */ +#line 17300 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_MONITOR_ACL; } +#line 49753 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3466: /* object_privilege: BINLOG_SYM ADMIN_SYM */ +#line 17301 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_ADMIN_ACL; } +#line 49759 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3467: /* object_privilege: BINLOG_SYM REPLAY_SYM */ +#line 17302 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_REPLAY_ACL; } +#line 49765 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3468: /* object_privilege: REPLICATION MASTER_SYM ADMIN_SYM */ +#line 17303 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_MASTER_ADMIN_ACL; } +#line 49771 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3469: /* object_privilege: REPLICATION SLAVE ADMIN_SYM */ +#line 17304 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_SLAVE_ADMIN_ACL; } +#line 49777 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3470: /* object_privilege: SLAVE MONITOR_SYM */ +#line 17305 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SLAVE_MONITOR_ACL; } +#line 49783 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3471: /* opt_and: %empty */ +#line 17309 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49789 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3472: /* opt_and: AND_SYM */ +#line 17310 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49795 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3475: /* require_list_element: SUBJECT_SYM TEXT_STRING */ +#line 17320 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.x509_subject.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SUBJECT")); + lex->account_options.x509_subject= (yyvsp[0].lex_string_with_metadata); + } +#line 49806 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3476: /* require_list_element: ISSUER_SYM TEXT_STRING */ +#line 17327 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.x509_issuer.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "ISSUER")); + lex->account_options.x509_issuer= (yyvsp[0].lex_string_with_metadata); + } +#line 49817 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3477: /* require_list_element: CIPHER_SYM TEXT_STRING */ +#line 17334 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.ssl_cipher.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CIPHER")); + lex->account_options.ssl_cipher= (yyvsp[0].lex_string_with_metadata); + } +#line 49828 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3478: /* grant_ident: '*' */ +#line 17344 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING db; + if (unlikely(Lex->copy_db_to(&db))) + MYSQL_YYABORT; + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name(db, + Lex_grant_object_name::STAR))) + MYSQL_YYABORT; + } +#line 49841 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3479: /* grant_ident: ident '.' '*' */ +#line 17353 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name((yyvsp[-2].ident_sys), + Lex_grant_object_name::IDENT_STAR))) + MYSQL_YYABORT; + } +#line 49851 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3480: /* grant_ident: '*' '.' '*' */ +#line 17359 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name( + null_clex_str, + Lex_grant_object_name::STAR_STAR))) + MYSQL_YYABORT; + } +#line 49862 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3481: /* grant_ident: table_ident */ +#line 17366 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name((yyvsp[0].table)))) + MYSQL_YYABORT; + } +#line 49871 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3482: /* user_list: user */ +#line 17374 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49880 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3483: /* user_list: user_list ',' user */ +#line 17379 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49889 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3484: /* grant_list: grant_user */ +#line 17387 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49898 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3485: /* grant_list: grant_list ',' grant_user */ +#line 17392 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49907 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3486: /* user_and_role_list: user_or_role */ +#line 17400 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49916 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3487: /* user_and_role_list: user_and_role_list ',' user_or_role */ +#line 17405 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49925 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3492: /* grant_user: user IDENTIFIED_SYM BY TEXT_STRING */ +#line 17416 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-3].lex_user); + (yyvsp[-3].lex_user)->auth= new (thd->mem_root) USER_AUTH(); + (yyvsp[-3].lex_user)->auth->pwtext= (yyvsp[0].lex_string_with_metadata); + } +#line 49935 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3493: /* grant_user: user IDENTIFIED_SYM BY PASSWORD_SYM TEXT_STRING */ +#line 17422 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-4].lex_user); + (yyvsp[-4].lex_user)->auth= new (thd->mem_root) USER_AUTH(); + (yyvsp[-4].lex_user)->auth->auth_str= (yyvsp[0].lex_string_with_metadata); + } +#line 49945 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3494: /* grant_user: user IDENTIFIED_SYM via_or_with auth_expression */ +#line 17428 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-3].lex_user); + (yyvsp[-3].lex_user)->auth= (yyvsp[0].user_auth); + } +#line 49954 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3495: /* grant_user: user_or_role */ +#line 17433 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[0].lex_user); + } +#line 49962 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3496: /* auth_expression: auth_token OR_SYM auth_expression */ +#line 17440 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[-2].user_auth); + DBUG_ASSERT((yyval.user_auth)->next == NULL); + (yyval.user_auth)->next= (yyvsp[0].user_auth); + } +#line 49972 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3497: /* auth_expression: auth_token */ +#line 17446 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[0].user_auth); + } +#line 49980 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3498: /* auth_token: ident_or_text opt_auth_str */ +#line 17453 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[0].user_auth); + (yyval.user_auth)->plugin= (yyvsp[-1].lex_str); + } +#line 49989 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3499: /* opt_auth_str: %empty */ +#line 17461 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + } +#line 49998 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3500: /* opt_auth_str: using_or_as TEXT_STRING_sys */ +#line 17466 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + (yyval.user_auth)->auth_str= (yyvsp[0].lex_str); + } +#line 50008 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3501: /* opt_auth_str: using_or_as PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 17472 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + } +#line 50018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3503: /* opt_require_clause: REQUIRE_SYM require_list */ +#line 17482 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_SPECIFIED; + } +#line 50026 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3504: /* opt_require_clause: REQUIRE_SYM SSL_SYM */ +#line 17486 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_ANY; + } +#line 50034 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3505: /* opt_require_clause: REQUIRE_SYM X509_SYM */ +#line 17490 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_X509; + } +#line 50042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3506: /* opt_require_clause: REQUIRE_SYM NONE_SYM */ +#line 17494 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_NONE; + } +#line 50050 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3507: /* resource_option: MAX_QUERIES_PER_HOUR ulong_num */ +#line 17501 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.questions=(yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::QUERIES_PER_HOUR; + } +#line 50059 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3508: /* resource_option: MAX_UPDATES_PER_HOUR ulong_num */ +#line 17506 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.updates=(yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::UPDATES_PER_HOUR; + } +#line 50068 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3509: /* resource_option: MAX_CONNECTIONS_PER_HOUR ulong_num */ +#line 17511 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.conn_per_hour= (yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::CONNECTIONS_PER_HOUR; + } +#line 50077 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3510: /* resource_option: MAX_USER_CONNECTIONS_SYM int_num */ +#line 17516 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.user_conn= (yyvsp[0].num); + Lex->account_options.specified_limits|= USER_RESOURCES::USER_CONNECTIONS; + } +#line 50086 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3511: /* resource_option: MAX_STATEMENT_TIME_SYM NUM_literal */ +#line 17521 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.max_statement_time= (yyvsp[0].item_num)->val_real(); + Lex->account_options.specified_limits|= USER_RESOURCES::MAX_STATEMENT_TIME; + } +#line 50095 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3512: /* resource_option_list: resource_option_list resource_option */ +#line 17528 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50101 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3513: /* resource_option_list: resource_option */ +#line 17529 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50107 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3514: /* opt_resource_options: %empty */ +#line 17533 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50113 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3516: /* opt_grant_options: %empty */ +#line 17539 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50119 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3517: /* opt_grant_options: WITH grant_option_list */ +#line 17540 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= (yyvsp[0].privilege); } +#line 50125 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3518: /* opt_grant_option: %empty */ +#line 17544 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50131 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3519: /* opt_grant_option: WITH GRANT OPTION */ +#line 17545 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL; } +#line 50137 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3520: /* grant_option_list: grant_option_list grant_option */ +#line 17549 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= (yyvsp[-1].privilege) | (yyvsp[0].privilege); } +#line 50143 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3522: /* grant_option: GRANT OPTION */ +#line 17554 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL;} +#line 50149 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3523: /* grant_option: resource_option */ +#line 17555 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50155 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3524: /* $@247: %empty */ +#line 17560 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_BEGIN; + lex->start_transaction_opt= 0; + } +#line 50165 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3525: /* begin_stmt_mariadb: BEGIN_MARIADB_SYM $@247 opt_work */ +#line 17565 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50171 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3526: /* compound_statement: sp_proc_stmt_compound_ok */ +#line 17570 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_COMPOUND; + if (Lex->sp_body_finalize_procedure(thd)) + MYSQL_YYABORT; + } +#line 50181 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3527: /* opt_not: %empty */ +#line 17578 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 50187 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3528: /* opt_not: not */ +#line 17579 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 50193 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3529: /* opt_work: %empty */ +#line 17583 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50199 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3530: /* opt_work: WORK_SYM */ +#line 17584 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50205 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3531: /* opt_chain: %empty */ +#line 17589 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } +#line 50211 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3532: /* opt_chain: AND_SYM NO_SYM CHAIN_SYM */ +#line 17590 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_NO; } +#line 50217 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3533: /* opt_chain: AND_SYM CHAIN_SYM */ +#line 17591 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_YES; } +#line 50223 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3534: /* opt_release: %empty */ +#line 17596 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } +#line 50229 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3535: /* opt_release: RELEASE_SYM */ +#line 17597 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_YES; } +#line 50235 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3536: /* opt_release: NO_SYM RELEASE_SYM */ +#line 17598 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_NO; } +#line 50241 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3537: /* commit: COMMIT_SYM opt_work opt_chain opt_release */ +#line 17603 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_COMMIT; + /* Don't allow AND CHAIN RELEASE. */ + MYSQL_YYABORT_UNLESS((yyvsp[-1].m_yes_no_unk) != TVL_YES || (yyvsp[0].m_yes_no_unk) != TVL_YES); + lex->tx_chain= (yyvsp[-1].m_yes_no_unk); + lex->tx_release= (yyvsp[0].m_yes_no_unk); + } +#line 50254 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3538: /* rollback: ROLLBACK_SYM opt_work opt_chain opt_release */ +#line 17615 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK; + /* Don't allow AND CHAIN RELEASE. */ + MYSQL_YYABORT_UNLESS((yyvsp[-1].m_yes_no_unk) != TVL_YES || (yyvsp[0].m_yes_no_unk) != TVL_YES); + lex->tx_chain= (yyvsp[-1].m_yes_no_unk); + lex->tx_release= (yyvsp[0].m_yes_no_unk); + } +#line 50267 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3539: /* rollback: ROLLBACK_SYM opt_work TO_SYM SAVEPOINT_SYM ident */ +#line 17624 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 50277 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3540: /* rollback: ROLLBACK_SYM opt_work TO_SYM ident */ +#line 17630 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 50287 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3541: /* savepoint: SAVEPOINT_SYM ident */ +#line 17639 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 50297 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3542: /* release: RELEASE_SYM SAVEPOINT_SYM ident */ +#line 17648 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_RELEASE_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 50307 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3543: /* unit_type_decl: UNION_SYM union_option */ +#line 17661 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= UNION_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 50313 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3544: /* unit_type_decl: INTERSECT_SYM union_option */ +#line 17663 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= INTERSECT_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 50319 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3545: /* unit_type_decl: EXCEPT_SYM union_option */ +#line 17665 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= EXCEPT_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 50325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3546: /* union_option: %empty */ +#line 17672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1; } +#line 50331 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3547: /* union_option: DISTINCT */ +#line 17673 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1; } +#line 50337 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3548: /* union_option: ALL */ +#line 17674 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=0; } +#line 50343 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3549: /* query_expression_option: STRAIGHT_JOIN */ +#line 17678 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_STRAIGHT_JOIN; } +#line 50349 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3550: /* query_expression_option: HIGH_PRIORITY */ +#line 17680 "/home/buildbot/git/sql/sql_yacc.yy" + { + YYPS->m_lock_type= TL_READ_HIGH_PRIORITY; + YYPS->m_mdl_type= MDL_SHARED_READ; + Select->options|= SELECT_HIGH_PRIORITY; + } +#line 50359 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3551: /* query_expression_option: DISTINCT */ +#line 17685 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_DISTINCT; } +#line 50365 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3552: /* query_expression_option: UNIQUE_SYM */ +#line 17686 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_DISTINCT; } +#line 50371 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3553: /* query_expression_option: SQL_SMALL_RESULT */ +#line 17687 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_SMALL_RESULT; } +#line 50377 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3554: /* query_expression_option: SQL_BIG_RESULT */ +#line 17688 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_BIG_RESULT; } +#line 50383 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3555: /* query_expression_option: SQL_BUFFER_RESULT */ +#line 17689 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_BUFFER_RESULT; } +#line 50389 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3556: /* query_expression_option: SQL_CALC_FOUND_ROWS */ +#line 17690 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_FOUND_ROWS; } +#line 50395 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3557: /* query_expression_option: ALL */ +#line 17691 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_ALL; } +#line 50401 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3560: /* no_definer: %empty */ +#line 17707 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + We have to distinguish missing DEFINER-clause from case when + CURRENT_USER specified as definer explicitly in order to properly + handle CREATE TRIGGER statements which come to replication thread + from older master servers (i.e. to create non-suid trigger in this + case). + */ + thd->lex->definer= 0; + } +#line 50416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3561: /* definer: DEFINER_SYM '=' user_or_role */ +#line 17721 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->definer= (yyvsp[0].lex_user); + Lex->account_options.reset(); + } +#line 50425 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3562: /* view_algorithm: ALGORITHM_SYM '=' UNDEFINED_SYM */ +#line 17734 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= DTYPE_ALGORITHM_UNDEFINED; } +#line 50431 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3563: /* view_algorithm: ALGORITHM_SYM '=' MERGE_SYM */ +#line 17735 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_ALGORITHM_MERGE; } +#line 50437 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3564: /* view_algorithm: ALGORITHM_SYM '=' TEMPTABLE_SYM */ +#line 17736 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_ALGORITHM_TMPTABLE; } +#line 50443 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3565: /* opt_view_suid: %empty */ +#line 17740 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_DEFAULT; } +#line 50449 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3566: /* opt_view_suid: view_suid */ +#line 17741 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= (yyvsp[0].view_suid); } +#line 50455 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3567: /* view_suid: SQL_SYM SECURITY_SYM DEFINER_SYM */ +#line 17745 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_DEFINER; } +#line 50461 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3568: /* view_suid: SQL_SYM SECURITY_SYM INVOKER_SYM */ +#line 17746 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_INVOKER; } +#line 50467 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3569: /* view_list_opt: %empty */ +#line 17751 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50473 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3570: /* view_list_opt: '(' view_list ')' */ +#line 17752 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 50479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3571: /* view_list: ident */ +#line 17757 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root); + } +#line 50489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3572: /* view_list: view_list ',' ident */ +#line 17763 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root); + } +#line 50499 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3573: /* $@248: %empty */ +#line 17771 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->parsing_options.allows_variable= FALSE; + lex->create_view->select.str= (char *) YYLIP->get_cpp_ptr(); + } +#line 50509 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3574: /* view_select: $@248 query_expression view_check_option */ +#line 17778 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_create_view((yyvsp[-1].select_lex_unit), (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 50518 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3575: /* view_check_option: %empty */ +#line 17785 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_NONE; } +#line 50524 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3576: /* view_check_option: WITH CHECK_SYM OPTION */ +#line 17786 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_CASCADED; } +#line 50530 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3577: /* view_check_option: WITH CASCADED CHECK_SYM OPTION */ +#line 17787 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_CASCADED; } +#line 50536 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3578: /* view_check_option: WITH LOCAL_SYM CHECK_SYM OPTION */ +#line 17788 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_LOCAL; } +#line 50542 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3579: /* trigger_action_order: FOLLOWS_SYM */ +#line 17799 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trigger_action_order_type)= TRG_ORDER_FOLLOWS; } +#line 50548 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3580: /* trigger_action_order: PRECEDES_SYM */ +#line 17801 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trigger_action_order_type)= TRG_ORDER_PRECEDES; } +#line 50554 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3581: /* trigger_follows_precedes_clause: %empty */ +#line 17806 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.trg_execution_order).ordering_clause= TRG_ORDER_NONE; + (yyval.trg_execution_order).anchor_trigger_name.str= NULL; + (yyval.trg_execution_order).anchor_trigger_name.length= 0; + } +#line 50564 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3582: /* trigger_follows_precedes_clause: trigger_action_order ident_or_text */ +#line 17813 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.trg_execution_order).ordering_clause= (yyvsp[-1].trigger_action_order_type); + (yyval.trg_execution_order).anchor_trigger_name= (yyvsp[0].lex_str); + } +#line 50573 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3583: /* $@249: %empty */ +#line 17822 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_options_with_check((yyvsp[0].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 50582 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3584: /* $@250: %empty */ +#line 17831 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $9 */ + Lex->raw_trg_on_table_name_begin= YYLIP->get_tok_start(); + } +#line 50590 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3585: /* $@251: %empty */ +#line 17837 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $13 */ + Lex->raw_trg_on_table_name_end= YYLIP->get_tok_start(); + } +#line 50598 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3586: /* $@252: %empty */ +#line 17842 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->trg_chistics.ordering_clause_begin= YYLIP->get_cpp_ptr(); + } +#line 50606 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3587: /* $@253: %empty */ +#line 17846 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $18 */ + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_RECURSIVE_CREATE, MYF(0), "TRIGGER")); + + lex->stmt_definition_begin= (yyvsp[-16].simple_string); + lex->ident.str= (yyvsp[-9].simple_string); + lex->ident.length= (yyvsp[-5].simple_string) - (yyvsp[-9].simple_string); + lex->spname= (yyvsp[-13].spname); + (*static_cast(&lex->trg_chistics))= ((yyvsp[0].trg_execution_order)); + lex->trg_chistics.ordering_clause_end= lip->get_cpp_ptr(); + + if (unlikely(!lex->make_sp_head(thd, (yyvsp[-13].spname), &sp_handler_trigger, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + + lex->sphead->set_body_start(thd, lip->get_cpp_tok_start()); + } +#line 50631 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3588: /* trigger_tail: remember_name opt_if_not_exists $@249 sp_name trg_action_time trg_event ON remember_name $@250 table_ident FOR_SYM remember_name $@251 EACH_SYM ROW_SYM $@252 trigger_follows_precedes_clause $@253 sp_proc_stmt force_lookahead */ +#line 17867 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $21 */ + LEX *lex= Lex; + + lex->sql_command= SQLCOM_CREATE_TRIGGER; + if (lex->sp_body_finalize_trigger(thd)) + MYSQL_YYABORT; + + /* + We have to do it after parsing trigger body, because some of + sp_proc_stmt alternatives are not saving/restoring LEX, so + lex->query_tables can be wiped out. + */ + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[-10].table), (LEX_CSTRING*) 0, + TL_OPTION_UPDATING, TL_READ_NO_INSERT, + MDL_SHARED_NO_WRITE)) + MYSQL_YYABORT; + } +#line 50654 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3589: /* $@254: %empty */ +#line 17895 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->init_last_field(&lex->sphead->m_return_field_def, + &empty_clex_str); + } +#line 50664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3590: /* sf_return_type: $@254 field_type */ +#line 17901 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sf_return_fill_definition((yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 50673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3591: /* xa: XA_SYM begin_or_start xid opt_join_or_resume */ +#line 17911 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_START; + } +#line 50681 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3592: /* xa: XA_SYM END xid opt_suspend */ +#line 17915 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_END; + } +#line 50689 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3593: /* xa: XA_SYM PREPARE_SYM xid */ +#line 17919 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_PREPARE; + } +#line 50697 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3594: /* xa: XA_SYM COMMIT_SYM xid opt_one_phase */ +#line 17923 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_COMMIT; + } +#line 50705 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3595: /* xa: XA_SYM ROLLBACK_SYM xid */ +#line 17927 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_ROLLBACK; + } +#line 50713 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3596: /* xa: XA_SYM RECOVER_SYM opt_format_xid */ +#line 17931 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_RECOVER; + Lex->verbose= (yyvsp[0].num); + } +#line 50722 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3597: /* opt_format_xid: %empty */ +#line 17938 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 50728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3598: /* opt_format_xid: FORMAT_SYM '=' ident_or_text */ +#line 17940 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("SQL"))) + (yyval.num)= true; + else if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("RAW"))) + (yyval.num)= false; + else + { + my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), + "XA RECOVER", (yyvsp[0].lex_str).str)); + (yyval.num)= false; + } + } +#line 50745 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3599: /* xid: text_string */ +#line 17956 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[0].string)->length() <= MAXGTRIDSIZE); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set(1L, (yyvsp[0].string)->ptr(), (yyvsp[0].string)->length(), 0, 0); + } +#line 50756 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3600: /* xid: text_string ',' text_string */ +#line 17963 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].string)->length() <= MAXGTRIDSIZE && (yyvsp[0].string)->length() <= MAXBQUALSIZE); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set(1L, (yyvsp[-2].string)->ptr(), (yyvsp[-2].string)->length(), (yyvsp[0].string)->ptr(), (yyvsp[0].string)->length()); + } +#line 50767 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3601: /* xid: text_string ',' text_string ',' ulong_num */ +#line 17970 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].string)->length() <= MAXGTRIDSIZE && + (yyvsp[-2].string)->length() <= MAXBQUALSIZE && + (yyvsp[0].ulong_num) <= static_cast( + std::numeric_limits::max())); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set((yyvsp[0].ulong_num), (yyvsp[-4].string)->ptr(), (yyvsp[-4].string)->length(), (yyvsp[-2].string)->ptr(), (yyvsp[-2].string)->length()); + } +#line 50781 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3602: /* begin_or_start: BEGIN_MARIADB_SYM */ +#line 17982 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50787 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3603: /* begin_or_start: BEGIN_ORACLE_SYM */ +#line 17983 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50793 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3604: /* begin_or_start: START_SYM */ +#line 17984 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50799 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3605: /* opt_join_or_resume: %empty */ +#line 17988 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 50805 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3606: /* opt_join_or_resume: JOIN_SYM */ +#line 17989 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_JOIN; } +#line 50811 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3607: /* opt_join_or_resume: RESUME_SYM */ +#line 17990 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_RESUME; } +#line 50817 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3608: /* opt_one_phase: %empty */ +#line 17994 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 50823 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3609: /* opt_one_phase: ONE_SYM PHASE_SYM */ +#line 17995 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_ONE_PHASE; } +#line 50829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3610: /* opt_suspend: %empty */ +#line 18000 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 50835 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3611: /* $@255: %empty */ +#line 18002 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_SUSPEND; } +#line 50841 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3613: /* opt_migrate: %empty */ +#line 18007 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50847 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3614: /* opt_migrate: FOR_SYM MIGRATE_SYM */ +#line 18008 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_FOR_MIGRATE; } +#line 50853 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3615: /* install: INSTALL_SYM PLUGIN_SYM opt_if_not_exists ident SONAME_SYM TEXT_STRING_sys */ +#line 18013 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_install_plugin((yyvsp[-3].object_ddl_options), (yyvsp[-2].ident_sys), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 50862 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3616: /* install: INSTALL_SYM SONAME_SYM TEXT_STRING_sys */ +#line 18018 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_install_plugin((yyvsp[0].lex_str)); + } +#line 50870 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3617: /* uninstall: UNINSTALL_SYM PLUGIN_SYM opt_if_exists ident */ +#line 18025 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_uninstall_plugin_by_name((yyvsp[-1].object_ddl_options), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 50879 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3618: /* uninstall: UNINSTALL_SYM SONAME_SYM opt_if_exists TEXT_STRING_sys */ +#line 18030 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_uninstall_plugin_by_soname((yyvsp[-1].object_ddl_options), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 50888 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3619: /* keep_gcc_happy: IMPOSSIBLE_ACTION */ +#line 18039 "/home/buildbot/git/sql/sql_yacc.yy" + { + YYERROR; + } +#line 50896 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3624: /* $@256: %empty */ +#line 18480 "/home/buildbot/git/sql/sql_yacc.yy" + { + // Direct procedure call (without the CALL keyword) + Lex_ident_sys tmp(thd, &(yyvsp[0].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->call_statement_start(thd, &tmp))) + MYSQL_YYABORT; + } +#line 50908 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3625: /* sp_statement: ident_cli_directly_assignable $@256 opt_sp_cparam_list */ +#line 18488 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 50917 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3626: /* $@257: %empty */ +#line 18493 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-2].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->call_statement_start(thd, &tmp, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 50928 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3627: /* sp_statement: ident_cli_directly_assignable '.' ident $@257 opt_sp_cparam_list */ +#line 18500 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 50937 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3628: /* $@258: %empty */ +#line 18505 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-4].ident_cli)); + if (unlikely(Lex->call_statement_start(thd, &tmp, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 50947 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3629: /* sp_statement: ident_cli_directly_assignable '.' ident '.' ident $@258 opt_sp_cparam_list */ +#line 18511 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 50956 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3630: /* sp_if_then_statements: sp_proc_stmts1_implicit_block */ +#line 18518 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 50962 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3631: /* sp_case_then_statements: sp_proc_stmts1_implicit_block */ +#line 18522 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 50968 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3655: /* row_field_name: ident_directly_assignable */ +#line 18572 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spvar_definition)= Lex->row_field_name(thd, (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 50977 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3656: /* $@259: %empty */ +#line 18580 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-1].expr_lex)->sp_while_loop_expression(thd))) + MYSQL_YYABORT; + } +#line 50986 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3657: /* while_body: expr_lex LOOP_SYM $@259 sp_proc_stmts1 END LOOP_SYM */ +#line 18585 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_while_loop_finalize(thd))) + MYSQL_YYABORT; + } +#line 50995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3658: /* for_loop_statements: LOOP_SYM sp_proc_stmts1 END LOOP_SYM */ +#line 18593 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51001 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3660: /* sp_block_label: labels_declaration_oracle */ +#line 18603 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->spcont->block_label_declare(&(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + (yyval.lex_str)= (yyvsp[0].lex_str); + } +#line 51011 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3661: /* remember_end_opt: %empty */ +#line 18612 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (yychar == YYEMPTY) + (yyval.simple_string)= (char*) YYLIP->get_cpp_ptr_rtrim(); + else + (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_end_rtrim(); + } +#line 51022 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3662: /* sp_opt_default: _empty */ +#line 18621 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = NULL; } +#line 51028 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3663: /* sp_opt_default: DEFAULT expr */ +#line 18622 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item); } +#line 51034 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3664: /* sp_opt_default: SET_VAR expr */ +#line 18623 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item); } +#line 51040 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3665: /* sp_opt_inout: _empty */ +#line 18627 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_IN; } +#line 51046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3667: /* sp_opt_inout: IN_SYM OUT_SYM */ +#line 18629 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_INOUT; } +#line 51052 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3668: /* $@260: %empty */ +#line 18633 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd); + } +#line 51060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3669: /* sp_proc_stmts1_implicit_block: $@260 sp_proc_stmts1 */ +#line 18637 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd))) + MYSQL_YYABORT; + } +#line 51069 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3670: /* remember_lex: %empty */ +#line 18645 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex)= thd->lex; + } +#line 51077 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3680: /* ident_directly_assignable: keyword_directly_assignable */ +#line 18664 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 51086 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3682: /* ident_cli_directly_assignable: keyword_directly_assignable */ +#line 18672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 51092 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3683: /* $@261: %empty */ +#line 18678 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_stmt_init(); + if (sp_create_assignment_lex(thd, (yyvsp[-1].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 51103 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3684: /* set_assign: ident_cli_directly_assignable SET_VAR $@261 set_expr_or_default */ +#line 18685 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY, + false))) + MYSQL_YYABORT; + } +#line 51116 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3685: /* $@262: %empty */ +#line 18694 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_stmt_init(); + if (sp_create_assignment_lex(thd, (yyvsp[-3].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 51127 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3686: /* set_assign: ident_cli_directly_assignable '.' ident SET_VAR $@262 set_expr_or_default */ +#line 18701 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + DBUG_ASSERT(lex->var_list.is_empty()); + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(lex->set_variable(&tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY, + false))) + MYSQL_YYABORT; + } +#line 51142 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3687: /* $@263: %empty */ +#line 18712 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!lex->is_trigger_new_or_old_reference(&(yyvsp[-3].ident_sys)))) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[-4].kwd).pos()); + MYSQL_YYABORT; + } + lex->set_stmt_init(); + if (sp_create_assignment_lex(thd, (yyvsp[-4].kwd).pos())) + MYSQL_YYABORT; + } +#line 51158 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3688: /* set_assign: COLON_ORACLE_SYM ident '.' ident SET_VAR $@263 set_expr_or_default */ +#line 18724 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING tmp= { (yyvsp[-5].ident_sys).str, (yyvsp[-5].ident_sys).length }; + if (unlikely(Lex->set_trigger_field(&tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY, + false))) + MYSQL_YYABORT; + } +#line 51170 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3689: /* labels_declaration_oracle: label_declaration_oracle */ +#line 18735 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 51176 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3690: /* labels_declaration_oracle: labels_declaration_oracle label_declaration_oracle */ +#line 18736 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 51182 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3691: /* label_declaration_oracle: SHIFT_LEFT label_ident SHIFT_RIGHT */ +#line 18741 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_goto_label(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + (yyval.lex_str)= (yyvsp[-1].ident_sys); + } +#line 51192 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3692: /* opt_exception_clause: _empty */ +#line 18749 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 51198 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3693: /* opt_exception_clause: EXCEPTION_ORACLE_SYM exception_handlers */ +#line 18750 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[0].num); } +#line 51204 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3694: /* exception_handlers: exception_handler */ +#line 18754 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 51210 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3695: /* exception_handlers: exception_handlers exception_handler */ +#line 18755 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].num) + 1; } +#line 51216 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3696: /* $@264: %empty */ +#line 18760 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_init(thd, sp_handler::EXIT))) + MYSQL_YYABORT; + } +#line 51225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3697: /* exception_handler: WHEN_SYM $@264 sp_hcond_list THEN_SYM sp_proc_stmts1_implicit_block */ +#line 18767 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_finalize(thd, sp_handler::EXIT))) + MYSQL_YYABORT; + } +#line 51234 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3698: /* sp_no_param: _empty */ +#line 18775 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= Lex->sphead->m_param_end= + YYLIP->get_cpp_tok_start() + 1; + } +#line 51243 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3703: /* opt_sp_name: _empty */ +#line 18793 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spname)= NULL; } +#line 51249 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3704: /* opt_sp_name: sp_name */ +#line 18794 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spname)= (yyvsp[0].spname); } +#line 51255 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3705: /* opt_package_routine_end_name: _empty */ +#line 18799 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 51261 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3706: /* opt_package_routine_end_name: ident */ +#line 18800 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 51267 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3709: /* sp_instr_addr: %empty */ +#line 18809 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_instr_addr)= Lex->sphead->instructions(); } +#line 51273 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3710: /* $@265: %empty */ +#line 18813 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd); + } +#line 51281 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3711: /* $@266: %empty */ +#line 18817 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 51290 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3712: /* $@267: %empty */ +#line 18823 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-3].spblock).hndlrs+= (yyvsp[0].spblock_handlers).hndlrs; + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-3].spblock)))) + MYSQL_YYABORT; + } +#line 51300 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3714: /* create_package_chistic: COMMENT_SYM TEXT_STRING_sys */ +#line 18833 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.comment= (yyvsp[0].lex_str); } +#line 51306 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3715: /* create_package_chistic: sp_suid */ +#line 18835 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.suid= (yyvsp[0].sp_suid); } +#line 51312 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3716: /* create_package_chistics: create_package_chistic */ +#line 18839 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51318 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3717: /* create_package_chistics: create_package_chistics create_package_chistic */ +#line 18840 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51324 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3719: /* opt_create_package_chistics: create_package_chistics */ +#line 18845 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51330 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3720: /* $@268: %empty */ +#line 18849 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.init(); } +#line 51336 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3722: /* package_implementation_executable_section: END */ +#line 18856 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_add_empty(thd))) + MYSQL_YYABORT; + (yyval.spblock_handlers).init(0); + } +#line 51346 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3723: /* package_implementation_executable_section: BEGIN_ORACLE_SYM sp_block_statements_and_exceptions END */ +#line 18861 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock_handlers)= (yyvsp[-1].spblock_handlers); } +#line 51352 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3726: /* package_implementation_declare_section: package_implementation_declare_section_list1 package_implementation_declare_section_list2 */ +#line 18873 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock).join((yyvsp[-1].spblock), (yyvsp[0].spblock)); } +#line 51358 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3728: /* package_implementation_declare_section_list1: package_implementation_declare_section_list1 package_implementation_item_declaration */ +#line 18880 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock).join((yyvsp[-1].spblock), (yyvsp[0].spblock)); } +#line 51364 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3730: /* package_implementation_declare_section_list2: package_implementation_declare_section_list2 package_implementation_routine_definition */ +#line 18887 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock).join((yyvsp[-1].spblock), (yyvsp[0].spblock)); } +#line 51370 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3731: /* package_routine_lex: %empty */ +#line 18891 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex)= new (thd->mem_root) + sp_lex_local(thd, thd->lex)))) + MYSQL_YYABORT; + thd->m_parser_state->m_yacc.reset_before_substatement(); + } +#line 51381 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3732: /* $@269: %empty */ +#line 18902 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].lex)->sphead->get_package()); + (yyvsp[-1].lex)->sql_command= SQLCOM_CREATE_FUNCTION; + sp_name *spname= (yyvsp[-2].lex)->make_sp_name_package_routine(thd, &(yyvsp[0].ident_sys)); + if (unlikely(!spname)) + MYSQL_YYABORT; + thd->lex= (yyvsp[-1].lex); + if (unlikely(!(yyvsp[-1].lex)->make_sp_head_no_recursive(thd, spname, + &sp_handler_package_function, + NOT_AGGREGATE))) + MYSQL_YYABORT; + (yyvsp[-2].lex)->sphead->get_package()->m_current_routine= (yyvsp[-1].lex); + (void) is_native_function_with_warn(thd, &(yyvsp[0].ident_sys)); + } +#line 51400 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3733: /* package_specification_function: remember_lex package_routine_lex ident $@269 opt_sp_parenthesized_fdparam_list RETURN_ORACLE_SYM sf_return_type sp_c_chistics */ +#line 18919 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_head *sp= thd->lex->sphead; + sp->restore_thd_mem_root(thd); + thd->lex= (yyvsp[-7].lex); + (yyval.lex)= (yyvsp[-6].lex); + } +#line 51411 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3734: /* $@270: %empty */ +#line 18929 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].lex)->sphead->get_package()); + (yyvsp[-1].lex)->sql_command= SQLCOM_CREATE_PROCEDURE; + sp_name *spname= (yyvsp[-2].lex)->make_sp_name_package_routine(thd, &(yyvsp[0].ident_sys)); + if (unlikely(!spname)) + MYSQL_YYABORT; + thd->lex= (yyvsp[-1].lex); + if (unlikely(!(yyvsp[-1].lex)->make_sp_head_no_recursive(thd, spname, + &sp_handler_package_procedure, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + (yyvsp[-2].lex)->sphead->get_package()->m_current_routine= (yyvsp[-1].lex); + } +#line 51429 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3735: /* package_specification_procedure: remember_lex package_routine_lex ident $@270 opt_sp_parenthesized_pdparam_list sp_c_chistics */ +#line 18944 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_head *sp= thd->lex->sphead; + sp->restore_thd_mem_root(thd); + thd->lex= (yyvsp[-5].lex); + (yyval.lex)= (yyvsp[-4].lex); + } +#line 51440 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3736: /* package_implementation_routine_definition: FUNCTION_SYM package_specification_function package_implementation_function_body ';' */ +#line 18956 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + if (unlikely(pkg->add_routine_implementation((yyvsp[-2].lex)))) + MYSQL_YYABORT; + pkg->m_current_routine= NULL; + (yyval.spblock).init(); + } +#line 51452 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3737: /* package_implementation_routine_definition: PROCEDURE_SYM package_specification_procedure package_implementation_procedure_body ';' */ +#line 18965 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + if (unlikely(pkg->add_routine_implementation((yyvsp[-2].lex)))) + MYSQL_YYABORT; + pkg->m_current_routine= NULL; + (yyval.spblock).init(); + } +#line 51464 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3738: /* package_implementation_routine_definition: package_specification_element */ +#line 18972 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock).init(); } +#line 51470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3739: /* $@271: %empty */ +#line 18978 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + sp_head *sp= pkg->m_current_routine->sphead; + thd->lex= pkg->m_current_routine; + sp->reset_thd_mem_root(thd); + sp->set_c_chistics(thd->lex->sp_chistics); + sp->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51483 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3740: /* package_implementation_function_body: sp_tail_is remember_lex $@271 sp_body opt_package_routine_end_name */ +#line 18987 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->lex->sp_body_finalize_function(thd) || + thd->lex->sphead->check_package_routine_end_name((yyvsp[0].lex_str)))) + MYSQL_YYABORT; + thd->lex= (yyvsp[-3].lex); + } +#line 51494 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3741: /* $@272: %empty */ +#line 18997 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + sp_head *sp= pkg->m_current_routine->sphead; + thd->lex= pkg->m_current_routine; + sp->reset_thd_mem_root(thd); + sp->set_c_chistics(thd->lex->sp_chistics); + sp->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51507 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3742: /* package_implementation_procedure_body: sp_tail_is remember_lex $@272 sp_body opt_package_routine_end_name */ +#line 19006 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->lex->sp_body_finalize_procedure(thd) || + thd->lex->sphead->check_package_routine_end_name((yyvsp[0].lex_str)))) + MYSQL_YYABORT; + thd->lex= (yyvsp[-3].lex); + } +#line 51518 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3748: /* package_specification_element: FUNCTION_SYM package_specification_function ';' */ +#line 19031 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + if (unlikely(pkg->add_routine_declaration((yyvsp[-1].lex)))) + MYSQL_YYABORT; + pkg->m_current_routine= NULL; + } +#line 51529 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3749: /* package_specification_element: PROCEDURE_SYM package_specification_procedure ';' */ +#line 19038 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + if (unlikely(pkg->add_routine_declaration((yyvsp[-1].lex)))) + MYSQL_YYABORT; + pkg->m_current_routine= NULL; + } +#line 51540 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3750: /* sp_decl_variable_list_anchored: sp_decl_idents_init_vars optionally_qualified_column_ident PERCENT_ORACLE_SYM TYPE_SYM sp_opt_default */ +#line 19050 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_with_ref_finalize(thd, (yyvsp[-4].num), (yyvsp[-3].qualified_column_ident), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-4].num)); + } +#line 51550 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3751: /* sp_decl_variable_list_anchored: sp_decl_idents_init_vars optionally_qualified_column_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM sp_opt_default */ +#line 19058 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_rowtype_finalize(thd, (yyvsp[-4].num), (yyvsp[-3].qualified_column_ident), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-4].num)); + } +#line 51560 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3752: /* sp_param_name_and_mode: sp_param_name sp_opt_inout */ +#line 19067 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].spvar)->mode= (yyvsp[0].spvar_mode); + (yyval.spvar)= (yyvsp[-1].spvar); + } +#line 51569 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3753: /* sp_param: sp_param_name_and_mode field_type */ +#line 19075 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_param_fill_definition((yyval.spvar)= (yyvsp[-1].spvar), (yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 51578 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3754: /* sp_param: sp_param_name_and_mode ROW_SYM row_type_body */ +#line 19080 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_row(thd, (yyval.spvar)= (yyvsp[-2].spvar), (yyvsp[0].spvar_definition_list)))) + MYSQL_YYABORT; + } +#line 51587 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3756: /* sp_param_anchored: sp_param_name_and_mode sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM */ +#line 19089 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, (yyval.spvar)= (yyvsp[-5].spvar), (yyvsp[-4].ident_sys), (yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 51596 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3757: /* sp_param_anchored: sp_param_name_and_mode sp_decl_ident '.' ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM */ +#line 19094 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, (yyval.spvar)= (yyvsp[-7].spvar), (yyvsp[-6].ident_sys), (yyvsp[-4].ident_sys), (yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 51605 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3758: /* sp_param_anchored: sp_param_name_and_mode sp_decl_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM */ +#line 19099 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, (yyval.spvar)= (yyvsp[-3].spvar), (yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 51614 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3759: /* sp_param_anchored: sp_param_name_and_mode sp_decl_ident '.' ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM */ +#line 19104 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, (yyval.spvar)= (yyvsp[-5].spvar), (yyvsp[-4].ident_sys), (yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 51623 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3760: /* $@273: %empty */ +#line 19113 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->sphead->set_c_chistics(lex->sp_chistics); + lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3761: /* sf_c_chistics_and_body_standalone: sp_c_chistics $@273 sp_tail_is sp_body force_lookahead */ +#line 19119 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_body_finalize_function(thd))) + MYSQL_YYABORT; + } +#line 51642 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3762: /* $@274: %empty */ +#line 19127 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->make_sp_head_no_recursive(thd, (yyvsp[0].spname), + &sp_handler_procedure, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + } +#line 51653 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3763: /* $@275: %empty */ +#line 19135 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51662 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3764: /* sp_tail_standalone: sp_name $@274 opt_sp_parenthesized_pdparam_list sp_c_chistics $@275 sp_tail_is sp_body opt_sp_name */ +#line 19142 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_body_finalize_procedure_standalone(thd, (yyvsp[0].spname)))) + MYSQL_YYABORT; + } +#line 51671 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3765: /* drop_routine: DROP FUNCTION_SYM opt_if_exists ident '.' ident */ +#line 19150 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_function((yyvsp[-3].object_ddl_options), (yyvsp[-2].ident_sys), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 51680 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3766: /* drop_routine: DROP FUNCTION_SYM opt_if_exists ident */ +#line 19155 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_function((yyvsp[-1].object_ddl_options), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 51689 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3767: /* drop_routine: DROP PROCEDURE_SYM opt_if_exists sp_name */ +#line 19160 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_procedure((yyvsp[-1].object_ddl_options), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51698 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3768: /* drop_routine: DROP PACKAGE_ORACLE_SYM opt_if_exists sp_name */ +#line 19165 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_PACKAGE, (yyvsp[-1].object_ddl_options)); + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "PACKAGE")); + lex->spname= (yyvsp[0].spname); + } +#line 51710 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3769: /* drop_routine: DROP PACKAGE_ORACLE_SYM BODY_ORACLE_SYM opt_if_exists sp_name */ +#line 19173 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_PACKAGE_BODY, (yyvsp[-1].object_ddl_options)); + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "PACKAGE BODY")); + lex->spname= (yyvsp[0].spname); + } +#line 51722 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3770: /* $@276: %empty */ +#line 19185 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_procedure_start((yyvsp[-3].object_ddl_options) | (yyvsp[0].object_ddl_options))) + MYSQL_YYABORT; + } +#line 51731 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3771: /* create_routine: create_or_replace definer_opt PROCEDURE_SYM opt_if_not_exists $@276 sp_tail_standalone */ +#line 19190 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_create_routine_finalize(); + } +#line 51739 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3772: /* $@277: %empty */ +#line 19195 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_start((yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-3].sp_aggregate_type), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51748 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3773: /* create_routine: create_or_replace definer opt_aggregate FUNCTION_SYM opt_if_not_exists sp_name $@277 opt_sp_parenthesized_fdparam_list RETURN_ORACLE_SYM sf_return_type sf_c_chistics_and_body_standalone opt_sp_name */ +#line 19203 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_finalize_standalone((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51757 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3774: /* $@278: %empty */ +#line 19209 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_start((yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-3].sp_aggregate_type), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51766 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3775: /* create_routine: create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists sp_name $@278 opt_sp_parenthesized_fdparam_list RETURN_ORACLE_SYM sf_return_type sf_c_chistics_and_body_standalone opt_sp_name */ +#line 19217 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_finalize_standalone((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51775 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3776: /* create_routine: create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists ident RETURNS_SYM udf_type SONAME_SYM TEXT_STRING_sys */ +#line 19223 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_udf_function((yyvsp[-9].object_ddl_options) | (yyvsp[-5].object_ddl_options), (yyvsp[-7].sp_aggregate_type), (yyvsp[-4].ident_sys), + (Item_result) (yyvsp[-2].num), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 51785 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3777: /* $@279: %empty */ +#line 19230 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg; + if (unlikely(!(pkg= Lex-> + create_package_start(thd, + SQLCOM_CREATE_PACKAGE, + &sp_handler_package_spec, + (yyvsp[-1].spname), (yyvsp[-5].object_ddl_options) | (yyvsp[-2].object_ddl_options))))) + MYSQL_YYABORT; + pkg->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51801 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3778: /* create_routine: create_or_replace definer_opt PACKAGE_ORACLE_SYM opt_if_not_exists sp_name opt_create_package_chistics_init $@279 sp_tail_is opt_package_specification_element_list END remember_end_opt opt_sp_name */ +#line 19244 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_package_finalize(thd, (yyvsp[-7].spname), (yyvsp[0].spname), (yyvsp[-1].simple_string)))) + MYSQL_YYABORT; + } +#line 51810 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3779: /* $@280: %empty */ +#line 19250 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg; + if (unlikely(!(pkg= Lex-> + create_package_start(thd, + SQLCOM_CREATE_PACKAGE_BODY, + &sp_handler_package_body, + (yyvsp[-1].spname), (yyvsp[-6].object_ddl_options) | (yyvsp[-2].object_ddl_options))))) + MYSQL_YYABORT; + pkg->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + Lex->sp_block_init(thd); + } +#line 51827 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3780: /* $@281: %empty */ +#line 19264 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 51836 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3781: /* $@282: %empty */ +#line 19269 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].spblock).hndlrs+= (yyvsp[0].spblock_handlers).hndlrs; + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-2].spblock)))) + MYSQL_YYABORT; + } +#line 51846 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3782: /* create_routine: create_or_replace definer_opt PACKAGE_ORACLE_SYM BODY_ORACLE_SYM opt_if_not_exists sp_name opt_create_package_chistics_init $@280 sp_tail_is package_implementation_declare_section $@281 package_implementation_executable_section $@282 remember_end_opt opt_sp_name */ +#line 19275 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_package_finalize(thd, (yyvsp[-9].spname), (yyvsp[0].spname), (yyvsp[-1].simple_string)))) + MYSQL_YYABORT; + } +#line 51855 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3783: /* opt_sp_decl_body_list: _empty */ +#line 19283 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spblock).init(); + } +#line 51863 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3784: /* opt_sp_decl_body_list: sp_decl_body_list */ +#line 19286 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock)= (yyvsp[0].spblock); } +#line 51869 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3785: /* $@283: %empty */ +#line 19291 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->sp_add_instr_cpush_for_cursors(thd, Lex->spcont))) + MYSQL_YYABORT; + } +#line 51878 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3786: /* sp_decl_body_list: sp_decl_non_handler_list $@283 opt_sp_decl_handler_list */ +#line 19296 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spblock).join((yyvsp[-2].spblock), (yyvsp[0].spblock)); + } +#line 51886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3788: /* sp_decl_non_handler_list: sp_decl_non_handler ';' */ +#line 19303 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock)= (yyvsp[-1].spblock); } +#line 51892 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3789: /* sp_decl_non_handler_list: sp_decl_non_handler_list sp_decl_non_handler ';' */ +#line 19305 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spblock).join((yyvsp[-2].spblock), (yyvsp[-1].spblock)); + } +#line 51900 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3790: /* sp_decl_handler_list: sp_decl_handler ';' */ +#line 19311 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock)= (yyvsp[-1].spblock); } +#line 51906 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3791: /* sp_decl_handler_list: sp_decl_handler_list sp_decl_handler ';' */ +#line 19313 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spblock).join((yyvsp[-2].spblock), (yyvsp[-1].spblock)); + } +#line 51914 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3792: /* opt_sp_decl_handler_list: _empty */ +#line 19319 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock).init(); } +#line 51920 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3795: /* sp_decl_non_handler: ident_directly_assignable CONDITION_SYM FOR_SYM sp_cond */ +#line 19326 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->spcont->declare_condition(thd, &(yyvsp[-3].ident_sys), (yyvsp[0].spcondvalue)))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).hndlrs= (yyval.spblock).curs= 0; + (yyval.spblock).conds= 1; + } +#line 51931 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3796: /* sp_decl_non_handler: ident_directly_assignable EXCEPTION_ORACLE_SYM */ +#line 19333 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_condition_value *spcond= new (thd->mem_root) + sp_condition_value_user_defined(); + if (unlikely(!spcond) || + unlikely(Lex->spcont->declare_condition(thd, &(yyvsp[-1].ident_sys), spcond))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).hndlrs= (yyval.spblock).curs= 0; + (yyval.spblock).conds= 1; + } +#line 51945 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3797: /* $@284: %empty */ +#line 19343 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd); + } +#line 51953 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3798: /* sp_decl_non_handler: CURSOR_SYM ident_directly_assignable $@284 opt_parenthesized_cursor_formal_parameters IS sp_cursor_stmt */ +#line 19348 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_pcontext *param_ctx= Lex->spcont; + if (unlikely(Lex->sp_block_finalize(thd))) + MYSQL_YYABORT; + if (unlikely(Lex->sp_declare_cursor(thd, &(yyvsp[-4].ident_sys), (yyvsp[0].sp_cursor_stmt), param_ctx, false))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).hndlrs= 0; + (yyval.spblock).curs= 1; + } +#line 51967 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3804: /* sp_proc_stmt: labels_declaration_oracle sp_labelable_stmt */ +#line 19366 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51973 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3815: /* sp_labelable_stmt: NULL_SYM */ +#line 19380 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51979 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3820: /* $@285: %empty */ +#line 19394 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd, &(yyvsp[-1].lex_str)); + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 51989 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3821: /* sp_labeled_block: sp_block_label BEGIN_ORACLE_SYM $@285 sp_block_statements_and_exceptions END sp_opt_label */ +#line 19402 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd, Lex_spblock((yyvsp[-2].spblock_handlers)), &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 51998 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3822: /* $@286: %empty */ +#line 19408 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd, &(yyvsp[-1].lex_str)); + } +#line 52006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3823: /* $@287: %empty */ +#line 19412 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 52015 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3824: /* sp_labeled_block: sp_block_label DECLARE_ORACLE_SYM $@286 opt_sp_decl_body_list $@287 BEGIN_ORACLE_SYM sp_block_statements_and_exceptions END sp_opt_label */ +#line 19420 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-5].spblock).hndlrs+= (yyvsp[-2].spblock_handlers).hndlrs; + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-5].spblock), &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 52025 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3827: /* $@288: %empty */ +#line 19434 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sp_block_init(thd); + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 52037 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3828: /* sp_unlabeled_block: BEGIN_ORACLE_SYM opt_not_atomic $@288 sp_block_statements_and_exceptions END */ +#line 19443 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd, Lex_spblock((yyvsp[-1].spblock_handlers))))) + MYSQL_YYABORT; + } +#line 52046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3829: /* $@289: %empty */ +#line 19448 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sp_block_init(thd); + } +#line 52056 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3830: /* $@290: %empty */ +#line 19454 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 52065 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3831: /* sp_unlabeled_block: DECLARE_ORACLE_SYM $@289 opt_sp_decl_body_list $@290 BEGIN_ORACLE_SYM sp_block_statements_and_exceptions END */ +#line 19461 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-4].spblock).hndlrs+= (yyvsp[-1].spblock_handlers).hndlrs; + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-4].spblock)))) + MYSQL_YYABORT; + } +#line 52075 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3832: /* $@291: %empty */ +#line 19471 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_executable_section(thd, (yyvsp[-1].sp_instr_addr)))) + MYSQL_YYABORT; + } +#line 52084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3833: /* sp_block_statements_and_exceptions: sp_instr_addr sp_proc_stmts $@291 opt_exception_clause */ +#line 19476 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_exceptions(thd, (yyvsp[-3].sp_instr_addr), (yyvsp[0].num)))) + MYSQL_YYABORT; + (yyval.spblock_handlers).init((yyvsp[0].num)); + } +#line 52094 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + +#line 52098 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + + *++yyvsp = yyval; + + /* Now 'shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; + yyerror (thd, YY_("syntax error")); + } + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, thd); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; + ++yynerrs; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + /* Pop stack until we find a state that shifts the error token. */ + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + YY_ACCESSING_SYMBOL (yystate), yyvsp, thd); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturnlab; + + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturnlab; + + +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ +yyexhaustedlab: + yyerror (thd, YY_("memory exhausted")); + yyresult = 2; + goto yyreturnlab; + + +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, thd); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, thd); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + + return yyresult; +} + diff --git a/sql/yy_oracle.hh b/sql/yy_oracle.hh new file mode 100644 index 00000000..9c7af745 --- /dev/null +++ b/sql/yy_oracle.hh @@ -0,0 +1,981 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + 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 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 General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_ORA_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_ORACLE_HH_INCLUDED +# define YY_ORA_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_ORACLE_HH_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int ORAdebug; +#endif + +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + ABORT_SYM = 258, /* ABORT_SYM */ + IMPOSSIBLE_ACTION = 259, /* IMPOSSIBLE_ACTION */ + FORCE_LOOKAHEAD = 260, /* FORCE_LOOKAHEAD */ + END_OF_INPUT = 261, /* END_OF_INPUT */ + COLON_ORACLE_SYM = 262, /* COLON_ORACLE_SYM */ + PARAM_MARKER = 263, /* PARAM_MARKER */ + FOR_SYSTEM_TIME_SYM = 264, /* FOR_SYSTEM_TIME_SYM */ + LEFT_PAREN_ALT = 265, /* LEFT_PAREN_ALT */ + LEFT_PAREN_WITH = 266, /* LEFT_PAREN_WITH */ + LEFT_PAREN_LIKE = 267, /* LEFT_PAREN_LIKE */ + ORACLE_CONCAT_SYM = 268, /* ORACLE_CONCAT_SYM */ + PERCENT_ORACLE_SYM = 269, /* PERCENT_ORACLE_SYM */ + WITH_CUBE_SYM = 270, /* WITH_CUBE_SYM */ + WITH_ROLLUP_SYM = 271, /* WITH_ROLLUP_SYM */ + WITH_SYSTEM_SYM = 272, /* WITH_SYSTEM_SYM */ + IDENT = 273, /* IDENT */ + IDENT_QUOTED = 274, /* IDENT_QUOTED */ + LEX_HOSTNAME = 275, /* LEX_HOSTNAME */ + UNDERSCORE_CHARSET = 276, /* UNDERSCORE_CHARSET */ + BIN_NUM = 277, /* BIN_NUM */ + DECIMAL_NUM = 278, /* DECIMAL_NUM */ + FLOAT_NUM = 279, /* FLOAT_NUM */ + HEX_NUM = 280, /* HEX_NUM */ + HEX_STRING = 281, /* HEX_STRING */ + LONG_NUM = 282, /* LONG_NUM */ + NCHAR_STRING = 283, /* NCHAR_STRING */ + NUM = 284, /* NUM */ + TEXT_STRING = 285, /* TEXT_STRING */ + ULONGLONG_NUM = 286, /* ULONGLONG_NUM */ + AND_AND_SYM = 287, /* AND_AND_SYM */ + DOT_DOT_SYM = 288, /* DOT_DOT_SYM */ + EQUAL_SYM = 289, /* EQUAL_SYM */ + GE = 290, /* GE */ + LE = 291, /* LE */ + MYSQL_CONCAT_SYM = 292, /* MYSQL_CONCAT_SYM */ + NE = 293, /* NE */ + NOT2_SYM = 294, /* NOT2_SYM */ + OR2_SYM = 295, /* OR2_SYM */ + SET_VAR = 296, /* SET_VAR */ + SHIFT_LEFT = 297, /* SHIFT_LEFT */ + SHIFT_RIGHT = 298, /* SHIFT_RIGHT */ + ACCESSIBLE_SYM = 299, /* ACCESSIBLE_SYM */ + ADD = 300, /* ADD */ + ALL = 301, /* ALL */ + ALTER = 302, /* ALTER */ + ANALYZE_SYM = 303, /* ANALYZE_SYM */ + AND_SYM = 304, /* AND_SYM */ + ASC = 305, /* ASC */ + ASENSITIVE_SYM = 306, /* ASENSITIVE_SYM */ + AS = 307, /* AS */ + BEFORE_SYM = 308, /* BEFORE_SYM */ + BETWEEN_SYM = 309, /* BETWEEN_SYM */ + BIGINT = 310, /* BIGINT */ + BINARY = 311, /* BINARY */ + BIT_AND = 312, /* BIT_AND */ + BIT_OR = 313, /* BIT_OR */ + BIT_XOR = 314, /* BIT_XOR */ + BLOB_MARIADB_SYM = 315, /* BLOB_MARIADB_SYM */ + BLOB_ORACLE_SYM = 316, /* BLOB_ORACLE_SYM */ + BODY_ORACLE_SYM = 317, /* BODY_ORACLE_SYM */ + BOTH = 318, /* BOTH */ + BY = 319, /* BY */ + CALL_SYM = 320, /* CALL_SYM */ + CASCADE = 321, /* CASCADE */ + CASE_SYM = 322, /* CASE_SYM */ + CAST_SYM = 323, /* CAST_SYM */ + CHANGE = 324, /* CHANGE */ + CHAR_SYM = 325, /* CHAR_SYM */ + CHECK_SYM = 326, /* CHECK_SYM */ + COLLATE_SYM = 327, /* COLLATE_SYM */ + CONDITION_SYM = 328, /* CONDITION_SYM */ + CONSTRAINT = 329, /* CONSTRAINT */ + CONTINUE_MARIADB_SYM = 330, /* CONTINUE_MARIADB_SYM */ + CONTINUE_ORACLE_SYM = 331, /* CONTINUE_ORACLE_SYM */ + CONVERT_SYM = 332, /* CONVERT_SYM */ + COUNT_SYM = 333, /* COUNT_SYM */ + CREATE = 334, /* CREATE */ + CROSS = 335, /* CROSS */ + CUME_DIST_SYM = 336, /* CUME_DIST_SYM */ + CURDATE = 337, /* CURDATE */ + CURRENT_ROLE = 338, /* CURRENT_ROLE */ + CURRENT_USER = 339, /* CURRENT_USER */ + CURSOR_SYM = 340, /* CURSOR_SYM */ + CURTIME = 341, /* CURTIME */ + DATABASE = 342, /* DATABASE */ + DATABASES = 343, /* DATABASES */ + DATE_ADD_INTERVAL = 344, /* DATE_ADD_INTERVAL */ + DATE_SUB_INTERVAL = 345, /* DATE_SUB_INTERVAL */ + DAY_HOUR_SYM = 346, /* DAY_HOUR_SYM */ + DAY_MICROSECOND_SYM = 347, /* DAY_MICROSECOND_SYM */ + DAY_MINUTE_SYM = 348, /* DAY_MINUTE_SYM */ + DAY_SECOND_SYM = 349, /* DAY_SECOND_SYM */ + DECIMAL_SYM = 350, /* DECIMAL_SYM */ + DECLARE_MARIADB_SYM = 351, /* DECLARE_MARIADB_SYM */ + DECLARE_ORACLE_SYM = 352, /* DECLARE_ORACLE_SYM */ + DEFAULT = 353, /* DEFAULT */ + DELETE_DOMAIN_ID_SYM = 354, /* DELETE_DOMAIN_ID_SYM */ + DELETE_SYM = 355, /* DELETE_SYM */ + DENSE_RANK_SYM = 356, /* DENSE_RANK_SYM */ + DESCRIBE = 357, /* DESCRIBE */ + DESC = 358, /* DESC */ + DETERMINISTIC_SYM = 359, /* DETERMINISTIC_SYM */ + DISTINCT = 360, /* DISTINCT */ + DIV_SYM = 361, /* DIV_SYM */ + DO_DOMAIN_IDS_SYM = 362, /* DO_DOMAIN_IDS_SYM */ + DOUBLE_SYM = 363, /* DOUBLE_SYM */ + DROP = 364, /* DROP */ + DUAL_SYM = 365, /* DUAL_SYM */ + EACH_SYM = 366, /* EACH_SYM */ + ELSEIF_MARIADB_SYM = 367, /* ELSEIF_MARIADB_SYM */ + ELSE = 368, /* ELSE */ + ELSIF_ORACLE_SYM = 369, /* ELSIF_ORACLE_SYM */ + EMPTY_SYM = 370, /* EMPTY_SYM */ + ENCLOSED = 371, /* ENCLOSED */ + ESCAPED = 372, /* ESCAPED */ + EXCEPT_SYM = 373, /* EXCEPT_SYM */ + EXISTS = 374, /* EXISTS */ + EXTRACT_SYM = 375, /* EXTRACT_SYM */ + FALSE_SYM = 376, /* FALSE_SYM */ + FETCH_SYM = 377, /* FETCH_SYM */ + FIRST_VALUE_SYM = 378, /* FIRST_VALUE_SYM */ + FLOAT_SYM = 379, /* FLOAT_SYM */ + FOREIGN = 380, /* FOREIGN */ + FOR_SYM = 381, /* FOR_SYM */ + FROM = 382, /* FROM */ + FULLTEXT_SYM = 383, /* FULLTEXT_SYM */ + GOTO_ORACLE_SYM = 384, /* GOTO_ORACLE_SYM */ + GRANT = 385, /* GRANT */ + GROUP_CONCAT_SYM = 386, /* GROUP_CONCAT_SYM */ + JSON_ARRAYAGG_SYM = 387, /* JSON_ARRAYAGG_SYM */ + JSON_OBJECTAGG_SYM = 388, /* JSON_OBJECTAGG_SYM */ + JSON_TABLE_SYM = 389, /* JSON_TABLE_SYM */ + GROUP_SYM = 390, /* GROUP_SYM */ + HAVING = 391, /* HAVING */ + HOUR_MICROSECOND_SYM = 392, /* HOUR_MICROSECOND_SYM */ + HOUR_MINUTE_SYM = 393, /* HOUR_MINUTE_SYM */ + HOUR_SECOND_SYM = 394, /* HOUR_SECOND_SYM */ + IF_SYM = 395, /* IF_SYM */ + IGNORE_DOMAIN_IDS_SYM = 396, /* IGNORE_DOMAIN_IDS_SYM */ + IGNORE_SYM = 397, /* IGNORE_SYM */ + IGNORED_SYM = 398, /* IGNORED_SYM */ + INDEX_SYM = 399, /* INDEX_SYM */ + INFILE = 400, /* INFILE */ + INNER_SYM = 401, /* INNER_SYM */ + INOUT_SYM = 402, /* INOUT_SYM */ + INSENSITIVE_SYM = 403, /* INSENSITIVE_SYM */ + INSERT = 404, /* INSERT */ + IN_SYM = 405, /* IN_SYM */ + INTERSECT_SYM = 406, /* INTERSECT_SYM */ + INTERVAL_SYM = 407, /* INTERVAL_SYM */ + INTO = 408, /* INTO */ + INT_SYM = 409, /* INT_SYM */ + IS = 410, /* IS */ + ITERATE_SYM = 411, /* ITERATE_SYM */ + JOIN_SYM = 412, /* JOIN_SYM */ + KEYS = 413, /* KEYS */ + KEY_SYM = 414, /* KEY_SYM */ + KILL_SYM = 415, /* KILL_SYM */ + LAG_SYM = 416, /* LAG_SYM */ + LEADING = 417, /* LEADING */ + LEAD_SYM = 418, /* LEAD_SYM */ + LEAVE_SYM = 419, /* LEAVE_SYM */ + LEFT = 420, /* LEFT */ + LIKE = 421, /* LIKE */ + LIMIT = 422, /* LIMIT */ + LINEAR_SYM = 423, /* LINEAR_SYM */ + LINES = 424, /* LINES */ + LOAD = 425, /* LOAD */ + LOCATOR_SYM = 426, /* LOCATOR_SYM */ + LOCK_SYM = 427, /* LOCK_SYM */ + LONGBLOB = 428, /* LONGBLOB */ + LONG_SYM = 429, /* LONG_SYM */ + LONGTEXT = 430, /* LONGTEXT */ + LOOP_SYM = 431, /* LOOP_SYM */ + LOW_PRIORITY = 432, /* LOW_PRIORITY */ + MASTER_SSL_VERIFY_SERVER_CERT_SYM = 433, /* MASTER_SSL_VERIFY_SERVER_CERT_SYM */ + MATCH = 434, /* MATCH */ + MAX_SYM = 435, /* MAX_SYM */ + MAXVALUE_SYM = 436, /* MAXVALUE_SYM */ + MEDIAN_SYM = 437, /* MEDIAN_SYM */ + MEDIUMBLOB = 438, /* MEDIUMBLOB */ + MEDIUMINT = 439, /* MEDIUMINT */ + MEDIUMTEXT = 440, /* MEDIUMTEXT */ + MIN_SYM = 441, /* MIN_SYM */ + MINUS_ORACLE_SYM = 442, /* MINUS_ORACLE_SYM */ + MINUTE_MICROSECOND_SYM = 443, /* MINUTE_MICROSECOND_SYM */ + MINUTE_SECOND_SYM = 444, /* MINUTE_SECOND_SYM */ + MODIFIES_SYM = 445, /* MODIFIES_SYM */ + MOD_SYM = 446, /* MOD_SYM */ + NATURAL = 447, /* NATURAL */ + NEG = 448, /* NEG */ + NESTED_SYM = 449, /* NESTED_SYM */ + NOT_SYM = 450, /* NOT_SYM */ + NO_WRITE_TO_BINLOG = 451, /* NO_WRITE_TO_BINLOG */ + NOW_SYM = 452, /* NOW_SYM */ + NTH_VALUE_SYM = 453, /* NTH_VALUE_SYM */ + NTILE_SYM = 454, /* NTILE_SYM */ + NULL_SYM = 455, /* NULL_SYM */ + NUMERIC_SYM = 456, /* NUMERIC_SYM */ + ON = 457, /* ON */ + OPTIMIZE = 458, /* OPTIMIZE */ + OPTIONALLY = 459, /* OPTIONALLY */ + ORDER_SYM = 460, /* ORDER_SYM */ + ORDINALITY_SYM = 461, /* ORDINALITY_SYM */ + OR_SYM = 462, /* OR_SYM */ + OTHERS_ORACLE_SYM = 463, /* OTHERS_ORACLE_SYM */ + OUTER = 464, /* OUTER */ + OUTFILE = 465, /* OUTFILE */ + OUT_SYM = 466, /* OUT_SYM */ + OVER_SYM = 467, /* OVER_SYM */ + PACKAGE_ORACLE_SYM = 468, /* PACKAGE_ORACLE_SYM */ + PAGE_CHECKSUM_SYM = 469, /* PAGE_CHECKSUM_SYM */ + PARSE_VCOL_EXPR_SYM = 470, /* PARSE_VCOL_EXPR_SYM */ + PARTITION_SYM = 471, /* PARTITION_SYM */ + PATH_SYM = 472, /* PATH_SYM */ + PERCENTILE_CONT_SYM = 473, /* PERCENTILE_CONT_SYM */ + PERCENTILE_DISC_SYM = 474, /* PERCENTILE_DISC_SYM */ + PERCENT_RANK_SYM = 475, /* PERCENT_RANK_SYM */ + PORTION_SYM = 476, /* PORTION_SYM */ + POSITION_SYM = 477, /* POSITION_SYM */ + PRECISION = 478, /* PRECISION */ + PRIMARY_SYM = 479, /* PRIMARY_SYM */ + PROCEDURE_SYM = 480, /* PROCEDURE_SYM */ + PURGE = 481, /* PURGE */ + RAISE_ORACLE_SYM = 482, /* RAISE_ORACLE_SYM */ + RANGE_SYM = 483, /* RANGE_SYM */ + RANK_SYM = 484, /* RANK_SYM */ + READS_SYM = 485, /* READS_SYM */ + READ_SYM = 486, /* READ_SYM */ + READ_WRITE_SYM = 487, /* READ_WRITE_SYM */ + REAL = 488, /* REAL */ + RECURSIVE_SYM = 489, /* RECURSIVE_SYM */ + REFERENCES = 490, /* REFERENCES */ + REF_SYSTEM_ID_SYM = 491, /* REF_SYSTEM_ID_SYM */ + REGEXP = 492, /* REGEXP */ + RELEASE_SYM = 493, /* RELEASE_SYM */ + RENAME = 494, /* RENAME */ + REPEAT_SYM = 495, /* REPEAT_SYM */ + REQUIRE_SYM = 496, /* REQUIRE_SYM */ + RESIGNAL_SYM = 497, /* RESIGNAL_SYM */ + RESTRICT = 498, /* RESTRICT */ + RETURNING_SYM = 499, /* RETURNING_SYM */ + RETURN_MARIADB_SYM = 500, /* RETURN_MARIADB_SYM */ + RETURN_ORACLE_SYM = 501, /* RETURN_ORACLE_SYM */ + REVOKE = 502, /* REVOKE */ + RIGHT = 503, /* RIGHT */ + ROW_NUMBER_SYM = 504, /* ROW_NUMBER_SYM */ + ROWS_SYM = 505, /* ROWS_SYM */ + ROWTYPE_ORACLE_SYM = 506, /* ROWTYPE_ORACLE_SYM */ + SECOND_MICROSECOND_SYM = 507, /* SECOND_MICROSECOND_SYM */ + SELECT_SYM = 508, /* SELECT_SYM */ + SENSITIVE_SYM = 509, /* SENSITIVE_SYM */ + SEPARATOR_SYM = 510, /* SEPARATOR_SYM */ + SERVER_OPTIONS = 511, /* SERVER_OPTIONS */ + SET = 512, /* SET */ + SHOW = 513, /* SHOW */ + SIGNAL_SYM = 514, /* SIGNAL_SYM */ + SMALLINT = 515, /* SMALLINT */ + SPATIAL_SYM = 516, /* SPATIAL_SYM */ + SPECIFIC_SYM = 517, /* SPECIFIC_SYM */ + SQL_BIG_RESULT = 518, /* SQL_BIG_RESULT */ + SQLEXCEPTION_SYM = 519, /* SQLEXCEPTION_SYM */ + SQL_SMALL_RESULT = 520, /* SQL_SMALL_RESULT */ + SQLSTATE_SYM = 521, /* SQLSTATE_SYM */ + SQL_SYM = 522, /* SQL_SYM */ + SQLWARNING_SYM = 523, /* SQLWARNING_SYM */ + SSL_SYM = 524, /* SSL_SYM */ + STARTING = 525, /* STARTING */ + STATS_AUTO_RECALC_SYM = 526, /* STATS_AUTO_RECALC_SYM */ + STATS_PERSISTENT_SYM = 527, /* STATS_PERSISTENT_SYM */ + STATS_SAMPLE_PAGES_SYM = 528, /* STATS_SAMPLE_PAGES_SYM */ + STDDEV_SAMP_SYM = 529, /* STDDEV_SAMP_SYM */ + STD_SYM = 530, /* STD_SYM */ + STRAIGHT_JOIN = 531, /* STRAIGHT_JOIN */ + SUM_SYM = 532, /* SUM_SYM */ + SYSDATE = 533, /* SYSDATE */ + TABLE_REF_PRIORITY = 534, /* TABLE_REF_PRIORITY */ + TABLE_SYM = 535, /* TABLE_SYM */ + TERMINATED = 536, /* TERMINATED */ + THEN_SYM = 537, /* THEN_SYM */ + TINYBLOB = 538, /* TINYBLOB */ + TINYINT = 539, /* TINYINT */ + TINYTEXT = 540, /* TINYTEXT */ + TO_SYM = 541, /* TO_SYM */ + TRAILING = 542, /* TRAILING */ + TRIGGER_SYM = 543, /* TRIGGER_SYM */ + TRUE_SYM = 544, /* TRUE_SYM */ + UNDO_SYM = 545, /* UNDO_SYM */ + UNION_SYM = 546, /* UNION_SYM */ + UNIQUE_SYM = 547, /* UNIQUE_SYM */ + UNLOCK_SYM = 548, /* UNLOCK_SYM */ + UNSIGNED = 549, /* UNSIGNED */ + UPDATE_SYM = 550, /* UPDATE_SYM */ + USAGE = 551, /* USAGE */ + USE_SYM = 552, /* USE_SYM */ + USING = 553, /* USING */ + UTC_DATE_SYM = 554, /* UTC_DATE_SYM */ + UTC_TIMESTAMP_SYM = 555, /* UTC_TIMESTAMP_SYM */ + UTC_TIME_SYM = 556, /* UTC_TIME_SYM */ + VALUES_IN_SYM = 557, /* VALUES_IN_SYM */ + VALUES_LESS_SYM = 558, /* VALUES_LESS_SYM */ + VALUES = 559, /* VALUES */ + VARBINARY = 560, /* VARBINARY */ + VARCHAR = 561, /* VARCHAR */ + VARIANCE_SYM = 562, /* VARIANCE_SYM */ + VAR_SAMP_SYM = 563, /* VAR_SAMP_SYM */ + VARYING = 564, /* VARYING */ + WHEN_SYM = 565, /* WHEN_SYM */ + WHERE = 566, /* WHERE */ + WHILE_SYM = 567, /* WHILE_SYM */ + WITH = 568, /* WITH */ + XOR = 569, /* XOR */ + YEAR_MONTH_SYM = 570, /* YEAR_MONTH_SYM */ + ZEROFILL = 571, /* ZEROFILL */ + BODY_MARIADB_SYM = 572, /* BODY_MARIADB_SYM */ + ELSEIF_ORACLE_SYM = 573, /* ELSEIF_ORACLE_SYM */ + ELSIF_MARIADB_SYM = 574, /* ELSIF_MARIADB_SYM */ + EXCEPTION_ORACLE_SYM = 575, /* EXCEPTION_ORACLE_SYM */ + GOTO_MARIADB_SYM = 576, /* GOTO_MARIADB_SYM */ + OTHERS_MARIADB_SYM = 577, /* OTHERS_MARIADB_SYM */ + PACKAGE_MARIADB_SYM = 578, /* PACKAGE_MARIADB_SYM */ + RAISE_MARIADB_SYM = 579, /* RAISE_MARIADB_SYM */ + ROWTYPE_MARIADB_SYM = 580, /* ROWTYPE_MARIADB_SYM */ + ROWNUM_SYM = 581, /* ROWNUM_SYM */ + REPLACE = 582, /* REPLACE */ + SUBSTRING = 583, /* SUBSTRING */ + TRIM = 584, /* TRIM */ + ACCOUNT_SYM = 585, /* ACCOUNT_SYM */ + ACTION = 586, /* ACTION */ + ADMIN_SYM = 587, /* ADMIN_SYM */ + ADDDATE_SYM = 588, /* ADDDATE_SYM */ + AFTER_SYM = 589, /* AFTER_SYM */ + AGAINST = 590, /* AGAINST */ + AGGREGATE_SYM = 591, /* AGGREGATE_SYM */ + ALGORITHM_SYM = 592, /* ALGORITHM_SYM */ + ALWAYS_SYM = 593, /* ALWAYS_SYM */ + ANY_SYM = 594, /* ANY_SYM */ + ASCII_SYM = 595, /* ASCII_SYM */ + AT_SYM = 596, /* AT_SYM */ + ATOMIC_SYM = 597, /* ATOMIC_SYM */ + AUTHORS_SYM = 598, /* AUTHORS_SYM */ + AUTOEXTEND_SIZE_SYM = 599, /* AUTOEXTEND_SIZE_SYM */ + AUTO_INC = 600, /* AUTO_INC */ + AUTO_SYM = 601, /* AUTO_SYM */ + AVG_ROW_LENGTH = 602, /* AVG_ROW_LENGTH */ + AVG_SYM = 603, /* AVG_SYM */ + BACKUP_SYM = 604, /* BACKUP_SYM */ + BEGIN_MARIADB_SYM = 605, /* BEGIN_MARIADB_SYM */ + BEGIN_ORACLE_SYM = 606, /* BEGIN_ORACLE_SYM */ + BINLOG_SYM = 607, /* BINLOG_SYM */ + BIT_SYM = 608, /* BIT_SYM */ + BLOCK_SYM = 609, /* BLOCK_SYM */ + BOOL_SYM = 610, /* BOOL_SYM */ + BOOLEAN_SYM = 611, /* BOOLEAN_SYM */ + BTREE_SYM = 612, /* BTREE_SYM */ + BYTE_SYM = 613, /* BYTE_SYM */ + CACHE_SYM = 614, /* CACHE_SYM */ + CASCADED = 615, /* CASCADED */ + CATALOG_NAME_SYM = 616, /* CATALOG_NAME_SYM */ + CHAIN_SYM = 617, /* CHAIN_SYM */ + CHANGED = 618, /* CHANGED */ + CHANNEL_SYM = 619, /* CHANNEL_SYM */ + CHARSET = 620, /* CHARSET */ + CHECKPOINT_SYM = 621, /* CHECKPOINT_SYM */ + CHECKSUM_SYM = 622, /* CHECKSUM_SYM */ + CIPHER_SYM = 623, /* CIPHER_SYM */ + CLASS_ORIGIN_SYM = 624, /* CLASS_ORIGIN_SYM */ + CLIENT_SYM = 625, /* CLIENT_SYM */ + CLOB_MARIADB_SYM = 626, /* CLOB_MARIADB_SYM */ + CLOB_ORACLE_SYM = 627, /* CLOB_ORACLE_SYM */ + CLOSE_SYM = 628, /* CLOSE_SYM */ + COALESCE = 629, /* COALESCE */ + CODE_SYM = 630, /* CODE_SYM */ + COLLATION_SYM = 631, /* COLLATION_SYM */ + COLUMNS = 632, /* COLUMNS */ + COLUMN_ADD_SYM = 633, /* COLUMN_ADD_SYM */ + COLUMN_CHECK_SYM = 634, /* COLUMN_CHECK_SYM */ + COLUMN_CREATE_SYM = 635, /* COLUMN_CREATE_SYM */ + COLUMN_DELETE_SYM = 636, /* COLUMN_DELETE_SYM */ + COLUMN_GET_SYM = 637, /* COLUMN_GET_SYM */ + COLUMN_SYM = 638, /* COLUMN_SYM */ + COLUMN_NAME_SYM = 639, /* COLUMN_NAME_SYM */ + COMMENT_SYM = 640, /* COMMENT_SYM */ + COMMITTED_SYM = 641, /* COMMITTED_SYM */ + COMMIT_SYM = 642, /* COMMIT_SYM */ + COMPACT_SYM = 643, /* COMPACT_SYM */ + COMPLETION_SYM = 644, /* COMPLETION_SYM */ + COMPRESSED_SYM = 645, /* COMPRESSED_SYM */ + CONCURRENT = 646, /* CONCURRENT */ + CONNECTION_SYM = 647, /* CONNECTION_SYM */ + CONSISTENT_SYM = 648, /* CONSISTENT_SYM */ + CONSTRAINT_CATALOG_SYM = 649, /* CONSTRAINT_CATALOG_SYM */ + CONSTRAINT_NAME_SYM = 650, /* CONSTRAINT_NAME_SYM */ + CONSTRAINT_SCHEMA_SYM = 651, /* CONSTRAINT_SCHEMA_SYM */ + CONTAINS_SYM = 652, /* CONTAINS_SYM */ + CONTEXT_SYM = 653, /* CONTEXT_SYM */ + CONTRIBUTORS_SYM = 654, /* CONTRIBUTORS_SYM */ + CPU_SYM = 655, /* CPU_SYM */ + CUBE_SYM = 656, /* CUBE_SYM */ + CURRENT_SYM = 657, /* CURRENT_SYM */ + CURRENT_POS_SYM = 658, /* CURRENT_POS_SYM */ + CURSOR_NAME_SYM = 659, /* CURSOR_NAME_SYM */ + CYCLE_SYM = 660, /* CYCLE_SYM */ + DATAFILE_SYM = 661, /* DATAFILE_SYM */ + DATA_SYM = 662, /* DATA_SYM */ + DATETIME = 663, /* DATETIME */ + DATE_SYM = 664, /* DATE_SYM */ + DAY_SYM = 665, /* DAY_SYM */ + DEALLOCATE_SYM = 666, /* DEALLOCATE_SYM */ + DEFINER_SYM = 667, /* DEFINER_SYM */ + DELAYED_SYM = 668, /* DELAYED_SYM */ + DELAY_KEY_WRITE_SYM = 669, /* DELAY_KEY_WRITE_SYM */ + DES_KEY_FILE = 670, /* DES_KEY_FILE */ + DIAGNOSTICS_SYM = 671, /* DIAGNOSTICS_SYM */ + DIRECTORY_SYM = 672, /* DIRECTORY_SYM */ + DISABLE_SYM = 673, /* DISABLE_SYM */ + DISCARD = 674, /* DISCARD */ + DISK_SYM = 675, /* DISK_SYM */ + DO_SYM = 676, /* DO_SYM */ + DUMPFILE = 677, /* DUMPFILE */ + DUPLICATE_SYM = 678, /* DUPLICATE_SYM */ + DYNAMIC_SYM = 679, /* DYNAMIC_SYM */ + ENABLE_SYM = 680, /* ENABLE_SYM */ + END = 681, /* END */ + ENDS_SYM = 682, /* ENDS_SYM */ + ENGINES_SYM = 683, /* ENGINES_SYM */ + ENGINE_SYM = 684, /* ENGINE_SYM */ + ENUM = 685, /* ENUM */ + ERROR_SYM = 686, /* ERROR_SYM */ + ERRORS = 687, /* ERRORS */ + ESCAPE_SYM = 688, /* ESCAPE_SYM */ + EVENTS_SYM = 689, /* EVENTS_SYM */ + EVENT_SYM = 690, /* EVENT_SYM */ + EVERY_SYM = 691, /* EVERY_SYM */ + EXCHANGE_SYM = 692, /* EXCHANGE_SYM */ + EXAMINED_SYM = 693, /* EXAMINED_SYM */ + EXCLUDE_SYM = 694, /* EXCLUDE_SYM */ + EXECUTE_SYM = 695, /* EXECUTE_SYM */ + EXCEPTION_MARIADB_SYM = 696, /* EXCEPTION_MARIADB_SYM */ + EXIT_MARIADB_SYM = 697, /* EXIT_MARIADB_SYM */ + EXIT_ORACLE_SYM = 698, /* EXIT_ORACLE_SYM */ + EXPANSION_SYM = 699, /* EXPANSION_SYM */ + EXPIRE_SYM = 700, /* EXPIRE_SYM */ + EXPORT_SYM = 701, /* EXPORT_SYM */ + EXTENDED_SYM = 702, /* EXTENDED_SYM */ + EXTENT_SIZE_SYM = 703, /* EXTENT_SIZE_SYM */ + FAST_SYM = 704, /* FAST_SYM */ + FAULTS_SYM = 705, /* FAULTS_SYM */ + FEDERATED_SYM = 706, /* FEDERATED_SYM */ + FILE_SYM = 707, /* FILE_SYM */ + FIRST_SYM = 708, /* FIRST_SYM */ + FIXED_SYM = 709, /* FIXED_SYM */ + FLUSH_SYM = 710, /* FLUSH_SYM */ + FOLLOWS_SYM = 711, /* FOLLOWS_SYM */ + FOLLOWING_SYM = 712, /* FOLLOWING_SYM */ + FORCE_SYM = 713, /* FORCE_SYM */ + FORMAT_SYM = 714, /* FORMAT_SYM */ + FOUND_SYM = 715, /* FOUND_SYM */ + FULL = 716, /* FULL */ + FUNCTION_SYM = 717, /* FUNCTION_SYM */ + GENERAL = 718, /* GENERAL */ + GENERATED_SYM = 719, /* GENERATED_SYM */ + GET_FORMAT = 720, /* GET_FORMAT */ + GET_SYM = 721, /* GET_SYM */ + GLOBAL_SYM = 722, /* GLOBAL_SYM */ + GRANTS = 723, /* GRANTS */ + HANDLER_SYM = 724, /* HANDLER_SYM */ + HARD_SYM = 725, /* HARD_SYM */ + HASH_SYM = 726, /* HASH_SYM */ + HELP_SYM = 727, /* HELP_SYM */ + HIGH_PRIORITY = 728, /* HIGH_PRIORITY */ + HISTORY_SYM = 729, /* HISTORY_SYM */ + HOST_SYM = 730, /* HOST_SYM */ + HOSTS_SYM = 731, /* HOSTS_SYM */ + HOUR_SYM = 732, /* HOUR_SYM */ + ID_SYM = 733, /* ID_SYM */ + IDENTIFIED_SYM = 734, /* IDENTIFIED_SYM */ + IGNORE_SERVER_IDS_SYM = 735, /* IGNORE_SERVER_IDS_SYM */ + IMMEDIATE_SYM = 736, /* IMMEDIATE_SYM */ + IMPORT = 737, /* IMPORT */ + INCREMENT_SYM = 738, /* INCREMENT_SYM */ + INDEXES = 739, /* INDEXES */ + INITIAL_SIZE_SYM = 740, /* INITIAL_SIZE_SYM */ + INSERT_METHOD = 741, /* INSERT_METHOD */ + INSTALL_SYM = 742, /* INSTALL_SYM */ + INVOKER_SYM = 743, /* INVOKER_SYM */ + IO_SYM = 744, /* IO_SYM */ + IPC_SYM = 745, /* IPC_SYM */ + ISOLATION = 746, /* ISOLATION */ + ISOPEN_SYM = 747, /* ISOPEN_SYM */ + ISSUER_SYM = 748, /* ISSUER_SYM */ + INVISIBLE_SYM = 749, /* INVISIBLE_SYM */ + JSON_SYM = 750, /* JSON_SYM */ + KEY_BLOCK_SIZE = 751, /* KEY_BLOCK_SIZE */ + LANGUAGE_SYM = 752, /* LANGUAGE_SYM */ + LAST_SYM = 753, /* LAST_SYM */ + LAST_VALUE = 754, /* LAST_VALUE */ + LASTVAL_SYM = 755, /* LASTVAL_SYM */ + LEAVES = 756, /* LEAVES */ + LESS_SYM = 757, /* LESS_SYM */ + LEVEL_SYM = 758, /* LEVEL_SYM */ + LIST_SYM = 759, /* LIST_SYM */ + LOCAL_SYM = 760, /* LOCAL_SYM */ + LOCKED_SYM = 761, /* LOCKED_SYM */ + LOCKS_SYM = 762, /* LOCKS_SYM */ + LOGFILE_SYM = 763, /* LOGFILE_SYM */ + LOGS_SYM = 764, /* LOGS_SYM */ + MASTER_CONNECT_RETRY_SYM = 765, /* MASTER_CONNECT_RETRY_SYM */ + MASTER_DELAY_SYM = 766, /* MASTER_DELAY_SYM */ + MASTER_GTID_POS_SYM = 767, /* MASTER_GTID_POS_SYM */ + MASTER_HOST_SYM = 768, /* MASTER_HOST_SYM */ + MASTER_LOG_FILE_SYM = 769, /* MASTER_LOG_FILE_SYM */ + MASTER_LOG_POS_SYM = 770, /* MASTER_LOG_POS_SYM */ + MASTER_PASSWORD_SYM = 771, /* MASTER_PASSWORD_SYM */ + MASTER_PORT_SYM = 772, /* MASTER_PORT_SYM */ + MASTER_SERVER_ID_SYM = 773, /* MASTER_SERVER_ID_SYM */ + MASTER_SSL_CAPATH_SYM = 774, /* MASTER_SSL_CAPATH_SYM */ + MASTER_SSL_CA_SYM = 775, /* MASTER_SSL_CA_SYM */ + MASTER_SSL_CERT_SYM = 776, /* MASTER_SSL_CERT_SYM */ + MASTER_SSL_CIPHER_SYM = 777, /* MASTER_SSL_CIPHER_SYM */ + MASTER_SSL_CRL_SYM = 778, /* MASTER_SSL_CRL_SYM */ + MASTER_SSL_CRLPATH_SYM = 779, /* MASTER_SSL_CRLPATH_SYM */ + MASTER_SSL_KEY_SYM = 780, /* MASTER_SSL_KEY_SYM */ + MASTER_SSL_SYM = 781, /* MASTER_SSL_SYM */ + MASTER_SYM = 782, /* MASTER_SYM */ + MASTER_USER_SYM = 783, /* MASTER_USER_SYM */ + MASTER_USE_GTID_SYM = 784, /* MASTER_USE_GTID_SYM */ + MASTER_HEARTBEAT_PERIOD_SYM = 785, /* MASTER_HEARTBEAT_PERIOD_SYM */ + MASTER_DEMOTE_TO_SLAVE_SYM = 786, /* MASTER_DEMOTE_TO_SLAVE_SYM */ + MAX_CONNECTIONS_PER_HOUR = 787, /* MAX_CONNECTIONS_PER_HOUR */ + MAX_QUERIES_PER_HOUR = 788, /* MAX_QUERIES_PER_HOUR */ + MAX_ROWS = 789, /* MAX_ROWS */ + MAX_SIZE_SYM = 790, /* MAX_SIZE_SYM */ + MAX_UPDATES_PER_HOUR = 791, /* MAX_UPDATES_PER_HOUR */ + MAX_STATEMENT_TIME_SYM = 792, /* MAX_STATEMENT_TIME_SYM */ + MAX_USER_CONNECTIONS_SYM = 793, /* MAX_USER_CONNECTIONS_SYM */ + MEDIUM_SYM = 794, /* MEDIUM_SYM */ + MEMORY_SYM = 795, /* MEMORY_SYM */ + MERGE_SYM = 796, /* MERGE_SYM */ + MESSAGE_TEXT_SYM = 797, /* MESSAGE_TEXT_SYM */ + MICROSECOND_SYM = 798, /* MICROSECOND_SYM */ + MIGRATE_SYM = 799, /* MIGRATE_SYM */ + MINUTE_SYM = 800, /* MINUTE_SYM */ + MINVALUE_SYM = 801, /* MINVALUE_SYM */ + MIN_ROWS = 802, /* MIN_ROWS */ + MODE_SYM = 803, /* MODE_SYM */ + MODIFY_SYM = 804, /* MODIFY_SYM */ + MONITOR_SYM = 805, /* MONITOR_SYM */ + MONTH_SYM = 806, /* MONTH_SYM */ + MUTEX_SYM = 807, /* MUTEX_SYM */ + MYSQL_SYM = 808, /* MYSQL_SYM */ + MYSQL_ERRNO_SYM = 809, /* MYSQL_ERRNO_SYM */ + NAMES_SYM = 810, /* NAMES_SYM */ + NAME_SYM = 811, /* NAME_SYM */ + NATIONAL_SYM = 812, /* NATIONAL_SYM */ + NCHAR_SYM = 813, /* NCHAR_SYM */ + NEVER_SYM = 814, /* NEVER_SYM */ + NEXT_SYM = 815, /* NEXT_SYM */ + NEXTVAL_SYM = 816, /* NEXTVAL_SYM */ + NOCACHE_SYM = 817, /* NOCACHE_SYM */ + NOCYCLE_SYM = 818, /* NOCYCLE_SYM */ + NODEGROUP_SYM = 819, /* NODEGROUP_SYM */ + NONE_SYM = 820, /* NONE_SYM */ + NOTFOUND_SYM = 821, /* NOTFOUND_SYM */ + NO_SYM = 822, /* NO_SYM */ + NOMAXVALUE_SYM = 823, /* NOMAXVALUE_SYM */ + NOMINVALUE_SYM = 824, /* NOMINVALUE_SYM */ + NO_WAIT_SYM = 825, /* NO_WAIT_SYM */ + NOWAIT_SYM = 826, /* NOWAIT_SYM */ + NUMBER_MARIADB_SYM = 827, /* NUMBER_MARIADB_SYM */ + NUMBER_ORACLE_SYM = 828, /* NUMBER_ORACLE_SYM */ + NVARCHAR_SYM = 829, /* NVARCHAR_SYM */ + OF_SYM = 830, /* OF_SYM */ + OFFSET_SYM = 831, /* OFFSET_SYM */ + OLD_PASSWORD_SYM = 832, /* OLD_PASSWORD_SYM */ + ONE_SYM = 833, /* ONE_SYM */ + ONLY_SYM = 834, /* ONLY_SYM */ + ONLINE_SYM = 835, /* ONLINE_SYM */ + OPEN_SYM = 836, /* OPEN_SYM */ + OPTIONS_SYM = 837, /* OPTIONS_SYM */ + OPTION = 838, /* OPTION */ + OVERLAPS_SYM = 839, /* OVERLAPS_SYM */ + OWNER_SYM = 840, /* OWNER_SYM */ + PACK_KEYS_SYM = 841, /* PACK_KEYS_SYM */ + PAGE_SYM = 842, /* PAGE_SYM */ + PARSER_SYM = 843, /* PARSER_SYM */ + PARTIAL = 844, /* PARTIAL */ + PARTITIONS_SYM = 845, /* PARTITIONS_SYM */ + PARTITIONING_SYM = 846, /* PARTITIONING_SYM */ + PASSWORD_SYM = 847, /* PASSWORD_SYM */ + PERIOD_SYM = 848, /* PERIOD_SYM */ + PERSISTENT_SYM = 849, /* PERSISTENT_SYM */ + PHASE_SYM = 850, /* PHASE_SYM */ + PLUGINS_SYM = 851, /* PLUGINS_SYM */ + PLUGIN_SYM = 852, /* PLUGIN_SYM */ + PORT_SYM = 853, /* PORT_SYM */ + PRECEDES_SYM = 854, /* PRECEDES_SYM */ + PRECEDING_SYM = 855, /* PRECEDING_SYM */ + PREPARE_SYM = 856, /* PREPARE_SYM */ + PRESERVE_SYM = 857, /* PRESERVE_SYM */ + PREV_SYM = 858, /* PREV_SYM */ + PREVIOUS_SYM = 859, /* PREVIOUS_SYM */ + PRIVILEGES = 860, /* PRIVILEGES */ + PROCESS = 861, /* PROCESS */ + PROCESSLIST_SYM = 862, /* PROCESSLIST_SYM */ + PROFILE_SYM = 863, /* PROFILE_SYM */ + PROFILES_SYM = 864, /* PROFILES_SYM */ + PROXY_SYM = 865, /* PROXY_SYM */ + QUARTER_SYM = 866, /* QUARTER_SYM */ + QUERY_SYM = 867, /* QUERY_SYM */ + QUICK = 868, /* QUICK */ + RAW_MARIADB_SYM = 869, /* RAW_MARIADB_SYM */ + RAW_ORACLE_SYM = 870, /* RAW_ORACLE_SYM */ + READ_ONLY_SYM = 871, /* READ_ONLY_SYM */ + REBUILD_SYM = 872, /* REBUILD_SYM */ + RECOVER_SYM = 873, /* RECOVER_SYM */ + REDOFILE_SYM = 874, /* REDOFILE_SYM */ + REDO_BUFFER_SIZE_SYM = 875, /* REDO_BUFFER_SIZE_SYM */ + REDUNDANT_SYM = 876, /* REDUNDANT_SYM */ + RELAY = 877, /* RELAY */ + RELAYLOG_SYM = 878, /* RELAYLOG_SYM */ + RELAY_LOG_FILE_SYM = 879, /* RELAY_LOG_FILE_SYM */ + RELAY_LOG_POS_SYM = 880, /* RELAY_LOG_POS_SYM */ + RELAY_THREAD = 881, /* RELAY_THREAD */ + RELOAD = 882, /* RELOAD */ + REMOVE_SYM = 883, /* REMOVE_SYM */ + REORGANIZE_SYM = 884, /* REORGANIZE_SYM */ + REPAIR = 885, /* REPAIR */ + REPEATABLE_SYM = 886, /* REPEATABLE_SYM */ + REPLAY_SYM = 887, /* REPLAY_SYM */ + REPLICATION = 888, /* REPLICATION */ + RESET_SYM = 889, /* RESET_SYM */ + RESTART_SYM = 890, /* RESTART_SYM */ + RESOURCES = 891, /* RESOURCES */ + RESTORE_SYM = 892, /* RESTORE_SYM */ + RESUME_SYM = 893, /* RESUME_SYM */ + RETURNED_SQLSTATE_SYM = 894, /* RETURNED_SQLSTATE_SYM */ + RETURNS_SYM = 895, /* RETURNS_SYM */ + REUSE_SYM = 896, /* REUSE_SYM */ + REVERSE_SYM = 897, /* REVERSE_SYM */ + ROLE_SYM = 898, /* ROLE_SYM */ + ROLLBACK_SYM = 899, /* ROLLBACK_SYM */ + ROLLUP_SYM = 900, /* ROLLUP_SYM */ + ROUTINE_SYM = 901, /* ROUTINE_SYM */ + ROWCOUNT_SYM = 902, /* ROWCOUNT_SYM */ + ROW_SYM = 903, /* ROW_SYM */ + ROW_COUNT_SYM = 904, /* ROW_COUNT_SYM */ + ROW_FORMAT_SYM = 905, /* ROW_FORMAT_SYM */ + RTREE_SYM = 906, /* RTREE_SYM */ + SAVEPOINT_SYM = 907, /* SAVEPOINT_SYM */ + SCHEDULE_SYM = 908, /* SCHEDULE_SYM */ + SCHEMA_NAME_SYM = 909, /* SCHEMA_NAME_SYM */ + SECOND_SYM = 910, /* SECOND_SYM */ + SECURITY_SYM = 911, /* SECURITY_SYM */ + SEQUENCE_SYM = 912, /* SEQUENCE_SYM */ + SERIALIZABLE_SYM = 913, /* SERIALIZABLE_SYM */ + SERIAL_SYM = 914, /* SERIAL_SYM */ + SESSION_SYM = 915, /* SESSION_SYM */ + SERVER_SYM = 916, /* SERVER_SYM */ + SETVAL_SYM = 917, /* SETVAL_SYM */ + SHARE_SYM = 918, /* SHARE_SYM */ + SHUTDOWN = 919, /* SHUTDOWN */ + SIGNED_SYM = 920, /* SIGNED_SYM */ + SIMPLE_SYM = 921, /* SIMPLE_SYM */ + SKIP_SYM = 922, /* SKIP_SYM */ + SLAVE = 923, /* SLAVE */ + SLAVES = 924, /* SLAVES */ + SLAVE_POS_SYM = 925, /* SLAVE_POS_SYM */ + SLOW = 926, /* SLOW */ + SNAPSHOT_SYM = 927, /* SNAPSHOT_SYM */ + SOCKET_SYM = 928, /* SOCKET_SYM */ + SOFT_SYM = 929, /* SOFT_SYM */ + SONAME_SYM = 930, /* SONAME_SYM */ + SOUNDS_SYM = 931, /* SOUNDS_SYM */ + SOURCE_SYM = 932, /* SOURCE_SYM */ + SQL_BUFFER_RESULT = 933, /* SQL_BUFFER_RESULT */ + SQL_CACHE_SYM = 934, /* SQL_CACHE_SYM */ + SQL_CALC_FOUND_ROWS = 935, /* SQL_CALC_FOUND_ROWS */ + SQL_NO_CACHE_SYM = 936, /* SQL_NO_CACHE_SYM */ + SQL_THREAD = 937, /* SQL_THREAD */ + STAGE_SYM = 938, /* STAGE_SYM */ + STARTS_SYM = 939, /* STARTS_SYM */ + START_SYM = 940, /* START_SYM */ + STATEMENT_SYM = 941, /* STATEMENT_SYM */ + STATUS_SYM = 942, /* STATUS_SYM */ + STOP_SYM = 943, /* STOP_SYM */ + STORAGE_SYM = 944, /* STORAGE_SYM */ + STORED_SYM = 945, /* STORED_SYM */ + STRING_SYM = 946, /* STRING_SYM */ + SUBCLASS_ORIGIN_SYM = 947, /* SUBCLASS_ORIGIN_SYM */ + SUBDATE_SYM = 948, /* SUBDATE_SYM */ + SUBJECT_SYM = 949, /* SUBJECT_SYM */ + SUBPARTITIONS_SYM = 950, /* SUBPARTITIONS_SYM */ + SUBPARTITION_SYM = 951, /* SUBPARTITION_SYM */ + SUPER_SYM = 952, /* SUPER_SYM */ + SUSPEND_SYM = 953, /* SUSPEND_SYM */ + SWAPS_SYM = 954, /* SWAPS_SYM */ + SWITCHES_SYM = 955, /* SWITCHES_SYM */ + SYSTEM = 956, /* SYSTEM */ + SYSTEM_TIME_SYM = 957, /* SYSTEM_TIME_SYM */ + TABLES = 958, /* TABLES */ + TABLESPACE = 959, /* TABLESPACE */ + TABLE_CHECKSUM_SYM = 960, /* TABLE_CHECKSUM_SYM */ + TABLE_NAME_SYM = 961, /* TABLE_NAME_SYM */ + TEMPORARY = 962, /* TEMPORARY */ + TEMPTABLE_SYM = 963, /* TEMPTABLE_SYM */ + TEXT_SYM = 964, /* TEXT_SYM */ + THAN_SYM = 965, /* THAN_SYM */ + TIES_SYM = 966, /* TIES_SYM */ + TIMESTAMP = 967, /* TIMESTAMP */ + TIMESTAMP_ADD = 968, /* TIMESTAMP_ADD */ + TIMESTAMP_DIFF = 969, /* TIMESTAMP_DIFF */ + TIME_SYM = 970, /* TIME_SYM */ + TRANSACTION_SYM = 971, /* TRANSACTION_SYM */ + TRANSACTIONAL_SYM = 972, /* TRANSACTIONAL_SYM */ + THREADS_SYM = 973, /* THREADS_SYM */ + TRIGGERS_SYM = 974, /* TRIGGERS_SYM */ + TRIM_ORACLE = 975, /* TRIM_ORACLE */ + TRUNCATE_SYM = 976, /* TRUNCATE_SYM */ + TYPE_SYM = 977, /* TYPE_SYM */ + UDF_RETURNS_SYM = 978, /* UDF_RETURNS_SYM */ + UNBOUNDED_SYM = 979, /* UNBOUNDED_SYM */ + UNCOMMITTED_SYM = 980, /* UNCOMMITTED_SYM */ + UNDEFINED_SYM = 981, /* UNDEFINED_SYM */ + UNDOFILE_SYM = 982, /* UNDOFILE_SYM */ + UNDO_BUFFER_SIZE_SYM = 983, /* UNDO_BUFFER_SIZE_SYM */ + UNICODE_SYM = 984, /* UNICODE_SYM */ + UNINSTALL_SYM = 985, /* UNINSTALL_SYM */ + UNKNOWN_SYM = 986, /* UNKNOWN_SYM */ + UNTIL_SYM = 987, /* UNTIL_SYM */ + UPGRADE_SYM = 988, /* UPGRADE_SYM */ + USER_SYM = 989, /* USER_SYM */ + USE_FRM = 990, /* USE_FRM */ + VALUE_SYM = 991, /* VALUE_SYM */ + VARCHAR2_MARIADB_SYM = 992, /* VARCHAR2_MARIADB_SYM */ + VARCHAR2_ORACLE_SYM = 993, /* VARCHAR2_ORACLE_SYM */ + VARIABLES = 994, /* VARIABLES */ + VERSIONING_SYM = 995, /* VERSIONING_SYM */ + VIA_SYM = 996, /* VIA_SYM */ + VIEW_SYM = 997, /* VIEW_SYM */ + VISIBLE_SYM = 998, /* VISIBLE_SYM */ + VIRTUAL_SYM = 999, /* VIRTUAL_SYM */ + WAIT_SYM = 1000, /* WAIT_SYM */ + WARNINGS = 1001, /* WARNINGS */ + WEEK_SYM = 1002, /* WEEK_SYM */ + WEIGHT_STRING_SYM = 1003, /* WEIGHT_STRING_SYM */ + WINDOW_SYM = 1004, /* WINDOW_SYM */ + WITHIN = 1005, /* WITHIN */ + WITHOUT = 1006, /* WITHOUT */ + WORK_SYM = 1007, /* WORK_SYM */ + WRAPPER_SYM = 1008, /* WRAPPER_SYM */ + WRITE_SYM = 1009, /* WRITE_SYM */ + X509_SYM = 1010, /* X509_SYM */ + XA_SYM = 1011, /* XA_SYM */ + XML_SYM = 1012, /* XML_SYM */ + YEAR_SYM = 1013, /* YEAR_SYM */ + CONDITIONLESS_JOIN = 1014, /* CONDITIONLESS_JOIN */ + ON_SYM = 1015, /* ON_SYM */ + PREC_BELOW_NOT = 1016, /* PREC_BELOW_NOT */ + SUBQUERY_AS_EXPR = 1017, /* SUBQUERY_AS_EXPR */ + PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE = 1018, /* PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE */ + USER = 1019, /* USER */ + PREC_BELOW_CONTRACTION_TOKEN2 = 1020, /* PREC_BELOW_CONTRACTION_TOKEN2 */ + EMPTY_FROM_CLAUSE = 1021 /* EMPTY_FROM_CLAUSE */ + }; + typedef enum yytokentype yytoken_kind_t; +#endif + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +union YYSTYPE +{ +#line 192 "/home/buildbot/git/sql/sql_yacc.yy" + + int num; + ulong ulong_num; + ulonglong ulonglong_number; + longlong longlong_number; + uint sp_instr_addr; + + /* structs */ + LEX_CSTRING lex_str; + Lex_ident_cli_st kwd; + Lex_ident_cli_st ident_cli; + Lex_ident_sys_st ident_sys; + Lex_column_list_privilege_st column_list_privilege; + Lex_string_with_metadata_st lex_string_with_metadata; + Lex_spblock_st spblock; + Lex_spblock_handlers_st spblock_handlers; + Lex_length_and_dec_st Lex_length_and_dec; + Lex_cast_type_st Lex_cast_type; + Lex_field_type_st Lex_field_type; + Lex_exact_charset_extended_collation_attrs_st + Lex_exact_charset_extended_collation_attrs; + Lex_extended_collation_st Lex_extended_collation; + Lex_dyncol_type_st Lex_dyncol_type; + Lex_for_loop_st for_loop; + Lex_for_loop_bounds_st for_loop_bounds; + Lex_trim_st trim; + Json_table_column::On_response json_on_response; + Lex_substring_spec_st substring_spec; + vers_history_point_t vers_history_point; + struct + { + enum sub_select_type unit_type; + bool distinct; + } unit_operation; + struct + { + SELECT_LEX *first; + SELECT_LEX *prev_last; + } select_list; + SQL_I_List *select_order; + Lex_select_lock select_lock; + Lex_select_limit select_limit; + Lex_order_limit_lock *order_limit_lock; + + /* pointers */ + Lex_ident_sys *ident_sys_ptr; + Create_field *create_field; + Spvar_definition *spvar_definition; + Row_definition_list *spvar_definition_list; + const Type_handler *type_handler; + const class Sp_handler *sp_handler; + CHARSET_INFO *charset; + Condition_information_item *cond_info_item; + DYNCALL_CREATE_DEF *dyncol_def; + Diagnostics_information *diag_info; + Item *item; + Item_num *item_num; + Item_param *item_param; + Item_basic_constant *item_basic_constant; + Key_part_spec *key_part; + LEX *lex; + sp_expr_lex *expr_lex; + sp_assignment_lex *assignment_lex; + class sp_lex_cursor *sp_cursor_stmt; + LEX_CSTRING *lex_str_ptr; + LEX_USER *lex_user; + USER_AUTH *user_auth; + List *cond_info_list; + List *dyncol_def_list; + List *item_list; + List *sp_assignment_lex_list; + List *stmt_info_list; + List *string_list; + List *ident_sys_list; + Statement_information_item *stmt_info_item; + String *string; + TABLE_LIST *table_list; + Table_ident *table; + Qualified_column_ident *qualified_column_ident; + char *simple_string; + const char *const_simple_string; + chooser_compare_func_creator boolfunc2creator; + class Lex_grant_privilege *lex_grant; + class Lex_grant_object_name *lex_grant_ident; + class my_var *myvar; + class sp_condition_value *spcondvalue; + class sp_head *sphead; + class sp_name *spname; + class sp_variable *spvar; + class With_element_head *with_element_head; + class With_clause *with_clause; + class Virtual_column_info *virtual_column; + engine_option_value *engine_option_value_ptr; + + handlerton *db_type; + st_select_lex *select_lex; + st_select_lex_unit *select_lex_unit; + struct p_elem_val *p_elem_value; + class Window_frame *window_frame; + class Window_frame_bound *window_frame_bound; + udf_func *udf; + st_trg_execution_order trg_execution_order; + + /* enums */ + enum enum_sp_suid_behaviour sp_suid; + enum enum_sp_aggregate_type sp_aggregate_type; + enum enum_view_suid view_suid; + enum Condition_information_item::Name cond_info_item_name; + enum enum_diag_condition_item_name diag_condition_item_name; + enum Diagnostics_information::Which_area diag_area; + enum enum_fk_option m_fk_option; + enum Item_udftype udf_type; + enum Key::Keytype key_type; + enum Statement_information_item::Name stmt_info_item_name; + enum enum_filetype filetype; + enum enum_tx_isolation tx_isolation; + enum enum_var_type var_type; + enum enum_yes_no_unknown m_yes_no_unk; + enum ha_choice choice; + enum ha_key_alg key_alg; + enum ha_rkey_function ha_rkey_mode; + enum index_hint_type index_hint; + enum interval_type interval, interval_time_st; + enum row_type row_type; + enum sp_variable::enum_mode spvar_mode; + enum thr_lock_type lock_type; + enum enum_mysql_timestamp_type date_time_type; + enum Window_frame_bound::Bound_precedence_type bound_precedence_type; + enum Window_frame::Frame_units frame_units; + enum Window_frame::Frame_exclusion frame_exclusion; + enum trigger_order_type trigger_action_order_type; + DDL_options_st object_ddl_options; + enum vers_kind_t vers_range_unit; + enum Column_definition::enum_column_versioning vers_column_versioning; + enum plsql_cursor_attr_t plsql_cursor_attr; + privilege_t privilege; + +#line 968 "/home/buildbot/git/mkdist/sql/yy_oracle.hh" + +}; +typedef union YYSTYPE YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + + + +int ORAparse (THD *thd); + + +#endif /* !YY_ORA_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_ORACLE_HH_INCLUDED */ diff --git a/storage/archive/CMakeLists.txt b/storage/archive/CMakeLists.txt index 5b6818fc..5c7b6aa4 100644 --- a/storage/archive/CMakeLists.txt +++ b/storage/archive/CMakeLists.txt @@ -14,5 +14,5 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA SET(ARCHIVE_SOURCES azio.c ha_archive.cc ha_archive.h) -MYSQL_ADD_PLUGIN(archive ${ARCHIVE_SOURCES} STORAGE_ENGINE LINK_LIBRARIES ${ZLIB_LIBRARY}) +MYSQL_ADD_PLUGIN(archive ${ARCHIVE_SOURCES} STORAGE_ENGINE LINK_LIBRARIES ${ZLIB_LIBRARIES}) diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc index 19a0ffe0..1ee1f071 100644 --- a/storage/archive/ha_archive.cc +++ b/storage/archive/ha_archive.cc @@ -267,6 +267,9 @@ ha_archive::ha_archive(handlerton *hton, TABLE_SHARE *table_arg) archive_reader_open= FALSE; } +/* Stack size 50264 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int archive_discover(handlerton *hton, THD* thd, TABLE_SHARE *share) { DBUG_ENTER("archive_discover"); @@ -308,6 +311,7 @@ ret: my_free(frm_ptr); DBUG_RETURN(my_errno); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** @brief Read version 1 meta file (5.0 compatibility routine). @@ -478,6 +482,10 @@ int ha_archive::read_data_header(azio_stream *file_to_read) See ha_example.cc for a longer description. */ + +/* Stack size 49608 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + Archive_share *ha_archive::get_share(const char *table_name, int *rc) { Archive_share *tmp_share; @@ -540,6 +548,7 @@ err: DBUG_RETURN(tmp_share); } +PRAGMA_REENABLE_CHECK_STACK_FRAME int Archive_share::init_archive_writer() @@ -761,6 +770,9 @@ int ha_archive::frm_compare(azio_stream *s) of creation. */ +/* Stack size 49608 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int ha_archive::create(const char *name, TABLE *table_arg, HA_CREATE_INFO *create_info) { @@ -878,6 +890,7 @@ error: /* Return error number, if we got one */ DBUG_RETURN(error ? error : -1); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /* This is where the actual row is written out. @@ -1496,6 +1509,10 @@ int ha_archive::repair(THD* thd, HA_CHECK_OPT* check_opt) The table can become fragmented if data was inserted, read, and then inserted again. What we do is open up the file and recompress it completely. */ + +/* Stack size 50152 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int ha_archive::optimize(THD* thd, HA_CHECK_OPT* check_opt) { int rc= 0; @@ -1621,6 +1638,7 @@ error: DBUG_RETURN(rc); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /* Below is an example of how to setup row level locking. diff --git a/storage/columnstore/CMakeLists.txt b/storage/columnstore/CMakeLists.txt index ebb138c7..3767d5da 100644 --- a/storage/columnstore/CMakeLists.txt +++ b/storage/columnstore/CMakeLists.txt @@ -1,6 +1,7 @@ #set(PLUGIN_COLUMNSTORE "NO" CACHE STRING "Enable ColumnStore engine") -if("NO" STREQUAL "${PLUGIN_COLUMNSTORE}") +if("NO" STREQUAL "${PLUGIN_COLUMNSTORE}" OR + (NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/columnstore/CMakeLists.txt)) return() endif() diff --git a/storage/columnstore/columnstore/CMakeLists.txt b/storage/columnstore/columnstore/CMakeLists.txt index 5d43aef5..0e6ad413 100644 --- a/storage/columnstore/columnstore/CMakeLists.txt +++ b/storage/columnstore/columnstore/CMakeLists.txt @@ -223,6 +223,7 @@ IF (MASK_LONGDOUBLE) MY_CHECK_AND_SET_COMPILER_FLAG("-DMASK_LONGDOUBLE") ENDIF() + SET (CMAKE_REQUIRED_FLAGS "-Werror -Wall") SET (ENGINE_LDFLAGS "-Wl,--no-as-needed -Wl,--add-needed") SET (ENGINE_DT_LIB datatypes) diff --git a/storage/columnstore/columnstore/VERSION b/storage/columnstore/columnstore/VERSION index 35b4ad7f..fb113a00 100644 --- a/storage/columnstore/columnstore/VERSION +++ b/storage/columnstore/columnstore/VERSION @@ -1,4 +1,4 @@ COLUMNSTORE_VERSION_MAJOR=6 COLUMNSTORE_VERSION_MINOR=4 COLUMNSTORE_VERSION_PATCH=8 -COLUMNSTORE_VERSION_RELEASE=1 +COLUMNSTORE_VERSION_RELEASE=2 diff --git a/storage/columnstore/columnstore/datatypes/mcs_datatype.cpp b/storage/columnstore/columnstore/datatypes/mcs_datatype.cpp index 59bc2bf2..2ca95ba2 100644 --- a/storage/columnstore/columnstore/datatypes/mcs_datatype.cpp +++ b/storage/columnstore/columnstore/datatypes/mcs_datatype.cpp @@ -1915,4 +1915,3 @@ const uint8_t* TypeHandlerUDecimal128::getEmptyValueForType( } // end of namespace datatypes -// vim:ts=2 sw=2: diff --git a/storage/columnstore/columnstore/datatypes/mcs_datatype.h b/storage/columnstore/columnstore/datatypes/mcs_datatype.h index a25c23e1..11b0d989 100644 --- a/storage/columnstore/columnstore/datatypes/mcs_datatype.h +++ b/storage/columnstore/columnstore/datatypes/mcs_datatype.h @@ -2522,6 +2522,4 @@ class TypeHandlerTimestamp : public TypeHandlerTemporal } // end of namespace datatypes -#endif // MCS_DATATYPE_H_INCLUDED - -// vim:ts=2 sw=2: +#endif // MCS_DATATYPE_H_INCLUDED \ No newline at end of file diff --git a/storage/columnstore/columnstore/datatypes/mcs_datatype_basic.h b/storage/columnstore/columnstore/datatypes/mcs_datatype_basic.h index 5ba6cfc1..16179f71 100644 --- a/storage/columnstore/columnstore/datatypes/mcs_datatype_basic.h +++ b/storage/columnstore/columnstore/datatypes/mcs_datatype_basic.h @@ -80,4 +80,3 @@ uint64_t xFloatToMCSUInt64Round(SRC value) } // end of namespace datatypes #endif // MCS_DATATYPE_BASIC_H_INCLUDED -// vim:ts=2 sw=2: diff --git a/storage/columnstore/columnstore/datatypes/mcs_double.h b/storage/columnstore/columnstore/datatypes/mcs_double.h index e34bf7aa..7e420f2f 100644 --- a/storage/columnstore/columnstore/datatypes/mcs_double.h +++ b/storage/columnstore/columnstore/datatypes/mcs_double.h @@ -55,5 +55,4 @@ class TDouble } // end of namespace datatypes -#endif // MCS_DOUBLE_H_INCLUDED -// vim:ts=2 sw=2: +#endif // MCS_DOUBLE_H_INCLUDED \ No newline at end of file diff --git a/storage/columnstore/columnstore/datatypes/mcs_float128.h b/storage/columnstore/columnstore/datatypes/mcs_float128.h index 058ad1ed..c25cfc90 100644 --- a/storage/columnstore/columnstore/datatypes/mcs_float128.h +++ b/storage/columnstore/columnstore/datatypes/mcs_float128.h @@ -725,5 +725,4 @@ class TFloat128 } // namespace datatypes -#endif // MCS_TSFLOAT128_H_INCLUDED -// vim:ts=2 sw=2: +#endif // MCS_TSFLOAT128_H_INCLUDED \ No newline at end of file diff --git a/storage/columnstore/columnstore/datatypes/mcs_int128.cpp b/storage/columnstore/columnstore/datatypes/mcs_int128.cpp index 13329fc4..58dee474 100644 --- a/storage/columnstore/columnstore/datatypes/mcs_int128.cpp +++ b/storage/columnstore/columnstore/datatypes/mcs_int128.cpp @@ -113,4 +113,3 @@ std::ostream& operator<<(std::ostream& os, const TSInt128& x) } } // end of namespace datatypes -// vim:ts=2 sw=2: diff --git a/storage/columnstore/columnstore/datatypes/mcs_int128.h b/storage/columnstore/columnstore/datatypes/mcs_int128.h index 02df0c7e..ddc37bdf 100644 --- a/storage/columnstore/columnstore/datatypes/mcs_int128.h +++ b/storage/columnstore/columnstore/datatypes/mcs_int128.h @@ -324,4 +324,3 @@ class TSInt128 } // end of namespace datatypes #endif // MCS_TSINT128_H_INCLUDED -// vim:ts=2 sw=2: diff --git a/storage/columnstore/columnstore/datatypes/mcs_int64.h b/storage/columnstore/columnstore/datatypes/mcs_int64.h index c44f1169..be379a62 100644 --- a/storage/columnstore/columnstore/datatypes/mcs_int64.h +++ b/storage/columnstore/columnstore/datatypes/mcs_int64.h @@ -180,5 +180,4 @@ class TSInt64Null : public TSInt64, public TNullFlag } // end of namespace datatypes -#endif // MCS_INT64_H_INCLUDED -// vim:ts=2 sw=2: +#endif // MCS_INT64_H_INCLUDED \ No newline at end of file diff --git a/storage/columnstore/columnstore/datatypes/mcs_longdouble.h b/storage/columnstore/columnstore/datatypes/mcs_longdouble.h index 55215642..f33d7658 100644 --- a/storage/columnstore/columnstore/datatypes/mcs_longdouble.h +++ b/storage/columnstore/columnstore/datatypes/mcs_longdouble.h @@ -55,5 +55,4 @@ class TLongDouble } // end of namespace datatypes -#endif // MCS_LONGDOUBLE_H_INCLUDED -// vim:ts=2 sw=2: +#endif // MCS_LONGDOUBLE_H_INCLUDED \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/ddlpackage/CMakeLists.txt b/storage/columnstore/columnstore/dbcon/ddlpackage/CMakeLists.txt index ed211403..5557ed3f 100644 --- a/storage/columnstore/columnstore/dbcon/ddlpackage/CMakeLists.txt +++ b/storage/columnstore/columnstore/dbcon/ddlpackage/CMakeLists.txt @@ -9,7 +9,7 @@ FIND_PACKAGE(FLEX REQUIRED) FLEX_TARGET(ddl_scan ddl.l ${CMAKE_CURRENT_BINARY_DIR}/ddl-scan.cpp COMPILE_FLAGS "-i -L -Pddl") ADD_FLEX_BISON_DEPENDENCY(ddl_scan ddl_gram) -set_source_files_properties(ddl-scan.cpp PROPERTIES COMPILE_FLAGS -Wno-sign-compare) +set_source_files_properties(ddl-scan.cpp PROPERTIES COMPILE_FLAGS "-Wno-register -Wno-deprecated-register -Wno-sign-compare -DYY_NO_INPUT") ########### next target ############### diff --git a/storage/columnstore/columnstore/dbcon/ddlpackageproc/altertableprocessor.cpp b/storage/columnstore/columnstore/dbcon/ddlpackageproc/altertableprocessor.cpp index aca76bf4..c09c79b4 100644 --- a/storage/columnstore/columnstore/dbcon/ddlpackageproc/altertableprocessor.cpp +++ b/storage/columnstore/columnstore/dbcon/ddlpackageproc/altertableprocessor.cpp @@ -2539,7 +2539,6 @@ void AlterTableProcessor::renameColumn(uint32_t sessionID, execplan::CalpontSyst } } // namespace ddlpackageprocessor -// vim:ts=4 sw=4: #ifdef __clang__ #pragma clang diagnostic pop diff --git a/storage/columnstore/columnstore/dbcon/ddlpackageproc/createtableprocessor.cpp b/storage/columnstore/columnstore/dbcon/ddlpackageproc/createtableprocessor.cpp index f51d0395..f0ff32be 100644 --- a/storage/columnstore/columnstore/dbcon/ddlpackageproc/createtableprocessor.cpp +++ b/storage/columnstore/columnstore/dbcon/ddlpackageproc/createtableprocessor.cpp @@ -830,4 +830,3 @@ void CreateTableProcessor::rollBackCreateTable(const string& error, BRM::TxnID t } } // namespace ddlpackageprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.cpp b/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.cpp index 3740035d..bf27af32 100644 --- a/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.cpp +++ b/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.cpp @@ -1491,4 +1491,3 @@ int DDLPackageProcessor::commitTransaction(uint64_t uniqueId, BRM::TxnID txnID) } } // namespace ddlpackageprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.h b/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.h index d2dd84c7..c2458528 100644 --- a/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.h +++ b/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.h @@ -54,7 +54,7 @@ #define EXPORT #endif -//#define IDB_DDL_DEBUG +// #define IDB_DDL_DEBUG namespace ddlpackageprocessor { #define SUMMARY_INFO(message) \ @@ -891,5 +891,4 @@ bool from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&) #undef EXPORT -#endif // DDLPACKAGEPROCESSOR_H -// vim:ts=4 sw=4: +#endif // DDLPACKAGEPROCESSOR_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/ddlpackageproc/droptableprocessor.cpp b/storage/columnstore/columnstore/dbcon/ddlpackageproc/droptableprocessor.cpp index e1ca785d..4cfc7946 100644 --- a/storage/columnstore/columnstore/dbcon/ddlpackageproc/droptableprocessor.cpp +++ b/storage/columnstore/columnstore/dbcon/ddlpackageproc/droptableprocessor.cpp @@ -1367,4 +1367,3 @@ TruncTableProcessor::DDLResult TruncTableProcessor::processPackage( } // namespace ddlpackageprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/dmlpackage/CMakeLists.txt b/storage/columnstore/columnstore/dbcon/dmlpackage/CMakeLists.txt index d7b5f235..e999cdae 100644 --- a/storage/columnstore/columnstore/dbcon/dmlpackage/CMakeLists.txt +++ b/storage/columnstore/columnstore/dbcon/dmlpackage/CMakeLists.txt @@ -10,7 +10,7 @@ FIND_PACKAGE(FLEX REQUIRED) FLEX_TARGET(dml_scan dml.l ${CMAKE_CURRENT_BINARY_DIR}/dml-scan.cpp COMPILE_FLAGS "-i -L -Pdml") ADD_FLEX_BISON_DEPENDENCY(dml_scan dml_gram) -set_source_files_properties(dml-scan.cpp PROPERTIES COMPILE_FLAGS -Wno-sign-compare) +set_source_files_properties(dml-scan.cpp PROPERTIES COMPILE_FLAGS "-Wno-register -Wno-deprecated-register -Wno-sign-compare -DYY_NO_INPUT") ########### next target ############### diff --git a/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.cpp b/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.cpp index 3a71efaf..875e90d7 100644 --- a/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.cpp +++ b/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.cpp @@ -97,4 +97,3 @@ AutoincrementData::OIDNextValue& AutoincrementData::getOidNextValueMap() return fOidNextValueMap; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.h b/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.h index 17be0648..81614f40 100644 --- a/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.h +++ b/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.h @@ -50,5 +50,4 @@ class AutoincrementData boost::mutex fOIDnextvalLock; }; -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/dmlpackageproc/dmlpackageprocessor.cpp b/storage/columnstore/columnstore/dbcon/dmlpackageproc/dmlpackageprocessor.cpp index b5217b0e..78b19b39 100644 --- a/storage/columnstore/columnstore/dbcon/dmlpackageproc/dmlpackageprocessor.cpp +++ b/storage/columnstore/columnstore/dbcon/dmlpackageproc/dmlpackageprocessor.cpp @@ -913,4 +913,3 @@ int DMLPackageProcessor::endTransaction(uint64_t uniqueId, BRM::TxnID txnID, boo return rc; } } // namespace dmlpackageprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/dmlpackageproc/insertpackageprocessor.cpp b/storage/columnstore/columnstore/dbcon/dmlpackageproc/insertpackageprocessor.cpp index fb844b69..3fd6b7ae 100644 --- a/storage/columnstore/columnstore/dbcon/dmlpackageproc/insertpackageprocessor.cpp +++ b/storage/columnstore/columnstore/dbcon/dmlpackageproc/insertpackageprocessor.cpp @@ -432,4 +432,3 @@ DMLPackageProcessor::DMLResult InsertPackageProcessor::processPackage(dmlpackage } // namespace dmlpackageprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.cpp b/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.cpp index d5f94ec6..1c169917 100644 --- a/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.cpp +++ b/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.cpp @@ -101,4 +101,3 @@ TablelockData::OIDTablelock& TablelockData::getOidTablelockMap() } } // namespace dmlpackageprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.h b/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.h index a5910d84..9c52d1cf 100644 --- a/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.h +++ b/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.h @@ -62,5 +62,4 @@ class TablelockData #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/execplan/calpontselectexecutionplan.h b/storage/columnstore/columnstore/dbcon/execplan/calpontselectexecutionplan.h index 10217d36..04b83689 100644 --- a/storage/columnstore/columnstore/dbcon/execplan/calpontselectexecutionplan.h +++ b/storage/columnstore/columnstore/dbcon/execplan/calpontselectexecutionplan.h @@ -940,5 +940,4 @@ inline std::ostream& operator<<(std::ostream& os, const CalpontSelectExecutionPl } } // namespace execplan -#endif // CALPONTSELECTEXECUTIONPLAN_H -// vim:ts=4 sw=4: +#endif // CALPONTSELECTEXECUTIONPLAN_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/execplan/calpontsystemcatalog.h b/storage/columnstore/columnstore/dbcon/execplan/calpontsystemcatalog.h index 5be4b023..56322f3d 100644 --- a/storage/columnstore/columnstore/dbcon/execplan/calpontsystemcatalog.h +++ b/storage/columnstore/columnstore/dbcon/execplan/calpontsystemcatalog.h @@ -1284,5 +1284,4 @@ bool ctListSort(const CalpontSystemCatalog::ColType& a, const CalpontSystemCatal } // namespace execplan -#endif // EXECPLAN_CALPONTSYSTEMCATALOG_H -// vim:ts=4 sw=4: +#endif // EXECPLAN_CALPONTSYSTEMCATALOG_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/execplan/clientrotator.cpp b/storage/columnstore/columnstore/dbcon/execplan/clientrotator.cpp index 7616f90e..395d7648 100644 --- a/storage/columnstore/columnstore/dbcon/execplan/clientrotator.cpp +++ b/storage/columnstore/columnstore/dbcon/execplan/clientrotator.cpp @@ -399,4 +399,3 @@ void ClientRotator::writeToLog(int line, const string& msg, bool critical) const } } // namespace execplan -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/execplan/clientrotator.h b/storage/columnstore/columnstore/dbcon/execplan/clientrotator.h index f0be4ff7..3ce8e97e 100644 --- a/storage/columnstore/columnstore/dbcon/execplan/clientrotator.h +++ b/storage/columnstore/columnstore/dbcon/execplan/clientrotator.h @@ -167,5 +167,4 @@ class ClientRotator }; } // namespace execplan -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/execplan/constantcolumn.cpp b/storage/columnstore/columnstore/dbcon/execplan/constantcolumn.cpp index a3094285..bcdc6767 100644 --- a/storage/columnstore/columnstore/dbcon/execplan/constantcolumn.cpp +++ b/storage/columnstore/columnstore/dbcon/execplan/constantcolumn.cpp @@ -347,4 +347,3 @@ bool ConstantColumn::operator!=(const TreeNode* t) const } } // namespace execplan -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/execplan/constantfilter.cpp b/storage/columnstore/columnstore/dbcon/execplan/constantfilter.cpp index 4f837d0a..18f872e0 100644 --- a/storage/columnstore/columnstore/dbcon/execplan/constantfilter.cpp +++ b/storage/columnstore/columnstore/dbcon/execplan/constantfilter.cpp @@ -308,4 +308,3 @@ void ConstantFilter::setSimpleColumnList() } } // namespace execplan -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/execplan/sessionmanager.h b/storage/columnstore/columnstore/dbcon/execplan/sessionmanager.h index 71076c26..9014a703 100644 --- a/storage/columnstore/columnstore/dbcon/execplan/sessionmanager.h +++ b/storage/columnstore/columnstore/dbcon/execplan/sessionmanager.h @@ -69,7 +69,7 @@ namespace execplan * immediately, causing all subsequent references to fail. This only affects * 'leakcheck'. */ -//#define DESTROYSHMSEG +// #define DESTROYSHMSEG class SessionManager { @@ -214,5 +214,4 @@ class SessionManager } // namespace execplan -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/anydatalist.cpp b/storage/columnstore/columnstore/dbcon/joblist/anydatalist.cpp index 4e5df471..da1ae05a 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/anydatalist.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/anydatalist.cpp @@ -170,4 +170,3 @@ std::ostream& omitOidInDL(std::ostream& strm) } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/batchprimitiveprocessor-jl.h b/storage/columnstore/columnstore/dbcon/joblist/batchprimitiveprocessor-jl.h index 46c8a583..577a16d3 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/batchprimitiveprocessor-jl.h +++ b/storage/columnstore/columnstore/dbcon/joblist/batchprimitiveprocessor-jl.h @@ -44,7 +44,7 @@ #include "brm.h" #include "command-jl.h" #include "resourcemanager.h" -//#include "tableband.h" +// #include "tableband.h" namespace joblist { @@ -367,5 +367,4 @@ class BatchPrimitiveProcessorJL } // namespace joblist -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/columncommand-jl.h b/storage/columnstore/columnstore/dbcon/joblist/columncommand-jl.h index e0001902..2ac982cc 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/columncommand-jl.h +++ b/storage/columnstore/columnstore/dbcon/joblist/columncommand-jl.h @@ -130,5 +130,4 @@ class ColumnCommandJL : public CommandJL } // namespace joblist -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.cpp b/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.cpp index e0475c11..d03f21e0 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.cpp @@ -828,4 +828,3 @@ void CrossEngineStep::formatMiniStats() } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.h b/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.h index 71c7386f..23f3315c 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.h +++ b/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.h @@ -250,6 +250,4 @@ class CrossEngineStep : public BatchPrimitive, public TupleDeliveryStep } // namespace joblist -#endif // JOBLIST_CROSSENGINESTEP_H - -// vim:ts=4 sw=4: +#endif // JOBLIST_CROSSENGINESTEP_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/diskjoinstep.cpp b/storage/columnstore/columnstore/dbcon/joblist/diskjoinstep.cpp index 87be2166..2f69f962 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/diskjoinstep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/diskjoinstep.cpp @@ -163,7 +163,7 @@ void DiskJoinStep::smallReader() RGData rgData; bool more = true; int64_t memUsage = 0, combinedMemUsage = 0; - int rowCount = 0; + [[maybe_unused]] int rowCount = 0; RowGroup l_smallRG = smallRG; try @@ -224,7 +224,7 @@ void DiskJoinStep::largeReader() RGData rgData; bool more = true; int64_t largeSize = 0; - int rowCount = 0; + [[maybe_unused]] int rowCount = 0; RowGroup l_largeRG = largeRG; largeIterationCount++; diff --git a/storage/columnstore/columnstore/dbcon/joblist/distributedenginecomm.cpp b/storage/columnstore/columnstore/dbcon/joblist/distributedenginecomm.cpp index ced9bf81..4e735e58 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/distributedenginecomm.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/distributedenginecomm.cpp @@ -1150,4 +1150,3 @@ uint32_t DistributedEngineComm::MQE::getNextConnectionId(const size_t pmIndex, } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/elementtype.h b/storage/columnstore/columnstore/dbcon/joblist/elementtype.h index 0d1f6ed7..0b38d93e 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/elementtype.h +++ b/storage/columnstore/columnstore/dbcon/joblist/elementtype.h @@ -245,14 +245,14 @@ extern std::ostream& operator<<(std::ostream& out, const TupleType& rhs); #ifndef NO_DATALISTS -//#include "bandeddl.h" -//#include "wsdl.h" +// #include "bandeddl.h" +// #include "wsdl.h" #include "fifo.h" -//#include "bucketdl.h" -//#include "constantdatalist.h" -//#include "swsdl.h" -//#include "zdl.h" -//#include "deliverywsdl.h" +// #include "bucketdl.h" +// #include "constantdatalist.h" +// #include "swsdl.h" +// #include "zdl.h" +// #include "deliverywsdl.h" namespace joblist { @@ -639,5 +639,4 @@ extern std::ostream& omitOidInDL(std::ostream& strm); #endif -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/errorinfo.h b/storage/columnstore/columnstore/dbcon/joblist/errorinfo.h index 710cb89c..a709a938 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/errorinfo.h +++ b/storage/columnstore/columnstore/dbcon/joblist/errorinfo.h @@ -53,5 +53,4 @@ typedef boost::shared_ptr SErrorInfo; } // namespace joblist -#endif // JOBLIST_ERROR_INFO_H_ -// vim:ts=4 sw=4: +#endif // JOBLIST_ERROR_INFO_H_ \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/expressionstep.cpp b/storage/columnstore/columnstore/dbcon/joblist/expressionstep.cpp index 2f5b96af..b182c7b2 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/expressionstep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/expressionstep.cpp @@ -790,4 +790,3 @@ const string ExpressionStep::toString() const } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/fifo.h b/storage/columnstore/columnstore/dbcon/joblist/fifo.h index 62bf8935..025e9f63 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/fifo.h +++ b/storage/columnstore/columnstore/dbcon/joblist/fifo.h @@ -530,5 +530,4 @@ void FIFO::totalFileCounts(uint64_t& numFiles, uint64_t& numBytes) co } // namespace joblist -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/groupconcat.cpp b/storage/columnstore/columnstore/dbcon/joblist/groupconcat.cpp index 5eb0e1b1..f9a64645 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/groupconcat.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/groupconcat.cpp @@ -1050,4 +1050,3 @@ const string GroupConcatNoOrder::toString() const } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/jlf_common.cpp b/storage/columnstore/columnstore/dbcon/joblist/jlf_common.cpp index 6ae8724e..47a1ecc6 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/jlf_common.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/jlf_common.cpp @@ -822,4 +822,3 @@ bool compatibleColumnTypes(const CalpontSystemCatalog::ColDataType& dt1, uint32_ } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/jlf_execplantojoblist.cpp b/storage/columnstore/columnstore/dbcon/joblist/jlf_execplantojoblist.cpp index 4ba29aa5..441ee1ea 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/jlf_execplantojoblist.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/jlf_execplantojoblist.cpp @@ -3446,7 +3446,6 @@ void JLF_ExecPlanToJobList::addJobSteps(JobStepVector& nsv, JobInfo& jobInfo, bo } } // namespace joblist -// vim:ts=4 sw=4: #ifdef __clang__ #pragma clang diagnostic pop diff --git a/storage/columnstore/columnstore/dbcon/joblist/jlf_graphics.cpp b/storage/columnstore/columnstore/dbcon/joblist/jlf_graphics.cpp index 7365e1c4..348fb85d 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/jlf_graphics.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/jlf_graphics.cpp @@ -418,7 +418,6 @@ ostream& writeDotCmds(ostream& dotFile, const JobStepVector& query, const JobSte } // end namespace jlf_graphics -// vim:ts=4 sw=4 syntax=cpp: #ifdef __clang__ #pragma clang diagnostic pop diff --git a/storage/columnstore/columnstore/dbcon/joblist/jlf_subquery.cpp b/storage/columnstore/columnstore/dbcon/joblist/jlf_subquery.cpp index 91d8a5de..0ea66ac0 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/jlf_subquery.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/jlf_subquery.cpp @@ -875,4 +875,3 @@ SJSTEP doUnionSub(CalpontExecutionPlan* ep, JobInfo& jobInfo) } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/jlf_tuplejoblist.cpp b/storage/columnstore/columnstore/dbcon/joblist/jlf_tuplejoblist.cpp index 7678d278..d388ce9f 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/jlf_tuplejoblist.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/jlf_tuplejoblist.cpp @@ -4559,7 +4559,6 @@ SJSTEP unionQueries(JobStepVector& queries, uint64_t distinctUnionNum, JobInfo& } } // namespace joblist -// vim:ts=4 sw=4: #ifdef __clang__ #pragma clang diagnostic pop diff --git a/storage/columnstore/columnstore/dbcon/joblist/joblist.cpp b/storage/columnstore/columnstore/dbcon/joblist/joblist.cpp index fd58bde0..7adc6a98 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/joblist.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/joblist.cpp @@ -1233,4 +1233,3 @@ void TupleJobList::abort() #pragma clang diagnostic pop #endif -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/joblist.h b/storage/columnstore/columnstore/dbcon/joblist/joblist.h index 61f498a2..4c6eb19e 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/joblist.h +++ b/storage/columnstore/columnstore/dbcon/joblist/joblist.h @@ -261,5 +261,4 @@ typedef boost::shared_ptr STJLP; #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/joblistfactory.cpp b/storage/columnstore/columnstore/dbcon/joblist/joblistfactory.cpp index 648b6f1c..26809d39 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/joblistfactory.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/joblistfactory.cpp @@ -2314,7 +2314,6 @@ SJLP JobListFactory::makeJobList(CalpontExecutionPlan* cplan, ResourceManager* r } } // namespace joblist -// vim:ts=4 sw=4: #ifdef __clang__ #pragma clang diagnostic pop diff --git a/storage/columnstore/columnstore/dbcon/joblist/jobstep.cpp b/storage/columnstore/columnstore/dbcon/joblist/jobstep.cpp index 36d13f35..8f42dff1 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/jobstep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/jobstep.cpp @@ -244,4 +244,3 @@ void JobStep::handleException(std::exception_ptr e, const int errorCode, const u } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/jobstep.h b/storage/columnstore/columnstore/dbcon/joblist/jobstep.h index e3c669cf..47371eb1 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/jobstep.h +++ b/storage/columnstore/columnstore/dbcon/joblist/jobstep.h @@ -567,5 +567,4 @@ typedef boost::shared_ptr SJSTEP; } // namespace joblist -#endif // JOBLIST_JOBSTEP_H_ -// vim:ts=4 sw=4: +#endif // JOBLIST_JOBSTEP_H_ \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/lbidlist.cpp b/storage/columnstore/columnstore/dbcon/joblist/lbidlist.cpp index 26080f0c..e784eb26 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/lbidlist.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/lbidlist.cpp @@ -920,4 +920,3 @@ template bool LBIDList::checkRangeOverlap(int64_t min, int64_t max, int } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/limitedorderby.cpp b/storage/columnstore/columnstore/dbcon/joblist/limitedorderby.cpp index 3aee6fc0..f4e573bd 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/limitedorderby.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/limitedorderby.cpp @@ -303,4 +303,3 @@ const string LimitedOrderBy::toString() const } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/passthrucommand-jl.cpp b/storage/columnstore/columnstore/dbcon/joblist/passthrucommand-jl.cpp index b512e37b..84e63f9c 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/passthrucommand-jl.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/passthrucommand-jl.cpp @@ -110,4 +110,3 @@ uint16_t PassThruCommandJL::getWidth() } }; // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/pcolscan.cpp b/storage/columnstore/columnstore/dbcon/joblist/pcolscan.cpp index aa6fd57b..2a3e64fb 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/pcolscan.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/pcolscan.cpp @@ -472,4 +472,3 @@ void pColScanStep::appendFilter(const std::vector& fs) } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/pcolstep.cpp b/storage/columnstore/columnstore/dbcon/joblist/pcolstep.cpp index fe9a6d5c..3a314a7d 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/pcolstep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/pcolstep.cpp @@ -616,4 +616,3 @@ void pColStep::appendFilter(const std::vector& fs) } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/pdictionaryscan.cpp b/storage/columnstore/columnstore/dbcon/joblist/pdictionaryscan.cpp index 08b65a70..910f0a8b 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/pdictionaryscan.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/pdictionaryscan.cpp @@ -929,4 +929,3 @@ uint16_t pDictionaryScan::planFlagsToPrimFlags(uint32_t planFlags) } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/primitivemsg.h b/storage/columnstore/columnstore/dbcon/joblist/primitivemsg.h index 3d467a8e..216182c9 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/primitivemsg.h +++ b/storage/columnstore/columnstore/dbcon/joblist/primitivemsg.h @@ -885,5 +885,4 @@ struct LbidAtVer #pragma pack(pop) -#endif // JOBLIST_PRIMITIVE_H -// vim:ts=4 sw=4: +#endif // JOBLIST_PRIMITIVE_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/primitivestep.h b/storage/columnstore/columnstore/dbcon/joblist/primitivestep.h index d20ef5a1..e25b3899 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/primitivestep.h +++ b/storage/columnstore/columnstore/dbcon/joblist/primitivestep.h @@ -111,18 +111,24 @@ class pColStep : public JobStep pColStep(const PassThruStep& rhs); - virtual ~pColStep(){} + virtual ~pColStep() + { + } /** @brief Starts processing. Set at least the RID list before calling. * * Starts processing. Set at least the RID list before calling this. */ - virtual void run(){} + virtual void run() + { + } /** @brief Sync's the caller with the end of execution. * * Does nothing. Returns when this instance is finished. */ - virtual void join(){} + virtual void join() + { + } virtual const std::string toString() const; @@ -347,19 +353,25 @@ class pColScanStep : public JobStep const execplan::CalpontSystemCatalog::ColType& ct, const JobInfo& jobInfo); pColScanStep(const pColStep& rhs); - ~pColScanStep(){} + ~pColScanStep() + { + } /** @brief Starts processing. * * Starts processing. */ - virtual void run(){} + virtual void run() + { + } /** @brief Sync's the caller with the end of execution. * * Does nothing. Returns when this instance is finished. */ - virtual void join(){} + virtual void join() + { + } virtual bool isDictCol() const { @@ -549,12 +561,18 @@ class pDictionaryStep : public JobStep pDictionaryStep(execplan::CalpontSystemCatalog::OID oid, execplan::CalpontSystemCatalog::OID tabelOid, const execplan::CalpontSystemCatalog::ColType& ct, const JobInfo& jobInfo); - virtual ~pDictionaryStep(){} + virtual ~pDictionaryStep() + { + } /** @brief virtual void Run method */ - virtual void run(){} - virtual void join(){} + virtual void run() + { + } + virtual void join() + { + } // void setOutList(StringDataList* rids); void setInputList(DataList_t* rids) { @@ -1506,7 +1524,7 @@ class FilterStep : public JobStep protected: // void unblockDataLists(FifoDataList* fifo, StringFifoDataList* strFifo, StrDataList* strResult, - //DataList_t* result); + // DataList_t* result); private: // This i/f is not meaningful in this step @@ -1676,5 +1694,4 @@ class PseudoColStep : public pColStep } // namespace joblist -#endif // JOBLIST_PRIMITIVESTEP_H -// vim:ts=4 sw=4: +#endif // JOBLIST_PRIMITIVESTEP_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/rowestimator.cpp b/storage/columnstore/columnstore/dbcon/joblist/rowestimator.cpp index 9babae7c..fa7e8920 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/rowestimator.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/rowestimator.cpp @@ -269,8 +269,8 @@ float RowEstimator::estimateRowReturnFactor(const BRM::EMEntry& emEntry, const m float tempFactor = 1.0; uint64_t adjustedMin = 0, adjustedMax = 0; - uint128_t adjustedBigMin, adjustedBigMax; - uint32_t distinctValuesEstimate; + uint128_t adjustedBigMin = 0, adjustedBigMax = 0; + uint32_t distinctValuesEstimate = 0; // Adjust values based on column type and estimate the if (!ct.isWideDecimalType()) diff --git a/storage/columnstore/columnstore/dbcon/joblist/subquerystep.cpp b/storage/columnstore/columnstore/dbcon/joblist/subquerystep.cpp index a019c24f..fbc46912 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/subquerystep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/subquerystep.cpp @@ -533,4 +533,3 @@ void SubAdapterStep::formatMiniStats() } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/subquerystep.h b/storage/columnstore/columnstore/dbcon/joblist/subquerystep.h index fb0eca13..e7a10f57 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/subquerystep.h +++ b/storage/columnstore/columnstore/dbcon/joblist/subquerystep.h @@ -274,5 +274,4 @@ class SubAdapterStep : public JobStep, public TupleDeliveryStep } // namespace joblist -#endif // SUBQUERY_STEP_H -// vim:ts=4 sw=4: +#endif // SUBQUERY_STEP_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/subquerytransformer.cpp b/storage/columnstore/columnstore/dbcon/joblist/subquerytransformer.cpp index 816b6aa7..48f1cc2d 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/subquerytransformer.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/subquerytransformer.cpp @@ -622,4 +622,3 @@ void SimpleScalarTransformer::getScalarResult() } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/tuple-bps.cpp b/storage/columnstore/columnstore/dbcon/joblist/tuple-bps.cpp index f9a6d736..c730e494 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tuple-bps.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/tuple-bps.cpp @@ -3334,4 +3334,3 @@ template bool TupleBPS::compareSingleValue(uint8_t COP, int64_t val1, i template bool TupleBPS::compareSingleValue(uint8_t COP, int128_t val1, int128_t val2) const; } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.cpp b/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.cpp index 3f06ed1c..16ce5611 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.cpp @@ -5962,4 +5962,3 @@ void TupleAggregateStep::formatMiniStats() } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.h b/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.h index 95d6ee42..f15c87bc 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.h +++ b/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.h @@ -225,6 +225,4 @@ class TupleAggregateStep : public JobStep, public TupleDeliveryStep } // namespace joblist -#endif // JOBLIST_TUPLEAGGREGATESTEP_H - -// vim:ts=4 sw=4: +#endif // JOBLIST_TUPLEAGGREGATESTEP_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.cpp b/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.cpp index f6a7d70c..b93e4137 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.cpp @@ -1258,4 +1258,3 @@ void TupleAnnexStep::formatMiniStats() } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.h b/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.h index 96cc0064..fa761262 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.h +++ b/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.h @@ -194,6 +194,4 @@ class reservablePQ : private std::priority_queue } // namespace joblist -#endif // JOBLIST_TUPLEANNEXSTEP_H - -// vim:ts=4 sw=4: +#endif // JOBLIST_TUPLEANNEXSTEP_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.cpp b/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.cpp index ee252ec0..065b087d 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.cpp @@ -842,4 +842,3 @@ const string TupleConstantBooleanStep::toString() const } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.h b/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.h index 0aca68ff..e1bd3b93 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.h +++ b/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.h @@ -190,6 +190,4 @@ class TupleConstantBooleanStep : public TupleConstantStep } // namespace joblist -#endif // JOBLIST_TUPLECONSTANTSTEP_H - -// vim:ts=4 sw=4: +#endif // JOBLIST_TUPLECONSTANTSTEP_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.cpp b/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.cpp index 8625723e..0b646b46 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.cpp @@ -2017,4 +2017,3 @@ void TupleHashJoinStep::abort() } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.h b/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.h index 8531cfd7..45ee8729 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.h +++ b/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.h @@ -653,5 +653,4 @@ class TupleHashJoinStep : public JobStep, public TupleDeliveryStep } // namespace joblist -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.cpp b/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.cpp index 701e77b3..60496895 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.cpp @@ -408,4 +408,3 @@ void TupleHavingStep::formatMiniStats() } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.h b/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.h index 068f3d35..eae7ae0c 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.h +++ b/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.h @@ -117,5 +117,3 @@ class TupleHavingStep : public ExpressionStep, public TupleDeliveryStep } // namespace joblist #endif // JOBLIST_TUPLEHAVINGSTEP_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/virtualtable.cpp b/storage/columnstore/columnstore/dbcon/joblist/virtualtable.cpp index dc9bf275..8fe1ec67 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/virtualtable.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/virtualtable.cpp @@ -158,4 +158,3 @@ const CalpontSystemCatalog::ColType& VirtualTable::columnType(uint32_t i) const } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.cpp b/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.cpp index 1ab8d398..ab7b8ca8 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.cpp +++ b/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.cpp @@ -1599,4 +1599,3 @@ void WindowFunctionStep::formatMiniStats() } } // namespace joblist -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.h b/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.h index e2f03eb4..fb5597e7 100644 --- a/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.h +++ b/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.h @@ -226,6 +226,4 @@ class WindowFunctionStep : public JobStep, public TupleDeliveryStep } // namespace joblist -#endif // JOBLIST_WINDOWFUNCTIONSTEP_H - -// vim:ts=4 sw=4: +#endif // JOBLIST_WINDOWFUNCTIONSTEP_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/mysql/ha_autoi.cpp b/storage/columnstore/columnstore/dbcon/mysql/ha_autoi.cpp index ddfbcdc2..4b9a2ae3 100644 --- a/storage/columnstore/columnstore/dbcon/mysql/ha_autoi.cpp +++ b/storage/columnstore/columnstore/dbcon/mysql/ha_autoi.cpp @@ -176,4 +176,3 @@ bool parseAutoincrementColumnComment(std::string comment, uint64_t& startValue) return autoincrement; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_datatype.h b/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_datatype.h index 2f9e625d..b0fd54a6 100644 --- a/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_datatype.h +++ b/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_datatype.h @@ -842,6 +842,4 @@ class WriteBatchFieldMariaDB : public WriteBatchField } // end of namespace datatypes -#endif - -// vim:ts=2 sw=2: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_ddl.cpp b/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_ddl.cpp index 2d18688f..305b8e07 100644 --- a/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_ddl.cpp +++ b/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_ddl.cpp @@ -2810,4 +2810,3 @@ extern "C" } } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_dml.cpp b/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_dml.cpp index bd142382..a3f97db7 100644 --- a/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_dml.cpp +++ b/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_dml.cpp @@ -1001,4 +1001,3 @@ int ha_mcs_impl_close_connection_(handlerton* hton, THD* thd, cal_connection_inf return rc; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_execplan.cpp b/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_execplan.cpp index 55f6de40..798e5af8 100644 --- a/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_execplan.cpp +++ b/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_execplan.cpp @@ -10481,4 +10481,3 @@ int getGroupPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, SCSEP& csep, cal_gro } } // namespace cal_impl_if -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/mysql/ha_pseudocolumn.cpp b/storage/columnstore/columnstore/dbcon/mysql/ha_pseudocolumn.cpp index 5b1010e8..48811328 100644 --- a/storage/columnstore/columnstore/dbcon/mysql/ha_pseudocolumn.cpp +++ b/storage/columnstore/columnstore/dbcon/mysql/ha_pseudocolumn.cpp @@ -584,4 +584,3 @@ execplan::ReturnedColumn* buildPseudoColumn(Item* item, gp_walk_info& gwi, bool& } } // namespace cal_impl_if -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dbcon/mysql/idb_mysql.h b/storage/columnstore/columnstore/dbcon/mysql/idb_mysql.h index bc966ffc..06911c6c 100644 --- a/storage/columnstore/columnstore/dbcon/mysql/idb_mysql.h +++ b/storage/columnstore/columnstore/dbcon/mysql/idb_mysql.h @@ -33,8 +33,8 @@ bool isnan(T); #endif #endif -//#define INFINIDB_DEBUG -//#define DEBUG_WALK_COND +// #define INFINIDB_DEBUG +// #define DEBUG_WALK_COND #define MYSQL_SERVER 1 // needed for definition of struct THD in mysql_priv.h #define USE_CALPONT_REGEX @@ -119,5 +119,4 @@ inline char* idb_mysql_query_str(THD* thd) } } // namespace -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/ddlproc/ddlproc.cpp b/storage/columnstore/columnstore/ddlproc/ddlproc.cpp index e479fbf4..f203f85d 100644 --- a/storage/columnstore/columnstore/ddlproc/ddlproc.cpp +++ b/storage/columnstore/columnstore/ddlproc/ddlproc.cpp @@ -248,4 +248,3 @@ int main(int argc, char** argv) return ServiceDDLProc(opt).Run(); } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/ddlproc/ddlprocessor.cpp b/storage/columnstore/columnstore/ddlproc/ddlprocessor.cpp index eb6f3d09..cca42af1 100644 --- a/storage/columnstore/columnstore/ddlproc/ddlprocessor.cpp +++ b/storage/columnstore/columnstore/ddlproc/ddlprocessor.cpp @@ -876,4 +876,3 @@ int DDLProcessor::commitTransaction(uint32_t txnID, std::string& errorMsg) return rc; } } // namespace ddlprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.cpp b/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.cpp index 1a61e1eb..48307417 100644 --- a/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.cpp +++ b/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.cpp @@ -547,4 +547,3 @@ void BatchInsertProc::getError(int& errorCode, std::string& errMsg) errMsg = fErrMsg; } } // namespace dmlprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.h b/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.h index c7cccb1d..f889c89c 100644 --- a/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.h +++ b/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.h @@ -94,5 +94,4 @@ class BatchInsertProc }; } // namespace dmlprocessor -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/dmlproc/dmlproc.cpp b/storage/columnstore/columnstore/dmlproc/dmlproc.cpp index f1fa9cc4..fb79ae59 100644 --- a/storage/columnstore/columnstore/dmlproc/dmlproc.cpp +++ b/storage/columnstore/columnstore/dmlproc/dmlproc.cpp @@ -639,14 +639,7 @@ int ServiceDMLProc::Child() // Couldn't check the return code b/c // fuser returns 1 for unused port. -#if defined(__GNUC__) && __GNUC__ >= 5 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-result" - (void)::system(cmd.c_str()); -#pragma GCC diagnostic pop -#else - (void)::system(cmd.c_str()); -#endif + std::ignore = ::system(cmd.c_str()); } catch (...) { @@ -698,4 +691,3 @@ int main(int argc, char** argv) return ServiceDMLProc(opt).Run(); } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dmlproc/dmlprocessor.cpp b/storage/columnstore/columnstore/dmlproc/dmlprocessor.cpp index 33e9b3d1..0cc5337a 100644 --- a/storage/columnstore/columnstore/dmlproc/dmlprocessor.cpp +++ b/storage/columnstore/columnstore/dmlproc/dmlprocessor.cpp @@ -2001,4 +2001,3 @@ void DMLProcessor::log(const std::string& msg, logging::LOG_TYPE level) } } // namespace dmlprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/dmlproc/dmlprocessor.h b/storage/columnstore/columnstore/dmlproc/dmlprocessor.h index b1863600..35465cda 100644 --- a/storage/columnstore/columnstore/dmlproc/dmlprocessor.h +++ b/storage/columnstore/columnstore/dmlproc/dmlprocessor.h @@ -331,5 +331,4 @@ class RollbackTransactionProcessor : public dmlpackageprocessor::DMLPackageProce } // namespace dmlprocessor -#endif // DMLPROCESSOR_H -// vim:ts=4 sw=4: +#endif // DMLPROCESSOR_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/exemgr/activestatementcounter.cpp b/storage/columnstore/columnstore/exemgr/activestatementcounter.cpp index 27a3df1d..b25e6154 100644 --- a/storage/columnstore/columnstore/exemgr/activestatementcounter.cpp +++ b/storage/columnstore/columnstore/exemgr/activestatementcounter.cpp @@ -57,4 +57,3 @@ void ActiveStatementCounter::decr(bool& counted) --fStatementCount; condvar.notify_one(); } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/exemgr/activestatementcounter.h b/storage/columnstore/columnstore/exemgr/activestatementcounter.h index e8e75c58..fbbf953c 100644 --- a/storage/columnstore/columnstore/exemgr/activestatementcounter.h +++ b/storage/columnstore/columnstore/exemgr/activestatementcounter.h @@ -63,5 +63,4 @@ class ActiveStatementCounter BRM::VSS fVss; }; -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/exemgr/main.cpp b/storage/columnstore/columnstore/exemgr/main.cpp index 513cc075..abb0991c 100644 --- a/storage/columnstore/columnstore/exemgr/main.cpp +++ b/storage/columnstore/columnstore/exemgr/main.cpp @@ -1825,4 +1825,3 @@ int main(int argc, char* argv[]) return ServiceExeMgr(opt).Run(); } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.cpp b/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.cpp index d33ac883..47153584 100644 --- a/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.cpp +++ b/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.cpp @@ -1063,4 +1063,3 @@ std::string Oam::itoa(const int i) return ss.str(); } } // namespace oam -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.h b/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.h index 504a537d..7e762ff0 100644 --- a/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.h +++ b/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.h @@ -425,5 +425,4 @@ class Oam #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/oamapps/columnstoreDB/columnstoreDB.cpp b/storage/columnstore/columnstore/oamapps/columnstoreDB/columnstoreDB.cpp index f716f9bd..3bdca8b6 100644 --- a/storage/columnstore/columnstore/oamapps/columnstoreDB/columnstoreDB.cpp +++ b/storage/columnstore/columnstore/oamapps/columnstoreDB/columnstoreDB.cpp @@ -271,7 +271,7 @@ int main(int argc, char** argv) Oam oam; BRM::DBRM dbrm; - char c; + signed char c; // Invokes member function `int operator ()(void);' while ((c = getopt(argc, argv, "c:h")) != -1) diff --git a/storage/columnstore/columnstore/oamapps/postConfigure/mycnfUpgrade.cpp b/storage/columnstore/columnstore/oamapps/postConfigure/mycnfUpgrade.cpp index d46bd773..a5b51dec 100644 --- a/storage/columnstore/columnstore/oamapps/postConfigure/mycnfUpgrade.cpp +++ b/storage/columnstore/columnstore/oamapps/postConfigure/mycnfUpgrade.cpp @@ -284,4 +284,3 @@ int main(int argc, char* argv[]) exit(0); } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/oamapps/sessionWalker/sessionwalker.cpp b/storage/columnstore/columnstore/oamapps/sessionWalker/sessionwalker.cpp index 5f096012..06cf08bd 100644 --- a/storage/columnstore/columnstore/oamapps/sessionWalker/sessionwalker.cpp +++ b/storage/columnstore/columnstore/oamapps/sessionWalker/sessionwalker.cpp @@ -133,4 +133,3 @@ int main(int argc, char** argv) return 0; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/primitives/blockcache/blockcacheclient.h b/storage/columnstore/columnstore/primitives/blockcache/blockcacheclient.h index ccdb5b16..c4b06c7b 100644 --- a/storage/columnstore/columnstore/primitives/blockcache/blockcacheclient.h +++ b/storage/columnstore/columnstore/primitives/blockcache/blockcacheclient.h @@ -177,5 +177,4 @@ class blockCacheClient } // namespace dbbc -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/primitives/blockcache/blockrequestprocessor.h b/storage/columnstore/columnstore/primitives/blockcache/blockrequestprocessor.h index edb1479f..3a1de568 100644 --- a/storage/columnstore/columnstore/primitives/blockcache/blockrequestprocessor.h +++ b/storage/columnstore/columnstore/primitives/blockcache/blockrequestprocessor.h @@ -191,5 +191,4 @@ class BlockRequestProcessor }; } // namespace dbbc -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/primitives/blockcache/filerequest.h b/storage/columnstore/columnstore/primitives/blockcache/filerequest.h index 19bd9256..0ede2eef 100644 --- a/storage/columnstore/columnstore/primitives/blockcache/filerequest.h +++ b/storage/columnstore/columnstore/primitives/blockcache/filerequest.h @@ -321,5 +321,4 @@ class fileRequest } // namespace dbbc -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/primitives/blockcache/iomanager.cpp b/storage/columnstore/columnstore/primitives/blockcache/iomanager.cpp index 81eb787c..d8cae6f3 100644 --- a/storage/columnstore/columnstore/primitives/blockcache/iomanager.cpp +++ b/storage/columnstore/columnstore/primitives/blockcache/iomanager.cpp @@ -1442,4 +1442,3 @@ void ioManager::handleBlockReadError(fileRequest* fr, const string& errMsg, bool } } // namespace dbbc -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/primitives/blockcache/iomanager.h b/storage/columnstore/columnstore/primitives/blockcache/iomanager.h index 6cf61569..546675d7 100644 --- a/storage/columnstore/columnstore/primitives/blockcache/iomanager.h +++ b/storage/columnstore/columnstore/primitives/blockcache/iomanager.h @@ -43,7 +43,7 @@ #include "fileblockrequestqueue.h" #include "filebuffermgr.h" -//#define SHARED_NOTHING_DEMO_2 +// #define SHARED_NOTHING_DEMO_2 namespace dbbc { @@ -148,5 +148,4 @@ void dropFDCache(); void purgeFDCache(std::vector& files); } // namespace dbbc -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/primitives/linux-port/column.cpp b/storage/columnstore/columnstore/primitives/linux-port/column.cpp index fb13ffba..f07416a2 100644 --- a/storage/columnstore/columnstore/primitives/linux-port/column.cpp +++ b/storage/columnstore/columnstore/primitives/linux-port/column.cpp @@ -18,7 +18,7 @@ #include #include -//#define NDEBUG +// #define NDEBUG #include #include #include @@ -1636,7 +1636,7 @@ template ::type* = nullptr> // gcc >= 5 #else sizeof(T) == sizeof(int128_t), - T>::type*> // gcc 4.8.5 + T>::type*> // gcc 4.8.5 #endif #else sizeof(T) == sizeof(int128_t), @@ -1672,7 +1672,7 @@ template = 5 typename std::enable_if::type* = nullptr> // gcc >= 5 #else - typename std::enable_if::type*> // gcc 4.8.5 + typename std::enable_if::type*> // gcc 4.8.5 #endif #else typename std::enable_if::type* = nullptr> @@ -1763,5 +1763,4 @@ template void primitives::PrimitiveProcessor::columnScanAndFilter(NewCo template void primitives::PrimitiveProcessor::columnScanAndFilter(NewColRequestHeader*, ColResultHeader*); -} // namespace primitives -// vim:ts=4 sw=4: +} // namespace primitives \ No newline at end of file diff --git a/storage/columnstore/columnstore/primitives/linux-port/dictionary.cpp b/storage/columnstore/columnstore/primitives/linux-port/dictionary.cpp index 2942d4fd..360d8b60 100644 --- a/storage/columnstore/columnstore/primitives/linux-port/dictionary.cpp +++ b/storage/columnstore/columnstore/primitives/linux-port/dictionary.cpp @@ -620,4 +620,3 @@ void PrimitiveProcessor::p_Dictionary(const DictInput* in, vector* out, } } // namespace primitives -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/primitives/linux-port/index.cpp b/storage/columnstore/columnstore/primitives/linux-port/index.cpp index bbfc949e..2d86d35e 100644 --- a/storage/columnstore/columnstore/primitives/linux-port/index.cpp +++ b/storage/columnstore/columnstore/primitives/linux-port/index.cpp @@ -1130,4 +1130,3 @@ void PrimitiveProcessor::p_IdxList(const IndexListHeader* rqst, IndexListHeader* } } // namespace primitives -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/primitives/linux-port/primitiveprocessor.h b/storage/columnstore/columnstore/primitives/linux-port/primitiveprocessor.h index baaf054f..453d41d8 100644 --- a/storage/columnstore/columnstore/primitives/linux-port/primitiveprocessor.h +++ b/storage/columnstore/columnstore/primitives/linux-port/primitiveprocessor.h @@ -563,5 +563,4 @@ boost::shared_ptr _parseColumnFilter( } // namespace primitives -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/primitives/primproc/batchprimitiveprocessor.cpp b/storage/columnstore/columnstore/primitives/primproc/batchprimitiveprocessor.cpp index e16b7ff1..5d898d05 100644 --- a/storage/columnstore/columnstore/primitives/primproc/batchprimitiveprocessor.cpp +++ b/storage/columnstore/columnstore/primitives/primproc/batchprimitiveprocessor.cpp @@ -2806,4 +2806,3 @@ void BatchPrimitiveProcessor::buildVSSCache(uint32_t loopCount) } } // namespace primitiveprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/primitives/primproc/columncommand.cpp b/storage/columnstore/columnstore/primitives/primproc/columncommand.cpp index 16426f49..a7069359 100644 --- a/storage/columnstore/columnstore/primitives/primproc/columncommand.cpp +++ b/storage/columnstore/columnstore/primitives/primproc/columncommand.cpp @@ -1226,4 +1226,3 @@ void ColumnCommandInt128::issuePrimitive() } } // namespace primitiveprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/primitives/primproc/columncommand.h b/storage/columnstore/columnstore/primitives/primproc/columncommand.h index b3ec49d7..c260f23d 100644 --- a/storage/columnstore/columnstore/primitives/primproc/columncommand.h +++ b/storage/columnstore/columnstore/primitives/primproc/columncommand.h @@ -307,5 +307,4 @@ inline void ColumnCommand::fillEmptyBlock(uint } // namespace primitiveprocessor -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/primitives/primproc/primitiveserver.cpp b/storage/columnstore/columnstore/primitives/primproc/primitiveserver.cpp index 99aa7a31..19c1f6a4 100644 --- a/storage/columnstore/columnstore/primitives/primproc/primitiveserver.cpp +++ b/storage/columnstore/columnstore/primitives/primproc/primitiveserver.cpp @@ -2575,4 +2575,3 @@ bool BPPV::aborted() // end workaround } // namespace primitiveprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/primitives/primproc/primproc.cpp b/storage/columnstore/columnstore/primitives/primproc/primproc.cpp index 96ab2088..ce757c32 100644 --- a/storage/columnstore/columnstore/primitives/primproc/primproc.cpp +++ b/storage/columnstore/columnstore/primitives/primproc/primproc.cpp @@ -786,4 +786,3 @@ int main(int argc, char** argv) return ServicePrimProc(opt).Run(); } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/primitives/primproc/udf.cpp b/storage/columnstore/columnstore/primitives/primproc/udf.cpp index 7a836590..188e5128 100644 --- a/storage/columnstore/columnstore/primitives/primproc/udf.cpp +++ b/storage/columnstore/columnstore/primitives/primproc/udf.cpp @@ -69,4 +69,3 @@ void loadUDFs() } } // namespace primitiveprocessor -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/storage-manager/src/smcat.cpp b/storage/columnstore/columnstore/storage-manager/src/smcat.cpp index e931ec8a..48dc5077 100644 --- a/storage/columnstore/columnstore/storage-manager/src/smcat.cpp +++ b/storage/columnstore/columnstore/storage-manager/src/smcat.cpp @@ -94,7 +94,7 @@ void catFileOffline(const char* filename, int prefixlen) void catFileOnline(const char* filename, int prefixlen) { uint8_t data[8192]; - off_t offset = 0; + [[maybe_unused]] off_t offset = 0; int read_err, write_err, count; idbdatafile::SMDataFile df(filename, O_RDONLY, 0); diff --git a/storage/columnstore/columnstore/storage-manager/src/unit_tests.cpp b/storage/columnstore/columnstore/storage-manager/src/unit_tests.cpp index 3d2e7ec2..dc37007a 100644 --- a/storage/columnstore/columnstore/storage-manager/src/unit_tests.cpp +++ b/storage/columnstore/columnstore/storage-manager/src/unit_tests.cpp @@ -1063,10 +1063,10 @@ bool copytask(bool connectionTest = false) copy_cmd* cmd = (copy_cmd*)buf; cmd->opcode = COPY; cmd->file1.flen = strlen(source); - strncpy(cmd->file1.filename, source, cmd->file1.flen); + memcpy(cmd->file1.filename, source, cmd->file1.flen); f_name* file2 = (f_name*)&cmd->file1.filename[cmd->file1.flen]; file2->flen = strlen(dest); - strncpy(file2->filename, dest, file2->flen); + memcpy(file2->filename, dest, file2->flen); uint len = (uint64_t)&file2->filename[file2->flen] - (uint64_t)buf; diff --git a/storage/columnstore/columnstore/tests/primitives_column_scan_and_filter.cpp b/storage/columnstore/columnstore/tests/primitives_column_scan_and_filter.cpp index 70f921b3..eeed651e 100644 --- a/storage/columnstore/columnstore/tests/primitives_column_scan_and_filter.cpp +++ b/storage/columnstore/columnstore/tests/primitives_column_scan_and_filter.cpp @@ -965,4 +965,3 @@ TEST_F(ColumnScanFilterTest, ColumnScan16Bytes2CompFilters) EXPECT_EQ(out->Max, __col16block_cdf_umax); EXPECT_EQ(out->Min, __col16block_cdf_umin); } -// vim:ts=2 sw=2: diff --git a/storage/columnstore/columnstore/tests/primitives_scan_bench.cpp b/storage/columnstore/columnstore/tests/primitives_scan_bench.cpp index 2d6b77c9..c2431b8d 100644 --- a/storage/columnstore/columnstore/tests/primitives_scan_bench.cpp +++ b/storage/columnstore/columnstore/tests/primitives_scan_bench.cpp @@ -427,4 +427,3 @@ BENCHMARK_DEFINE_F(FilterBenchFixture, BM_ColumnScan8Byte1FilterVectorizedCode)( BENCHMARK_REGISTER_F(FilterBenchFixture, BM_ColumnScan8Byte1FilterVectorizedCode); BENCHMARK_MAIN(); -// vim:ts=2 sw=2: diff --git a/storage/columnstore/columnstore/tools/bincvt/li2bin.cpp b/storage/columnstore/columnstore/tools/bincvt/li2bin.cpp index 51b1d8b6..91bf9c4c 100644 --- a/storage/columnstore/columnstore/tools/bincvt/li2bin.cpp +++ b/storage/columnstore/columnstore/tools/bincvt/li2bin.cpp @@ -278,4 +278,3 @@ int main(int argc, char** argv) return 0; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/tools/clearShm/main.cpp b/storage/columnstore/columnstore/tools/clearShm/main.cpp index e37e27db..d31f9a75 100644 --- a/storage/columnstore/columnstore/tools/clearShm/main.cpp +++ b/storage/columnstore/columnstore/tools/clearShm/main.cpp @@ -221,4 +221,3 @@ int main(int argc, char** argv) return 0; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/tools/dbbuilder/dbbuilder.cpp b/storage/columnstore/columnstore/tools/dbbuilder/dbbuilder.cpp index 38b9ffd5..79d2a4be 100644 --- a/storage/columnstore/columnstore/tools/dbbuilder/dbbuilder.cpp +++ b/storage/columnstore/columnstore/tools/dbbuilder/dbbuilder.cpp @@ -324,4 +324,3 @@ int main(int argc, char* argv[]) return 1; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/tools/ddlcleanup/ddlcleanup.cpp b/storage/columnstore/columnstore/tools/ddlcleanup/ddlcleanup.cpp index bbbbac43..6d1ca008 100644 --- a/storage/columnstore/columnstore/tools/ddlcleanup/ddlcleanup.cpp +++ b/storage/columnstore/columnstore/tools/ddlcleanup/ddlcleanup.cpp @@ -80,4 +80,3 @@ int main(int argc, char** argv) return ddlcleanuputil::ddl_cleanup(); } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/tools/editem/editem.cpp b/storage/columnstore/columnstore/tools/editem/editem.cpp index 2dcb6ce8..bce63ed0 100644 --- a/storage/columnstore/columnstore/tools/editem/editem.cpp +++ b/storage/columnstore/columnstore/tools/editem/editem.cpp @@ -1040,4 +1040,3 @@ int main(int argc, char** argv) return 0; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/tools/qfe/server.cpp b/storage/columnstore/columnstore/tools/qfe/server.cpp index 018cf470..7b3276de 100644 --- a/storage/columnstore/columnstore/tools/qfe/server.cpp +++ b/storage/columnstore/columnstore/tools/qfe/server.cpp @@ -513,4 +513,3 @@ int main(int argc, char** argv) return 0; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/tools/sendPlan/sendplan.cpp b/storage/columnstore/columnstore/tools/sendPlan/sendplan.cpp index 5374d867..bd8f4bb4 100644 --- a/storage/columnstore/columnstore/tools/sendPlan/sendplan.cpp +++ b/storage/columnstore/columnstore/tools/sendPlan/sendplan.cpp @@ -390,4 +390,3 @@ int main(int argc, char** argv) return 0; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/tools/setConfig/main.cpp b/storage/columnstore/columnstore/tools/setConfig/main.cpp index 1c536167..7d7fe396 100644 --- a/storage/columnstore/columnstore/tools/setConfig/main.cpp +++ b/storage/columnstore/columnstore/tools/setConfig/main.cpp @@ -148,4 +148,3 @@ int main(int argc, char** argv) return 0; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/cacheutils/cacheutils.cpp b/storage/columnstore/columnstore/utils/cacheutils/cacheutils.cpp index ead2483a..a0042e15 100644 --- a/storage/columnstore/columnstore/utils/cacheutils/cacheutils.cpp +++ b/storage/columnstore/columnstore/utils/cacheutils/cacheutils.cpp @@ -354,4 +354,3 @@ int purgePrimProcFdCache(const std::vector files, const int pmId) } } // namespace cacheutils -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/cacheutils/cacheutils.h b/storage/columnstore/columnstore/utils/cacheutils/cacheutils.h index 13d01ef6..fdc01da7 100644 --- a/storage/columnstore/columnstore/utils/cacheutils/cacheutils.h +++ b/storage/columnstore/columnstore/utils/cacheutils/cacheutils.h @@ -73,6 +73,4 @@ int dropPrimProcFdCache(); int purgePrimProcFdCache(const std::vector files, const int pmId); } // namespace cacheutils -// vim:ts=4 sw=4: - #endif diff --git a/storage/columnstore/columnstore/utils/common/hashfamily.h b/storage/columnstore/columnstore/utils/common/hashfamily.h index 6733beaf..eb40a4df 100644 --- a/storage/columnstore/columnstore/utils/common/hashfamily.h +++ b/storage/columnstore/columnstore/utils/common/hashfamily.h @@ -51,5 +51,4 @@ class HashFamily }; } // namespace utils -#endif -// vim:ts=2 sw=2: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/common/mcs_basic_types.h b/storage/columnstore/columnstore/utils/common/mcs_basic_types.h index 2e1caf32..e19f78a8 100644 --- a/storage/columnstore/columnstore/utils/common/mcs_basic_types.h +++ b/storage/columnstore/columnstore/utils/common/mcs_basic_types.h @@ -22,5 +22,4 @@ using int128_t = __int128; using uint128_t = unsigned __int128; -#endif // MCS_BASIC_TYPES_H_INCLUDED -// vim:ts=2 sw=2: +#endif // MCS_BASIC_TYPES_H_INCLUDED \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/common/simd_sse.h b/storage/columnstore/columnstore/utils/common/simd_sse.h index c7da2ec0..d9873414 100644 --- a/storage/columnstore/columnstore/utils/common/simd_sse.h +++ b/storage/columnstore/columnstore/utils/common/simd_sse.h @@ -892,4 +892,3 @@ class SimdFilterProcessor< } // namespace simd #endif // if defined(__x86_64__ ) -// vim:ts=2 sw=2: diff --git a/storage/columnstore/columnstore/utils/compress/idbcompress.cpp b/storage/columnstore/columnstore/utils/compress/idbcompress.cpp index a0a98387..adc7a9cd 100644 --- a/storage/columnstore/columnstore/utils/compress/idbcompress.cpp +++ b/storage/columnstore/columnstore/utils/compress/idbcompress.cpp @@ -672,4 +672,3 @@ std::shared_ptr getCompressorByType( #endif } // namespace compress -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/configcpp/configcpp.cpp b/storage/columnstore/columnstore/utils/configcpp/configcpp.cpp index a7194ef7..e102a0cb 100644 --- a/storage/columnstore/columnstore/utils/configcpp/configcpp.cpp +++ b/storage/columnstore/columnstore/utils/configcpp/configcpp.cpp @@ -669,4 +669,3 @@ std::string Config::getTempFileDir(Config::TempDirPurpose what) } } // namespace config -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/configcpp/configcpp.h b/storage/columnstore/columnstore/utils/configcpp/configcpp.h index f573f292..35f290e8 100644 --- a/storage/columnstore/columnstore/utils/configcpp/configcpp.h +++ b/storage/columnstore/columnstore/utils/configcpp/configcpp.h @@ -244,5 +244,4 @@ class Config #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/configcpp/configstream.cpp b/storage/columnstore/columnstore/utils/configcpp/configstream.cpp index 059f690e..cfb1a4ac 100644 --- a/storage/columnstore/columnstore/utils/configcpp/configstream.cpp +++ b/storage/columnstore/columnstore/utils/configcpp/configstream.cpp @@ -64,4 +64,3 @@ void ConfigStream::init(const xmlChar* xp) } } // namespace config -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/configcpp/configstream.h b/storage/columnstore/columnstore/utils/configcpp/configstream.h index b42c6506..8c32e31d 100644 --- a/storage/columnstore/columnstore/utils/configcpp/configstream.h +++ b/storage/columnstore/columnstore/utils/configcpp/configstream.h @@ -62,5 +62,4 @@ class ConfigStream } // namespace config -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/configcpp/xmlparser.cpp b/storage/columnstore/columnstore/utils/configcpp/xmlparser.cpp index 03da1f95..37b6bdde 100644 --- a/storage/columnstore/columnstore/utils/configcpp/xmlparser.cpp +++ b/storage/columnstore/columnstore/utils/configcpp/xmlparser.cpp @@ -285,4 +285,3 @@ const vector XMLParser::enumSection(const xmlDocPtr doc, const string& s } } // namespace config -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/configcpp/xmlparser.h b/storage/columnstore/columnstore/utils/configcpp/xmlparser.h index 48467d24..c1804992 100644 --- a/storage/columnstore/columnstore/utils/configcpp/xmlparser.h +++ b/storage/columnstore/columnstore/utils/configcpp/xmlparser.h @@ -64,5 +64,4 @@ class XMLParser } // namespace config -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/dataconvert/dataconvert.cpp b/storage/columnstore/columnstore/utils/dataconvert/dataconvert.cpp index 14195433..37ff38c4 100644 --- a/storage/columnstore/columnstore/utils/dataconvert/dataconvert.cpp +++ b/storage/columnstore/columnstore/utils/dataconvert/dataconvert.cpp @@ -1418,7 +1418,7 @@ boost::any DataConvert::StringToUDecimal(const datatypes::SystemCatalog::TypeAtt { int64_t val64; number_int_value(data, typeCode, colType, pushWarning, prm.noRoundup(), val64); - char ival = (char)val64; + signed char ival = (signed char)val64; if (ival < 0 && ival != static_cast(joblist::TINYINTEMPTYROW) && ival != static_cast(joblist::TINYINTNULL)) @@ -3388,4 +3388,3 @@ void DataConvert::joinColTypeForUnion(datatypes::SystemCatalog::TypeHolderStd& u } } // namespace dataconvert -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.cpp b/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.cpp index a9defdf4..ca196c29 100644 --- a/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.cpp +++ b/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.cpp @@ -270,4 +270,3 @@ int ddl_cleanup() } } // namespace ddlcleanuputil -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.h b/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.h index 7eebdf15..b76052fa 100644 --- a/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.h +++ b/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.h @@ -29,6 +29,4 @@ namespace ddlcleanuputil { int ddl_cleanup(); } -// vim:ts=4 sw=4: - #endif diff --git a/storage/columnstore/columnstore/utils/funcexp/func_abs.cpp b/storage/columnstore/columnstore/utils/funcexp/func_abs.cpp index 64ac5d01..cd05ade7 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_abs.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_abs.cpp @@ -79,4 +79,3 @@ long double Func_abs::getLongDoubleVal(Row& row, FunctionParm& parm, bool& isNul } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_add_time.cpp b/storage/columnstore/columnstore/utils/funcexp/func_add_time.cpp index 5a2506b3..82c173ed 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_add_time.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_add_time.cpp @@ -303,4 +303,3 @@ int64_t Func_add_time::getTimeIntVal(rowgroup::Row& row, FunctionParm& parm, boo } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_ascii.cpp b/storage/columnstore/columnstore/utils/funcexp/func_ascii.cpp index eb93f601..5cf8653d 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_ascii.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_ascii.cpp @@ -56,4 +56,3 @@ int64_t Func_ascii::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& isNu } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_between.cpp b/storage/columnstore/columnstore/utils/funcexp/func_between.cpp index 3ce66eb6..65712363 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_between.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_between.cpp @@ -376,4 +376,3 @@ bool Func_notbetween::getBoolVal(rowgroup::Row& row, FunctionParm& pm, bool& isN } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_bitwise.cpp b/storage/columnstore/columnstore/utils/funcexp/func_bitwise.cpp index c10030b9..998696ae 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_bitwise.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_bitwise.cpp @@ -494,4 +494,3 @@ bool Func_bit_count::fix(execplan::FunctionColumn& col) const } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_case.cpp b/storage/columnstore/columnstore/utils/funcexp/func_case.cpp index e8bfbd0f..fba7691e 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_case.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_case.cpp @@ -723,4 +723,3 @@ int64_t Func_searched_case::getTimeIntVal(rowgroup::Row& row, FunctionParm& parm } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_cast.cpp b/storage/columnstore/columnstore/utils/funcexp/func_cast.cpp index 4b224c6d..ef0e2f51 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_cast.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_cast.cpp @@ -1549,4 +1549,3 @@ double Func_cast_double::getDoubleVal(Row& row, FunctionParm& parm, bool& isNull } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_ceil.cpp b/storage/columnstore/columnstore/utils/funcexp/func_ceil.cpp index dc559a5d..e5c1f872 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_ceil.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_ceil.cpp @@ -598,4 +598,3 @@ IDB_Decimal Func_ceil::getDecimalVal(Row& row, FunctionParm& parm, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_char.cpp b/storage/columnstore/columnstore/utils/funcexp/func_char.cpp index 7ead2b94..0c4adeaf 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_char.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_char.cpp @@ -178,4 +178,3 @@ string Func_char::getStrVal(Row& row, FunctionParm& parm, bool& isNull, CalpontS } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_char_length.cpp b/storage/columnstore/columnstore/utils/funcexp/func_char_length.cpp index 553d5439..5270d1d8 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_char_length.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_char_length.cpp @@ -121,4 +121,3 @@ int64_t Func_char_length::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_coalesce.cpp b/storage/columnstore/columnstore/utils/funcexp/func_coalesce.cpp index ebabde05..bbb5a279 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_coalesce.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_coalesce.cpp @@ -244,4 +244,3 @@ execplan::IDB_Decimal Func_coalesce::getDecimalVal(rowgroup::Row& row, FunctionP } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_concat.cpp b/storage/columnstore/columnstore/utils/funcexp/func_concat.cpp index 73b2a2b2..05835d23 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_concat.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_concat.cpp @@ -65,4 +65,3 @@ string Func_concat::getStrVal(Row& row, FunctionParm& parm, bool& isNull, Calpon } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_concat_oracle.cpp b/storage/columnstore/columnstore/utils/funcexp/func_concat_oracle.cpp index 28713a10..46631e7a 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_concat_oracle.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_concat_oracle.cpp @@ -71,4 +71,3 @@ string Func_concat_oracle::getStrVal(Row& row, FunctionParm& parm, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_concat_ws.cpp b/storage/columnstore/columnstore/utils/funcexp/func_concat_ws.cpp index 2c07c5b0..ea0cf22d 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_concat_ws.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_concat_ws.cpp @@ -121,4 +121,3 @@ string Func_concat_ws::getStrVal(Row& row, FunctionParm& parm, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_conv.cpp b/storage/columnstore/columnstore/utils/funcexp/func_conv.cpp index 5f73f5ea..037ce83e 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_conv.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_conv.cpp @@ -304,4 +304,3 @@ string Func_conv::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& isNull } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_convert_tz.cpp b/storage/columnstore/columnstore/utils/funcexp/func_convert_tz.cpp index 03efdad8..36339279 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_convert_tz.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_convert_tz.cpp @@ -220,4 +220,3 @@ string Func_convert_tz::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_crc32.cpp b/storage/columnstore/columnstore/utils/funcexp/func_crc32.cpp index 8d728c11..e573db87 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_crc32.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_crc32.cpp @@ -64,4 +64,3 @@ int64_t Func_crc32::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& isNu } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_date.cpp b/storage/columnstore/columnstore/utils/funcexp/func_date.cpp index 5544e8b3..b6e554e5 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_date.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_date.cpp @@ -149,4 +149,3 @@ string Func_date::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& isNull } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_date_add.cpp b/storage/columnstore/columnstore/utils/funcexp/func_date_add.cpp index 2e715acc..6cc47fda 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_date_add.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_date_add.cpp @@ -816,4 +816,3 @@ string Func_date_add::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_date_format.cpp b/storage/columnstore/columnstore/utils/funcexp/func_date_format.cpp index 962fc811..8a3ba974 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_date_format.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_date_format.cpp @@ -416,4 +416,3 @@ int64_t Func_date_format::getTimestampIntVal(rowgroup::Row& row, FunctionParm& p } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_day.cpp b/storage/columnstore/columnstore/utils/funcexp/func_day.cpp index bd4a484d..e7954e3d 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_day.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_day.cpp @@ -143,4 +143,3 @@ int64_t Func_day::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& isNull } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_dayname.cpp b/storage/columnstore/columnstore/utils/funcexp/func_dayname.cpp index 07078a25..e8e069db 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_dayname.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_dayname.cpp @@ -179,4 +179,3 @@ string Func_dayname::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& isN } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_dayofweek.cpp b/storage/columnstore/columnstore/utils/funcexp/func_dayofweek.cpp index 441bfeeb..c8fb40ab 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_dayofweek.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_dayofweek.cpp @@ -166,4 +166,3 @@ int64_t Func_dayofweek::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_dayofyear.cpp b/storage/columnstore/columnstore/utils/funcexp/func_dayofyear.cpp index fb9d9742..215ec215 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_dayofyear.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_dayofyear.cpp @@ -160,4 +160,3 @@ int64_t Func_dayofyear::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_div.cpp b/storage/columnstore/columnstore/utils/funcexp/func_div.cpp index 7169992b..d36e75c9 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_div.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_div.cpp @@ -108,4 +108,3 @@ string Func_div::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_elt.cpp b/storage/columnstore/columnstore/utils/funcexp/func_elt.cpp index 22446095..860dd1ae 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_elt.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_elt.cpp @@ -96,4 +96,3 @@ string Func_elt::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_exp.cpp b/storage/columnstore/columnstore/utils/funcexp/func_exp.cpp index bab2fc92..d57b2855 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_exp.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_exp.cpp @@ -110,4 +110,3 @@ long double Func_exp::getLongDoubleVal(Row& row, FunctionParm& parm, bool& isNul } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_extract.cpp b/storage/columnstore/columnstore/utils/funcexp/func_extract.cpp index a6f8d635..b051f267 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_extract.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_extract.cpp @@ -254,4 +254,3 @@ int64_t Func_extract::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_find_in_set.cpp b/storage/columnstore/columnstore/utils/funcexp/func_find_in_set.cpp index 94c1243d..85b0c7e2 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_find_in_set.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_find_in_set.cpp @@ -127,4 +127,3 @@ execplan::IDB_Decimal Func_find_in_set::getDecimalVal(rowgroup::Row& row, Functi } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_floor.cpp b/storage/columnstore/columnstore/utils/funcexp/func_floor.cpp index 7c0dacc8..f497400b 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_floor.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_floor.cpp @@ -555,4 +555,3 @@ IDB_Decimal Func_floor::getDecimalVal(Row& row, FunctionParm& parm, bool& isNull } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_from_days.cpp b/storage/columnstore/columnstore/utils/funcexp/func_from_days.cpp index e9f45b42..a3e964ee 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_from_days.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_from_days.cpp @@ -80,4 +80,3 @@ int64_t Func_from_days::getDatetimeIntVal(rowgroup::Row& row, FunctionParm& parm } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_from_unixtime.cpp b/storage/columnstore/columnstore/utils/funcexp/func_from_unixtime.cpp index cca4083b..b01bfab3 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_from_unixtime.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_from_unixtime.cpp @@ -212,4 +212,3 @@ long double Func_from_unixtime::getLongDoubleVal(rowgroup::Row& row, FunctionPar } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_get_format.cpp b/storage/columnstore/columnstore/utils/funcexp/func_get_format.cpp index d902c087..00f51364 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_get_format.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_get_format.cpp @@ -107,4 +107,3 @@ string Func_get_format::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_greatest.cpp b/storage/columnstore/columnstore/utils/funcexp/func_greatest.cpp index e8562be2..b3dea5be 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_greatest.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_greatest.cpp @@ -240,4 +240,3 @@ int64_t Func_greatest::getTimeIntVal(rowgroup::Row& row, FunctionParm& fp, bool& } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_hex.cpp b/storage/columnstore/columnstore/utils/funcexp/func_hex.cpp index 9e2fa114..c1a111cb 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_hex.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_hex.cpp @@ -140,4 +140,3 @@ string Func_hex::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_hour.cpp b/storage/columnstore/columnstore/utils/funcexp/func_hour.cpp index 7d2da741..0550ef3e 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_hour.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_hour.cpp @@ -156,4 +156,3 @@ int64_t Func_hour::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& isNul } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_idbpartition.cpp b/storage/columnstore/columnstore/utils/funcexp/func_idbpartition.cpp index 3b71cdd9..b7b5e697 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_idbpartition.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_idbpartition.cpp @@ -63,4 +63,3 @@ string Func_idbpartition::getStrVal(Row& row, FunctionParm& parm, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_if.cpp b/storage/columnstore/columnstore/utils/funcexp/func_if.cpp index 98fe8a33..d5941df8 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_if.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_if.cpp @@ -234,4 +234,3 @@ int64_t Func_if::getTimeIntVal(Row& row, FunctionParm& parm, bool& isNull, Calpo } } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_ifnull.cpp b/storage/columnstore/columnstore/utils/funcexp/func_ifnull.cpp index 52dae255..a2450a5a 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_ifnull.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_ifnull.cpp @@ -205,4 +205,3 @@ bool Func_ifnull::getBoolVal(Row& row, FunctionParm& parm, bool& isNull, Calpont } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_in.cpp b/storage/columnstore/columnstore/utils/funcexp/func_in.cpp index 89ed8959..d452fc24 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_in.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_in.cpp @@ -386,4 +386,3 @@ bool Func_notin::getBoolVal(rowgroup::Row& row, FunctionParm& pm, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_insert.cpp b/storage/columnstore/columnstore/utils/funcexp/func_insert.cpp index 236752e9..72fd06e4 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_insert.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_insert.cpp @@ -102,4 +102,3 @@ std::string Func_insert::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& i } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_instr.cpp b/storage/columnstore/columnstore/utils/funcexp/func_instr.cpp index ab0379cc..71eb81d0 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_instr.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_instr.cpp @@ -85,4 +85,3 @@ int64_t Func_instr::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& isNu } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_isnull.cpp b/storage/columnstore/columnstore/utils/funcexp/func_isnull.cpp index 48337b3e..4ff7e643 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_isnull.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_isnull.cpp @@ -79,4 +79,3 @@ bool Func_isnull::getBoolVal(Row& row, FunctionParm& parm, bool& isNull, Calpont } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_last_day.cpp b/storage/columnstore/columnstore/utils/funcexp/func_last_day.cpp index 89f173a7..e74a2d51 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_last_day.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_last_day.cpp @@ -195,4 +195,3 @@ int64_t Func_last_day::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& i } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_lcase.cpp b/storage/columnstore/columnstore/utils/funcexp/func_lcase.cpp index 817e82ae..eabdfd40 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_lcase.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_lcase.cpp @@ -68,4 +68,3 @@ std::string Func_lcase::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_least.cpp b/storage/columnstore/columnstore/utils/funcexp/func_least.cpp index add78cfa..d488b751 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_least.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_least.cpp @@ -218,4 +218,3 @@ int64_t Func_least::getTimeIntVal(rowgroup::Row& row, FunctionParm& fp, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_left.cpp b/storage/columnstore/columnstore/utils/funcexp/func_left.cpp index a90d5f46..de31d177 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_left.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_left.cpp @@ -73,4 +73,3 @@ std::string Func_left::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& isN } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_length.cpp b/storage/columnstore/columnstore/utils/funcexp/func_length.cpp index f63e2f1b..a6f7236f 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_length.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_length.cpp @@ -55,4 +55,3 @@ int64_t Func_length::getIntVal(rowgroup::Row& row, FunctionParm& fp, bool& isNul } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_lpad.cpp b/storage/columnstore/columnstore/utils/funcexp/func_lpad.cpp index 0ad0bdc2..8a5544a6 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_lpad.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_lpad.cpp @@ -127,4 +127,3 @@ std::string Func_lpad::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& isN } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_ltrim.cpp b/storage/columnstore/columnstore/utils/funcexp/func_ltrim.cpp index 39fd7165..3d7e9691 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_ltrim.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_ltrim.cpp @@ -93,4 +93,3 @@ std::string Func_ltrim::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_ltrim_oracle.cpp b/storage/columnstore/columnstore/utils/funcexp/func_ltrim_oracle.cpp index 234808e7..70fc1dc8 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_ltrim_oracle.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_ltrim_oracle.cpp @@ -97,4 +97,3 @@ std::string Func_ltrim_oracle::getStrVal(rowgroup::Row& row, FunctionParm& fp, b } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_makedate.cpp b/storage/columnstore/columnstore/utils/funcexp/func_makedate.cpp index 0418508d..fb49f54c 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_makedate.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_makedate.cpp @@ -190,4 +190,3 @@ string Func_makedate::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_maketime.cpp b/storage/columnstore/columnstore/utils/funcexp/func_maketime.cpp index 6d0a9d90..ad918ccc 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_maketime.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_maketime.cpp @@ -171,4 +171,3 @@ string Func_maketime::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_math.cpp b/storage/columnstore/columnstore/utils/funcexp/func_math.cpp index 7d60ae50..74a12aa7 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_math.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_math.cpp @@ -2276,4 +2276,3 @@ double Func_degrees::getDoubleVal(Row& row, FunctionParm& parm, bool& isNull, Ca } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_md5.cpp b/storage/columnstore/columnstore/utils/funcexp/func_md5.cpp index 6ef058e8..0ce6b0a0 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_md5.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_md5.cpp @@ -512,4 +512,3 @@ string Func_md5::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& isNull, } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_microsecond.cpp b/storage/columnstore/columnstore/utils/funcexp/func_microsecond.cpp index aca1e3ae..8c94647b 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_microsecond.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_microsecond.cpp @@ -137,4 +137,3 @@ int64_t Func_microsecond::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_minute.cpp b/storage/columnstore/columnstore/utils/funcexp/func_minute.cpp index af310c87..8e572454 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_minute.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_minute.cpp @@ -137,4 +137,3 @@ int64_t Func_minute::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& isN } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_mod.cpp b/storage/columnstore/columnstore/utils/funcexp/func_mod.cpp index bf33a649..dff1a4e0 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_mod.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_mod.cpp @@ -531,4 +531,3 @@ std::string Func_mod::getStrVal(Row& row, FunctionParm& fp, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_month.cpp b/storage/columnstore/columnstore/utils/funcexp/func_month.cpp index 50ee3600..ea66abf3 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_month.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_month.cpp @@ -142,4 +142,3 @@ int64_t Func_month::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& isNu } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_monthname.cpp b/storage/columnstore/columnstore/utils/funcexp/func_monthname.cpp index 8ea7c3e3..c674f454 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_monthname.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_monthname.cpp @@ -191,4 +191,3 @@ execplan::IDB_Decimal Func_monthname::getDecimalVal(rowgroup::Row& row, Function } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_nullif.cpp b/storage/columnstore/columnstore/utils/funcexp/func_nullif.cpp index ba4ab740..3821151e 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_nullif.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_nullif.cpp @@ -964,7 +964,7 @@ execplan::IDB_Decimal Func_nullif::getDecimalVal(rowgroup::Row& row, FunctionPar { // strip off micro seconds value = value.substr(0, 14); - int64_t x = atoll(value.c_str()); + x = atoll(value.c_str()); if (s > 5) s = 0; @@ -1022,4 +1022,3 @@ execplan::IDB_Decimal Func_nullif::getDecimalVal(rowgroup::Row& row, FunctionPar } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_period_add.cpp b/storage/columnstore/columnstore/utils/funcexp/func_period_add.cpp index 23b96415..4038651e 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_period_add.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_period_add.cpp @@ -94,4 +94,3 @@ int64_t Func_period_add::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_period_diff.cpp b/storage/columnstore/columnstore/utils/funcexp/func_period_diff.cpp index 470ab60c..080d15a4 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_period_diff.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_period_diff.cpp @@ -113,4 +113,3 @@ int64_t Func_period_diff::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_pow.cpp b/storage/columnstore/columnstore/utils/funcexp/func_pow.cpp index 734b50a2..236e7e2c 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_pow.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_pow.cpp @@ -121,4 +121,3 @@ long double Func_pow::getLongDoubleVal(Row& row, FunctionParm& parm, bool& isNul } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_quarter.cpp b/storage/columnstore/columnstore/utils/funcexp/func_quarter.cpp index 04c4babb..5f1fd003 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_quarter.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_quarter.cpp @@ -139,4 +139,3 @@ int64_t Func_quarter::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_quote.cpp b/storage/columnstore/columnstore/utils/funcexp/func_quote.cpp index 05ce4cec..b82cf7ba 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_quote.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_quote.cpp @@ -80,4 +80,3 @@ std::string Func_quote::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_rand.cpp b/storage/columnstore/columnstore/utils/funcexp/func_rand.cpp index 223949bb..b7da263d 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_rand.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_rand.cpp @@ -98,4 +98,3 @@ double Func_rand::getDoubleVal(rowgroup::Row& row, FunctionParm& parm, bool& isN } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_regexp.cpp b/storage/columnstore/columnstore/utils/funcexp/func_regexp.cpp index cb495c8c..60e1459d 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_regexp.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_regexp.cpp @@ -248,4 +248,3 @@ bool Func_regexp::getBoolVal(rowgroup::Row& row, FunctionParm& pm, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_repeat.cpp b/storage/columnstore/columnstore/utils/funcexp/func_repeat.cpp index 6b0e6ace..ebbfc355 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_repeat.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_repeat.cpp @@ -90,4 +90,3 @@ std::string Func_repeat::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& i } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_replace.cpp b/storage/columnstore/columnstore/utils/funcexp/func_replace.cpp index 05e0fe35..da18fb3f 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_replace.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_replace.cpp @@ -173,4 +173,3 @@ std::string Func_replace::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_replace_oracle.cpp b/storage/columnstore/columnstore/utils/funcexp/func_replace_oracle.cpp index b8eb7f6e..113b49d9 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_replace_oracle.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_replace_oracle.cpp @@ -167,4 +167,3 @@ std::string Func_replace_oracle::getStrVal(rowgroup::Row& row, FunctionParm& fp, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_reverse.cpp b/storage/columnstore/columnstore/utils/funcexp/func_reverse.cpp index 2b383ee7..db57d095 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_reverse.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_reverse.cpp @@ -93,4 +93,3 @@ std::string Func_reverse::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_right.cpp b/storage/columnstore/columnstore/utils/funcexp/func_right.cpp index 4615256e..2c1ec612 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_right.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_right.cpp @@ -73,4 +73,3 @@ std::string Func_right::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_round.cpp b/storage/columnstore/columnstore/utils/funcexp/func_round.cpp index 16855324..c6e67336 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_round.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_round.cpp @@ -645,7 +645,7 @@ string Func_round::getStrVal(Row& row, FunctionParm& parm, bool& isNull, Calpont { IDB_Decimal x = getDecimalVal(row, parm, isNull, op_ct); int64_t e = (x.scale < 0) ? (-x.scale) : x.scale; - int64_t p = 1; + [[maybe_unused]] int64_t p = 1; while (e-- > 0) p *= 10; @@ -716,4 +716,3 @@ int64_t Func_round::getTimestampIntVal(rowgroup::Row& row, FunctionParm& parm, b } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_rpad.cpp b/storage/columnstore/columnstore/utils/funcexp/func_rpad.cpp index fba47bfa..a2a538ff 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_rpad.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_rpad.cpp @@ -127,4 +127,3 @@ std::string Func_rpad::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& isN } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_rtrim.cpp b/storage/columnstore/columnstore/utils/funcexp/func_rtrim.cpp index 426ec871..ee61906b 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_rtrim.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_rtrim.cpp @@ -157,4 +157,3 @@ std::string Func_rtrim::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_rtrim_oracle.cpp b/storage/columnstore/columnstore/utils/funcexp/func_rtrim_oracle.cpp index 1b47d7dd..93713e11 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_rtrim_oracle.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_rtrim_oracle.cpp @@ -161,4 +161,3 @@ std::string Func_rtrim_oracle::getStrVal(rowgroup::Row& row, FunctionParm& fp, b } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_sec_to_time.cpp b/storage/columnstore/columnstore/utils/funcexp/func_sec_to_time.cpp index d3b4af67..9a2fef4c 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_sec_to_time.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_sec_to_time.cpp @@ -231,4 +231,3 @@ execplan::IDB_Decimal Func_sec_to_time::getDecimalVal(rowgroup::Row& row, Functi } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_second.cpp b/storage/columnstore/columnstore/utils/funcexp/func_second.cpp index 7731ea66..6136c3ed 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_second.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_second.cpp @@ -144,4 +144,3 @@ int64_t Func_second::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& isN } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_sha.cpp b/storage/columnstore/columnstore/utils/funcexp/func_sha.cpp index bc74a0a2..ec3fac1f 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_sha.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_sha.cpp @@ -655,4 +655,3 @@ string Func_sha::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& isNull, } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_sign.cpp b/storage/columnstore/columnstore/utils/funcexp/func_sign.cpp index a0cece67..426fbb0c 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_sign.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_sign.cpp @@ -71,4 +71,3 @@ string Func_sign::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& isNull } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_space.cpp b/storage/columnstore/columnstore/utils/funcexp/func_space.cpp index 93e765a5..9a9a8578 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_space.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_space.cpp @@ -57,4 +57,3 @@ std::string Func_space::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_str_to_date.cpp b/storage/columnstore/columnstore/utils/funcexp/func_str_to_date.cpp index 0580021f..ab0fb4f6 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_str_to_date.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_str_to_date.cpp @@ -264,4 +264,3 @@ int64_t Func_str_to_date::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_strcmp.cpp b/storage/columnstore/columnstore/utils/funcexp/func_strcmp.cpp index a16c68cc..63b3b0b2 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_strcmp.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_strcmp.cpp @@ -74,4 +74,3 @@ std::string Func_strcmp::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& i } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_substr.cpp b/storage/columnstore/columnstore/utils/funcexp/func_substr.cpp index cb45acc0..9a39a4f1 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_substr.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_substr.cpp @@ -98,4 +98,3 @@ std::string Func_substr::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& i } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_substring_index.cpp b/storage/columnstore/columnstore/utils/funcexp/func_substring_index.cpp index ffae25e5..82f94a7e 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_substring_index.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_substring_index.cpp @@ -205,4 +205,3 @@ std::string Func_substring_index::getStrVal(rowgroup::Row& row, FunctionParm& fp } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_sysdate.cpp b/storage/columnstore/columnstore/utils/funcexp/func_sysdate.cpp index b30e66c5..780492f3 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_sysdate.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_sysdate.cpp @@ -105,4 +105,3 @@ int64_t Func_sysdate::getTimeIntVal(rowgroup::Row& row, FunctionParm& parm, bool } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_time.cpp b/storage/columnstore/columnstore/utils/funcexp/func_time.cpp index 14d2246a..e898f782 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_time.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_time.cpp @@ -169,4 +169,3 @@ double Func_time::getDoubleVal(rowgroup::Row& row, FunctionParm& fp, bool& isNul } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_time_format.cpp b/storage/columnstore/columnstore/utils/funcexp/func_time_format.cpp index d075658b..1205e21b 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_time_format.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_time_format.cpp @@ -229,4 +229,3 @@ string Func_time_format::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_time_to_sec.cpp b/storage/columnstore/columnstore/utils/funcexp/func_time_to_sec.cpp index 388ef2ca..3cf718aa 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_time_to_sec.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_time_to_sec.cpp @@ -195,4 +195,3 @@ int64_t Func_time_to_sec::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_timediff.cpp b/storage/columnstore/columnstore/utils/funcexp/func_timediff.cpp index d3f89139..03000476 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_timediff.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_timediff.cpp @@ -349,4 +349,3 @@ double Func_timediff::getDoubleVal(rowgroup::Row& row, FunctionParm& fp, bool& i } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_timestampdiff.cpp b/storage/columnstore/columnstore/utils/funcexp/func_timestampdiff.cpp index 07e7eda7..6ad2f395 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_timestampdiff.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_timestampdiff.cpp @@ -196,4 +196,3 @@ int64_t Func_timestampdiff::getTimeIntVal(rowgroup::Row& row, FunctionParm& parm } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_to_days.cpp b/storage/columnstore/columnstore/utils/funcexp/func_to_days.cpp index f597c5fd..d6f831be 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_to_days.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_to_days.cpp @@ -151,4 +151,3 @@ int64_t Func_to_days::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_trim.cpp b/storage/columnstore/columnstore/utils/funcexp/func_trim.cpp index 636afe44..d4782356 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_trim.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_trim.cpp @@ -168,4 +168,3 @@ std::string Func_trim::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& isN } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_trim_oracle.cpp b/storage/columnstore/columnstore/utils/funcexp/func_trim_oracle.cpp index 5e1226c5..4daec213 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_trim_oracle.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_trim_oracle.cpp @@ -166,4 +166,3 @@ std::string Func_trim_oracle::getStrVal(rowgroup::Row& row, FunctionParm& fp, bo } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_truncate.cpp b/storage/columnstore/columnstore/utils/funcexp/func_truncate.cpp index 87f045af..7a529c00 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_truncate.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_truncate.cpp @@ -522,7 +522,7 @@ IDB_Decimal Func_truncate::getDecimalVal(Row& row, FunctionParm& parm, bool& isN { // strip off micro seconds value = value.substr(0, 14); - int64_t x = atoll(value.c_str()); + x = atoll(value.c_str()); if (s > 5) s = 0; @@ -613,7 +613,7 @@ IDB_Decimal Func_truncate::getDecimalVal(Row& row, FunctionParm& parm, bool& isN { // strip off micro seconds value = value.substr(0, 14); - int64_t x = atoll(value.c_str()); + x = atoll(value.c_str()); if (s > 5) s = 0; @@ -721,4 +721,3 @@ int64_t Func_truncate::getTimestampIntVal(rowgroup::Row& row, FunctionParm& parm } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_ucase.cpp b/storage/columnstore/columnstore/utils/funcexp/func_ucase.cpp index 9fa00e67..1cbbd6a2 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_ucase.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_ucase.cpp @@ -77,4 +77,3 @@ std::string Func_ucase::getStrVal(rowgroup::Row& row, FunctionParm& fp, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_unhex.cpp b/storage/columnstore/columnstore/utils/funcexp/func_unhex.cpp index 38da2cb2..92ef5fa3 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_unhex.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_unhex.cpp @@ -112,4 +112,3 @@ string Func_unhex::getStrVal(rowgroup::Row& row, FunctionParm& parm, bool& isNul } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_unix_timestamp.cpp b/storage/columnstore/columnstore/utils/funcexp/func_unix_timestamp.cpp index d5b65fe2..f9c81e6b 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_unix_timestamp.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_unix_timestamp.cpp @@ -223,4 +223,3 @@ string Func_unix_timestamp::getStrVal(rowgroup::Row& row, FunctionParm& parm, bo } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_week.cpp b/storage/columnstore/columnstore/utils/funcexp/func_week.cpp index 8f7a3af0..e6ab52f3 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_week.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_week.cpp @@ -169,4 +169,3 @@ int64_t Func_week::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& isNul } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_weekday.cpp b/storage/columnstore/columnstore/utils/funcexp/func_weekday.cpp index 302293b8..e78d12c6 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_weekday.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_weekday.cpp @@ -164,4 +164,3 @@ int64_t Func_weekday::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& is } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_year.cpp b/storage/columnstore/columnstore/utils/funcexp/func_year.cpp index 2f4fc827..9ea12fbd 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_year.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_year.cpp @@ -140,4 +140,3 @@ int64_t Func_year::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& isNul } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/func_yearweek.cpp b/storage/columnstore/columnstore/utils/funcexp/func_yearweek.cpp index 3b85692b..2ad94139 100644 --- a/storage/columnstore/columnstore/utils/funcexp/func_yearweek.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/func_yearweek.cpp @@ -173,4 +173,3 @@ int64_t Func_yearweek::getIntVal(rowgroup::Row& row, FunctionParm& parm, bool& i } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/funcexp/functor.cpp b/storage/columnstore/columnstore/utils/funcexp/functor.cpp index 4eed1688..3da34944 100644 --- a/storage/columnstore/columnstore/utils/funcexp/functor.cpp +++ b/storage/columnstore/columnstore/utils/funcexp/functor.cpp @@ -361,4 +361,3 @@ string Func::longDoubleToString(long double ld) } } // namespace funcexp -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/libmysql_client/libmysql_client.h b/storage/columnstore/columnstore/utils/libmysql_client/libmysql_client.h index 4207a705..931886b7 100644 --- a/storage/columnstore/columnstore/utils/libmysql_client/libmysql_client.h +++ b/storage/columnstore/columnstore/utils/libmysql_client/libmysql_client.h @@ -91,4 +91,3 @@ class LibMySQL #endif // UTILS_LIBMYSQL_CL_H -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/loggingcpp/errorcodes.cpp b/storage/columnstore/columnstore/utils/loggingcpp/errorcodes.cpp index e52a5e32..c8e879c0 100644 --- a/storage/columnstore/columnstore/utils/loggingcpp/errorcodes.cpp +++ b/storage/columnstore/columnstore/utils/loggingcpp/errorcodes.cpp @@ -103,4 +103,3 @@ string ErrorCodes::errorString(uint16_t code) const return (fPreamble + msg); } } // namespace logging -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/loggingcpp/exceptclasses.h b/storage/columnstore/columnstore/utils/loggingcpp/exceptclasses.h index 92aebbbb..7bd6b625 100644 --- a/storage/columnstore/columnstore/utils/loggingcpp/exceptclasses.h +++ b/storage/columnstore/columnstore/utils/loggingcpp/exceptclasses.h @@ -307,5 +307,4 @@ class ProtocolError : public std::logic_error } // namespace logging -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/messageqcpp/inetstreamsocket.cpp b/storage/columnstore/columnstore/utils/messageqcpp/inetstreamsocket.cpp index 81ed82f6..45f605bc 100644 --- a/storage/columnstore/columnstore/utils/messageqcpp/inetstreamsocket.cpp +++ b/storage/columnstore/columnstore/utils/messageqcpp/inetstreamsocket.cpp @@ -101,8 +101,6 @@ using boost::scoped_array; // some static functions namespace { -using messageqcpp::ByteStream; - // @bug 2441 - Retry after 512 read() error. // ERESTARTSYS (512) is a kernal I/O errno that is similar to a EINTR, except // that it is not supposed to "leak" out into the user space. But we are @@ -936,17 +934,9 @@ void InetStreamSocket::connect(const sockaddr* serv_addr) #ifdef _MSC_VER char buf = '\0'; (void)::recv(socketParms().sd(), &buf, 1, 0); -#else -#if defined(__GNUC__) && __GNUC__ >= 5 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-result" - char buf = '\0'; - ::read(socketParms().sd(), &buf, 1); // we know 1 byte is in the recv buffer -#pragma GCC diagnostic pop #else char buf = '\0'; - ::read(socketParms().sd(), &buf, 1); // we know 1 byte is in the recv buffer -#endif // pragma + std::ignore = ::read(socketParms().sd(), &buf, 1); // we know 1 byte is in the recv buffer #endif return; } diff --git a/storage/columnstore/columnstore/utils/messageqcpp/messagequeue.h b/storage/columnstore/columnstore/utils/messageqcpp/messagequeue.h index 7d9cba82..30dd20ff 100644 --- a/storage/columnstore/columnstore/utils/messageqcpp/messagequeue.h +++ b/storage/columnstore/columnstore/utils/messageqcpp/messagequeue.h @@ -337,5 +337,4 @@ inline void MessageQueueClient::syncProto(bool use) #undef EXPORT -#endif // MESSAGEQCPP_MESSAGEQUEUE_H -// vim:ts=4 sw=4: +#endif // MESSAGEQCPP_MESSAGEQUEUE_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/multicast/multicast.cpp b/storage/columnstore/columnstore/utils/multicast/multicast.cpp index 116f0382..b471c170 100644 --- a/storage/columnstore/columnstore/utils/multicast/multicast.cpp +++ b/storage/columnstore/columnstore/utils/multicast/multicast.cpp @@ -93,4 +93,3 @@ void MulticastSender::send(const ByteStream& msg) } // namespace multicast -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/regr/regrmysql.cpp b/storage/columnstore/columnstore/utils/regr/regrmysql.cpp index 1b480aa8..d9e9a51b 100644 --- a/storage/columnstore/columnstore/utils/regr/regrmysql.cpp +++ b/storage/columnstore/columnstore/utils/regr/regrmysql.cpp @@ -1405,4 +1405,3 @@ extern "C" return valOut; } } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/rowgroup/rowgroup.cpp b/storage/columnstore/columnstore/utils/rowgroup/rowgroup.cpp index 4e767e1d..7c297f8f 100644 --- a/storage/columnstore/columnstore/utils/rowgroup/rowgroup.cpp +++ b/storage/columnstore/columnstore/utils/rowgroup/rowgroup.cpp @@ -1751,4 +1751,3 @@ RowGroup RowGroup::truncate(uint32_t cols) } // namespace rowgroup -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/rowgroup/rowgroup.h b/storage/columnstore/columnstore/utils/rowgroup/rowgroup.h index a17449d0..6dfebfec 100644 --- a/storage/columnstore/columnstore/utils/rowgroup/rowgroup.h +++ b/storage/columnstore/columnstore/utils/rowgroup/rowgroup.h @@ -31,7 +31,7 @@ #include #include #include -//#define NDEBUG +// #define NDEBUG #include #include #include @@ -1525,8 +1525,8 @@ class RowGroup : public messageqcpp::Serializeable inline void setUseStringTable(bool); // RGData *convertToInlineData(uint64_t *size = NULL) const; // caller manages the memory returned by - //this void convertToInlineDataInPlace(); RGData *convertToStringTable(uint64_t *size = NULL) const; void - //convertToStringTableInPlace(); + // this void convertToInlineDataInPlace(); RGData *convertToStringTable(uint64_t *size = NULL) + // const; void convertToStringTableInPlace(); void serializeRGData(messageqcpp::ByteStream&) const; inline uint32_t getStringTableThreshold() const; @@ -2184,5 +2184,4 @@ inline void RGData::getRow(uint32_t num, Row* row) } // namespace rowgroup -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/rwlock/rwlock.cpp b/storage/columnstore/columnstore/utils/rwlock/rwlock.cpp index 73a9c5db..ca7b82e9 100644 --- a/storage/columnstore/columnstore/utils/rwlock/rwlock.cpp +++ b/storage/columnstore/columnstore/utils/rwlock/rwlock.cpp @@ -746,4 +746,3 @@ LockState RWLock::getLockState() } } // namespace rwlock -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/rwlock/rwlock.h b/storage/columnstore/columnstore/utils/rwlock/rwlock.h index 33702570..d18640a4 100644 --- a/storage/columnstore/columnstore/utils/rwlock/rwlock.h +++ b/storage/columnstore/columnstore/utils/rwlock/rwlock.h @@ -46,9 +46,15 @@ namespace rwlock { -const std::array RWLockNames = { { - "all", "VSS", "ExtentMap", "FreeList", "VBBM", "CopyLocks", "ExtentMapIndex", -} }; +const std::array RWLockNames = {{ + "all", + "VSS", + "ExtentMap", + "FreeList", + "VBBM", + "CopyLocks", + "ExtentMapIndex", +}}; /// the layout of the shmseg struct State @@ -283,5 +289,4 @@ class RWLock #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/startup/installdir.cpp b/storage/columnstore/columnstore/utils/startup/installdir.cpp index 65437a9c..2db2128d 100644 --- a/storage/columnstore/columnstore/utils/startup/installdir.cpp +++ b/storage/columnstore/columnstore/utils/startup/installdir.cpp @@ -112,4 +112,3 @@ const string StartUp::tmpDir() } } // namespace startup -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/startup/installdir.h b/storage/columnstore/columnstore/utils/startup/installdir.h index 4d9b8989..c902d4bf 100644 --- a/storage/columnstore/columnstore/utils/startup/installdir.h +++ b/storage/columnstore/columnstore/utils/startup/installdir.h @@ -53,5 +53,4 @@ class StartUp } // namespace startup -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/testbc/iomanager.cpp b/storage/columnstore/columnstore/utils/testbc/iomanager.cpp index 7c3cc4d6..b2944e5b 100644 --- a/storage/columnstore/columnstore/utils/testbc/iomanager.cpp +++ b/storage/columnstore/columnstore/utils/testbc/iomanager.cpp @@ -325,4 +325,3 @@ fileRequest* ioManager::getNextRequest() } } // namespace dbbc -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/testbc/iomanager.h b/storage/columnstore/columnstore/utils/testbc/iomanager.h index 20704c58..aab251dd 100644 --- a/storage/columnstore/columnstore/utils/testbc/iomanager.h +++ b/storage/columnstore/columnstore/utils/testbc/iomanager.h @@ -99,5 +99,4 @@ class ioManager }; } // namespace dbbc -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/threadpool/prioritythreadpool.cpp b/storage/columnstore/columnstore/utils/threadpool/prioritythreadpool.cpp index b26144b6..908c0ba9 100644 --- a/storage/columnstore/columnstore/utils/threadpool/prioritythreadpool.cpp +++ b/storage/columnstore/columnstore/utils/threadpool/prioritythreadpool.cpp @@ -322,4 +322,3 @@ void PriorityThreadPool::stop() } } // namespace threadpool -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/udfsdk/udfmysql.cpp b/storage/columnstore/columnstore/utils/udfsdk/udfmysql.cpp index 55272942..f32fc6b3 100644 --- a/storage/columnstore/columnstore/utils/udfsdk/udfmysql.cpp +++ b/storage/columnstore/columnstore/utils/udfsdk/udfmysql.cpp @@ -535,4 +535,3 @@ extern "C" return 0; } } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/udfsdk/udfsdk.cpp b/storage/columnstore/columnstore/utils/udfsdk/udfsdk.cpp index 0cf80618..dc5e4fa8 100644 --- a/storage/columnstore/columnstore/utils/udfsdk/udfsdk.cpp +++ b/storage/columnstore/columnstore/utils/udfsdk/udfsdk.cpp @@ -375,4 +375,3 @@ int64_t MCS_isnull::getDatetimeIntVal(Row& row, FunctionParm& parm, bool& isNull } } // namespace udfsdk -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/udfsdk/udfsdk.h b/storage/columnstore/columnstore/utils/udfsdk/udfsdk.h index 9e53601b..6c0ee013 100644 --- a/storage/columnstore/columnstore/utils/udfsdk/udfsdk.h +++ b/storage/columnstore/columnstore/utils/udfsdk/udfsdk.h @@ -314,4 +314,3 @@ class MCS_isnull : public funcexp::Func #undef EXPORT -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/framebound.cpp b/storage/columnstore/columnstore/utils/windowfunction/framebound.cpp index 043620f5..56b50d2e 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/framebound.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/framebound.cpp @@ -72,4 +72,3 @@ const string FrameBound::toString() const } } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/framebound.h b/storage/columnstore/columnstore/utils/windowfunction/framebound.h index 27038ae1..22203c73 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/framebound.h +++ b/storage/columnstore/columnstore/utils/windowfunction/framebound.h @@ -146,6 +146,4 @@ extern std::map colType2String; } // namespace windowfunction -#endif // UTILS_FRAMEBOUND_H - -// vim:ts=4 sw=4: +#endif // UTILS_FRAMEBOUND_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.cpp b/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.cpp index 0b356bce..e884d930 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.cpp @@ -411,4 +411,3 @@ template class FrameBoundExpressionRange; template class FrameBoundExpressionRange; } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.h b/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.h index 0a36a543..0688e7da 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.h +++ b/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.h @@ -214,6 +214,4 @@ class FrameBoundExpressionRange : public FrameBoundConstantRange } // namespace windowfunction -#endif // UTILS_FRAMEBOUNDRANGE_H - -// vim:ts=4 sw=4: +#endif // UTILS_FRAMEBOUNDRANGE_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.cpp b/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.cpp index 616b1e0e..3d442741 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.cpp @@ -139,4 +139,3 @@ template class FrameBoundExpressionRow; template class FrameBoundExpressionRow; } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.h b/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.h index ac0b6c0a..bc7f450a 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.h +++ b/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.h @@ -148,5 +148,3 @@ class FrameBoundExpressionRow : public FrameBoundConstantRow } // namespace windowfunction #endif // UTILS_FRAMEBOUNDROW_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/idborderby.cpp b/storage/columnstore/columnstore/utils/windowfunction/idborderby.cpp index 30d442e7..5160eed2 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/idborderby.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/idborderby.cpp @@ -898,4 +898,3 @@ bool IdbOrderBy::Eq::operator()(const Row::Pointer& d1, const Row::Pointer& d2) } } // namespace ordering -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_count.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_count.cpp index c45cd297..bc469476 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_count.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_count.cpp @@ -184,4 +184,3 @@ template boost::shared_ptr WF_count::makeFunction(i WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_count.h b/storage/columnstore/columnstore/utils/windowfunction/wf_count.h index 2dcbd963..1c4da82e 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_count.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_count.h @@ -49,5 +49,3 @@ class WF_count : public WindowFunctionType } // namespace windowfunction #endif // UTILS_WF_COUNT_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.cpp index 4e7de53f..b3babe8b 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.cpp @@ -306,4 +306,3 @@ template void WF_lead_lag::parseParms(const std::vector& template void WF_lead_lag::parseParms(const std::vector&); } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.h b/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.h index 9aaea0c8..e6290eb8 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.h @@ -54,5 +54,3 @@ class WF_lead_lag : public WindowFunctionType } // namespace windowfunction #endif // UTILS_WF_LEAD_LAG_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.cpp index 4120fe32..b5b63bde 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.cpp @@ -185,4 +185,3 @@ template boost::shared_ptr WF_min_max::makeFunction WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.h b/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.h index bd8091ed..9305ebcb 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.h @@ -48,5 +48,3 @@ class WF_min_max : public WindowFunctionType } // namespace windowfunction #endif // UTILS_WF_MIN_MAX_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.cpp index 338984a0..f3c9e2a1 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.cpp @@ -271,4 +271,3 @@ template boost::shared_ptr WF_nth_value::makeFuncti WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.h b/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.h index d5d98b4b..e78709f2 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.h @@ -52,5 +52,3 @@ class WF_nth_value : public WindowFunctionType } // namespace windowfunction #endif // UTILS_WF_NTH_VALUE_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.cpp index 375fd81d..4b663460 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.cpp @@ -154,4 +154,3 @@ void WF_ntile::operator()(int64_t b, int64_t e, int64_t c) } } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.h b/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.h index 154f725b..db3de2cf 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.h @@ -49,5 +49,3 @@ class WF_ntile : public WindowFunctionType } // namespace windowfunction #endif // UTILS_WF_NTILE_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.cpp index 4d0dfce0..24d6b9f2 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.cpp @@ -382,4 +382,3 @@ template boost::shared_ptr WF_percentile::makeFunct WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.h b/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.h index 952f29af..713a2698 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.h @@ -50,5 +50,3 @@ class WF_percentile : public WindowFunctionType } // namespace windowfunction #endif // UTILS_WF_PERCENTILE_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.cpp index f0459b7f..540ca808 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.cpp @@ -145,4 +145,3 @@ void WF_ranking::operator()(int64_t b, int64_t e, int64_t c) } } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.h b/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.h index df2e7471..dcfb9448 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.h @@ -48,5 +48,3 @@ class WF_ranking : public WindowFunctionType } // namespace windowfunction #endif // UTILS_WF_RANKING_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.cpp index 6453c0a0..6dd58ce3 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.cpp @@ -86,4 +86,3 @@ void WF_row_number::operator()(int64_t b, int64_t e, int64_t c) } } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.h b/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.h index d0976c25..bcb8d996 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.h @@ -47,5 +47,3 @@ class WF_row_number : public WindowFunctionType } // namespace windowfunction #endif // UTILS_WF_ROW_NUMBER_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_stats.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_stats.cpp index a4b6f4f5..73a668ac 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_stats.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_stats.cpp @@ -234,4 +234,3 @@ template boost::shared_ptr WF_stats::makeFunction(i WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_stats.h b/storage/columnstore/columnstore/utils/windowfunction/wf_stats.h index 725d1c6c..6a50df11 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_stats.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_stats.h @@ -50,5 +50,3 @@ class WF_stats : public WindowFunctionType } // namespace windowfunction #endif // UTILS_WF_STATS_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.cpp index d988f0a1..573b6e09 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.cpp @@ -306,4 +306,3 @@ template boost::shared_ptr WF_sum_avg: int, const string&, int, WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.h b/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.h index 14cbd356..bdb5bc38 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.h @@ -61,6 +61,4 @@ class WF_sum_avg : public WindowFunctionType } // namespace windowfunction -#endif // UTILS_WF_SUM_AVG_H - -// vim:ts=4 sw=4: +#endif // UTILS_WF_SUM_AVG_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.cpp b/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.cpp index 274c9701..0894c6ad 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.cpp @@ -1191,4 +1191,3 @@ void WF_udaf::operator()(int64_t b, int64_t e, int64_t c) fPrev = c; } } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.h b/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.h index ab777761..22fae5a6 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.h +++ b/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.h @@ -113,6 +113,4 @@ class WF_udaf : public WindowFunctionType } // namespace windowfunction -#endif // UTILS_WF_UDAF_H - -// vim:ts=4 sw=4: +#endif // UTILS_WF_UDAF_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/utils/windowfunction/windowframe.cpp b/storage/columnstore/columnstore/utils/windowfunction/windowframe.cpp index cbc9352c..491e0a0f 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/windowframe.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/windowframe.cpp @@ -81,4 +81,3 @@ const string WindowFrame::toString() const } } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/windowframe.h b/storage/columnstore/columnstore/utils/windowfunction/windowframe.h index 159ee84d..cb20c5fe 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/windowframe.h +++ b/storage/columnstore/columnstore/utils/windowfunction/windowframe.h @@ -121,5 +121,3 @@ class WindowFrame } // namespace windowfunction #endif // UTILS_WINDOWFRAME_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/windowfunction.cpp b/storage/columnstore/columnstore/utils/windowfunction/windowfunction.cpp index a0e84493..941fff91 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/windowfunction.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/windowfunction.cpp @@ -259,4 +259,3 @@ void WindowFunction::sort(std::vector::iterator v, uint64_t n) } } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/windowfunction.h b/storage/columnstore/columnstore/utils/windowfunction/windowfunction.h index 53f5b9a4..2d65f8fc 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/windowfunction.h +++ b/storage/columnstore/columnstore/utils/windowfunction/windowfunction.h @@ -113,5 +113,3 @@ class WindowFunction } // namespace windowfunction #endif // UTILS_WINDOWFUNCTION_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.cpp b/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.cpp index ccf74609..43f05f4b 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.cpp +++ b/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.cpp @@ -797,4 +797,3 @@ void WindowFunctionType::constParms(const std::vector& functionParms) } } // namespace windowfunction -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.h b/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.h index c1af9bc7..e64ac30c 100644 --- a/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.h +++ b/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.h @@ -305,5 +305,3 @@ extern std::map colType2String; } // namespace windowfunction #endif // UTILS_WINDOWFUNCTIONTYPE_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/versioning/BRM/brmshmimpl.cpp b/storage/columnstore/columnstore/versioning/BRM/brmshmimpl.cpp index 74028241..44750c63 100644 --- a/storage/columnstore/columnstore/versioning/BRM/brmshmimpl.cpp +++ b/storage/columnstore/columnstore/versioning/BRM/brmshmimpl.cpp @@ -410,4 +410,3 @@ void BRMManagedShmImpl::remap(const bool readOnly) } // namespace BRM -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/versioning/BRM/load_brm.cpp b/storage/columnstore/columnstore/versioning/BRM/load_brm.cpp index 4378fb76..b72bd3c2 100644 --- a/storage/columnstore/columnstore/versioning/BRM/load_brm.cpp +++ b/storage/columnstore/columnstore/versioning/BRM/load_brm.cpp @@ -127,4 +127,3 @@ int main(int argc, char** argv) return 0; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/versioning/BRM/slavecomm.cpp b/storage/columnstore/columnstore/versioning/BRM/slavecomm.cpp index 7b665a1a..1f490dd8 100644 --- a/storage/columnstore/columnstore/versioning/BRM/slavecomm.cpp +++ b/storage/columnstore/columnstore/versioning/BRM/slavecomm.cpp @@ -2432,4 +2432,3 @@ void SlaveComm::do_dmlReleaseLBIDRanges(ByteStream& msg) } // namespace BRM -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/versioning/BRM/vbbm.cpp b/storage/columnstore/columnstore/versioning/BRM/vbbm.cpp index 253bd051..2ed2454d 100644 --- a/storage/columnstore/columnstore/versioning/BRM/vbbm.cpp +++ b/storage/columnstore/columnstore/versioning/BRM/vbbm.cpp @@ -40,7 +40,6 @@ #include #include -namespace bi = boost::interprocess; #include #include @@ -1076,8 +1075,8 @@ void VBBM::save(string filename) } var = VBBM_MAGIC_V2; - int bytesWritten = 0; - int bytesToWrite = 12; + [[maybe_unused]] int bytesWritten = 0; + [[maybe_unused]] int bytesToWrite = 12; bytesWritten += out->write((char*)&var, 4); bytesWritten += out->write((char*)&vbbm->vbCurrentSize, 4); bytesWritten += out->write((char*)&vbbm->nFiles, 4); diff --git a/storage/columnstore/columnstore/writeengine/client/we_clients.cpp b/storage/columnstore/columnstore/writeengine/client/we_clients.cpp index c696dbb6..b6d66e2e 100644 --- a/storage/columnstore/columnstore/writeengine/client/we_clients.cpp +++ b/storage/columnstore/columnstore/writeengine/client/we_clients.cpp @@ -545,4 +545,3 @@ void WEClients::addDataToOutput(SBS sbs, uint32_t connIndex) } // namespace WriteEngine -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/client/we_clients.h b/storage/columnstore/columnstore/writeengine/client/we_clients.h index 8028181a..a059b739 100644 --- a/storage/columnstore/columnstore/writeengine/client/we_clients.h +++ b/storage/columnstore/columnstore/writeengine/client/we_clients.h @@ -32,7 +32,7 @@ #include #include "bytestream.h" -//#include "we_message.h" +// #include "we_message.h" #include "threadsafequeue.h" #include "rwlock_local.h" #include "resourcemanager.h" @@ -181,5 +181,4 @@ class WEClients #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.cpp b/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.cpp index d155715b..9f910193 100644 --- a/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.cpp +++ b/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.cpp @@ -52,4 +52,3 @@ void Redistribute::handleRedistributeMessage(ByteStream& bs, IOSocket& ios) } // namespace redistribute -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.h b/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.h index 62c33b83..8e01ed01 100644 --- a/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.h +++ b/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.h @@ -45,6 +45,4 @@ class Redistribute } // namespace redistribute -#endif // WE_REDISTRIBUTE_H - -// vim:ts=4 sw=4: +#endif // WE_REDISTRIBUTE_H \ No newline at end of file diff --git a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.cpp b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.cpp index a54e47ff..9cb5e139 100644 --- a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.cpp +++ b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.cpp @@ -698,4 +698,3 @@ void RedistributeControl::logMessage(const string& msg) } // namespace redistribute -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.h b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.h index 65535051..6b466508 100644 --- a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.h +++ b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.h @@ -126,5 +126,3 @@ class RedistributeControl } // namespace redistribute #endif // WE_REDISTRIBUTECONTROL_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.cpp b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.cpp index ce808eb2..774f4011 100644 --- a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.cpp +++ b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.cpp @@ -838,4 +838,3 @@ void RedistributeControlThread::doStopAction() } // namespace redistribute -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.h b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.h index 8f3116fa..92581ebd 100644 --- a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.h +++ b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.h @@ -127,5 +127,3 @@ class RedistributeControlThread } // namespace redistribute #endif // WE_REDISTRIBUTECONTROLTHREAD_H - -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.cpp b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.cpp index 67f1f586..5825ea53 100644 --- a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.cpp +++ b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.cpp @@ -1520,4 +1520,3 @@ void RedistributeWorkerThread::logMessage(const string& msg, int line) } // namespace redistribute -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.h b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.h index cdd3a62a..c1933bf7 100644 --- a/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.h +++ b/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.h @@ -142,6 +142,4 @@ class RedistributeWorkerThread } // namespace redistribute -#endif // WE_REDISTRIBUTEWORKERTHREAD_H - -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff --git a/storage/columnstore/columnstore/writeengine/server/we_ddlcommandproc.cpp b/storage/columnstore/columnstore/writeengine/server/we_ddlcommandproc.cpp index 1d832f9e..3970e6c1 100644 --- a/storage/columnstore/columnstore/writeengine/server/we_ddlcommandproc.cpp +++ b/storage/columnstore/columnstore/writeengine/server/we_ddlcommandproc.cpp @@ -4952,4 +4952,3 @@ void WE_DDLCommandProc::purgeFDCache() } } // namespace WriteEngine -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/shared/we_brm.cpp b/storage/columnstore/columnstore/writeengine/shared/we_brm.cpp index a049806b..fb5d88fa 100644 --- a/storage/columnstore/columnstore/writeengine/shared/we_brm.cpp +++ b/storage/columnstore/columnstore/writeengine/shared/we_brm.cpp @@ -1741,4 +1741,3 @@ int BRMWrapper::getExtentCPMaxMin(const BRM::LBID_t lbid, BRM::CPMaxMin& cpMaxMi } } // namespace WriteEngine -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/shared/we_chunkmanager.cpp b/storage/columnstore/columnstore/writeengine/shared/we_chunkmanager.cpp index b34535c7..784f9990 100644 --- a/storage/columnstore/columnstore/writeengine/shared/we_chunkmanager.cpp +++ b/storage/columnstore/columnstore/writeengine/shared/we_chunkmanager.cpp @@ -2667,4 +2667,3 @@ int ChunkManager::checkFixLastDictChunk(const FID& fid, uint16_t root, uint32_t } } // namespace WriteEngine -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/splitter/we_splitterapp.cpp b/storage/columnstore/columnstore/writeengine/splitter/we_splitterapp.cpp index 366c64ad..22a29100 100644 --- a/storage/columnstore/columnstore/writeengine/splitter/we_splitterapp.cpp +++ b/storage/columnstore/columnstore/writeengine/splitter/we_splitterapp.cpp @@ -572,4 +572,3 @@ int main(int argc, char** argv) return SPLTR_EXIT_STATUS; } -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/wrapper/we_colop.cpp b/storage/columnstore/columnstore/writeengine/wrapper/we_colop.cpp index 25bed1eb..bbe3dc42 100644 --- a/storage/columnstore/columnstore/writeengine/wrapper/we_colop.cpp +++ b/storage/columnstore/columnstore/writeengine/wrapper/we_colop.cpp @@ -1910,4 +1910,3 @@ int ColumnOp::writeRowsValues(Column& curCol, uint64_t totalRow, const RIDList& } } // namespace WriteEngine -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.cpp b/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.cpp index 64bfff06..421ecbcb 100644 --- a/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.cpp +++ b/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.cpp @@ -109,4 +109,3 @@ ColsExtsInfoMap& TableMetaData::getColsExtsInfoMap() return fColsExtsInfoMap; } } // namespace WriteEngine -// vim:ts=4 sw=4: diff --git a/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.h b/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.h index 2e4f114a..830fecba 100644 --- a/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.h +++ b/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.h @@ -99,5 +99,4 @@ class TableMetaData #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif // WE_TABLEMETADATA_H__ \ No newline at end of file diff --git a/storage/columnstore/columnstore/writeengine/wrapper/writeengine.cpp b/storage/columnstore/columnstore/writeengine/wrapper/writeengine.cpp index 81520412..41471472 100644 --- a/storage/columnstore/columnstore/writeengine/wrapper/writeengine.cpp +++ b/storage/columnstore/columnstore/writeengine/wrapper/writeengine.cpp @@ -6628,4 +6628,3 @@ int WriteEngineWrapper::RemoveTxnFromLBIDMap(const TxnID txnid) } } // end of namespace -// vim:ts=4 sw=4: diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index 51d1cf2f..31f7d2eb 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -406,7 +406,7 @@ MYSQL_ADD_PLUGIN(connect ${CONNECT_SOURCES} STORAGE_ENGINE COMPONENT connect-engine RECOMPILE_FOR_EMBEDDED - LINK_LIBRARIES ${ZLIB_LIBRARY} ${XML_LIBRARY} ${ICONV_LIBRARY} + LINK_LIBRARIES ${ZLIB_LIBRARIES} ${XML_LIBRARY} ${ICONV_LIBRARY} ${ODBC_LIBRARY} ${JDBC_LIBRARY} ${MONGOC_LIBRARY} ${IPHLPAPI_LIBRARY} ${REST_LIBRARY}) IF(NOT TARGET connect) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 54ecde32..e9aa3db6 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -6454,6 +6454,9 @@ char *ha_connect::GetDBfromName(const char *name) ha_create_table() in handle.cc */ +/* Stack size 25608 in clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int ha_connect::create(const char *name, TABLE *table_arg, HA_CREATE_INFO *create_info) { @@ -6998,6 +7001,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, table= st; DBUG_RETURN(rc); } // end of create +PRAGMA_REENABLE_CHECK_STACK_FRAME /** Used to check whether a file based outward table can be populated by @@ -7005,6 +7009,10 @@ int ha_connect::create(const char *name, TABLE *table_arg, - file does not exist or is void - user has file privilege */ + +/* Stack size 16664 in clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + bool ha_connect::FileExists(const char *fn, bool bf) { if (!fn || !*fn) @@ -7055,6 +7063,7 @@ bool ha_connect::FileExists(const char *fn, bool bf) return true; } // end of FileExists +PRAGMA_REENABLE_CHECK_STACK_FRAME // Called by SameString and NoFieldOptionChange bool ha_connect::CheckString(PCSZ str1, PCSZ str2) diff --git a/storage/connect/ioapi.h b/storage/connect/ioapi.h index 44430e56..94b292ed 100644 --- a/storage/connect/ioapi.h +++ b/storage/connect/ioapi.h @@ -144,7 +144,7 @@ typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stre typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); -/* here is the "old" 32 bits structure structure */ +/* here is the "old" 32 bits structure */ typedef struct zlib_filefunc_def_s { open_file_func zopen_file; diff --git a/storage/connect/libdoc.cpp b/storage/connect/libdoc.cpp index 67f22ce2..ab588dd4 100644 --- a/storage/connect/libdoc.cpp +++ b/storage/connect/libdoc.cpp @@ -93,7 +93,6 @@ class LIBXMLDOC : public XMLDOCUMENT { xmlXPathContextPtr Ctxp; xmlXPathObjectPtr Xop; xmlXPathObjectPtr NlXop; - xmlErrorPtr Xerr; char *Buf; // Temporary bool Nofreelist; }; // end of class LIBXMLDOC @@ -327,7 +326,6 @@ LIBXMLDOC::LIBXMLDOC(char *nsl, char *nsdf, char *enc, PFBLOCK fp) Ctxp = NULL; Xop = NULL; NlXop = NULL; - Xerr = NULL; Buf = NULL; Nofreelist = false; } // end of LIBXMLDOC constructor @@ -365,8 +363,8 @@ bool LIBXMLDOC::ParseFile(PGLOBAL g, char *fn) Encoding = (char*)Docp->encoding; return false; - } else if ((Xerr = xmlGetLastError())) - xmlResetError(Xerr); + } else if (xmlGetLastError()) + xmlResetLastError(); return true; } // end of ParseFile @@ -505,9 +503,9 @@ int LIBXMLDOC::DumpDoc(PGLOBAL g, char *ofn) #if 1 // This function does not crash ( if (xmlSaveFormatFileEnc((const char *)ofn, Docp, Encoding, 0) < 0) { - xmlErrorPtr err = xmlGetLastError(); + const xmlError *err = xmlGetLastError(); strcpy(g->Message, (err) ? err->message : "Error saving XML doc"); - xmlResetError(Xerr); + xmlResetLastError(); rc = -1; } // endif Save // rc = xmlDocDump(of, Docp); @@ -546,8 +544,8 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp) if (Nlist) { xmlXPathFreeNodeSet(Nlist); - if ((Xerr = xmlGetLastError())) - xmlResetError(Xerr); + if (xmlGetLastError()) + xmlResetLastError(); Nlist = NULL; } // endif Nlist @@ -555,8 +553,8 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp) if (Xop) { xmlXPathFreeObject(Xop); - if ((Xerr = xmlGetLastError())) - xmlResetError(Xerr); + if (xmlGetLastError()) + xmlResetLastError(); Xop = NULL; } // endif Xop @@ -564,8 +562,8 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp) if (NlXop) { xmlXPathFreeObject(NlXop); - if ((Xerr = xmlGetLastError())) - xmlResetError(Xerr); + if (xmlGetLastError()) + xmlResetLastError(); NlXop = NULL; } // endif NlXop @@ -573,8 +571,8 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp) if (Ctxp) { xmlXPathFreeContext(Ctxp); - if ((Xerr = xmlGetLastError())) - xmlResetError(Xerr); + if (xmlGetLastError()) + xmlResetLastError(); Ctxp = NULL; } // endif Ctxp @@ -590,6 +588,7 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp) /******************************************************************/ xmlNodeSetPtr LIBXMLDOC::GetNodeList(PGLOBAL g, xmlNodePtr np, char *xp) { + const xmlError *xerr; xmlNodeSetPtr nl; if (trace(1)) @@ -649,11 +648,11 @@ xmlNodeSetPtr LIBXMLDOC::GetNodeList(PGLOBAL g, xmlNodePtr np, char *xp) } else xmlXPathFreeObject(Xop); // Caused node not found - if ((Xerr = xmlGetLastError())) { - strcpy(g->Message, Xerr->message); - xmlResetError(Xerr); + if ((xerr = xmlGetLastError())) { + strcpy(g->Message, xerr->message); + xmlResetLastError(); return NULL; - } // endif Xerr + } // endif xerr } // endif Xop @@ -1079,7 +1078,7 @@ void XML2NODE::AddText(PGLOBAL g, PCSZ txtp) /******************************************************************/ void XML2NODE::DeleteChild(PGLOBAL g, PXNODE dnp) { - xmlErrorPtr xerr; + const xmlError *xerr; if (trace(1)) htrc("DeleteChild: node=%p\n", dnp); @@ -1122,7 +1121,7 @@ err: if (trace(1)) htrc("DeleteChild: errmsg=%-.256s\n", xerr->message); - xmlResetError(xerr); + xmlResetLastError(); } // end of DeleteChild /* -------------------- class XML2NODELIST ---------------------- */ diff --git a/storage/connect/mysql-test/connect/r/drop-open-error.result b/storage/connect/mysql-test/connect/r/drop-open-error.result index a5d1e893..f9b9b7e8 100644 --- a/storage/connect/mysql-test/connect/r/drop-open-error.result +++ b/storage/connect/mysql-test/connect/r/drop-open-error.result @@ -3,7 +3,7 @@ create table tcon engine=connect table_type=mysql CONNECTION='mysql://root@local ERROR HY000: Too long value for 'SRCDEF' drop table mdev9949; Warnings: -Warning 1017 Can't find file: 'MYSQLD_DATADIR/test/mdev9949.dos' (errno: 2 "No such file or directory") +Warning 1017 Can't find file: 'DATADIR/test/mdev9949.dos' (errno: 2 "No such file or directory") drop table t1; select @@secure_file_priv 'must be NULL'; must be NULL diff --git a/storage/connect/mysql-test/connect/r/mysql.result b/storage/connect/mysql-test/connect/r/mysql.result index 1dcbca88..d1c68dcc 100644 --- a/storage/connect/mysql-test/connect/r/mysql.result +++ b/storage/connect/mysql-test/connect/r/mysql.result @@ -229,6 +229,7 @@ a 20 30 # Start of mysqldump ------ +/*!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t2` ( diff --git a/storage/connect/mysql-test/connect/t/drop-open-error.test b/storage/connect/mysql-test/connect/t/drop-open-error.test index 69e634e8..dd286c96 100644 --- a/storage/connect/mysql-test/connect/t/drop-open-error.test +++ b/storage/connect/mysql-test/connect/t/drop-open-error.test @@ -13,8 +13,9 @@ error ER_VALUE_TOO_LONG; create table tcon engine=connect table_type=mysql CONNECTION='mysql://root@localhost/test/t1' SRCDEF='select c from t1 where c in ("foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar")'; # copy the invalid frm (as created by the statement above before the MDEV-9949 fix) +let $MARIADB_DATADIR=`select @@datadir`; copy_file $MTR_SUITE_DIR/std_data/mdev9949.frm $datadir/test/mdev9949.frm; ---replace_result $datadir MYSQLD_DATADIR/ ./ MYSQLD_DATADIR/ +--replace_result $MARIADB_DATADIR DATADIR/ './' 'DATADIR/' drop table mdev9949; drop table t1; diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index d0b7b316..7e2857f1 100644 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -125,8 +125,11 @@ PTDB TDBMUL::Duplicate(PGLOBAL g) /* have a LRECL that is the sum of the lengths of all components. */ /* This is why we use a big filename array to take care of that. */ /***********************************************************************/ + +PRAGMA_DISABLE_CHECK_STACK_FRAME + bool TDBMUL::InitFileNames(PGLOBAL g) - { +{ #define PFNZ 4096 #define FNSZ (_MAX_DRIVE+_MAX_DIR+_MAX_FNAME+_MAX_EXT) PTDBDIR dirp; @@ -234,6 +237,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) NumFiles = n; return false; } // end of InitFileNames +PRAGMA_REENABLE_CHECK_STACK_FRAME /***********************************************************************/ /* The table column list is the sub-table column list. */ diff --git a/storage/connect/unzip.c b/storage/connect/unzip.c index 90935043..de69f4b6 100644 --- a/storage/connect/unzip.c +++ b/storage/connect/unzip.c @@ -122,7 +122,7 @@ const char unz_copyright[] = " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; -/* unz_file_info_interntal contain internal info about a file in zipfile*/ +/* unz_file_info64_internal contain internal info about a file in zipfile*/ typedef struct unz_file_info64_internal_s { ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ @@ -542,7 +542,7 @@ local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) return 0; - /* number of the disk with the start of the zip64 end of central directory */ + /* number of the disk with the start of the zip64 end of central directory */ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) return 0; if (uL != 0) @@ -590,10 +590,10 @@ local unzFile unzOpenInternal (const void *path, ZPOS64_T central_pos; uLong uL; - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ + uLong number_disk; /* number of the current disk, used for + spanning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the disk with central dir, used + for spanning ZIP, unsupported, always 0*/ ZPOS64_T number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ diff --git a/storage/connect/unzip.h b/storage/connect/unzip.h index 2104e391..ef045109 100644 --- a/storage/connect/unzip.h +++ b/storage/connect/unzip.h @@ -306,7 +306,7 @@ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, Get Info about the current file if pfile_info!=NULL, the *pfile_info structure will contain somes info about the current file - if szFileName!=NULL, the filemane string will be copied in szFileName + if szFileName!=NULL, the filename string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). diff --git a/storage/connect/zip.c b/storage/connect/zip.c index 3d3d4cad..523ea222 100644 --- a/storage/connect/zip.c +++ b/storage/connect/zip.c @@ -575,7 +575,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) return 0; - /* number of the disk with the start of the zip64 end of central directory */ + /* number of the disk with the start of the zip64 end of central directory */ if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) return 0; if (uL != 0) @@ -614,9 +614,9 @@ local int LoadCentralDirectoryRecord(zip64_internal* pziinit) { ZPOS64_T central_pos; uLong uL; - uLong number_disk; /* number of the current dist, used for + uLong number_disk; /* number of the current disk, used for spanning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used + uLong number_disk_with_CD; /* number of the disk with central dir, used for spanning ZIP, unsupported, always 0*/ ZPOS64_T number_entry; ZPOS64_T number_entry_CD; /* total number of entries in @@ -814,71 +814,66 @@ local int LoadCentralDirectoryRecord(zip64_internal* pziinit) { /************************************************************/ extern zipFile ZEXPORT zipOpen3(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) { - zip64_internal ziinit; zip64_internal* zi; int err=ZIP_OK; - ziinit.z_filefunc.zseek32_file = NULL; - ziinit.z_filefunc.ztell32_file = NULL; + if (!(zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)))) + return NULL; + + zi->z_filefunc.zseek32_file = NULL; + zi->z_filefunc.ztell32_file = NULL; if (pzlib_filefunc64_32_def==NULL) - fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64); + fill_fopen64_filefunc(&zi->z_filefunc.zfile_func64); else - ziinit.z_filefunc = *pzlib_filefunc64_32_def; + zi->z_filefunc = *pzlib_filefunc64_32_def; - ziinit.filestream = ZOPEN64(ziinit.z_filefunc, + zi->filestream = ZOPEN64(zi->z_filefunc, pathname, (append == APPEND_STATUS_CREATE) ? (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); - if (ziinit.filestream == NULL) + if (zi->filestream == NULL) + { + free(zi); return NULL; + } if (append == APPEND_STATUS_CREATEAFTER) - ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END); + ZSEEK64(zi->z_filefunc,zi->filestream,0,SEEK_END); - ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream); - ziinit.in_opened_file_inzip = 0; - ziinit.ci.stream_initialised = 0; - ziinit.number_entry = 0; - ziinit.add_position_when_writing_offset = 0; - init_linkedlist(&(ziinit.central_dir)); - - - - zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)); - if (zi==NULL) - { - ZCLOSE64(ziinit.z_filefunc,ziinit.filestream); - return NULL; - } + zi->begin_pos = ZTELL64(zi->z_filefunc,zi->filestream); + zi->in_opened_file_inzip = 0; + zi->ci.stream_initialised = 0; + zi->number_entry = 0; + zi->add_position_when_writing_offset = 0; + init_linkedlist(&(zi->central_dir)); /* now we add file in a zipfile */ # ifndef NO_ADDFILEINEXISTINGZIP - ziinit.globalcomment = NULL; + zi->globalcomment = NULL; if (append == APPEND_STATUS_ADDINZIP) { // Read and Cache Central Directory Records - err = LoadCentralDirectoryRecord(&ziinit); + err = LoadCentralDirectoryRecord(zi); } if (globalcomment) { - *globalcomment = ziinit.globalcomment; + *globalcomment = zi->globalcomment; } # endif /* !NO_ADDFILEINEXISTINGZIP*/ if (err != ZIP_OK) { # ifndef NO_ADDFILEINEXISTINGZIP - free(ziinit.globalcomment); + free(zi->globalcomment); # endif /* !NO_ADDFILEINEXISTINGZIP*/ free(zi); return NULL; } else { - *zi = ziinit; return (zipFile)zi; } } @@ -1027,7 +1022,6 @@ extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, c int err = ZIP_OK; # ifdef NOCRYPT - (crcForCrypting); if (password != NULL) return ZIP_PARAMERROR; # endif @@ -1043,6 +1037,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, c return ZIP_PARAMERROR; #endif + // The filename and comment length must fit in 16 bits. + if ((filename!=NULL) && (strlen(filename)>0xffff)) + return ZIP_PARAMERROR; + if ((comment!=NULL) && (strlen(comment)>0xffff)) + return ZIP_PARAMERROR; + // The extra field length must fit in 16 bits. If the member also requires + // a Zip64 extra block, that will also need to fit within that 16-bit + // length, but that will be checked for later. + if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff)) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; if (zi->in_opened_file_inzip == 1) @@ -1597,7 +1602,7 @@ extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_si if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) { - // we can not write more data to the buffer that we have room for. + // we cannot write more data to the buffer that we have room for. return ZIP_BADZIPFILE; } @@ -1861,7 +1866,7 @@ extern int ZEXPORT zipClose(zipFile file, const char* global_comment) { free_linkedlist(&(zi->central_dir)); pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; - if(pos >= 0xffffffff || zi->number_entry > 0xFFFF) + if(pos >= 0xffffffff || zi->number_entry >= 0xFFFF) { ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); diff --git a/storage/connect/zip.h b/storage/connect/zip.h index 5fc08413..3e230d34 100644 --- a/storage/connect/zip.h +++ b/storage/connect/zip.h @@ -177,9 +177,9 @@ extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, filename : the filename in zip (if NULL, '-' without quote will be used *zipfi contain supplemental information if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local - contains the extrafield data the the local header + contains the extrafield data for the local header if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global - contains the extrafield data the the local header + contains the extrafield data for the global header if comment != NULL, comment contain the comment string method contain the compression method (0 for store, Z_DEFLATED for deflate) level contain the level of compression (can be Z_DEFAULT_COMPRESSION) diff --git a/storage/heap/ha_heap.cc b/storage/heap/ha_heap.cc index 5f7f0c1e..404ad22a 100644 --- a/storage/heap/ha_heap.cc +++ b/storage/heap/ha_heap.cc @@ -440,31 +440,22 @@ int ha_heap::external_lock(THD *thd, int lock_type) SYNOPSIS disable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ disable all non-unique keys - HA_KEY_SWITCH_ALL disable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE dis. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE dis. all keys and make persistent DESCRIPTION - Disable indexes and clear keys to use for scanning. - - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_NONUNIQ_SAVE is not implemented with HEAP. - HA_KEY_SWITCH_ALL_SAVE is not implemented with HEAP. + See handler::ha_disable_indexes() RETURN 0 ok HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_heap::disable_indexes(uint mode) +int ha_heap::disable_indexes(key_map map, bool persist) { int error; - if (mode == HA_KEY_SWITCH_ALL) + if (!persist) { + DBUG_ASSERT(map.is_clear_all()); if (!(error= heap_disable_indexes(file))) set_keys_for_scanning(); } @@ -482,11 +473,6 @@ int ha_heap::disable_indexes(uint mode) SYNOPSIS enable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ enable all non-unique keys - HA_KEY_SWITCH_ALL enable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE en. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE en. all keys and make persistent DESCRIPTION Enable indexes and set keys to use for scanning. @@ -495,10 +481,7 @@ int ha_heap::disable_indexes(uint mode) since the heap storage engine cannot repair the indexes. To be sure, call handler::delete_all_rows() before. - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_NONUNIQ_SAVE is not implemented with HEAP. - HA_KEY_SWITCH_ALL_SAVE is not implemented with HEAP. + See also handler::ha_enable_indexes() RETURN 0 ok @@ -506,12 +489,13 @@ int ha_heap::disable_indexes(uint mode) HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_heap::enable_indexes(uint mode) +int ha_heap::enable_indexes(key_map map, bool persist) { int error; - if (mode == HA_KEY_SWITCH_ALL) + if (!persist) { + DBUG_ASSERT(map.is_prefix(table->s->keys)); if (!(error= heap_enable_indexes(file))) set_keys_for_scanning(); } diff --git a/storage/heap/ha_heap.h b/storage/heap/ha_heap.h index 18e0d1a9..d8636f7f 100644 --- a/storage/heap/ha_heap.h +++ b/storage/heap/ha_heap.h @@ -101,8 +101,8 @@ public: int external_lock(THD *thd, int lock_type); int delete_all_rows(void); int reset_auto_increment(ulonglong value); - int disable_indexes(uint mode); - int enable_indexes(uint mode); + int disable_indexes(key_map map, bool persist); + int enable_indexes(key_map map, bool persist); int indexes_are_disabled(void); ha_rows records_in_range(uint inx, const key_range *start_key, const key_range *end_key, page_range *pages); diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index 32c0a437..b3125ca9 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -48,6 +48,13 @@ IF(UNIX) IF(HAVE_LIBNUMA) LINK_LIBRARIES(numa) ENDIF() + IF(CMAKE_SIZEOF_VOID_P EQUAL 8) + IF(CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch|AARCH|p(ower)?pc|x86_|amd)64") + OPTION(WITH_INNODB_PMEM "Support memory-mapped InnoDB redo log" ON) + ELSE() # Disable by default on ISA that are not covered by our CI + OPTION(WITH_INNODB_PMEM "Support memory-mapped InnoDB redo log" OFF) + ENDIF() + ENDIF() ENDIF() ENDIF() @@ -71,7 +78,7 @@ ADD_FEATURE_INFO(INNODB_ROOT_GUESS WITH_INNODB_ROOT_GUESS OPTION(WITH_INNODB_EXTRA_DEBUG "Enable extra InnoDB debug checks" OFF) IF(WITH_INNODB_EXTRA_DEBUG) - ADD_DEFINITIONS(-DUNIV_ZIP_DEBUG) + ADD_DEFINITIONS(-DUNIV_ZIP_DEBUG -DLOG_LATCH_DEBUG) ENDIF() ADD_FEATURE_INFO(INNODB_EXTRA_DEBUG WITH_INNODB_EXTRA_DEBUG "Extra InnoDB debug checks") @@ -133,7 +140,6 @@ SET(INNOBASE_SOURCES btr/btr0pcur.cc btr/btr0sea.cc btr/btr0defragment.cc - buf/buf0block_hint.cc buf/buf0buddy.cc buf/buf0buf.cc buf/buf0dblwr.cc @@ -428,26 +434,16 @@ SET(INNOBASE_SOURCES ut/ut0vec.cc ut/ut0wqueue.cc) -OPTION(WITH_PMEM "Support redo log in persistent memory" OFF) -FIND_PACKAGE(PMEM) -IF(PMEM_FOUND) - INCLUDE_DIRECTORIES(${PMEM_INCLUDES}) - ADD_COMPILE_FLAGS(log/log0log.cc log/log0recv.cc - buf/buf0flu.cc mtr/mtr0mtr.cc trx/trx0trx.cc srv/srv0start.cc - COMPILE_FLAGS "-DHAVE_PMEM") - SET(PMEM_LIBRARY ${PMEM_LIBRARIES}) -ELSE() - IF(WITH_PMEM) - MESSAGE(FATAL_ERROR "WITH_PMEM=ON cannot be satisfied") - ENDIF() +IF(WITH_INNODB_PMEM) + ADD_DEFINITIONS(-DHAVE_PMEM) + SET(INNOBASE_SOURCES ${INNOBASE_SOURCES} include/cache.h sync/cache.cc) ENDIF() MYSQL_ADD_PLUGIN(innobase ${INNOBASE_SOURCES} STORAGE_ENGINE MODULE_OUTPUT_NAME ha_innodb DEFAULT RECOMPILE_FOR_EMBEDDED LINK_LIBRARIES - ${ZLIB_LIBRARY} - ${PMEM_LIBRARY} + ${ZLIB_LIBRARIES} ${NUMA_LIBRARY} ${LIBSYSTEMD} ${LINKER_SCRIPT}) diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index 705ff035..6b3a3733 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -264,6 +264,8 @@ btr_root_block_get( mtr_t* mtr, /*!< in: mtr */ dberr_t* err) /*!< out: error code */ { + ut_ad(mode != RW_NO_LATCH); + if (!index->table || !index->table->space) { *err= DB_TABLESPACE_NOT_FOUND; @@ -285,13 +287,12 @@ btr_root_block_get( if (UNIV_LIKELY(block != nullptr)) { - if (UNIV_UNLIKELY(mode == RW_NO_LATCH)); - else if (!!page_is_comp(block->page.frame) != - index->table->not_redundant() || - btr_page_get_index_id(block->page.frame) != index->id || - !fil_page_index_page_check(block->page.frame) || - index->is_spatial() != - (fil_page_get_type(block->page.frame) == FIL_PAGE_RTREE)) + if (!!page_is_comp(block->page.frame) != + index->table->not_redundant() || + btr_page_get_index_id(block->page.frame) != index->id || + !fil_page_index_page_check(block->page.frame) || + index->is_spatial() != + (fil_page_get_type(block->page.frame) == FIL_PAGE_RTREE)) { *err= DB_PAGE_CORRUPTED; block= nullptr; @@ -561,13 +562,39 @@ btr_page_alloc_for_ibuf( { buf_page_make_young_if_needed(&new_block->page); *err= flst_remove(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, new_block, - PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, mtr); + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, + fil_system.sys_space->free_limit, mtr); } ut_d(if (*err == DB_SUCCESS) flst_validate(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, mtr)); return new_block; } +static MY_ATTRIBUTE((nonnull, warn_unused_result)) +/** Acquire a latch on the index root page for allocating or freeing pages. +@param index index tree +@param mtr mini-transaction +@param err error code +@return root page +@retval nullptr if an error occurred */ +buf_block_t *btr_root_block_sx(dict_index_t *index, mtr_t *mtr, dberr_t *err) +{ + buf_block_t *root= + mtr->get_already_latched(page_id_t{index->table->space_id, index->page}, + MTR_MEMO_PAGE_SX_FIX); + if (!root) + { + root= btr_root_block_get(index, RW_SX_LATCH, mtr, err); + if (UNIV_UNLIKELY(!root)) + return root; + } +#ifdef BTR_CUR_HASH_ADAPT + else + ut_ad(!root->index || !root->index->freed()); +#endif + return root; +} + /**************************************************************//** Allocates a new file page to be used in an index tree. NOTE: we assume that the caller has made the reservation for free extents! @@ -589,21 +616,9 @@ btr_page_alloc_low( page should be initialized. */ dberr_t* err) /*!< out: error code */ { - const auto savepoint= mtr->get_savepoint(); - buf_block_t *root= btr_root_block_get(index, RW_NO_LATCH, mtr, err); + buf_block_t *root= btr_root_block_sx(index, mtr, err); if (UNIV_UNLIKELY(!root)) return root; - - const bool have_latch= mtr->have_u_or_x_latch(*root); -#ifdef BTR_CUR_HASH_ADAPT - ut_ad(!have_latch || !root->index || !root->index->freed()); -#endif - mtr->rollback_to_savepoint(savepoint); - - if (!have_latch && - UNIV_UNLIKELY(!(root= btr_root_block_get(index, RW_SX_LATCH, mtr, err)))) - return root; - fseg_header_t *seg_header= root->page.frame + (level ? PAGE_HEADER + PAGE_BTR_SEG_TOP : PAGE_HEADER + PAGE_BTR_SEG_LEAF); return fseg_alloc_free_page_general(seg_header, hint_page_no, file_direction, @@ -652,7 +667,8 @@ btr_page_free_for_ibuf( buf_block_t *root= btr_get_latched_root(*index, mtr); dberr_t err= flst_add_first(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, - block, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, mtr); + block, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, + fil_system.sys_space->free_limit, mtr); ut_d(if (err == DB_SUCCESS) flst_validate(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, mtr)); return err; @@ -696,24 +712,16 @@ dberr_t btr_page_free(dict_index_t* index, buf_block_t* block, mtr_t* mtr, fil_space_t *space= index->table->space; dberr_t err; - const auto savepoint= mtr->get_savepoint(); - if (buf_block_t *root= btr_root_block_get(index, RW_NO_LATCH, mtr, &err)) + if (buf_block_t *root= btr_root_block_sx(index, mtr, &err)) { - const bool have_latch= mtr->have_u_or_x_latch(*root); -#ifdef BTR_CUR_HASH_ADAPT - ut_ad(!have_latch || !root->index || !root->index->freed()); -#endif - mtr->rollback_to_savepoint(savepoint); - if (have_latch || - (root= btr_root_block_get(index, RW_SX_LATCH, mtr, &err))) - err= fseg_free_page(&root->page.frame[blob || - page_is_leaf(block->page.frame) - ? PAGE_HEADER + PAGE_BTR_SEG_LEAF - : PAGE_HEADER + PAGE_BTR_SEG_TOP], - space, page, mtr, space_latched); + err= fseg_free_page(&root->page.frame[blob || + page_is_leaf(block->page.frame) + ? PAGE_HEADER + PAGE_BTR_SEG_LEAF + : PAGE_HEADER + PAGE_BTR_SEG_TOP], + space, page, mtr, space_latched); + if (err == DB_SUCCESS) + buf_page_free(space, page, mtr); } - if (err == DB_SUCCESS) - buf_page_free(space, page, mtr); /* The page was marked free in the allocation bitmap, but it should remain exclusively latched until mtr_t::commit() or until it @@ -1291,54 +1299,71 @@ btr_read_autoinc(dict_index_t* index) return autoinc; } -/** Read the last used AUTO_INCREMENT value from PAGE_ROOT_AUTO_INC, -or fall back to MAX(auto_increment_column). -@param[in] table table containing an AUTO_INCREMENT column -@param[in] col_no index of the AUTO_INCREMENT column -@return the AUTO_INCREMENT value -@retval 0 on error or if no AUTO_INCREMENT value was used yet */ -ib_uint64_t -btr_read_autoinc_with_fallback(const dict_table_t* table, unsigned col_no) +dict_index_t *dict_table_t::get_index(const dict_col_t &col) const { - ut_ad(table->persistent_autoinc); - ut_ad(!table->is_temporary()); + dict_index_t *index= dict_table_get_first_index(this); - dict_index_t* index = dict_table_get_first_index(table); + while (index && (index->fields[0].col != &col || index->is_corrupted())) + index= dict_table_get_next_index(index); - if (index == NULL) { - return 0; - } + return index; +} - mtr_t mtr; - mtr.start(); - buf_block_t* block = buf_page_get( - page_id_t(index->table->space_id, index->page), - index->table->space->zip_size(), - RW_S_LATCH, &mtr); - - ib_uint64_t autoinc = block - ? page_get_autoinc(block->page.frame) : 0; - const bool retry = block && autoinc == 0 - && !page_is_empty(block->page.frame); - mtr.commit(); +/** Read the last used AUTO_INCREMENT value from PAGE_ROOT_AUTO_INC, +or fall back to MAX(auto_increment_column). +@param table table containing an AUTO_INCREMENT column +@param col_no index of the AUTO_INCREMENT column +@param mysql_version TABLE_SHARE::mysql_version +@param max the maximum value of the AUTO_INCREMENT column +@return the AUTO_INCREMENT value +@retval 0 on error or if no AUTO_INCREMENT value was used yet */ +uint64_t btr_read_autoinc_with_fallback(const dict_table_t *table, + unsigned col_no, ulong mysql_version, + uint64_t max) +{ + ut_ad(table->persistent_autoinc); + ut_ad(!table->is_temporary()); - if (retry) { - /* This should be an old data file where - PAGE_ROOT_AUTO_INC was initialized to 0. - Fall back to reading MAX(autoinc_col). - There should be an index on it. */ - const dict_col_t* autoinc_col - = dict_table_get_nth_col(table, col_no); - while (index && index->fields[0].col != autoinc_col) { - index = dict_table_get_next_index(index); - } + uint64_t autoinc= 0; + mtr_t mtr; + mtr.start(); - if (index) { - autoinc = row_search_max_autoinc(index); - } - } + if (buf_block_t *block= + buf_page_get(page_id_t(table->space_id, + dict_table_get_first_index(table)->page), + table->space->zip_size(), RW_SX_LATCH, &mtr)) + { + autoinc= page_get_autoinc(block->page.frame); - return autoinc; + if (autoinc > 0 && autoinc <= max && mysql_version >= 100210); + else if (dict_index_t *index= + table->get_index(*dict_table_get_nth_col(table, col_no))) + { + /* Read MAX(autoinc_col), in case this table had originally been + created before MariaDB 10.2.4 introduced persistent AUTO_INCREMENT + and MariaDB 10.2.10 fixed MDEV-12123, and there could be a garbage + value in the PAGE_ROOT_AUTO_INC field. */ + const uint64_t max_autoinc= row_search_max_autoinc(index); + const bool need_adjust{autoinc > max || autoinc < max_autoinc}; + ut_ad(max_autoinc <= max); + + if (UNIV_UNLIKELY(need_adjust) && !high_level_read_only && !opt_readonly) + { + sql_print_information("InnoDB: Resetting PAGE_ROOT_AUTO_INC from " + UINT64PF " to " UINT64PF + " on table %`.*s.%`s (created with version %lu)", + autoinc, max_autoinc, + int(table->name.dblen()), table->name.m_name, + table->name.basename(), mysql_version); + autoinc= max_autoinc; + index->set_modified(mtr); + page_set_autoinc(block, max_autoinc, &mtr, true); + } + } + } + + mtr.commit(); + return autoinc; } /** Write the next available AUTO_INCREMENT value to PAGE_ROOT_AUTO_INC. diff --git a/storage/innobase/btr/btr0bulk.cc b/storage/innobase/btr/btr0bulk.cc index 5bf68c58..e2513ad6 100644 --- a/storage/innobase/btr/btr0bulk.cc +++ b/storage/innobase/btr/btr0bulk.cc @@ -837,7 +837,7 @@ PageBulk::release() m_block->page.fix(); /* No other threads can modify this block. */ - m_modify_clock = buf_block_get_modify_clock(m_block); + m_modify_clock = m_block->modify_clock; m_mtr.commit(); } diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index 46afb73b..2fc05b06 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -817,7 +817,7 @@ static ulint btr_node_ptr_max_size(const dict_index_t* index) /* Determine the maximum length of the index field. */ field_max_size = dict_col_get_fixed_size(col, comp); - if (field_max_size) { + if (field_max_size && field->fixed_len) { /* dict_index_add_col() should guarantee this */ ut_ad(!field->prefix_len || field->fixed_len == field->prefix_len); @@ -935,7 +935,7 @@ static inline page_cur_mode_t btr_cur_nonleaf_mode(page_cur_mode_t mode) return PAGE_CUR_LE; } -static MY_ATTRIBUTE((nonnull)) +MY_ATTRIBUTE((nonnull,warn_unused_result)) /** Acquire a latch on the previous page without violating the latching order. @param block index page @param page_id page identifier with valid space identifier @@ -946,8 +946,9 @@ static MY_ATTRIBUTE((nonnull)) @retval 0 if an error occurred @retval 1 if the page could be latched in the wrong order @retval -1 if the latch on block was temporarily released */ -int btr_latch_prev(buf_block_t *block, page_id_t page_id, ulint zip_size, - rw_lock_type_t rw_latch, mtr_t *mtr, dberr_t *err) +static int btr_latch_prev(buf_block_t *block, page_id_t page_id, + ulint zip_size, + rw_lock_type_t rw_latch, mtr_t *mtr, dberr_t *err) { ut_ad(rw_latch == RW_S_LATCH || rw_latch == RW_X_LATCH); ut_ad(page_id.space() == block->page.id().space()); @@ -955,47 +956,80 @@ int btr_latch_prev(buf_block_t *block, page_id_t page_id, ulint zip_size, const auto prev_savepoint= mtr->get_savepoint(); ut_ad(block == mtr->at_savepoint(prev_savepoint - 1)); - page_id.set_page_no(btr_page_get_prev(block->page.frame)); + const page_t *const page= block->page.frame; + page_id.set_page_no(btr_page_get_prev(page)); + /* We are holding a latch on the current page. + + We will start by buffer-fixing the left sibling. Waiting for a latch + on it while holding a latch on the current page could lead to a + deadlock, because another thread could hold that latch and wait for + a right sibling page latch (the current page). + + If there is a conflict, we will temporarily release our latch on the + current block while waiting for a latch on the left sibling. The + buffer-fixes on both blocks will prevent eviction. */ + + retry: buf_block_t *prev= buf_page_get_gen(page_id, zip_size, RW_NO_LATCH, nullptr, BUF_GET, mtr, err, false); if (UNIV_UNLIKELY(!prev)) return 0; int ret= 1; - if (UNIV_UNLIKELY(rw_latch == RW_S_LATCH)) + static_assert(MTR_MEMO_PAGE_S_FIX == mtr_memo_type_t(BTR_SEARCH_LEAF), ""); + static_assert(MTR_MEMO_PAGE_X_FIX == mtr_memo_type_t(BTR_MODIFY_LEAF), ""); + + if (rw_latch == RW_S_LATCH + ? prev->page.lock.s_lock_try() : prev->page.lock.x_lock_try()) { - if (UNIV_LIKELY(prev->page.lock.s_lock_try())) + mtr->lock_register(prev_savepoint, mtr_memo_type_t(rw_latch)); + if (UNIV_UNLIKELY(prev->page.id() != page_id)) { - mtr->lock_register(prev_savepoint, MTR_MEMO_PAGE_S_FIX); - goto prev_latched; + fail: + /* the page was just read and found to be corrupted */ + mtr->rollback_to_savepoint(prev_savepoint); + return 0; } - block->page.lock.s_unlock(); } else { - if (UNIV_LIKELY(prev->page.lock.x_lock_try())) + ut_ad(mtr->at_savepoint(mtr->get_savepoint() - 1)->page.id() == page_id); + mtr->release_last_page(); + if (rw_latch == RW_S_LATCH) + block->page.lock.s_unlock(); + else + block->page.lock.x_unlock(); + + prev= buf_page_get_gen(page_id, zip_size, rw_latch, prev, + BUF_GET, mtr, err); + if (rw_latch == RW_S_LATCH) + block->page.lock.s_lock(); + else + block->page.lock.x_lock(); + + const page_id_t prev_page_id= page_id; + page_id.set_page_no(btr_page_get_prev(page)); + + if (UNIV_UNLIKELY(page_id != prev_page_id)) { - mtr->lock_register(prev_savepoint, MTR_MEMO_PAGE_X_FIX); - goto prev_latched; + mtr->release_last_page(); + if (page_id.page_no() == FIL_NULL) + return -1; + goto retry; } - block->page.lock.x_unlock(); + + if (UNIV_UNLIKELY(!prev)) + goto fail; + + ret= -1; } - ret= -1; - mtr->lock_register(prev_savepoint - 1, MTR_MEMO_BUF_FIX); - mtr->rollback_to_savepoint(prev_savepoint); - prev= buf_page_get_gen(page_id, zip_size, rw_latch, prev, - BUF_GET, mtr, err, false); - if (UNIV_UNLIKELY(!prev)) - return 0; - mtr->upgrade_buffer_fix(prev_savepoint - 1, rw_latch); - - prev_latched: - if (memcmp_aligned<2>(FIL_PAGE_TYPE + prev->page.frame, - FIL_PAGE_TYPE + block->page.frame, 2) || - memcmp_aligned<2>(PAGE_HEADER + PAGE_INDEX_ID + prev->page.frame, - PAGE_HEADER + PAGE_INDEX_ID + block->page.frame, 8) || - page_is_comp(prev->page.frame) != page_is_comp(block->page.frame)) + const page_t *const p= prev->page.frame; + if (memcmp_aligned<4>(FIL_PAGE_NEXT + p, FIL_PAGE_OFFSET + page, 4) || + memcmp_aligned<2>(FIL_PAGE_TYPE + p, FIL_PAGE_TYPE + page, 2) || + memcmp_aligned<2>(PAGE_HEADER + PAGE_INDEX_ID + p, + PAGE_HEADER + PAGE_INDEX_ID + page, 8) || + page_is_comp(p) != page_is_comp(page)) { ut_ad("corrupted" == 0); // FIXME: remove this *err= DB_CORRUPTION; @@ -6092,7 +6126,6 @@ btr_store_big_rec_extern_fields( for (ulint blob_npages = 0;; ++blob_npages) { buf_block_t* block; const ulint commit_freq = 4; - uint32_t r_extents; ut_ad(page_align(field_ref) == page_align(rec)); @@ -6127,22 +6160,14 @@ btr_store_big_rec_extern_fields( hint_prev = rec_block->page.id().page_no(); } - error = fsp_reserve_free_extents( - &r_extents, index->table->space, 1, - FSP_BLOB, &mtr, 1); - if (UNIV_UNLIKELY(error != DB_SUCCESS)) { -alloc_fail: - mtr.commit(); - goto func_exit; - } - block = btr_page_alloc(index, hint_prev + 1, FSP_NO_DIR, 0, &mtr, &mtr, &error); - index->table->space->release_free_extents(r_extents); if (!block) { - goto alloc_fail; +alloc_fail: + mtr.commit(); + goto func_exit; } const uint32_t space_id = block->page.id().space(); diff --git a/storage/innobase/btr/btr0pcur.cc b/storage/innobase/btr/btr0pcur.cc index 2131fb94..de0f9e93 100644 --- a/storage/innobase/btr/btr0pcur.cc +++ b/storage/innobase/btr/btr0pcur.cc @@ -179,10 +179,8 @@ before_first: cursor->old_n_fields, &cursor->old_rec_buf, &cursor->buf_size); - cursor->block_when_stored.store(block); - - /* Function try to check if block is S/X latch. */ - cursor->modify_clock = buf_block_get_modify_clock(block); + cursor->old_page_id = block->page.id(); + cursor->modify_clock = block->modify_clock; } /**************************************************************//** @@ -214,101 +212,80 @@ btr_pcur_copy_stored_position( } /** Optimistically latches the leaf page or pages requested. -@param[in] block guessed buffer block -@param[in,out] pcur cursor -@param[in,out] latch_mode BTR_SEARCH_LEAF, ... -@param[in,out] mtr mini-transaction -@return true if success */ +@param pcur persistent cursor +@param latch_mode BTR_SEARCH_LEAF, ... +@param mtr mini-transaction +@return true on success */ TRANSACTIONAL_TARGET -static bool btr_pcur_optimistic_latch_leaves(buf_block_t *block, - btr_pcur_t *pcur, +static bool btr_pcur_optimistic_latch_leaves(btr_pcur_t *pcur, btr_latch_mode *latch_mode, mtr_t *mtr) { - ut_ad(block->page.buf_fix_count()); - ut_ad(block->page.in_file()); - ut_ad(block->page.frame); - static_assert(BTR_SEARCH_PREV & BTR_SEARCH_LEAF, ""); static_assert(BTR_MODIFY_PREV & BTR_MODIFY_LEAF, ""); static_assert((BTR_SEARCH_PREV ^ BTR_MODIFY_PREV) == (RW_S_LATCH ^ RW_X_LATCH), ""); + buf_block_t *const block= + buf_page_optimistic_fix(pcur->btr_cur.page_cur.block, pcur->old_page_id); + + if (!block) + return false; + + if (*latch_mode == BTR_SEARCH_LEAF || *latch_mode == BTR_MODIFY_LEAF) + return buf_page_optimistic_get(block, rw_lock_type_t(*latch_mode), + pcur->modify_clock, mtr); + + ut_ad(*latch_mode == BTR_SEARCH_PREV || *latch_mode == BTR_MODIFY_PREV); const rw_lock_type_t mode= rw_lock_type_t(*latch_mode & (RW_X_LATCH | RW_S_LATCH)); - switch (*latch_mode) { - default: - ut_ad(*latch_mode == BTR_SEARCH_LEAF || *latch_mode == BTR_MODIFY_LEAF); - return buf_page_optimistic_get(mode, block, pcur->modify_clock, mtr); - case BTR_SEARCH_PREV: - case BTR_MODIFY_PREV: - page_id_t id{0}; - uint32_t left_page_no; - ulint zip_size; - buf_block_t *left_block= nullptr; - { - transactional_shared_lock_guard g{block->page.lock}; - if (block->modify_clock != pcur->modify_clock) - return false; - id= block->page.id(); - zip_size= block->zip_size(); - left_page_no= btr_page_get_prev(block->page.frame); - } - - if (left_page_no != FIL_NULL) - { - left_block= - buf_page_get_gen(page_id_t(id.space(), left_page_no), zip_size, - mode, nullptr, BUF_GET_POSSIBLY_FREED, mtr); - - if (!left_block); - else if (btr_page_get_next(left_block->page.frame) != id.page_no()) - { -release_left_block: - mtr->release_last_page(); - return false; - } - else - buf_page_make_young_if_needed(&left_block->page); - } - - if (buf_page_optimistic_get(mode, block, pcur->modify_clock, mtr)) - { - if (btr_page_get_prev(block->page.frame) == left_page_no) - { - /* block was already buffer-fixed while entering the function and - buf_page_optimistic_get() buffer-fixes it again. */ - ut_ad(2 <= block->page.buf_fix_count()); - *latch_mode= btr_latch_mode(mode); - return true; - } - - mtr->release_last_page(); - } - - ut_ad(block->page.buf_fix_count()); - if (left_block) - goto release_left_block; - return false; + uint64_t modify_clock; + uint32_t left_page_no; + const page_t *const page= block->page.frame; + { + transactional_shared_lock_guard g{block->page.lock}; + modify_clock= block->modify_clock; + left_page_no= btr_page_get_prev(page); } -} -/** Structure acts as functor to do the latching of leaf pages. -It returns true if latching of leaf pages succeeded and false -otherwise. */ -struct optimistic_latch_leaves -{ - btr_pcur_t *const cursor; - btr_latch_mode *const latch_mode; - mtr_t *const mtr; + const auto savepoint= mtr->get_savepoint(); + mtr->memo_push(block, MTR_MEMO_BUF_FIX); - bool operator()(buf_block_t *hint) const + if (UNIV_UNLIKELY(modify_clock != pcur->modify_clock)) { - return hint && - btr_pcur_optimistic_latch_leaves(hint, cursor, latch_mode, mtr); + fail: + mtr->rollback_to_savepoint(savepoint); + return false; + } + + buf_block_t *prev; + if (left_page_no != FIL_NULL) + { + prev= buf_page_get_gen(page_id_t(pcur->old_page_id.space(), + left_page_no), block->zip_size(), + mode, nullptr, BUF_GET_POSSIBLY_FREED, mtr); + if (!prev || + page_is_comp(prev->page.frame) != page_is_comp(block->page.frame) || + memcmp_aligned<2>(block->page.frame, prev->page.frame, 2) || + memcmp_aligned<2>(block->page.frame + PAGE_HEADER + PAGE_INDEX_ID, + prev->page.frame + PAGE_HEADER + PAGE_INDEX_ID, 8)) + goto fail; } -}; + else + prev= nullptr; + + mtr->upgrade_buffer_fix(savepoint, mode); + + if (UNIV_UNLIKELY(block->modify_clock != modify_clock) || + UNIV_UNLIKELY(block->page.is_freed()) || + (prev && + memcmp_aligned<4>(FIL_PAGE_NEXT + prev->page.frame, + FIL_PAGE_OFFSET + page, 4))) + goto fail; + + return true; +} /** Restores the stored position of a persistent cursor bufferfixing the page and obtaining the specified latches. If the cursor position @@ -331,6 +308,7 @@ btr_pcur_t::SAME_UNIQ cursor position is on user rec and points on the record with the same unique field values as in the stored record, btr_pcur_t::NOT_SAME cursor position is not on user rec or points on the record with not the samebuniq field values as in the stored */ +TRANSACTIONAL_TARGET btr_pcur_t::restore_status btr_pcur_t::restore_position(btr_latch_mode restore_latch_mode, mtr_t *mtr) { @@ -361,7 +339,6 @@ btr_pcur_t::restore_position(btr_latch_mode restore_latch_mode, mtr_t *mtr) latch_mode = BTR_LATCH_MODE_WITHOUT_INTENTION(restore_latch_mode); pos_state = BTR_PCUR_IS_POSITIONED; - block_when_stored.clear(); return restore_status::NOT_SAME; } @@ -378,9 +355,8 @@ btr_pcur_t::restore_position(btr_latch_mode restore_latch_mode, mtr_t *mtr) case BTR_SEARCH_PREV: case BTR_MODIFY_PREV: /* Try optimistic restoration. */ - if (block_when_stored.run_with_hint( - optimistic_latch_leaves{this, &restore_latch_mode, - mtr})) { + if (btr_pcur_optimistic_latch_leaves(this, &restore_latch_mode, + mtr)) { pos_state = BTR_PCUR_IS_POSITIONED; latch_mode = restore_latch_mode; @@ -485,16 +461,22 @@ btr_pcur_t::restore_position(btr_latch_mode restore_latch_mode, mtr_t *mtr) since the cursor can now be on a different page! But we can retain the value of old_rec */ - block_when_stored.store(btr_pcur_get_block(this)); - modify_clock= buf_block_get_modify_clock( - block_when_stored.block()); + old_page_id = btr_cur.page_cur.block->page.id(); + modify_clock = btr_cur.page_cur.block->modify_clock; mem_heap_free(heap); return restore_status::SAME_ALL; } - if (n_matched_fields >= index->n_uniq) - ret_val= restore_status::SAME_UNIQ; + if (n_matched_fields >= index->n_uniq + /* Unique indexes can contain "NULL" keys, and if all + unique fields are NULL and not all tuple + fields match to record fields, then treat it as if + restored cursor position points to the record with + not the same unique key. */ + && !(index->n_nullable + && dtuple_contains_null(tuple, index->n_uniq))) + ret_val= restore_status::SAME_UNIQ; } mem_heap_free(heap); @@ -612,40 +594,33 @@ btr_pcur_move_backward_from_page( return true; } - buf_block_t* block = btr_pcur_get_block(cursor); - - if (page_has_prev(block->page.frame)) { - buf_block_t* left_block - = mtr->at_savepoint(mtr->get_savepoint() - 1); - const page_t* const left = left_block->page.frame; - if (memcmp_aligned<4>(left + FIL_PAGE_NEXT, - block->page.frame - + FIL_PAGE_OFFSET, 4)) { - /* This should be the right sibling page, or - if there is none, the current block. */ - ut_ad(left_block == block - || !memcmp_aligned<4>(left + FIL_PAGE_PREV, - block->page.frame - + FIL_PAGE_OFFSET, 4)); - /* The previous one must be the left sibling. */ - left_block - = mtr->at_savepoint(mtr->get_savepoint() - 2); - ut_ad(!memcmp_aligned<4>(left_block->page.frame - + FIL_PAGE_NEXT, - block->page.frame - + FIL_PAGE_OFFSET, 4)); - } + buf_block_t* block = mtr->at_savepoint(0); + ut_ad(block == btr_pcur_get_block(cursor)); + const page_t* const page = block->page.frame; + /* btr_pcur_optimistic_latch_leaves() will acquire a latch on + the preceding page if one exists; + if that fails, btr_cur_t::search_leaf() invoked by + btr_pcur_open_with_no_init() will also acquire a latch on the + succeeding page. Our caller only needs one page latch. */ + ut_ad(mtr->get_savepoint() <= 3); + + if (page_has_prev(page)) { + buf_block_t* const left_block = mtr->at_savepoint(1); + ut_ad(!memcmp_aligned<4>(page + FIL_PAGE_OFFSET, + left_block->page.frame + + FIL_PAGE_NEXT, 4)); if (btr_pcur_is_before_first_on_page(cursor)) { + /* Reposition on the previous page. */ page_cur_set_after_last(left_block, &cursor->btr_cur.page_cur); /* Release the right sibling. */ - } else { - /* Release the left sibling. */ + mtr->rollback_to_savepoint(0, 1); block = left_block; } - mtr->release(*block); } + mtr->rollback_to_savepoint(1); + ut_ad(block == mtr->at_savepoint(0)); cursor->latch_mode = latch_mode; cursor->old_rec = nullptr; return false; diff --git a/storage/innobase/buf/buf0block_hint.cc b/storage/innobase/buf/buf0block_hint.cc deleted file mode 100644 index 6bd01faa..00000000 --- a/storage/innobase/buf/buf0block_hint.cc +++ /dev/null @@ -1,59 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2020, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2020, 2021, MariaDB Corporation. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License, version 2.0, as published by the -Free Software Foundation. - -This program is also distributed with certain software (including but not -limited to OpenSSL) that is licensed under separate terms, as designated in a -particular file or component or in included license documentation. The authors -of MySQL hereby grant you an additional permission to link the program and -your derivative works with the separately licensed software that they have -included with MySQL. - -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, version 2.0, -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., -51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*****************************************************************************/ - -#include "buf0block_hint.h" -namespace buf { - -TRANSACTIONAL_TARGET -void Block_hint::buffer_fix_block_if_still_valid() -{ - /* To check if m_block belongs to the current buf_pool, we must - prevent freeing memory while we check, and until we buffer-fix the - block. For this purpose it is enough to latch any of the many - latches taken by buf_pool_t::resize(). - - Similar to buf_page_optimistic_get(), we must validate - m_block->page.id() after acquiring the hash_lock, because the object - may have been freed and not actually attached to buf_pool.page_hash - at the moment. (The block could have been reused to store a - different page, and that slice of buf_pool.page_hash could be protected - by another hash_lock that we are not holding.) - - Finally, we must ensure that the block is not being freed. */ - if (m_block) - { - auto &cell= buf_pool.page_hash.cell_get(m_page_id.fold()); - transactional_shared_lock_guard g - {buf_pool.page_hash.lock_get(cell)}; - if (buf_pool.is_uncompressed(m_block) && m_page_id == m_block->page.id() && - m_block->page.frame && m_block->page.in_file()) - m_block->page.fix(); - else - clear(); - } -} -} // namespace buf diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 23b5b776..49f73105 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -77,6 +77,8 @@ struct set_numa_interleave_t if (srv_numa_interleave) { struct bitmask *numa_mems_allowed = numa_get_mems_allowed(); + MEM_MAKE_DEFINED(numa_mems_allowed, + sizeof *numa_mems_allowed); ib::info() << "Setting NUMA memory policy to" " MPOL_INTERLEAVE"; if (set_mempolicy(MPOL_INTERLEAVE, @@ -1062,6 +1064,7 @@ inline bool buf_pool_t::chunk_t::create(size_t bytes) if (srv_numa_interleave) { struct bitmask *numa_mems_allowed= numa_get_mems_allowed(); + MEM_MAKE_DEFINED(numa_mems_allowed, sizeof *numa_mems_allowed); if (mbind(mem, mem_size(), MPOL_INTERLEAVE, numa_mems_allowed->maskp, numa_mems_allowed->size, MPOL_MF_MOVE)) @@ -1591,17 +1594,14 @@ inline bool buf_pool_t::withdraw_blocks() /* reserve free_list length */ if (UT_LIST_GET_LEN(withdraw) < withdraw_target) { - buf_flush_LRU( - std::max(withdraw_target - - UT_LIST_GET_LEN(withdraw), - srv_LRU_scan_depth), - true); - mysql_mutex_unlock(&buf_pool.mutex); - buf_dblwr.flush_buffered_writes(); - mysql_mutex_lock(&buf_pool.flush_list_mutex); - buf_flush_wait_LRU_batch_end(); - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - mysql_mutex_lock(&buf_pool.mutex); + try_LRU_scan = false; + mysql_mutex_unlock(&mutex); + mysql_mutex_lock(&flush_list_mutex); + page_cleaner_wakeup(true); + my_cond_wait(&done_flush_list, + &flush_list_mutex.m_mutex); + mysql_mutex_unlock(&flush_list_mutex); + mysql_mutex_lock(&mutex); } /* relocate blocks/buddies in withdrawn area */ @@ -2298,7 +2298,10 @@ buf_page_t *buf_pool_t::watch_set(const page_id_t id, got_block: bpage->fix(); if (watch_is_sentinel(*bpage)) + { + ut_ad(!bpage->oldest_modification()); bpage= nullptr; + } page_hash.lock_get(chain).unlock(); return bpage; } @@ -2370,6 +2373,7 @@ void buf_pool_t::watch_unset(const page_id_t id, buf_pool_t::hash_chain &chain) } else { + ut_ad(!w->oldest_modification()); const auto state= w->state(); ut_ad(~buf_page_t::LRU_MASK & state); ut_ad(state >= buf_page_t::UNFIXED + 1); @@ -2856,9 +2860,10 @@ got_block_fixed: if (state > buf_page_t::READ_FIX && state < buf_page_t::WRITE_FIX) { if (mode == BUF_PEEK_IF_IN_POOL) { ignore_block: + block->unfix(); +ignore_unfixed: ut_ad(mode == BUF_GET_POSSIBLY_FREED || mode == BUF_PEEK_IF_IN_POOL); - block->unfix(); if (err) { *err = DB_CORRUPTION; } @@ -2872,16 +2877,32 @@ ignore_block: in buf_page_t::read_complete() or buf_pool_t::corrupted_evict(), or after buf_zip_decompress() in this function. */ - block->page.lock.s_lock(); + if (rw_latch != RW_NO_LATCH) { + block->page.lock.s_lock(); + } else if (!block->page.lock.s_lock_try()) { + /* For RW_NO_LATCH, we should not try to acquire S or X + latch directly as we could be violating the latching + order resulting in deadlock. Instead we try latching the + page and retry in case of a failure. */ + goto wait_for_read; + } state = block->page.state(); ut_ad(state < buf_page_t::READ_FIX || state >= buf_page_t::WRITE_FIX); const page_id_t id{block->page.id()}; block->page.lock.s_unlock(); - if (UNIV_UNLIKELY(id != page_id)) { + if (UNIV_UNLIKELY(state < buf_page_t::UNFIXED)) { + if (UNIV_UNLIKELY(id == page_id)) { + /* The page read was completed, and + another thread marked the page as free + while we were waiting. */ + goto ignore_block; + } + ut_ad(id == page_id_t{~0ULL}); block->page.unfix(); + if (++retries < BUF_PAGE_READ_MAX_RETRIES) { goto loop; } @@ -2892,6 +2913,7 @@ ignore_block: return nullptr; } + ut_ad(id == page_id); } else if (mode != BUF_PEEK_IF_IN_POOL) { } else if (!mtr) { ut_ad(!block->page.oldest_modification()); @@ -2918,6 +2940,7 @@ free_unfixed_block: if (UNIV_UNLIKELY(!block->page.frame)) { if (!block->page.lock.x_lock_try()) { wait_for_unzip: +wait_for_read: /* The page is being read or written, or another thread is executing buf_zip_decompress() in buf_page_get_low() on it. */ @@ -3098,83 +3121,72 @@ re_evict_fail: #endif /* UNIV_DEBUG */ ut_ad(block->page.frame); + /* The state = block->page.state() may be stale at this point, + and in fact, at any point of time if we consider its + buffer-fix component. If the block is being read into the + buffer pool, it is possible that buf_page_t::read_complete() + will invoke buf_pool_t::corrupted_evict() and therefore + invalidate it (invoke buf_page_t::set_corrupt_id() and set the + state to FREED). Therefore, after acquiring the page latch we + must recheck the state. */ + if (state >= buf_page_t::UNFIXED && allow_ibuf_merge && fil_page_get_type(block->page.frame) == FIL_PAGE_INDEX && page_is_leaf(block->page.frame)) { block->page.lock.x_lock(); - ut_ad(block->page.id() == page_id - || (state >= buf_page_t::READ_FIX - && state < buf_page_t::WRITE_FIX)); - -#ifdef BTR_CUR_HASH_ADAPT - btr_search_drop_page_hash_index(block, true); -#endif /* BTR_CUR_HASH_ADAPT */ - - dberr_t e; - - if (UNIV_UNLIKELY(block->page.id() != page_id)) { -page_id_mismatch: - state = block->page.state(); - e = DB_CORRUPTION; -ibuf_merge_corrupted: - if (err) { - *err = e; - } - - if (block->page.id().is_corrupted()) { - buf_pool.corrupted_evict(&block->page, state); - } - return nullptr; - } - state = block->page.state(); ut_ad(state < buf_page_t::READ_FIX); if (state >= buf_page_t::IBUF_EXIST && state < buf_page_t::REINIT) { block->page.clear_ibuf_exist(); - e = ibuf_merge_or_delete_for_page(block, page_id, - block->zip_size()); - if (UNIV_UNLIKELY(e != DB_SUCCESS)) { - goto ibuf_merge_corrupted; + if (dberr_t local_err = + ibuf_merge_or_delete_for_page(block, page_id, + block->zip_size())) { + if (err) { + *err = local_err; + } + goto release_and_ignore_block; } + } else if (state < buf_page_t::UNFIXED) { +release_and_ignore_block: + block->page.lock.x_unlock(); + goto ignore_block; } - if (rw_latch == RW_X_LATCH) { - goto get_latch_valid; - } else { +#ifdef BTR_CUR_HASH_ADAPT + btr_search_drop_page_hash_index(block, true); +#endif /* BTR_CUR_HASH_ADAPT */ + + switch (rw_latch) { + case RW_NO_LATCH: + block->page.lock.x_unlock(); + break; + case RW_S_LATCH: block->page.lock.x_unlock(); - goto get_latch; + block->page.lock.s_lock(); + break; + case RW_SX_LATCH: + block->page.lock.x_u_downgrade(); + break; + default: + ut_ad(rw_latch == RW_X_LATCH); } + + mtr->memo_push(block, mtr_memo_type_t(rw_latch)); } else { -get_latch: switch (rw_latch) { case RW_NO_LATCH: mtr->memo_push(block, MTR_MEMO_BUF_FIX); return block; case RW_S_LATCH: block->page.lock.s_lock(); - ut_ad(!block->page.is_read_fixed()); - if (UNIV_UNLIKELY(block->page.id() != page_id)) { - block->page.lock.s_unlock(); - block->page.lock.x_lock(); - goto page_id_mismatch; - } -get_latch_valid: - mtr->memo_push(block, mtr_memo_type_t(rw_latch)); -#ifdef BTR_CUR_HASH_ADAPT - btr_search_drop_page_hash_index(block, true); -#endif /* BTR_CUR_HASH_ADAPT */ break; case RW_SX_LATCH: block->page.lock.u_lock(); ut_ad(!block->page.is_io_fixed()); - if (UNIV_UNLIKELY(block->page.id() != page_id)) { - block->page.lock.u_x_upgrade(); - goto page_id_mismatch; - } - goto get_latch_valid; + break; default: ut_ad(rw_latch == RW_X_LATCH); if (block->page.lock.x_lock_upgraded()) { @@ -3183,17 +3195,26 @@ get_latch_valid: mtr->page_lock_upgrade(*block); return block; } - if (UNIV_UNLIKELY(block->page.id() != page_id)) { - goto page_id_mismatch; - } - goto get_latch_valid; } - ut_ad(page_id_t(page_get_space_id(block->page.frame), - page_get_page_no(block->page.frame)) - == page_id); + mtr->memo_push(block, mtr_memo_type_t(rw_latch)); + state = block->page.state(); + + if (UNIV_UNLIKELY(state < buf_page_t::UNFIXED)) { + mtr->release_last_page(); + goto ignore_unfixed; + } + + ut_ad(state < buf_page_t::READ_FIX + || state > buf_page_t::WRITE_FIX); + +#ifdef BTR_CUR_HASH_ADAPT + btr_search_drop_page_hash_index(block, true); +#endif /* BTR_CUR_HASH_ADAPT */ } + ut_ad(page_id_t(page_get_space_id(block->page.frame), + page_get_page_no(block->page.frame)) == page_id); return block; } @@ -3289,83 +3310,76 @@ buf_page_get_gen( return block; } -/********************************************************************//** -This is the general function used to get optimistic access to a database -page. -@return TRUE if success */ TRANSACTIONAL_TARGET -bool buf_page_optimistic_get(ulint rw_latch, buf_block_t *block, - uint64_t modify_clock, mtr_t *mtr) +buf_block_t *buf_page_optimistic_fix(buf_block_t *block, page_id_t id) +{ + buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(id.fold()); + transactional_shared_lock_guard g + {buf_pool.page_hash.lock_get(chain)}; + if (UNIV_UNLIKELY(!buf_pool.is_uncompressed(block) || + id != block->page.id() || !block->page.frame)) + return nullptr; + const auto state= block->page.state(); + if (UNIV_UNLIKELY(state < buf_page_t::UNFIXED || + state >= buf_page_t::READ_FIX)) + return nullptr; + block->page.fix(); + return block; +} + +buf_block_t *buf_page_optimistic_get(buf_block_t *block, + rw_lock_type_t rw_latch, + uint64_t modify_clock, mtr_t *mtr) { - ut_ad(block); - ut_ad(mtr); ut_ad(mtr->is_active()); ut_ad(rw_latch == RW_S_LATCH || rw_latch == RW_X_LATCH); + ut_ad(block->page.buf_fix_count()); - if (have_transactional_memory); - else if (UNIV_UNLIKELY(!block->page.frame)) - return false; - else + if (rw_latch == RW_S_LATCH) { - const auto state= block->page.state(); - if (UNIV_UNLIKELY(state < buf_page_t::UNFIXED || - state >= buf_page_t::READ_FIX)) - return false; - } + if (!block->page.lock.s_lock_try()) + { + fail: + block->page.unfix(); + return nullptr; + } - bool success; - const page_id_t id{block->page.id()}; - buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(id.fold()); - bool have_u_not_x= false; + ut_ad(!ibuf_inside(mtr) || + ibuf_page(block->page.id(), block->zip_size(), nullptr)); - { - transactional_shared_lock_guard g - {buf_pool.page_hash.lock_get(chain)}; - if (UNIV_UNLIKELY(id != block->page.id() || !block->page.frame)) - return false; - const auto state= block->page.state(); - if (UNIV_UNLIKELY(state < buf_page_t::UNFIXED || - state >= buf_page_t::READ_FIX)) - return false; - - if (rw_latch == RW_S_LATCH) - success= block->page.lock.s_lock_try(); - else + if (modify_clock != block->modify_clock || block->page.is_freed()) { - have_u_not_x= block->page.lock.have_u_not_x(); - success= have_u_not_x || block->page.lock.x_lock_try(); + block->page.lock.s_unlock(); + goto fail; } - } - if (!success) - return false; - - if (have_u_not_x) + ut_ad(!block->page.is_read_fixed()); + buf_page_make_young_if_needed(&block->page); + mtr->memo_push(block, MTR_MEMO_PAGE_S_FIX); + } + else if (block->page.lock.have_u_not_x()) { block->page.lock.u_x_upgrade(); + block->page.unfix(); mtr->page_lock_upgrade(*block); - ut_ad(id == block->page.id()); ut_ad(modify_clock == block->modify_clock); } + else if (!block->page.lock.x_lock_try()) + goto fail; else { - ut_ad(rw_latch == RW_S_LATCH || !block->page.is_io_fixed()); - ut_ad(id == block->page.id()); - ut_ad(!ibuf_inside(mtr) || ibuf_page(id, block->zip_size(), nullptr)); + ut_ad(!block->page.is_io_fixed()); + ut_ad(!ibuf_inside(mtr) || + ibuf_page(block->page.id(), block->zip_size(), nullptr)); if (modify_clock != block->modify_clock || block->page.is_freed()) { - if (rw_latch == RW_S_LATCH) - block->page.lock.s_unlock(); - else - block->page.lock.x_unlock(); - return false; + block->page.lock.x_unlock(); + goto fail; } - block->page.fix(); - ut_ad(!block->page.is_read_fixed()); buf_page_make_young_if_needed(&block->page); - mtr->memo_push(block, mtr_memo_type_t(rw_latch)); + mtr->memo_push(block, MTR_MEMO_PAGE_X_FIX); } ut_d(if (!(++buf_dbg_counter % 5771)) buf_pool.validate()); @@ -3375,7 +3389,7 @@ bool buf_page_optimistic_get(ulint rw_latch, buf_block_t *block, ut_ad(~buf_page_t::LRU_MASK & state); ut_ad(block->page.frame); - return true; + return block; } /** Try to S-latch a page. diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index d4628985..d364be31 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -274,30 +274,22 @@ buf_flush_relocate_on_flush_list( ut_d(buf_flush_validate_low()); } -/** Note that a block is no longer dirty, while not removing -it from buf_pool.flush_list -@param temporary whether the page belongs to the temporary tablespace -@param error whether an error may have occurred while writing */ -inline void buf_page_t::write_complete(bool temporary, bool error) +void buf_page_t::write_complete(bool persistent, bool error, uint32_t state) { - ut_ad(temporary == fsp_is_system_temporary(id().space())); - if (UNIV_UNLIKELY(error)); - else if (temporary) - { - ut_ad(oldest_modification() == 2); - oldest_modification_= 0; - } - else + ut_ad(!persistent == fsp_is_system_temporary(id().space())); + ut_ad(state >= WRITE_FIX); + + if (UNIV_LIKELY(!error)) { + ut_d(lsn_t om= oldest_modification()); + ut_ad(om >= 2); + ut_ad(persistent == (om > 2)); /* We use release memory order to guarantee that callers of oldest_modification_acquire() will observe the block as being detached from buf_pool.flush_list, after reading the value 0. */ - ut_ad(oldest_modification() > 2); - oldest_modification_.store(1, std::memory_order_release); + oldest_modification_.store(persistent, std::memory_order_release); } - const auto s= state(); - ut_ad(s >= WRITE_FIX); - zip.fix.fetch_sub((s >= WRITE_FIX_REINIT) + zip.fix.fetch_sub((state >= WRITE_FIX_REINIT) ? (WRITE_FIX_REINIT - UNFIXED) : (WRITE_FIX - UNFIXED)); lock.u_unlock(true); @@ -311,18 +303,10 @@ inline void buf_pool_t::n_flush_inc() inline void buf_pool_t::n_flush_dec() { - mysql_mutex_lock(&flush_list_mutex); + mysql_mutex_assert_owner(&flush_list_mutex); ut_ad(page_cleaner_status >= LRU_FLUSH); if ((page_cleaner_status-= LRU_FLUSH) < LRU_FLUSH) pthread_cond_broadcast(&done_flush_LRU); - mysql_mutex_unlock(&flush_list_mutex); -} - -inline void buf_pool_t::n_flush_dec_holding_mutex() -{ - mysql_mutex_assert_owner(&flush_list_mutex); - ut_ad(page_cleaner_status >= LRU_FLUSH); - page_cleaner_status-= LRU_FLUSH; } /** Complete write of a file page from buf_pool. @@ -352,28 +336,26 @@ void buf_page_write_complete(const IORequest &request, bool error) mysql_mutex_assert_not_owner(&buf_pool.mutex); mysql_mutex_assert_not_owner(&buf_pool.flush_list_mutex); - if (request.is_LRU()) + const bool persistent= bpage->oldest_modification() != 2; + + if (UNIV_UNLIKELY(!persistent) && UNIV_LIKELY(!error)) { - const bool temp= bpage->oldest_modification() == 2; - if (!temp && state < buf_page_t::WRITE_FIX_REINIT && - request.node->space->use_doublewrite()) - buf_dblwr.write_completed(); /* We must hold buf_pool.mutex while releasing the block, so that no other thread can access it before we have freed it. */ mysql_mutex_lock(&buf_pool.mutex); - bpage->write_complete(temp, error); - if (!error) - buf_LRU_free_page(bpage, true); + bpage->write_complete(persistent, error, state); + buf_LRU_free_page(bpage, true); mysql_mutex_unlock(&buf_pool.mutex); - - buf_pool.n_flush_dec(); } else { + bpage->write_complete(persistent, error, state); if (state < buf_page_t::WRITE_FIX_REINIT && request.node->space->use_doublewrite()) + { + ut_ad(persistent); buf_dblwr.write_completed(); - bpage->write_complete(false, error); + } } } @@ -740,17 +722,15 @@ ATTRIBUTE_COLD void buf_pool_t::release_freed_page(buf_page_t *bpage) noexcept } /** Write a flushable page to a file or free a freeable block. -@param evict whether to evict the page on write completion @param space tablespace @return whether a page write was initiated and buf_pool.mutex released */ -bool buf_page_t::flush(bool evict, fil_space_t *space) +bool buf_page_t::flush(fil_space_t *space) { mysql_mutex_assert_not_owner(&buf_pool.flush_list_mutex); ut_ad(in_file()); ut_ad(in_LRU_list); ut_ad((space->purpose == FIL_TYPE_TEMPORARY) == (space == fil_system.temp_space)); - ut_ad(evict || space != fil_system.temp_space); ut_ad(space->referenced()); const auto s= state(); @@ -797,22 +777,11 @@ bool buf_page_t::flush(bool evict, fil_space_t *space) mysql_mutex_unlock(&buf_pool.mutex); IORequest::Type type= IORequest::WRITE_ASYNC; - if (UNIV_UNLIKELY(evict)) - { - type= IORequest::WRITE_LRU; - mysql_mutex_lock(&buf_pool.flush_list_mutex); - buf_pool.n_flush_inc(); - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - } /* Apart from the U-lock, this block will also be protected by is_write_fixed() and oldest_modification()>1. Thus, it cannot be relocated or removed. */ - DBUG_PRINT("ib_buf", ("%s %u page %u:%u", - evict ? "LRU" : "flush_list", - id().space(), id().page_no())); - buf_block_t *block= reinterpret_cast(this); page_t *write_frame= zip.data; @@ -864,10 +833,7 @@ bool buf_page_t::flush(bool evict, fil_space_t *space) { switch (space->chain.start->punch_hole) { case 1: - static_assert(IORequest::PUNCH_LRU - IORequest::PUNCH == - IORequest::WRITE_LRU - IORequest::WRITE_ASYNC, ""); - type= - IORequest::Type(type + (IORequest::PUNCH - IORequest::WRITE_ASYNC)); + type= IORequest::PUNCH; break; case 2: size= orig_size; @@ -894,10 +860,8 @@ bool buf_page_t::flush(bool evict, fil_space_t *space) /** Check whether a page can be flushed from the buf_pool. @param id page identifier @param fold id.fold() -@param evict true=buf_pool.LRU; false=buf_pool.flush_list @return whether the page can be flushed */ -static bool buf_flush_check_neighbor(const page_id_t id, ulint fold, - bool evict) +static bool buf_flush_check_neighbor(const page_id_t id, ulint fold) { mysql_mutex_assert_owner(&buf_pool.mutex); ut_ad(fold == id.fold()); @@ -906,26 +870,16 @@ static bool buf_flush_check_neighbor(const page_id_t id, ulint fold, const buf_page_t *bpage= buf_pool.page_hash.get(id, buf_pool.page_hash.cell_get(fold)); - if (!bpage || buf_pool.watch_is_sentinel(*bpage)) - return false; - - /* We avoid flushing 'non-old' blocks in an eviction flush, because the - flushed blocks are soon freed */ - if (evict && !bpage->is_old()) - return false; - - return bpage->oldest_modification() > 1 && !bpage->is_io_fixed(); + return bpage && bpage->oldest_modification() > 1 && !bpage->is_io_fixed(); } /** Check which neighbors of a page can be flushed from the buf_pool. @param space tablespace @param id page identifier of a dirty page @param contiguous whether to consider contiguous areas of pages -@param evict true=buf_pool.LRU; false=buf_pool.flush_list @return last page number that can be flushed */ static page_id_t buf_flush_check_neighbors(const fil_space_t &space, - page_id_t &id, bool contiguous, - bool evict) + page_id_t &id, bool contiguous) { ut_ad(id.page_no() < space.size + (space.physical_size() == 2048 ? 1 @@ -958,7 +912,7 @@ static page_id_t buf_flush_check_neighbors(const fil_space_t &space, for (page_id_t i= id - 1;; --i) { fold--; - if (!buf_flush_check_neighbor(i, fold, evict)) + if (!buf_flush_check_neighbor(i, fold)) { low= i + 1; break; @@ -974,7 +928,7 @@ static page_id_t buf_flush_check_neighbors(const fil_space_t &space, while (++i < high) { ++fold; - if (!buf_flush_check_neighbor(i, fold, evict)) + if (!buf_flush_check_neighbor(i, fold)) break; } @@ -1051,14 +1005,13 @@ and also write zeroes or punch the hole for the freed ranges of pages. @param page_id page identifier @param bpage buffer page @param contiguous whether to consider contiguous areas of pages -@param evict true=buf_pool.LRU; false=buf_pool.flush_list @param n_flushed number of pages flushed so far in this batch @param n_to_flush maximum number of pages we are allowed to flush @return number of pages flushed */ static ulint buf_flush_try_neighbors(fil_space_t *space, const page_id_t page_id, buf_page_t *bpage, - bool contiguous, bool evict, + bool contiguous, ulint n_flushed, ulint n_to_flush) { ut_ad(space->id == page_id.space()); @@ -1072,7 +1025,7 @@ static ulint buf_flush_try_neighbors(fil_space_t *space, ut_ad(lsn >= bpage->oldest_modification()); if (UNIV_UNLIKELY(lsn < space->get_create_lsn())) { - ut_a(!bpage->flush(evict, space)); + ut_a(!bpage->flush(space)); mysql_mutex_unlock(&buf_pool.mutex); return 0; } @@ -1082,7 +1035,7 @@ static ulint buf_flush_try_neighbors(fil_space_t *space, ulint count= 0; page_id_t id= page_id; - page_id_t high= buf_flush_check_neighbors(*space, id, contiguous, evict); + page_id_t high= buf_flush_check_neighbors(*space, id, contiguous); ut_ad(page_id >= id); ut_ad(page_id < high); @@ -1119,7 +1072,7 @@ static ulint buf_flush_try_neighbors(fil_space_t *space, ut_ad(!buf_pool.watch_is_sentinel(*b)); ut_ad(b->oldest_modification() > 1); flush: - if (b->flush(evict, space)) + if (b->flush(space)) { ++count; continue; @@ -1127,9 +1080,10 @@ static ulint buf_flush_try_neighbors(fil_space_t *space, } /* We avoid flushing 'non-old' blocks in an eviction flush, because the flushed blocks are soon freed */ - else if ((!evict || b->is_old()) && !buf_pool.watch_is_sentinel(*b) && - b->oldest_modification() > 1 && b->lock.u_lock_try(true)) + else if (b->oldest_modification() > 1 && b->lock.u_lock_try(true)) { + /* For the buf_pool.watch[] sentinels, oldest_modification() == 0 */ + ut_ad(!buf_pool.watch_is_sentinel(*b)); if (b->oldest_modification() < 2) b->lock.u_unlock(true); else @@ -1251,10 +1205,8 @@ static void buf_flush_discard_page(buf_page_t *bpage) /** Flush dirty blocks from the end buf_pool.LRU, and move clean blocks to buf_pool.free. @param max maximum number of blocks to flush -@param evict whether dirty pages are to be evicted after flushing them @param n counts of flushed and evicted pages */ -static void buf_flush_LRU_list_batch(ulint max, bool evict, - flush_counters_t *n) +static void buf_flush_LRU_list_batch(ulint max, flush_counters_t *n) { ulint scanned= 0; ulint free_limit= srv_LRU_scan_depth; @@ -1302,8 +1254,12 @@ static void buf_flush_LRU_list_batch(ulint max, bool evict, if (state < buf_page_t::READ_FIX && bpage->lock.u_lock_try(true)) { ut_ad(!bpage->is_io_fixed()); - bool do_evict= evict; switch (bpage->oldest_modification()) { + case 2: + /* LRU flushing will always evict pages of the temporary tablespace, + in buf_page_write_complete(). */ + ++n->evicted; + break; case 1: mysql_mutex_lock(&buf_pool.flush_list_mutex); if (ut_d(lsn_t lsn=) bpage->oldest_modification()) @@ -1316,12 +1272,8 @@ static void buf_flush_LRU_list_batch(ulint max, bool evict, case 0: bpage->lock.u_unlock(true); goto evict; - case 2: - /* LRU flushing will always evict pages of the temporary tablespace. */ - do_evict= true; } - /* Block is ready for flush. Dispatch an IO request. - If do_evict, the page may be evicted by buf_page_write_complete(). */ + /* Block is ready for flush. Dispatch an IO request. */ const page_id_t page_id(bpage->id()); const uint32_t space_id= page_id.space(); if (!space || space->id != space_id) @@ -1356,6 +1308,7 @@ static void buf_flush_LRU_list_batch(ulint max, bool evict, no_space: mysql_mutex_lock(&buf_pool.flush_list_mutex); buf_flush_discard_page(bpage); + ++n->evicted; continue; } @@ -1368,8 +1321,8 @@ static void buf_flush_LRU_list_batch(ulint max, bool evict, if (neighbors && space->is_rotational()) n->flushed+= buf_flush_try_neighbors(space, page_id, bpage, neighbors == 1, - do_evict, n->flushed, max); - else if (bpage->flush(do_evict, space)) + n->flushed, max); + else if (bpage->flush(space)) ++n->flushed; else continue; @@ -1387,24 +1340,25 @@ static void buf_flush_LRU_list_batch(ulint max, bool evict, space->release(); if (scanned) + { MONITOR_INC_VALUE_CUMULATIVE(MONITOR_LRU_BATCH_SCANNED, MONITOR_LRU_BATCH_SCANNED_NUM_CALL, MONITOR_LRU_BATCH_SCANNED_PER_CALL, scanned); + } } /** Flush and move pages from LRU or unzip_LRU list to the free list. Whether LRU or unzip_LRU is used depends on the state of the system. @param max maximum number of blocks to flush -@param evict whether dirty pages are to be evicted after flushing them @param n counts of flushed and evicted pages */ -static void buf_do_LRU_batch(ulint max, bool evict, flush_counters_t *n) +static void buf_do_LRU_batch(ulint max, flush_counters_t *n) { if (buf_LRU_evict_from_unzip_LRU()) buf_free_from_unzip_LRU_list_batch(); n->evicted= 0; n->flushed= 0; - buf_flush_LRU_list_batch(max, evict, n); + buf_flush_LRU_list_batch(max, n); mysql_mutex_assert_owner(&buf_pool.mutex); buf_lru_freed_page_count+= n->evicted; @@ -1516,8 +1470,8 @@ static ulint buf_do_flush_list_batch(ulint max_n, lsn_t lsn) { if (neighbors && space->is_rotational()) count+= buf_flush_try_neighbors(space, page_id, bpage, - neighbors == 1, false, count, max_n); - else if (bpage->flush(false, space)) + neighbors == 1, count, max_n); + else if (bpage->flush(space)) ++count; else continue; @@ -1536,10 +1490,13 @@ static ulint buf_do_flush_list_batch(ulint max_n, lsn_t lsn) space->release(); if (scanned) + { MONITOR_INC_VALUE_CUMULATIVE(MONITOR_FLUSH_BATCH_SCANNED, MONITOR_FLUSH_BATCH_SCANNED_NUM_CALL, MONITOR_FLUSH_BATCH_SCANNED_PER_CALL, scanned); + } + return count; } @@ -1683,7 +1640,7 @@ bool buf_flush_list_space(fil_space_t *space, ulint *n_flushed) goto was_freed; } mysql_mutex_unlock(&buf_pool.flush_list_mutex); - if (bpage->flush(false, space)) + if (bpage->flush(space)) { ++n_flush; if (!--max_n_flush) @@ -1741,27 +1698,22 @@ and move clean blocks to buf_pool.free. The caller must invoke buf_dblwr.flush_buffered_writes() after releasing buf_pool.mutex. @param max_n wished maximum mumber of blocks flushed -@param evict whether to evict pages after flushing -@return evict ? number of processed pages : number of pages written */ -ulint buf_flush_LRU(ulint max_n, bool evict) +@return number of pages written */ +static ulint buf_flush_LRU(ulint max_n) { mysql_mutex_assert_owner(&buf_pool.mutex); flush_counters_t n; - buf_do_LRU_batch(max_n, evict, &n); + buf_do_LRU_batch(max_n, &n); ulint pages= n.flushed; if (n.evicted) { - if (evict) - pages+= n.evicted; buf_pool.try_LRU_scan= true; pthread_cond_broadcast(&buf_pool.done_free); } - else if (!pages && !buf_pool.try_LRU_scan && - !buf_pool.LRU_warned.test_and_set(std::memory_order_acquire)) - { + else if (!pages && !buf_pool.try_LRU_scan) /* For example, with the minimum innodb_buffer_pool_size=5M and the default innodb_page_size=16k there are only a little over 316 pages in the buffer pool. The buffer pool can easily be exhausted @@ -1775,18 +1727,13 @@ ulint buf_flush_LRU(ulint max_n, bool evict) (3) This thread is the only one that could make progress, but we fail to do so because all the pages that we scanned are buffer-fixed or latched by some thread. */ - sql_print_warning("InnoDB: Could not free any blocks in the buffer pool!" - " %zu blocks are in use and %zu free." - " Consider increasing innodb_buffer_pool_size.", - UT_LIST_GET_LEN(buf_pool.LRU), - UT_LIST_GET_LEN(buf_pool.free)); - } + buf_pool.LRU_warn(); return pages; } #ifdef HAVE_PMEM -# include +# include "cache.h" #endif /** Write checkpoint information to the log header and release mutex. @@ -1900,8 +1847,7 @@ inline void log_t::write_checkpoint(lsn_t end_lsn) noexcept ut_ad(!log.is_opened()); bool success; log.m_file= - os_file_create_func(get_log_file_path().c_str(), - OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT, + os_file_create_func(get_log_file_path().c_str(), OS_FILE_OPEN, OS_FILE_NORMAL, OS_LOG_FILE, false, &success); ut_a(success); ut_a(log.is_opened()); @@ -1916,7 +1862,7 @@ inline void log_t::write_checkpoint(lsn_t end_lsn) noexcept { my_munmap(buf, file_size); buf= resize_buf; - buf_free= START_OFFSET + (get_lsn() - resizing); + set_buf_free(START_OFFSET + (get_lsn() - resizing)); } else #endif @@ -1958,9 +1904,7 @@ inline void log_t::write_checkpoint(lsn_t end_lsn) noexcept static bool log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn) { ut_ad(!srv_read_only_mode); -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); ut_ad(oldest_lsn <= end_lsn); ut_ad(end_lsn == log_sys.get_lsn()); @@ -2327,7 +2271,7 @@ func_exit: sum_pages += last_pages_in; - const ulint time_elapsed = std::max(curr_time - prev_time, 1); + const ulint time_elapsed = std::max(ulint(curr_time - prev_time), 1); /* We update our variables every innodb_flushing_avg_loops iterations to smooth out transition in workload. */ @@ -2541,26 +2485,16 @@ static void buf_flush_page_cleaner() { buf_pool.page_cleaner_set_idle(false); buf_pool.n_flush_inc(); - /* Remove clean blocks from buf_pool.flush_list before the LRU scan. */ - for (buf_page_t *p= UT_LIST_GET_FIRST(buf_pool.flush_list); p; ) - { - const lsn_t lsn{p->oldest_modification()}; - ut_ad(lsn > 2 || lsn == 1); - buf_page_t *n= UT_LIST_GET_NEXT(list, p); - if (lsn <= 1) - buf_pool.delete_from_flush_list(p); - p= n; - } mysql_mutex_unlock(&buf_pool.flush_list_mutex); n= srv_max_io_capacity; mysql_mutex_lock(&buf_pool.mutex); LRU_flush: - n= buf_flush_LRU(n, false); + n= buf_flush_LRU(n); mysql_mutex_unlock(&buf_pool.mutex); last_pages+= n; check_oldest_and_set_idle: mysql_mutex_lock(&buf_pool.flush_list_mutex); - buf_pool.n_flush_dec_holding_mutex(); + buf_pool.n_flush_dec(); oldest_lsn= buf_pool.get_oldest_modification(0); if (!oldest_lsn) goto fully_unemployed; @@ -2693,6 +2627,16 @@ static void buf_flush_page_cleaner() #endif } +ATTRIBUTE_COLD void buf_pool_t::LRU_warn() +{ + mysql_mutex_assert_owner(&mutex); + if (!LRU_warned.test_and_set(std::memory_order_acquire)) + sql_print_warning("InnoDB: Could not free any blocks in the buffer pool!" + " %zu blocks are in use and %zu free." + " Consider increasing innodb_buffer_pool_size.", + UT_LIST_GET_LEN(LRU), UT_LIST_GET_LEN(free)); +} + /** Initialize page_cleaner. */ ATTRIBUTE_COLD void buf_flush_page_cleaner_init() { diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index 2a8d6ff2..33d01b6b 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.cc @@ -385,142 +385,76 @@ we put it to free list to be used. @return the free control block, in state BUF_BLOCK_MEMORY */ buf_block_t *buf_LRU_get_free_block(bool have_mutex) { - ulint n_iterations = 0; - ulint flush_failures = 0; - MONITOR_INC(MONITOR_LRU_GET_FREE_SEARCH); - if (have_mutex) { - mysql_mutex_assert_owner(&buf_pool.mutex); - goto got_mutex; - } - DBUG_EXECUTE_IF("recv_ran_out_of_buffer", - if (recv_recovery_is_on() - && recv_sys.apply_log_recs) { - mysql_mutex_lock(&buf_pool.mutex); - goto flush_lru; - }); -get_mutex: - mysql_mutex_lock(&buf_pool.mutex); -got_mutex: - buf_LRU_check_size_of_non_data_objects(); - buf_block_t* block; + bool waited= false; + MONITOR_INC(MONITOR_LRU_GET_FREE_SEARCH); + if (!have_mutex) + mysql_mutex_lock(&buf_pool.mutex); + + buf_LRU_check_size_of_non_data_objects(); - IF_DBUG(static bool buf_lru_free_blocks_error_printed,); - DBUG_EXECUTE_IF("ib_lru_force_no_free_page", - if (!buf_lru_free_blocks_error_printed) { - n_iterations = 21; - goto not_found;}); + buf_block_t *block; retry: - /* If there is a block in the free list, take it */ - if ((block = buf_LRU_get_free_only()) != nullptr) { + /* If there is a block in the free list, take it */ + block= buf_LRU_get_free_only(); + if (block) + { got_block: - const ulint LRU_size = UT_LIST_GET_LEN(buf_pool.LRU); - const ulint available = UT_LIST_GET_LEN(buf_pool.free); - const ulint scan_depth = srv_LRU_scan_depth / 2; - ut_ad(LRU_size <= BUF_LRU_MIN_LEN || available >= scan_depth - || buf_pool.need_LRU_eviction()); - - if (!have_mutex) { - mysql_mutex_unlock(&buf_pool.mutex); - } - - if (UNIV_UNLIKELY(available < scan_depth) - && LRU_size > BUF_LRU_MIN_LEN) { - mysql_mutex_lock(&buf_pool.flush_list_mutex); - if (!buf_pool.page_cleaner_active()) { - buf_pool.page_cleaner_wakeup(true); - } - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - } - - block->page.zip.clear(); - return block; - } + const ulint LRU_size= UT_LIST_GET_LEN(buf_pool.LRU); + const ulint available= UT_LIST_GET_LEN(buf_pool.free); + const ulint scan_depth= srv_LRU_scan_depth / 2; + ut_ad(LRU_size <= BUF_LRU_MIN_LEN || + available >= scan_depth || buf_pool.need_LRU_eviction()); - MONITOR_INC( MONITOR_LRU_GET_FREE_LOOPS ); - if (n_iterations || buf_pool.try_LRU_scan) { - /* If no block was in the free list, search from the - end of the LRU list and try to free a block there. - If we are doing for the first time we'll scan only - tail of the LRU list otherwise we scan the whole LRU - list. */ - if (buf_LRU_scan_and_free_block(n_iterations - ? ULINT_UNDEFINED : 100)) { - goto retry; - } + if (UNIV_UNLIKELY(available < scan_depth) && LRU_size > BUF_LRU_MIN_LEN) + { + mysql_mutex_lock(&buf_pool.flush_list_mutex); + if (!buf_pool.page_cleaner_active()) + buf_pool.page_cleaner_wakeup(true); + mysql_mutex_unlock(&buf_pool.flush_list_mutex); + } - /* Tell other threads that there is no point - in scanning the LRU list. */ - buf_pool.try_LRU_scan = false; - } + if (!have_mutex) + mysql_mutex_unlock(&buf_pool.mutex); - for (;;) { - if ((block = buf_LRU_get_free_only()) != nullptr) { - goto got_block; - } - const bool wake = buf_pool.need_LRU_eviction(); - mysql_mutex_unlock(&buf_pool.mutex); - mysql_mutex_lock(&buf_pool.flush_list_mutex); - const auto n_flush = buf_pool.n_flush(); - if (wake && !buf_pool.page_cleaner_active()) { - buf_pool.page_cleaner_wakeup(true); - } - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - mysql_mutex_lock(&buf_pool.mutex); - if (!n_flush) { - goto not_found; - } - if (!buf_pool.try_LRU_scan) { - my_cond_wait(&buf_pool.done_free, - &buf_pool.mutex.m_mutex); - } - } - -not_found: - if (n_iterations > 1) { - MONITOR_INC( MONITOR_LRU_GET_FREE_WAITS ); - } + block->page.zip.clear(); + return block; + } - if (n_iterations == 21 - && srv_buf_pool_old_size == srv_buf_pool_size - && buf_pool.LRU_warned.test_and_set(std::memory_order_acquire)) { - IF_DBUG(buf_lru_free_blocks_error_printed = true,); - mysql_mutex_unlock(&buf_pool.mutex); - ib::warn() << "Difficult to find free blocks in the buffer pool" - " (" << n_iterations << " search iterations)! " - << flush_failures << " failed attempts to" - " flush a page!" - " Consider increasing innodb_buffer_pool_size." - " Pending flushes (fsync): " - << fil_n_pending_tablespace_flushes - << ". " << os_n_file_reads << " OS file reads, " - << os_n_file_writes << " OS file writes, " - << os_n_fsyncs - << " OS fsyncs."; - mysql_mutex_lock(&buf_pool.mutex); - } + MONITOR_INC(MONITOR_LRU_GET_FREE_LOOPS); + if (waited || buf_pool.try_LRU_scan) + { + /* If no block was in the free list, search from the end of the + LRU list and try to free a block there. If we are doing for the + first time we'll scan only tail of the LRU list otherwise we scan + the whole LRU list. */ + if (buf_LRU_scan_and_free_block(waited ? ULINT_UNDEFINED : 100)) + goto retry; + + /* Tell other threads that there is no point in scanning the LRU + list. */ + buf_pool.try_LRU_scan= false; + } - /* No free block was found: try to flush the LRU list. - The freed blocks will be up for grabs for all threads. + waited= true; - TODO: A more elegant way would have been to return one freed - up block to the caller here but the code that deals with - removing the block from buf_pool.page_hash and buf_pool.LRU is fairly - involved (particularly in case of ROW_FORMAT=COMPRESSED pages). We - can do that in a separate patch sometime in future. */ -#ifndef DBUG_OFF -flush_lru: -#endif - if (!buf_flush_LRU(innodb_lru_flush_size, true)) { - MONITOR_INC(MONITOR_LRU_SINGLE_FLUSH_FAILURE_COUNT); - ++flush_failures; - } + while (!(block= buf_LRU_get_free_only())) + { + buf_pool.stat.LRU_waits++; + + timespec abstime; + set_timespec(abstime, 1); + + mysql_mutex_lock(&buf_pool.flush_list_mutex); + if (!buf_pool.page_cleaner_active()) + buf_pool.page_cleaner_wakeup(true); + mysql_mutex_unlock(&buf_pool.flush_list_mutex); + if (my_cond_timedwait(&buf_pool.done_free, &buf_pool.mutex.m_mutex, + &abstime)) + buf_pool.LRU_warn(); + } - n_iterations++; - buf_pool.stat.LRU_waits++; - mysql_mutex_unlock(&buf_pool.mutex); - buf_dblwr.flush_buffered_writes(); - goto get_mutex; + goto got_block; } /** Move the LRU_old pointer so that the length of the old blocks list diff --git a/storage/innobase/buf/buf0rea.cc b/storage/innobase/buf/buf0rea.cc index 9041c6a2..76a5e710 100644 --- a/storage/innobase/buf/buf0rea.cc +++ b/storage/innobase/buf/buf0rea.cc @@ -575,7 +575,7 @@ fail: hash_lock.lock_shared(); const buf_page_t* bpage= buf_pool.page_hash.get(i, chain); - if (!bpage) + if (!bpage || buf_pool.watch_is_sentinel(*bpage)) { hash_lock.unlock_shared(); if (i == page_id) diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc index 5d3cab17..a1295c33 100644 --- a/storage/innobase/dict/dict0dict.cc +++ b/storage/innobase/dict/dict0dict.cc @@ -657,47 +657,22 @@ dict_table_t::parse_name<>(char(&)[NAME_LEN + 1], char(&)[NAME_LEN + 1], /** Acquire MDL shared for the table name. @tparam trylock whether to use non-blocking operation @param[in,out] table table object -@param[in,out] thd background thread -@param[out] mdl mdl ticket +@param[in,out] mdl_context MDL context +@param[out] mdl MDL ticket @param[in] table_op operation to perform when opening @return table object after locking MDL shared @retval nullptr if the table is not readable, or if trylock && MDL blocked */ template +__attribute__((nonnull, warn_unused_result)) dict_table_t* dict_acquire_mdl_shared(dict_table_t *table, - THD *thd, - MDL_ticket **mdl, + MDL_context *mdl_context, MDL_ticket **mdl, dict_table_op_t table_op) { - if (!table || !mdl) - return table; - - MDL_context *mdl_context= static_cast(thd_mdl_context(thd)); - size_t db_len; - dict_table_t *not_found= nullptr; - - if (trylock) - { - dict_sys.freeze(SRW_LOCK_CALL); - db_len= dict_get_db_name_len(table->name.m_name); - dict_sys.unfreeze(); - } - else - { - ut_ad(dict_sys.frozen_not_locked()); - db_len= dict_get_db_name_len(table->name.m_name); - } - - if (db_len == 0) - return table; /* InnoDB system tables are not covered by MDL */ - - if (!mdl_context) - return nullptr; - table_id_t table_id= table->id; char db_buf[NAME_LEN + 1], db_buf1[NAME_LEN + 1]; char tbl_buf[NAME_LEN + 1], tbl_buf1[NAME_LEN + 1]; - size_t tbl_len; + size_t db_len, tbl_len; bool unaccessible= false; if (!table->parse_name(db_buf, tbl_buf, &db_len, &tbl_len)) @@ -768,7 +743,6 @@ retry: if (!table || !table->is_accessible()) { - table= nullptr; return_without_mdl: if (trylock) dict_sys.unfreeze(); @@ -777,7 +751,7 @@ return_without_mdl: mdl_context->release_lock(*mdl); *mdl= nullptr; } - return not_found; + return nullptr; } size_t db1_len, tbl1_len; @@ -814,6 +788,50 @@ return_without_mdl: goto retry; } +template dict_table_t* dict_acquire_mdl_shared +(dict_table_t*,MDL_context*,MDL_ticket**,dict_table_op_t); + +/** Acquire MDL shared for the table name. +@tparam trylock whether to use non-blocking operation +@param[in,out] table table object +@param[in,out] thd background thread +@param[out] mdl mdl ticket +@param[in] table_op operation to perform when opening +@return table object after locking MDL shared +@retval nullptr if the table is not readable, or if trylock && MDL blocked */ +template +dict_table_t* +dict_acquire_mdl_shared(dict_table_t *table, + THD *thd, + MDL_ticket **mdl, + dict_table_op_t table_op) +{ + if (!table || !mdl) + return table; + + MDL_context *mdl_context= static_cast(thd_mdl_context(thd)); + size_t db_len; + + if (trylock) + { + dict_sys.freeze(SRW_LOCK_CALL); + db_len= dict_get_db_name_len(table->name.m_name); + dict_sys.unfreeze(); + } + else + { + ut_ad(dict_sys.frozen_not_locked()); + db_len= dict_get_db_name_len(table->name.m_name); + } + + if (db_len == 0) + return table; /* InnoDB system tables are not covered by MDL */ + + return mdl_context + ? dict_acquire_mdl_shared(table, mdl_context, mdl, table_op) + : nullptr; +} + template dict_table_t* dict_acquire_mdl_shared (dict_table_t*,THD*,MDL_ticket**,dict_table_op_t); template dict_table_t* dict_acquire_mdl_shared @@ -960,9 +978,6 @@ void dict_sys_t::lock_wait(SRW_LOCK_ARGS(const char *file, unsigned line)) { latch.wr_lock(SRW_LOCK_ARGS(file, line)); latch_ex_wait_start.store(0, std::memory_order_relaxed); - ut_ad(!latch_readers); - ut_ad(!latch_ex); - ut_d(latch_ex= pthread_self()); return; } @@ -978,35 +993,36 @@ void dict_sys_t::lock_wait(SRW_LOCK_ARGS(const char *file, unsigned line)) ib::warn() << "A long wait (" << waited << " seconds) was observed for dict_sys.latch"; latch.wr_lock(SRW_LOCK_ARGS(file, line)); - ut_ad(!latch_readers); - ut_ad(!latch_ex); - ut_d(latch_ex= pthread_self()); } #ifdef UNIV_PFS_RWLOCK ATTRIBUTE_NOINLINE void dict_sys_t::unlock() { - ut_ad(latch_ex == pthread_self()); - ut_ad(!latch_readers); - ut_d(latch_ex= 0); latch.wr_unlock(); } ATTRIBUTE_NOINLINE void dict_sys_t::freeze(const char *file, unsigned line) { latch.rd_lock(file, line); - ut_ad(!latch_ex); - ut_d(latch_readers++); } ATTRIBUTE_NOINLINE void dict_sys_t::unfreeze() { - ut_ad(!latch_ex); - ut_ad(latch_readers--); latch.rd_unlock(); } #endif /* UNIV_PFS_RWLOCK */ +/** Report an error about failing to open a table. +@param name table name */ +static void dict_table_open_failed(const table_name_t &name) +{ + my_printf_error(ER_TABLE_CORRUPT, + "Table %`.*s.%`s is corrupted." + " Please drop the table and recreate.", + MYF(ME_ERROR_LOG), + int(name.dblen()), name.m_name, name.basename()); +} + /**********************************************************************//** Returns a table object and increments its open handle count. NOTE! This is a high-level function to be used mainly from outside the @@ -1039,18 +1055,20 @@ dict_table_open_on_name( if (!(ignore_err & ~DICT_ERR_IGNORE_FK_NOKEY) && !table->is_readable() && table->corrupted) { - ulint algo = table->space->get_compression_algo(); - if (algo <= PAGE_ALGORITHM_LAST && !fil_comp_algo_loaded(algo)) { - my_printf_error(ER_PROVIDER_NOT_LOADED, - "Table %s is compressed with %s, which is not currently loaded. " - "Please load the %s provider plugin to open the table", - MYF(ME_ERROR_LOG), table->name, - page_compression_algorithms[algo], page_compression_algorithms[algo]); - } else { - my_printf_error(ER_TABLE_CORRUPT, - "Table %s is corrupted. Please drop the table and recreate.", - MYF(ME_ERROR_LOG), table->name); - } + ulint algo= table->space->get_compression_algo(); + if (algo <= PAGE_ALGORITHM_LAST && !fil_comp_algo_loaded(algo)) + my_printf_error(ER_PROVIDER_NOT_LOADED, + "Table %`.*s.%`s is compressed with %s," + " which is not currently loaded. " + "Please load the %s provider plugin" + " to open the table", + MYF(ME_ERROR_LOG), + int(table->name.dblen()), table->name.m_name, + table->name.basename(), + page_compression_algorithms[algo], + page_compression_algorithms[algo]); + else + dict_table_open_failed(table->name); dict_sys.unfreeze(); DBUG_RETURN(nullptr); } @@ -1070,8 +1088,7 @@ dict_table_open_on_name( if (!(ignore_err & ~DICT_ERR_IGNORE_FK_NOKEY) && !table->is_readable() && table->corrupted) { - ib::error() << "Table " << table->name - << " is corrupted. Please drop the table and recreate."; + dict_table_open_failed(table->name); if (!dict_locked) dict_sys.unlock(); DBUG_RETURN(nullptr); @@ -1992,7 +2009,6 @@ dict_index_add_to_cache( new_index->n_fields = new_index->n_def; new_index->trx_id = index->trx_id; new_index->set_committed(index->is_committed()); - new_index->nulls_equal = index->nulls_equal; n_ord = new_index->n_uniq; /* Flag the ordering columns and also set column max_prefix */ diff --git a/storage/innobase/dict/dict0stats.cc b/storage/innobase/dict/dict0stats.cc index f11187b9..f647278d 100644 --- a/storage/innobase/dict/dict0stats.cc +++ b/storage/innobase/dict/dict0stats.cc @@ -3867,6 +3867,10 @@ release_and_exit: goto release_and_exit; } +#ifdef ENABLED_DEBUG_SYNC + DEBUG_SYNC(thd, "dict_stats_mdl_acquired"); +#endif /* ENABLED_DEBUG_SYNC */ + trx = trx_create(); trx_start_internal_read_only(trx); diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index 97cb3994..d4e6c6f3 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -2290,7 +2290,7 @@ void fil_space_crypt_close_tablespace(const fil_space_t *space) << space->chain.start->name << " (" << space->id << ") active threads " << crypt_data->rotate_state.active_threads - << "flushing=" + << " flushing=" << crypt_data->rotate_state.flushing << "."; last = now; } diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index bd0ace7c..e8d23657 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -342,7 +342,7 @@ static bool fil_node_open_file_low(fil_node_t *node) ut_ad(node->space->is_closing()); mysql_mutex_assert_owner(&fil_system.mutex); static_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096, "compatibility"); -#if defined _WIN32 || defined HAVE_FCNTL_DIRECT +#if defined _WIN32 || defined O_DIRECT ulint type; switch (FSP_FLAGS_GET_ZIP_SSIZE(node->space->flags)) { case 1: @@ -361,8 +361,7 @@ static bool fil_node_open_file_low(fil_node_t *node) bool success; node->handle= os_file_create(innodb_data_file_key, node->name, node->is_raw_disk - ? OS_FILE_OPEN_RAW | OS_FILE_ON_ERROR_NO_EXIT - : OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT, + ? OS_FILE_OPEN_RAW : OS_FILE_OPEN, OS_FILE_AIO, type, srv_read_only_mode, &success); @@ -928,9 +927,7 @@ bool fil_space_free(uint32_t id, bool x_latched) log_sys.latch.wr_unlock(); } else { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); if (space->max_lsn) { ut_d(space->max_lsn = 0); fil_system.named_spaces.remove(*space); @@ -1691,30 +1688,27 @@ pfs_os_file_t fil_delete_tablespace(uint32_t id) /*******************************************************************//** Allocates and builds a file name from a path, a table or tablespace name and a suffix. The string must be freed by caller with ut_free(). -@param[in] path NULL or the directory path or the full path and filename. +@param[in] path nullptr or the directory path or the full path and filename @param[in] name {} if path is full, or Table/Tablespace name -@param[in] ext the file extension to use -@param[in] trim_name true if the last name on the path should be trimmed. +@param[in] extension the file extension to use +@param[in] trim_name true if the last name on the path should be trimmed @return own: file name */ -char* fil_make_filepath(const char *path, const fil_space_t::name_type &name, - ib_extention ext, bool trim_name) +char* fil_make_filepath_low(const char *path, + const fil_space_t::name_type &name, + ib_extention extension, bool trim_name) { /* The path may contain the basename of the file, if so we do not need the name. If the path is NULL, we can use the default path, but there needs to be a name. */ ut_ad(path || name.data()); - /* If we are going to strip a name off the path, there better be a - path and a new name to put back on. */ - ut_ad(!trim_name || (path && name.data())); - if (path == NULL) { path = fil_path_to_mysql_datadir; } ulint len = 0; /* current length */ ulint path_len = strlen(path); - const char* suffix = dot_ext[ext]; + const char* suffix = dot_ext[extension]; ulint suffix_len = strlen(suffix); ulint full_len = path_len + 1 + name.size() + suffix_len + 1; @@ -1797,8 +1791,16 @@ char* fil_make_filepath(const char *path, const fil_space_t::name_type &name, char *fil_make_filepath(const char* path, const table_name_t name, ib_extention suffix, bool strip_name) { - return fil_make_filepath(path, {name.m_name, strlen(name.m_name)}, - suffix, strip_name); + return fil_make_filepath_low(path, {name.m_name, strlen(name.m_name)}, + suffix, strip_name); +} + +/** Wrapper function over fil_make_filepath_low() to build directory name. +@param path the directory path or the full path and filename +@return own: directory name */ +static inline char *fil_make_dirpath(const char *path) +{ + return fil_make_filepath_low(path, fil_space_t::name_type{}, NO_EXT, true); } dberr_t fil_space_t::rename(const char *path, bool log, bool replace) @@ -1839,14 +1841,32 @@ dberr_t fil_space_t::rename(const char *path, bool log, bool replace) return DB_TABLESPACE_NOT_FOUND; } - exists= false; - if (replace); - else if (!os_file_status(path, &exists, &ftype) || exists) + if (!replace) { - sql_print_error("InnoDB: Cannot rename '%s' to '%s'" - " because the target file exists.", - old_path, path); - return DB_TABLESPACE_EXISTS; + char *schema_path= fil_make_dirpath(path); + if (!schema_path) + return DB_ERROR; + + exists= false; + bool schema_fail= os_file_status(schema_path, &exists, &ftype) && !exists; + ut_free(schema_path); + + if (schema_fail) + { + sql_print_error("InnoDB: Cannot rename '%s' to '%s'" + " because the target schema directory doesn't exist.", + old_path, path); + return DB_ERROR; + } + + exists= false; + if (!os_file_status(path, &exists, &ftype) || exists) + { + sql_print_error("InnoDB: Cannot rename '%s' to '%s'" + " because the target file exists.", + old_path, path); + return DB_TABLESPACE_EXISTS; + } } mtr_t mtr; @@ -1906,7 +1926,7 @@ fil_ibd_create( static_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096, "compatibility"); -#if defined _WIN32 || defined HAVE_FCNTL_DIRECT +#if defined _WIN32 || defined O_DIRECT ulint type; switch (FSP_FLAGS_GET_ZIP_SSIZE(flags)) { case 1: @@ -1922,7 +1942,7 @@ fil_ibd_create( file = os_file_create( innodb_data_file_key, path, - OS_FILE_CREATE | OS_FILE_ON_ERROR_NO_EXIT, + OS_FILE_CREATE, OS_FILE_AIO, type, srv_read_only_mode, &success); if (!success) { @@ -3037,9 +3057,7 @@ void fil_names_dirty( fil_space_t* space) { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); ut_ad(recv_recovery_is_on()); ut_ad(log_sys.get_lsn() != 0); ut_ad(space->max_lsn == 0); @@ -3053,9 +3071,7 @@ fil_names_dirty( tablespace was modified for the first time since fil_names_clear(). */ ATTRIBUTE_NOINLINE ATTRIBUTE_COLD void mtr_t::name_write() { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); ut_d(fil_space_validate_for_mtr_commit(m_user_space)); ut_ad(!m_user_space->max_lsn); m_user_space->max_lsn= log_sys.get_lsn(); @@ -3079,9 +3095,7 @@ ATTRIBUTE_COLD lsn_t fil_names_clear(lsn_t lsn) { mtr_t mtr; -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); ut_ad(lsn); ut_ad(log_sys.is_latest()); diff --git a/storage/innobase/fsp/fsp0file.cc b/storage/innobase/fsp/fsp0file.cc index 1c20efcd..62f90f53 100644 --- a/storage/innobase/fsp/fsp0file.cc +++ b/storage/innobase/fsp/fsp0file.cc @@ -502,9 +502,10 @@ err_exit: return DB_SUCCESS; } - sql_print_error("InnoDB: %s in datafile: %s, Space ID: " - UINT32PF ", " "Flags: " UINT32PF, - error_txt, m_filepath, m_space_id, m_flags); + sql_print_information( + "InnoDB: %s in datafile: %s, Space ID: " UINT32PF + ", " "Flags: " UINT32PF, + error_txt, m_filepath, m_space_id, m_flags); m_is_valid = false; return DB_CORRUPTION; } diff --git a/storage/innobase/fsp/fsp0fsp.cc b/storage/innobase/fsp/fsp0fsp.cc index 87672a82..5f34fe93 100644 --- a/storage/innobase/fsp/fsp0fsp.cc +++ b/storage/innobase/fsp/fsp0fsp.cc @@ -259,6 +259,7 @@ inline void xdes_init(const buf_block_t &block, xdes_t *descr, mtr_t *mtr) } /** Mark a page used in an extent descriptor. +@param[in] space tablespace @param[in,out] seg_inode segment inode @param[in,out] iblock segment inode page @param[in] page page number @@ -268,8 +269,9 @@ inline void xdes_init(const buf_block_t &block, xdes_t *descr, mtr_t *mtr) @return error code */ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t -fseg_mark_page_used(fseg_inode_t *seg_inode, buf_block_t *iblock, - ulint page, xdes_t *descr, buf_block_t *xdes, mtr_t *mtr) +fseg_mark_page_used(const fil_space_t *space, + fseg_inode_t *seg_inode, buf_block_t *iblock, + uint32_t page, xdes_t *descr, buf_block_t *xdes, mtr_t *mtr) { ut_ad(fil_page_get_type(iblock->page.frame) == FIL_PAGE_INODE); ut_ad(!((page_offset(seg_inode) - FSEG_ARR_OFFSET) % FSEG_INODE_SIZE)); @@ -278,15 +280,16 @@ fseg_mark_page_used(fseg_inode_t *seg_inode, buf_block_t *iblock, const uint16_t xoffset= uint16_t(descr - xdes->page.frame + XDES_FLST_NODE); const uint16_t ioffset= uint16_t(seg_inode - iblock->page.frame); + const uint32_t limit= space->free_limit; if (!xdes_get_n_used(descr)) { /* We move the extent from the free list to the NOT_FULL list */ if (dberr_t err= flst_remove(iblock, uint16_t(FSEG_FREE + ioffset), - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; if (dberr_t err= flst_add_last(iblock, uint16_t(FSEG_NOT_FULL + ioffset), - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; } @@ -303,10 +306,10 @@ fseg_mark_page_used(fseg_inode_t *seg_inode, buf_block_t *iblock, { /* We move the extent from the NOT_FULL list to the FULL list */ if (dberr_t err= flst_remove(iblock, uint16_t(FSEG_NOT_FULL + ioffset), - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; if (dberr_t err= flst_add_last(iblock, uint16_t(FSEG_FULL + ioffset), - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; mtr->write<4>(*iblock, seg_inode + FSEG_NOT_FULL_N_USED, not_full_n_used - FSP_EXTENT_SIZE); @@ -884,7 +887,7 @@ fsp_fill_free_list( xdes_set_free(*xdes, descr, FSP_IBUF_BITMAP_OFFSET, mtr); xdes_set_state(*xdes, descr, XDES_FREE_FRAG, mtr); if (dberr_t err= flst_add_last(header, FSP_HEADER_OFFSET + FSP_FREE_FRAG, - xdes, xoffset, mtr)) + xdes, xoffset, space->free_limit, mtr)) return err; byte *n_used= FSP_HEADER_OFFSET + FSP_FRAG_N_USED + header->page.frame; mtr->write<4>(*header, n_used, 2U + mach_read_from_4(n_used)); @@ -893,7 +896,7 @@ fsp_fill_free_list( { if (dberr_t err= flst_add_last(header, FSP_HEADER_OFFSET + FSP_FREE, - xdes, xoffset, mtr)) + xdes, xoffset, space->free_limit, mtr)) return err; count++; } @@ -944,7 +947,11 @@ corrupted: first = flst_get_first(FSP_HEADER_OFFSET + FSP_FREE + header->page.frame); - if (first.page == FIL_NULL) { + if (first.page >= space->free_limit) { + if (first.page != FIL_NULL) { + goto flst_corrupted; + } + *err = fsp_fill_free_list(false, space, header, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { goto corrupted; @@ -955,6 +962,17 @@ corrupted: if (first.page == FIL_NULL) { return nullptr; /* No free extents left */ } + if (first.page >= space->free_limit) { + goto flst_corrupted; + } + } + + if (first.boffset < FSP_HEADER_OFFSET + FSP_HEADER_SIZE + || first.boffset >= space->physical_size() + - (XDES_SIZE + FIL_PAGE_DATA_END)) { + flst_corrupted: + *err = DB_CORRUPTION; + goto corrupted; } descr = xdes_lst_get_descriptor(*space, first, mtr, @@ -967,7 +985,7 @@ corrupted: *err = flst_remove(header, FSP_HEADER_OFFSET + FSP_FREE, desc_block, static_cast(descr - desc_block->page.frame + XDES_FLST_NODE), - mtr); + space->free_limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { return nullptr; } @@ -984,11 +1002,12 @@ MY_ATTRIBUTE((nonnull, warn_unused_result)) @param[in,out] xdes extent descriptor page @param[in,out] descr extent descriptor @param[in] bit slot to allocate in the extent +@param[in] space tablespace @param[in,out] mtr mini-transaction @return error code */ static dberr_t fsp_alloc_from_free_frag(buf_block_t *header, buf_block_t *xdes, xdes_t *descr, - ulint bit, mtr_t *mtr) + uint32_t bit, fil_space_t *space, mtr_t *mtr) { if (UNIV_UNLIKELY(xdes_get_state(descr) != XDES_FREE_FRAG || !xdes_is_free(descr, bit))) @@ -1001,14 +1020,15 @@ fsp_alloc_from_free_frag(buf_block_t *header, buf_block_t *xdes, xdes_t *descr, if (xdes_is_full(descr)) { + const uint32_t limit= space->free_limit; /* The fragment is full: move it to another list */ const uint16_t xoffset= static_cast(descr - xdes->page.frame + XDES_FLST_NODE); if (dberr_t err= flst_remove(header, FSP_HEADER_OFFSET + FSP_FREE_FRAG, - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; if (dberr_t err= flst_add_last(header, FSP_HEADER_OFFSET + FSP_FULL_FRAG, - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; xdes_set_state(*xdes, descr, XDES_FULL_FRAG, mtr); n_used-= FSP_EXTENT_SIZE; @@ -1070,8 +1090,11 @@ buf_block_t *fsp_alloc_free_page(fil_space_t *space, uint32_t hint, /* Else take the first extent in free_frag list */ fil_addr_t first = flst_get_first(FSP_HEADER_OFFSET + FSP_FREE_FRAG + block->page.frame); - if (first.page == FIL_NULL) + if (first.page >= space->free_limit) { + if (first.page != FIL_NULL) + goto flst_corrupted; + /* There are no partially full fragments: allocate a free extent and add it to the FREE_FRAG list. NOTE that the allocation may have as a side-effect that an extent containing a descriptor @@ -1082,13 +1105,23 @@ buf_block_t *fsp_alloc_free_page(fil_space_t *space, uint32_t hint, return nullptr; *err= flst_add_last(block, FSP_HEADER_OFFSET + FSP_FREE_FRAG, xdes, static_cast(descr - xdes->page.frame + - XDES_FLST_NODE), mtr); + XDES_FLST_NODE), + space->free_limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) return nullptr; xdes_set_state(*xdes, descr, XDES_FREE_FRAG, mtr); } else { + if (first.boffset < FSP_HEADER_OFFSET + FSP_HEADER_SIZE || + first.boffset >= space->physical_size() - + (XDES_SIZE + FIL_PAGE_DATA_END)) + { + flst_corrupted: + *err= DB_CORRUPTION; + goto err_exit; + } + descr= xdes_lst_get_descriptor(*space, first, mtr, &xdes, err); if (!descr) return nullptr; @@ -1135,7 +1168,7 @@ buf_block_t *fsp_alloc_free_page(fil_space_t *space, uint32_t hint, } } - *err= fsp_alloc_from_free_frag(block, xdes, descr, free, mtr); + *err= fsp_alloc_from_free_frag(block, xdes, descr, free, space, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) goto corrupted; return fsp_page_create(space, page_no, init_mtr); @@ -1174,7 +1207,8 @@ static dberr_t fsp_free_extent(fil_space_t* space, uint32_t offset, space->free_len++; return flst_add_last(block, FSP_HEADER_OFFSET + FSP_FREE, xdes, static_cast(descr - xdes->page.frame + - XDES_FLST_NODE), mtr); + XDES_FLST_NODE), + space->free_limit, mtr); } MY_ATTRIBUTE((nonnull)) @@ -1228,16 +1262,17 @@ static dberr_t fsp_free_page(fil_space_t *space, uint32_t offset, mtr_t *mtr) const uint16_t xoffset= static_cast(descr - xdes->page.frame + XDES_FLST_NODE); + const uint32_t limit = space->free_limit; if (state == XDES_FULL_FRAG) { /* The fragment was full: move it to another list */ err = flst_remove(header, FSP_HEADER_OFFSET + FSP_FULL_FRAG, - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } err = flst_add_last(header, FSP_HEADER_OFFSET + FSP_FREE_FRAG, - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } @@ -1259,7 +1294,7 @@ static dberr_t fsp_free_page(fil_space_t *space, uint32_t offset, mtr_t *mtr) if (!xdes_get_n_used(descr)) { /* The extent has become free: move it to another list */ err = flst_remove(header, FSP_HEADER_OFFSET + FSP_FREE_FRAG, - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (err == DB_SUCCESS) { err = fsp_free_extent(space, offset, mtr); } @@ -1353,7 +1388,7 @@ static dberr_t fsp_alloc_seg_inode_page(fil_space_t *space, #endif return flst_add_last(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FREE, - block, FSEG_INODE_PAGE_NODE, mtr); + block, FSEG_INODE_PAGE_NODE, space->free_limit, mtr); } MY_ATTRIBUTE((nonnull, warn_unused_result)) @@ -1409,12 +1444,13 @@ fsp_alloc_seg_inode(fil_space_t *space, buf_block_t *header, { /* There are no other unused headers left on the page: move it to another list */ + const uint32_t limit= space->free_limit; *err= flst_remove(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FREE, - block, FSEG_INODE_PAGE_NODE, mtr); + block, FSEG_INODE_PAGE_NODE, limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) return nullptr; *err= flst_add_last(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FULL, - block, FSEG_INODE_PAGE_NODE, mtr); + block, FSEG_INODE_PAGE_NODE, limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) return nullptr; } @@ -1447,16 +1483,17 @@ static void fsp_free_seg_inode(fil_space_t *space, fseg_inode_t *inode, } const ulint physical_size= space->physical_size(); + const uint32_t limit= space->free_limit; if (ULINT_UNDEFINED == fsp_seg_inode_page_find_free(iblock->page.frame, 0, physical_size)) { /* Move the page to another list */ if (flst_remove(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FULL, - iblock, FSEG_INODE_PAGE_NODE, mtr) != DB_SUCCESS) + iblock, FSEG_INODE_PAGE_NODE, limit, mtr) != DB_SUCCESS) return; if (flst_add_last(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FREE, - iblock, FSEG_INODE_PAGE_NODE, mtr) != DB_SUCCESS) + iblock, FSEG_INODE_PAGE_NODE, limit, mtr) != DB_SUCCESS) return; } @@ -1468,7 +1505,7 @@ static void fsp_free_seg_inode(fil_space_t *space, fseg_inode_t *inode, /* There are no other used headers left on the page: free it */ if (flst_remove(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FREE, - iblock, FSEG_INODE_PAGE_NODE, mtr) == DB_SUCCESS) + iblock, FSEG_INODE_PAGE_NODE, limit, mtr) == DB_SUCCESS) fsp_free_page(space, iblock->page.id().page_no(), mtr); } @@ -1841,7 +1878,8 @@ static dberr_t fseg_fill_free_list(const fseg_inode_t *inode, static_cast(inode - iblock->page.frame + FSEG_FREE), xdes, static_cast(descr - xdes->page.frame + - XDES_FLST_NODE), mtr)) + XDES_FLST_NODE), + space->free_limit, mtr)) return err; xdes_set_state(*xdes, descr, XDES_FSEG, mtr); mtr->memcpy(*xdes, descr + XDES_ID, inode + FSEG_ID, 8); @@ -1876,11 +1914,25 @@ fseg_alloc_free_extent( ut_ad(!memcmp(FSEG_MAGIC_N_BYTES, FSEG_MAGIC_N + inode, 4)); ut_d(space->modify_check(*mtr)); + if (UNIV_UNLIKELY(page_offset(inode) < FSEG_ARR_OFFSET)) + { + corrupted: + *err= DB_CORRUPTION; + space->set_corrupted(); + return nullptr; + } + if (flst_get_len(inode + FSEG_FREE)) { + const fil_addr_t first= flst_get_first(inode + FSEG_FREE); + if (first.page >= space->free_limit || + first.boffset < FSP_HEADER_OFFSET + FSP_HEADER_SIZE || + first.boffset >= space->physical_size() - + (XDES_SIZE + FIL_PAGE_DATA_END)) + goto corrupted; + /* Segment free list is not empty, allocate from it */ - return xdes_lst_get_descriptor(*space, flst_get_first(inode + FSEG_FREE), - mtr, xdes, err); + return xdes_lst_get_descriptor(*space, first, mtr, xdes, err); } xdes_t* descr= fsp_alloc_free_extent(space, 0, xdes, mtr, err); @@ -1892,7 +1944,8 @@ fseg_alloc_free_extent( static_cast(inode - iblock->page.frame + FSEG_FREE), *xdes, static_cast(descr - (*xdes)->page.frame + - XDES_FLST_NODE), mtr); + XDES_FLST_NODE), + space->free_limit, mtr); if (UNIV_LIKELY(*err != DB_SUCCESS)) return nullptr; /* Try to fill the segment free list */ @@ -1978,29 +2031,42 @@ fseg_alloc_free_page_low( } } - /* In the big if-else below we look for ret_page and ret_descr */ - /*-------------------------------------------------------------*/ - if ((xdes_get_state(descr) == XDES_FSEG) - && mach_read_from_8(descr + XDES_ID) == seg_id - && xdes_is_free(descr, hint % FSP_EXTENT_SIZE)) { + const uint32_t extent_size = FSP_EXTENT_SIZE; + ret_descr = descr; + /* Try to get the page from extent which belongs to segment */ + if (xdes_get_state(descr) == XDES_FSEG + && mach_read_from_8(descr + XDES_ID) == seg_id) { + /* Get the page from the segment extent */ + if (xdes_is_free(descr, hint % extent_size)) { take_hinted_page: - /* 1. We can take the hinted page - =================================*/ - ret_descr = descr; - ret_page = hint; - /* Skip the check for extending the tablespace. If the - page hint were not within the size of the tablespace, - we would have got (descr == NULL) above and reset the hint. */ - goto got_hinted_page; - /*-----------------------------------------------------------*/ - } else if (xdes_get_state(descr) == XDES_FREE - && reserved - used < reserved / FSEG_FILLFACTOR - && used >= FSEG_FRAG_LIMIT) { - - /* 2. We allocate the free extent from space and can take - ========================================================= - the hinted page - ===============*/ + ret_page = hint; + goto got_hinted_page; + } else if (!xdes_is_full(descr)) { + /* Take the page from the same extent as the + hinted page (and the extent already belongs to + the segment) */ + ret_page = xdes_find_free(descr, hint % extent_size); + if (ret_page == FIL_NULL) { + ut_ad(!has_done_reservation); + return nullptr; + } + ret_page += xdes_get_offset(ret_descr); + goto alloc_done; + } + } + + /** If the number of unused but reserved pages in a segment is + esser than minimum value of 1/8 of reserved pages or + 4 * FSP_EXTENT_SIZE and there are at least half of extent size + used pages, then we allow a new empty extent to be added to + the segment in fseg_alloc_free_page_general(). Otherwise, we use + unused pages of the segment. */ + if (used < extent_size / 2 || + reserved - used >= reserved / 8 || + reserved - used >= extent_size * 4) { + } else if (xdes_get_state(descr) == XDES_FREE) { + /* Allocate the free extent from space and can + take the hinted page */ ret_descr = fsp_alloc_free_extent(space, hint, &xdes, mtr, err); @@ -2020,61 +2086,42 @@ take_hinted_page: + FSEG_FREE), xdes, static_cast(ret_descr - xdes->page.frame - + XDES_FLST_NODE), mtr); + + XDES_FLST_NODE), + space->free_limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { return nullptr; } /* Try to fill the segment free list */ *err = fseg_fill_free_list(seg_inode, iblock, space, - hint + FSP_EXTENT_SIZE, mtr); + hint + extent_size, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { return nullptr; } goto take_hinted_page; - /*-----------------------------------------------------------*/ - } else if ((direction != FSP_NO_DIR) - && ((reserved - used) < reserved / FSEG_FILLFACTOR) - && (used >= FSEG_FRAG_LIMIT) - && (ret_descr = fseg_alloc_free_extent(seg_inode, iblock, - &xdes, space, - mtr, err))) { - /* 3. We take any free extent (which was already assigned above - =============================================================== - in the if-condition to ret_descr) and take the lowest or - ======================================================== - highest page in it, depending on the direction - ==============================================*/ + } else if (direction != FSP_NO_DIR) { + + ret_descr = fseg_alloc_free_extent(seg_inode, iblock, + &xdes, space, mtr, err); + + if (!ret_descr) { + ut_ad(*err != DB_SUCCESS); + return nullptr; + } + /* Take any free extent (which was already assigned + above in the if-condition to ret_descr) and take the + lowest or highest page in it, depending on the direction */ ret_page = xdes_get_offset(ret_descr); if (direction == FSP_DOWN) { - ret_page += FSP_EXTENT_SIZE - 1; - } - ut_ad(!has_done_reservation || ret_page != FIL_NULL); - /*-----------------------------------------------------------*/ - } else if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { - return nullptr; - } else if ((xdes_get_state(descr) == XDES_FSEG) - && mach_read_from_8(descr + XDES_ID) == seg_id - && (!xdes_is_full(descr))) { - - /* 4. We can take the page from the same extent as the - ====================================================== - hinted page (and the extent already belongs to the - ================================================== - segment) - ========*/ - ret_descr = descr; - ret_page = xdes_find_free(ret_descr, hint % FSP_EXTENT_SIZE); - if (ret_page == FIL_NULL) { - ut_ad(!has_done_reservation); - } else { - ret_page += xdes_get_offset(ret_descr); + ret_page += extent_size - 1; } - /*-----------------------------------------------------------*/ - } else if (reserved - used > 0) { - /* 5. We take any unused page from the segment - ==============================================*/ + goto alloc_done; + } + + /* Try to take individual page from the segment or tablespace */ + if (reserved - used > 0) { + /* Take any unused page from the segment */ fil_addr_t first; if (flst_get_len(seg_inode + FSEG_NOT_FULL) > 0) { @@ -2083,7 +2130,15 @@ take_hinted_page: first = flst_get_first(seg_inode + FSEG_FREE); } else { ut_ad(!has_done_reservation); - return(NULL); + return nullptr; + } + + if (first.page >= space->free_limit + || first.boffset < FSP_HEADER_OFFSET + FSP_HEADER_SIZE + || first.boffset >= space->physical_size() + - (XDES_SIZE + FIL_PAGE_DATA_END)) { + *err= DB_CORRUPTION; + return nullptr; } ret_descr = xdes_lst_get_descriptor(*space, first, mtr, &xdes); @@ -2097,10 +2152,9 @@ take_hinted_page: } else { ret_page += xdes_get_offset(ret_descr); } - /*-----------------------------------------------------------*/ - } else if (used < FSEG_FRAG_LIMIT) { - /* 6. We allocate an individual page from the space - ===================================================*/ + + } else if (used < extent_size / 2) { + /* Allocate an individual page from the space */ buf_block_t* block = fsp_alloc_free_page( space, hint, mtr, init_mtr, err); @@ -2123,13 +2177,11 @@ take_hinted_page: /* fsp_alloc_free_page() invoked fsp_init_file_page() already. */ return(block); - /*-----------------------------------------------------------*/ } else { - /* 7. We allocate a new extent and take its first page - ======================================================*/ + /* In worst case, try to allocate a new extent + and take its first page */ ret_descr = fseg_alloc_free_extent(seg_inode, iblock, &xdes, space, mtr, err); - if (!ret_descr) { ut_ad(!has_done_reservation || *err); return nullptr; @@ -2142,14 +2194,13 @@ take_hinted_page: /* Page could not be allocated */ ut_ad(!has_done_reservation); - return(NULL); + return nullptr; } - +alloc_done: if (space->size <= ret_page && !is_predefined_tablespace(space->id)) { /* It must be that we are extending a single-table tablespace whose size is still < 64 pages */ - - if (ret_page >= FSP_EXTENT_SIZE) { + if (ret_page >= extent_size) { sql_print_error("InnoDB: Trying to extend '%s'" " by single page(s) though the" " space size " UINT32PF "." @@ -2157,33 +2208,34 @@ take_hinted_page: space->chain.start->name, space->size, ret_page); ut_ad(!has_done_reservation); - return(NULL); + return nullptr; } if (!fsp_try_extend_data_file_with_pages( space, ret_page, header, mtr)) { /* No disk space left */ ut_ad(!has_done_reservation); - return(NULL); + return nullptr; } } -got_hinted_page: - /* ret_descr == NULL if the block was allocated from free_frag - (XDES_FREE_FRAG) */ + /* Skip the check for extending the tablespace. + If the page hint were not within the size of the tablespace, + descr set to nullptr above and reset the hint and the block + was allocated from free_frag (XDES_FREE_FRAG) */ if (ret_descr != NULL) { +got_hinted_page: /* At this point we know the extent and the page offset. The extent is still in the appropriate list (FSEG_NOT_FULL or FSEG_FREE), and the page is not yet marked as used. */ - ut_d(buf_block_t* xxdes); ut_ad(xdes_get_descriptor(space, ret_page, mtr, err, &xxdes) == ret_descr); ut_ad(xdes == xxdes); - ut_ad(xdes_is_free(ret_descr, ret_page % FSP_EXTENT_SIZE)); + ut_ad(xdes_is_free(ret_descr, ret_page % extent_size)); - *err = fseg_mark_page_used(seg_inode, iblock, ret_page, - ret_descr, xdes, mtr); + *err = fseg_mark_page_used(space, seg_inode, iblock, ret_page, + ret_descr, xdes, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { return nullptr; } @@ -2524,18 +2576,19 @@ corrupted: const uint16_t xoffset= uint16_t(descr - xdes->page.frame + XDES_FLST_NODE); const uint16_t ioffset= uint16_t(seg_inode - iblock->page.frame); + const uint32_t limit = space->free_limit; if (xdes_is_full(descr)) { /* The fragment is full: move it to another list */ err = flst_remove(iblock, static_cast(FSEG_FULL + ioffset), - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } err = flst_add_last(iblock, static_cast(FSEG_NOT_FULL + ioffset), - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } @@ -2553,7 +2606,7 @@ corrupted: if (!xdes_get_n_used(descr)) { err = flst_remove(iblock, static_cast(FSEG_NOT_FULL + ioffset), - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } @@ -2698,11 +2751,12 @@ fseg_free_extent( #endif /* BTR_CUR_HASH_ADAPT */ uint16_t lst; + uint32_t limit = space->free_limit; if (xdes_is_full(descr)) { lst = static_cast(FSEG_FULL + ioffset); remove: - err = flst_remove(iblock, lst, xdes, xoffset, mtr); + err = flst_remove(iblock, lst, xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } @@ -2712,7 +2766,7 @@ remove: } else { err = flst_remove( iblock, static_cast(FSEG_NOT_FULL + ioffset), - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } @@ -2962,7 +3016,10 @@ fseg_get_first_extent( return nullptr; } - if (first.page == FIL_NULL) + if (first.page >= space->free_limit || + first.boffset < FSP_HEADER_OFFSET + FSP_HEADER_SIZE || + first.boffset >= space->physical_size() - + (XDES_SIZE + FIL_PAGE_DATA_END)) goto corrupted; return xdes_lst_get_descriptor(*space, first, mtr, nullptr, err); diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc index 0775d939..4d9a1d3a 100644 --- a/storage/innobase/fts/fts0fts.cc +++ b/storage/innobase/fts/fts0fts.cc @@ -2187,6 +2187,22 @@ fts_trx_row_get_new_state( return(result); } +/** Compare two doubly indirected pointers */ +static int fts_ptr2_cmp(const void *p1, const void *p2) +{ + const void *a= **static_cast(p1); + const void *b= **static_cast(p2); + return b > a ? -1 : a > b; +} + +/** Compare a singly indirected pointer to a doubly indirected one */ +static int fts_ptr1_ptr2_cmp(const void *p1, const void *p2) +{ + const void *a= *static_cast(p1); + const void *b= **static_cast(p2); + return b > a ? -1 : a > b; +} + /******************************************************************//** Create a savepoint instance. @return savepoint instance */ @@ -2209,8 +2225,8 @@ fts_savepoint_create( savepoint->name = mem_heap_strdup(heap, name); } - savepoint->tables = rbt_create( - sizeof(fts_trx_table_t*), fts_trx_table_cmp); + static_assert(!offsetof(fts_trx_table_t, table), "ABI"); + savepoint->tables = rbt_create(sizeof(fts_trx_table_t*), fts_ptr2_cmp); return(savepoint); } @@ -2258,6 +2274,19 @@ fts_trx_create( return(ftt); } +/** Compare two doc_id */ +static inline int doc_id_cmp(doc_id_t a, doc_id_t b) +{ + return b > a ? -1 : a > b; +} + +/** Compare two DOC_ID. */ +int fts_doc_id_cmp(const void *p1, const void *p2) +{ + return doc_id_cmp(*static_cast(p1), + *static_cast(p2)); +} + /******************************************************************//** Create an FTS trx table. @return FTS trx table */ @@ -2276,7 +2305,8 @@ fts_trx_table_create( ftt->table = table; ftt->fts_trx = fts_trx; - ftt->rows = rbt_create(sizeof(fts_trx_row_t), fts_trx_row_doc_id_cmp); + static_assert(!offsetof(fts_trx_row_t, doc_id), "ABI"); + ftt->rows = rbt_create(sizeof(fts_trx_row_t), fts_doc_id_cmp); return(ftt); } @@ -2300,7 +2330,8 @@ fts_trx_table_clone( ftt->table = ftt_src->table; ftt->fts_trx = ftt_src->fts_trx; - ftt->rows = rbt_create(sizeof(fts_trx_row_t), fts_trx_row_doc_id_cmp); + static_assert(!offsetof(fts_trx_row_t, doc_id), "ABI"); + ftt->rows = rbt_create(sizeof(fts_trx_row_t), fts_doc_id_cmp); /* Copy the rb tree values to the new savepoint. */ rbt_merge_uniq(ftt->rows, ftt_src->rows); @@ -2325,13 +2356,9 @@ fts_trx_init( { fts_trx_table_t* ftt; ib_rbt_bound_t parent; - ib_rbt_t* tables; - fts_savepoint_t* savepoint; - - savepoint = static_cast(ib_vector_last(savepoints)); - - tables = savepoint->tables; - rbt_search_cmp(tables, &parent, &table->id, fts_trx_table_id_cmp, NULL); + ib_rbt_t* tables = static_cast( + ib_vector_last(savepoints))->tables; + rbt_search_cmp(tables, &parent, &table, fts_ptr1_ptr2_cmp, nullptr); if (parent.result == 0) { fts_trx_table_t** fttp; @@ -3860,6 +3887,13 @@ fts_write_node( return(error); } +/** Sort an array of doc_id */ +void fts_doc_ids_sort(ib_vector_t *doc_ids) +{ + doc_id_t *const data= reinterpret_cast(doc_ids->data); + std::sort(data, data + doc_ids->used); +} + /*********************************************************************//** Add rows to the DELETED_CACHE table. @return DB_SUCCESS if all went well else error code*/ @@ -3881,7 +3915,7 @@ fts_sync_add_deleted_cache( ut_a(ib_vector_size(doc_ids) > 0); - ib_vector_sort(doc_ids, fts_doc_id_cmp); + fts_doc_ids_sort(doc_ids); info = pars_info_create(); @@ -5575,8 +5609,8 @@ fts_savepoint_rollback_last_stmt( l_ftt = rbt_value(fts_trx_table_t*, node); rbt_search_cmp( - s_tables, &parent, &(*l_ftt)->table->id, - fts_trx_table_id_cmp, NULL); + s_tables, &parent, &(*l_ftt)->table, + fts_ptr1_ptr2_cmp, nullptr); if (parent.result == 0) { fts_trx_table_t** s_ftt; diff --git a/storage/innobase/fts/fts0opt.cc b/storage/innobase/fts/fts0opt.cc index fe31767d..30889e59 100644 --- a/storage/innobase/fts/fts0opt.cc +++ b/storage/innobase/fts/fts0opt.cc @@ -1016,7 +1016,7 @@ fts_table_fetch_doc_ids( que_graph_free(graph); if (error == DB_SUCCESS) { - ib_vector_sort(doc_ids->doc_ids, fts_doc_id_cmp); + fts_doc_ids_sort(doc_ids->doc_ids); } if (alloc_bk_trx) { diff --git a/storage/innobase/fts/fts0que.cc b/storage/innobase/fts/fts0que.cc index 9c92a117..b8f22076 100644 --- a/storage/innobase/fts/fts0que.cc +++ b/storage/innobase/fts/fts0que.cc @@ -385,22 +385,6 @@ fts_query_terms_in_document( ulint* total); /*!< out: total words in document */ #endif -/******************************************************************** -Compare two fts_doc_freq_t doc_ids. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_freq_doc_id_cmp( -/*================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const fts_doc_freq_t* fq1 = (const fts_doc_freq_t*) p1; - const fts_doc_freq_t* fq2 = (const fts_doc_freq_t*) p2; - - return((int) (fq1->doc_id - fq2->doc_id)); -} - #if 0 /*******************************************************************//** Print the table used for calculating LCS. */ @@ -506,14 +490,11 @@ fts_query_compare_rank( if (r2->rank < r1->rank) { return(-1); } else if (r2->rank == r1->rank) { - if (r1->doc_id < r2->doc_id) { - return(1); - } else if (r1->doc_id > r2->doc_id) { - return(1); + return -1; } - return(0); + return r1->doc_id > r2->doc_id; } return(1); @@ -674,8 +655,9 @@ fts_query_add_word_freq( word_freq.doc_count = 0; + static_assert(!offsetof(fts_doc_freq_t, doc_id), "ABI"); word_freq.doc_freqs = rbt_create( - sizeof(fts_doc_freq_t), fts_freq_doc_id_cmp); + sizeof(fts_doc_freq_t), fts_doc_id_cmp); parent.last = rbt_add_node( query->word_freqs, &parent, &word_freq); @@ -1253,8 +1235,9 @@ fts_query_intersect( /* Create the rb tree that will hold the doc ids of the intersection. */ + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); query->intersection = rbt_create( - sizeof(fts_ranking_t), fts_ranking_doc_id_cmp); + sizeof(fts_ranking_t), fts_doc_id_cmp); query->total_size += SIZEOF_RBT_CREATE; @@ -1540,8 +1523,9 @@ fts_merge_doc_ids( to create a new result set for fts_query_intersect(). */ if (query->oper == FTS_EXIST) { + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); query->intersection = rbt_create( - sizeof(fts_ranking_t), fts_ranking_doc_id_cmp); + sizeof(fts_ranking_t), fts_doc_id_cmp); query->total_size += SIZEOF_RBT_CREATE; } @@ -3012,8 +2996,9 @@ fts_query_visitor( if (query->oper == FTS_EXIST) { ut_ad(query->intersection == NULL); + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); query->intersection = rbt_create( - sizeof(fts_ranking_t), fts_ranking_doc_id_cmp); + sizeof(fts_ranking_t), fts_doc_id_cmp); query->total_size += SIZEOF_RBT_CREATE; } @@ -3123,8 +3108,8 @@ fts_ast_visit_sub_exp( /* Create new result set to store the sub-expression result. We will merge this result set with the parent after processing. */ - query->doc_ids = rbt_create(sizeof(fts_ranking_t), - fts_ranking_doc_id_cmp); + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); + query->doc_ids = rbt_create(sizeof(fts_ranking_t), fts_doc_id_cmp); query->total_size += SIZEOF_RBT_CREATE; @@ -3661,8 +3646,9 @@ fts_query_prepare_result( result = static_cast( ut_zalloc_nokey(sizeof(*result))); + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); result->rankings_by_id = rbt_create( - sizeof(fts_ranking_t), fts_ranking_doc_id_cmp); + sizeof(fts_ranking_t), fts_doc_id_cmp); query->total_size += sizeof(fts_result_t) + SIZEOF_RBT_CREATE; result_is_null = true; @@ -4038,7 +4024,7 @@ fts_query( DEBUG_SYNC_C("fts_deleted_doc_ids_append"); /* Sort the vector so that we can do a binary search over the ids. */ - ib_vector_sort(query.deleted->doc_ids, fts_doc_id_cmp); + fts_doc_ids_sort(query.deleted->doc_ids); /* Convert the query string to lower case before parsing. We own the ut_malloc'ed result and so remember to free it before return. */ @@ -4065,8 +4051,9 @@ fts_query( query.heap = mem_heap_create(128); /* Create the rb tree for the doc id (current) set. */ + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); query.doc_ids = rbt_create( - sizeof(fts_ranking_t), fts_ranking_doc_id_cmp); + sizeof(fts_ranking_t), fts_doc_id_cmp); query.parser = index->parser; query.total_size += SIZEOF_RBT_CREATE; diff --git a/storage/innobase/fut/fut0lst.cc b/storage/innobase/fut/fut0lst.cc index a52027f2..48e2fbe3 100644 --- a/storage/innobase/fut/fut0lst.cc +++ b/storage/innobase/fut/fut0lst.cc @@ -113,17 +113,18 @@ static void flst_add_to_empty(buf_block_t *base, uint16_t boffset, } /** Insert a node after another one. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] cur insert position block -@param[in] coffset byte offset of the insert position -@param[in,out] add block to be added -@param[in] aoffset byte offset of the block to be added -@param[in,out] mtr mini-transaction */ +@param base base node block +@param boffset byte offset of the base node +@param cur insert position block +@param coffset byte offset of the insert position +@param add block to be added +@param aoffset byte offset of the block to be added +@param limit fil_space_t::free_limit +@param mtr mini-transaction */ static dberr_t flst_insert_after(buf_block_t *base, uint16_t boffset, buf_block_t *cur, uint16_t coffset, buf_block_t *add, uint16_t aoffset, - mtr_t *mtr) + uint32_t limit, mtr_t *mtr) { ut_ad(base != cur || boffset != coffset); ut_ad(base != add || boffset != aoffset); @@ -139,6 +140,15 @@ static dberr_t flst_insert_after(buf_block_t *base, uint16_t boffset, MTR_MEMO_PAGE_SX_FIX)); fil_addr_t next_addr= flst_get_next_addr(cur->page.frame + coffset); + if (next_addr.page >= limit) + { + if (UNIV_UNLIKELY(next_addr.page != FIL_NULL)) + return DB_CORRUPTION; + } + else if (UNIV_UNLIKELY(next_addr.boffset < FIL_PAGE_DATA || + next_addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; flst_write_addr(*add, add->page.frame + aoffset + FLST_PREV, cur->page.id().page_no(), coffset, mtr); @@ -167,18 +177,19 @@ static dberr_t flst_insert_after(buf_block_t *base, uint16_t boffset, } /** Insert a node before another one. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] cur insert position block -@param[in] coffset byte offset of the insert position -@param[in,out] add block to be added -@param[in] aoffset byte offset of the block to be added -@param[in,out] mtr mini-transaction +@param base base node block +@param boffset byte offset of the base node +@param cur insert position block +@param coffset byte offset of the insert position +@param add block to be added +@param aoffset byte offset of the block to be added +@param limit fil_space_t::free_limit +@param mtr mini-transaction @return error code */ static dberr_t flst_insert_before(buf_block_t *base, uint16_t boffset, buf_block_t *cur, uint16_t coffset, buf_block_t *add, uint16_t aoffset, - mtr_t *mtr) + uint32_t limit, mtr_t *mtr) { ut_ad(base != cur || boffset != coffset); ut_ad(base != add || boffset != aoffset); @@ -194,6 +205,15 @@ static dberr_t flst_insert_before(buf_block_t *base, uint16_t boffset, MTR_MEMO_PAGE_SX_FIX)); fil_addr_t prev_addr= flst_get_prev_addr(cur->page.frame + coffset); + if (prev_addr.page >= limit) + { + if (UNIV_UNLIKELY(prev_addr.page != FIL_NULL)) + return DB_CORRUPTION; + } + else if (UNIV_UNLIKELY(prev_addr.boffset < FIL_PAGE_DATA || + prev_addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; flst_write_addr(*add, add->page.frame + aoffset + FLST_PREV, prev_addr.page, prev_addr.boffset, mtr); @@ -234,14 +254,9 @@ void flst_init(const buf_block_t& block, byte *base, mtr_t *mtr) flst_zero_both(block, base + FLST_FIRST, mtr); } -/** Append a file list node to a list. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] add block to be added -@param[in] aoffset byte offset of the node to be added -@param[in,outr] mtr mini-transaction */ dberr_t flst_add_last(buf_block_t *base, uint16_t boffset, - buf_block_t *add, uint16_t aoffset, mtr_t *mtr) + buf_block_t *add, uint16_t aoffset, + uint32_t limit, mtr_t *mtr) { ut_ad(base != add || boffset != aoffset); ut_ad(boffset < base->physical_size()); @@ -258,6 +273,13 @@ dberr_t flst_add_last(buf_block_t *base, uint16_t boffset, else { fil_addr_t addr= flst_get_last(base->page.frame + boffset); + if (UNIV_UNLIKELY(addr.page >= limit)) + return DB_CORRUPTION; + else if (UNIV_UNLIKELY(addr.boffset < FIL_PAGE_DATA || + addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; + buf_block_t *cur= add; dberr_t err; if (addr.page != add->page.id().page_no() && @@ -266,19 +288,13 @@ dberr_t flst_add_last(buf_block_t *base, uint16_t boffset, BUF_GET_POSSIBLY_FREED, mtr, &err))) return err; return flst_insert_after(base, boffset, cur, addr.boffset, - add, aoffset, mtr); + add, aoffset, limit, mtr); } } -/** Prepend a file list node to a list. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] add block to be added -@param[in] aoffset byte offset of the node to be added -@param[in,out] mtr mini-transaction -@return error code */ dberr_t flst_add_first(buf_block_t *base, uint16_t boffset, - buf_block_t *add, uint16_t aoffset, mtr_t *mtr) + buf_block_t *add, uint16_t aoffset, + uint32_t limit, mtr_t *mtr) { ut_ad(base != add || boffset != aoffset); ut_ad(boffset < base->physical_size()); @@ -296,6 +312,12 @@ dberr_t flst_add_first(buf_block_t *base, uint16_t boffset, else { fil_addr_t addr= flst_get_first(base->page.frame + boffset); + if (UNIV_UNLIKELY(addr.page >= limit)) + return DB_CORRUPTION; + else if (UNIV_UNLIKELY(addr.boffset < FIL_PAGE_DATA || + addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; buf_block_t *cur= add; dberr_t err; if (addr.page != add->page.id().page_no() && @@ -304,19 +326,13 @@ dberr_t flst_add_first(buf_block_t *base, uint16_t boffset, BUF_GET_POSSIBLY_FREED, mtr, &err))) return err; return flst_insert_before(base, boffset, cur, addr.boffset, - add, aoffset, mtr); + add, aoffset, limit, mtr); } } -/** Remove a file list node. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] cur block to be removed -@param[in] coffset byte offset of the current record to be removed -@param[in,out] mtr mini-transaction -@return error code */ dberr_t flst_remove(buf_block_t *base, uint16_t boffset, - buf_block_t *cur, uint16_t coffset, mtr_t *mtr) + buf_block_t *cur, uint16_t coffset, + uint32_t limit, mtr_t *mtr) { ut_ad(boffset < base->physical_size()); ut_ad(coffset < cur->physical_size()); @@ -329,9 +345,27 @@ dberr_t flst_remove(buf_block_t *base, uint16_t boffset, const fil_addr_t next_addr= flst_get_next_addr(cur->page.frame + coffset); dberr_t err= DB_SUCCESS; - if (prev_addr.page == FIL_NULL) + if (next_addr.page >= limit) + { + if (next_addr.page != FIL_NULL) + return DB_CORRUPTION; + } + else if (UNIV_UNLIKELY(next_addr.boffset < FIL_PAGE_DATA || + next_addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; + + if (prev_addr.page >= limit) + { + if (prev_addr.page != FIL_NULL) + return DB_CORRUPTION; flst_write_addr(*base, base->page.frame + boffset + FLST_FIRST, next_addr.page, next_addr.boffset, mtr); + } + else if (UNIV_UNLIKELY(prev_addr.boffset < FIL_PAGE_DATA || + prev_addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; else { buf_block_t *b= cur; @@ -375,25 +409,19 @@ void flst_validate(const buf_block_t *base, uint16_t boffset, mtr_t *mtr) ut_ad(mtr->memo_contains_flagged(base, MTR_MEMO_PAGE_X_FIX | MTR_MEMO_PAGE_SX_FIX)); - /* We use two mini-transaction handles: the first is used to lock - the base node, and prevent other threads from modifying the list. - The second is used to traverse the list. We cannot run the second - mtr without committing it at times, because if the list is long, - the x-locked pages could fill the buffer, resulting in a deadlock. */ - mtr_t mtr2; - const uint32_t len= flst_get_len(base->page.frame + boffset); fil_addr_t addr= flst_get_first(base->page.frame + boffset); for (uint32_t i= len; i--; ) { - mtr2.start(); + ut_ad(addr.boffset >= FIL_PAGE_DATA); + ut_ad(addr.boffset < base->physical_size() - FIL_PAGE_DATA_END); const buf_block_t *b= buf_page_get_gen(page_id_t(base->page.id().space(), addr.page), base->zip_size(), RW_SX_LATCH, nullptr, BUF_GET, mtr); ut_ad(b); addr= flst_get_next_addr(b->page.frame + addr.boffset); - mtr2.commit(); + mtr->release_last_page(); } ut_ad(addr.page == FIL_NULL); @@ -402,13 +430,14 @@ void flst_validate(const buf_block_t *base, uint16_t boffset, mtr_t *mtr) for (uint32_t i= len; i--; ) { - mtr2.start(); + ut_ad(addr.boffset >= FIL_PAGE_DATA); + ut_ad(addr.boffset < base->physical_size() - FIL_PAGE_DATA_END); const buf_block_t *b= buf_page_get_gen(page_id_t(base->page.id().space(), addr.page), base->zip_size(), RW_SX_LATCH, nullptr, BUF_GET, mtr); ut_ad(b); addr= flst_get_prev_addr(b->page.frame + addr.boffset); - mtr2.commit(); + mtr->release_last_page(); } ut_ad(addr.page == FIL_NULL); diff --git a/storage/innobase/gis/gis0sea.cc b/storage/innobase/gis/gis0sea.cc index 0df9a7de..4aab68e9 100644 --- a/storage/innobase/gis/gis0sea.cc +++ b/storage/innobase/gis/gis0sea.cc @@ -289,10 +289,6 @@ rtr_pcur_getnext_from_path( mtr->rollback_to_savepoint(1); } - ut_ad((my_latch_mode | 4) == BTR_CONT_MODIFY_TREE - || !page_is_leaf(btr_cur_get_page(btr_cur)) - || !btr_cur->page_cur.block->page.lock.have_any()); - const auto block_savepoint = mtr->get_savepoint(); block = buf_page_get_gen( page_id_t(index->table->space_id, @@ -511,7 +507,7 @@ rtr_pcur_move_to_next( mysql_mutex_unlock(&rtr_info->matches->rtr_match_mutex); cursor->btr_cur.page_cur.rec = rec.r_rec; - cursor->btr_cur.page_cur.block = &rtr_info->matches->block; + cursor->btr_cur.page_cur.block = rtr_info->matches->block; DEBUG_SYNC_C("rtr_pcur_move_to_next_return"); return(true); @@ -672,8 +668,13 @@ dberr_t rtr_search_to_nth_level(ulint level, const dtuple_t *tuple, buf_mode, mtr, &err, false); if (!block) { - if (err == DB_DECRYPTION_FAILED) - btr_decryption_failed(*index); + if (err) + { + err_exit: + if (err == DB_DECRYPTION_FAILED) + btr_decryption_failed(*index); + mtr->rollback_to_savepoint(savepoint); + } func_exit: if (UNIV_LIKELY_NULL(heap)) mem_heap_free(heap); @@ -737,7 +738,8 @@ dberr_t rtr_search_to_nth_level(ulint level, const dtuple_t *tuple, #endif } - if (height == 0) { + if (height == 0) + { if (rw_latch == RW_NO_LATCH) { ut_ad(block == mtr->at_savepoint(block_savepoint)); @@ -821,7 +823,7 @@ dberr_t rtr_search_to_nth_level(ulint level, const dtuple_t *tuple, if (page_cur_search_with_match(tuple, page_mode, &up_match, &low_match, &cur->page_cur, nullptr)) { err= DB_CORRUPTION; - goto func_exit; + goto err_exit; } } @@ -1316,21 +1318,15 @@ rtr_create_rtr_info( rtr_info->index = index; if (init_matches) { - rtr_info->heap = mem_heap_create(sizeof(*(rtr_info->matches))); rtr_info->matches = static_cast( - mem_heap_zalloc( - rtr_info->heap, - sizeof(*rtr_info->matches))); + ut_zalloc_nokey(sizeof *rtr_info->matches)); rtr_info->matches->matched_recs = UT_NEW_NOKEY(rtr_rec_vector()); - rtr_info->matches->bufp = page_align(rtr_info->matches->rec_buf - + UNIV_PAGE_SIZE_MAX + 1); mysql_mutex_init(rtr_match_mutex_key, &rtr_info->matches->rtr_match_mutex, nullptr); - rtr_info->matches->block.page.lock.init(); } rtr_info->path = UT_NEW_NOKEY(rtr_node_path_t()); @@ -1449,18 +1445,16 @@ rtr_clean_rtr_info( if (free_all) { if (rtr_info->matches) { - if (rtr_info->matches->matched_recs != NULL) { - UT_DELETE(rtr_info->matches->matched_recs); + if (rtr_info->matches->block) { + buf_block_free(rtr_info->matches->block); + rtr_info->matches->block = nullptr; } - rtr_info->matches->block.page.lock.free(); + UT_DELETE(rtr_info->matches->matched_recs); mysql_mutex_destroy( &rtr_info->matches->rtr_match_mutex); - } - - if (rtr_info->heap) { - mem_heap_free(rtr_info->heap); + ut_free(rtr_info->matches); } if (initialized) { @@ -1570,7 +1564,7 @@ rtr_check_discard_page( if (auto matches = rtr_info->matches) { mysql_mutex_lock(&matches->rtr_match_mutex); - if (matches->block.page.id() == id) { + if (matches->block->page.id() == id) { matches->matched_recs->clear(); matches->valid = false; } @@ -1584,23 +1578,6 @@ rtr_check_discard_page( lock_sys.prdt_page_free_from_discard(id, true); } -/** Structure acts as functor to get the optimistic access of the page. -It returns true if it successfully gets the page. */ -struct optimistic_get -{ - btr_pcur_t *const r_cursor; - mtr_t *const mtr; - - optimistic_get(btr_pcur_t *r_cursor,mtr_t *mtr) - :r_cursor(r_cursor), mtr(mtr) {} - - bool operator()(buf_block_t *hint) const - { - return hint && buf_page_optimistic_get( - RW_X_LATCH, hint, r_cursor->modify_clock, mtr); - } -}; - /** Restore the stored position of a persistent cursor bufferfixing the page */ static bool @@ -1632,8 +1609,11 @@ rtr_cur_restore_position( r_cursor->modify_clock = 100; ); - if (r_cursor->block_when_stored.run_with_hint( - optimistic_get(r_cursor, mtr))) { + if (buf_page_optimistic_fix(r_cursor->btr_cur.page_cur.block, + r_cursor->old_page_id) + && buf_page_optimistic_get(r_cursor->btr_cur.page_cur.block, + RW_X_LATCH, r_cursor->modify_clock, + mtr)) { ut_ad(r_cursor->pos_state == BTR_PCUR_IS_POSITIONED); ut_ad(r_cursor->rel_pos == BTR_PCUR_ON); @@ -1778,7 +1758,7 @@ rtr_leaf_push_match_rec( ulint data_len; rtr_rec_t rtr_rec; - buf = match_rec->block.page.frame + match_rec->used; + buf = match_rec->block->page.frame + match_rec->used; ut_ad(page_rec_is_leaf(rec)); copy = rec_copy(buf, rec, offsets); @@ -1875,43 +1855,6 @@ rtr_non_leaf_insert_stack_push( new_seq, level, child_no, my_cursor, mbr_inc); } -/** Copy a buf_block_t, except "block->page.lock". -@param[in,out] matches copy to match->block -@param[in] block block to copy */ -static -void -rtr_copy_buf( - matched_rec_t* matches, - const buf_block_t* block) -{ - /* Copy all members of "block" to "matches->block" except "lock". - We skip "lock" because it is not used - from the dummy buf_block_t we create here and because memcpy()ing - it generates (valid) compiler warnings that the vtable pointer - will be copied. */ - matches->block.page.lock.free(); - new (&matches->block.page) buf_page_t(block->page); - matches->block.page.frame = block->page.frame; - matches->block.unzip_LRU = block->unzip_LRU; - - ut_d(matches->block.in_unzip_LRU_list = block->in_unzip_LRU_list); - ut_d(matches->block.in_withdraw_list = block->in_withdraw_list); - - /* Skip buf_block_t::lock */ - matches->block.modify_clock = block->modify_clock; -#ifdef BTR_CUR_HASH_ADAPT - matches->block.n_hash_helps = block->n_hash_helps; - matches->block.n_fields = block->n_fields; - matches->block.left_side = block->left_side; -#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG - matches->block.n_pointers = 0; -#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */ - matches->block.curr_n_fields = block->curr_n_fields; - matches->block.curr_left_side = block->curr_left_side; - matches->block.index = block->index; -#endif /* BTR_CUR_HASH_ADAPT */ -} - /****************************************************************//** Generate a shadow copy of the page block header to save the matched records */ @@ -1925,16 +1868,18 @@ rtr_init_match( { ut_ad(matches->matched_recs->empty()); matches->locked = false; - rtr_copy_buf(matches, block); - matches->block.page.frame = matches->bufp; matches->valid = false; + if (!matches->block) { + matches->block = buf_block_alloc(); + } + + matches->block->page.init(buf_page_t::MEMORY, block->page.id()); /* We have to copy PAGE_*_SUPREMUM_END bytes so that we can use infimum/supremum of this page as normal btr page for search. */ - memcpy(matches->block.page.frame, page, page_is_comp(page) - ? PAGE_NEW_SUPREMUM_END : PAGE_OLD_SUPREMUM_END); matches->used = page_is_comp(page) ? PAGE_NEW_SUPREMUM_END : PAGE_OLD_SUPREMUM_END; + memcpy(matches->block->page.frame, page, matches->used); #ifdef RTR_SEARCH_DIAGNOSTIC ulint pageno = page_get_page_no(page); fprintf(stderr, "INNODB_RTR: Searching leaf page %d\n", @@ -2361,7 +2306,7 @@ rtr_cur_search_with_match( #endif /* UNIV_DEBUG */ /* Pop the last match record and position on it */ match_rec->matched_recs->pop_back(); - page_cur_position(test_rec.r_rec, &match_rec->block, + page_cur_position(test_rec.r_rec, match_rec->block, cursor); } } else { diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 407834f2..dfe034ec 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -47,10 +47,13 @@ this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include #include "sql_type_geom.h" #include "scope.h" #include "srv0srv.h" +extern my_bool opt_readonly; + // MYSQL_PLUGIN_IMPORT extern my_bool lower_case_file_system; // MYSQL_PLUGIN_IMPORT extern char mysql_unpacked_real_data_home[]; @@ -116,6 +119,7 @@ thread_local ha_handler_stats *mariadb_stats= &mariadb_dummy_stats; #include "snappy-c.h" #include +#include // TT_FOR_UPGRADE #define thd_get_trx_isolation(X) ((enum_tx_isolation)thd_tx_isolation(X)) @@ -874,6 +878,10 @@ static MYSQL_THDVAR_BOOL(table_locks, PLUGIN_VAR_OPCMDARG, /* check_func */ NULL, /* update_func */ NULL, /* default */ TRUE); +static MYSQL_THDVAR_BOOL(snapshot_isolation, PLUGIN_VAR_OPCMDARG, + "Use snapshot isolation (write-write conflict detection).", + NULL, NULL, FALSE); + static MYSQL_THDVAR_BOOL(strict_mode, PLUGIN_VAR_OPCMDARG, "Use strict mode when evaluating create options.", NULL, NULL, TRUE); @@ -2166,6 +2174,9 @@ convert_error_code_to_mysql( return(HA_ERR_LOCK_DEADLOCK); + case DB_RECORD_CHANGED: + return HA_ERR_RECORD_CHANGED; + case DB_LOCK_WAIT_TIMEOUT: /* Starting from 5.0.13, we let MySQL just roll back the latest SQL statement in a lock wait timeout. Previously, we @@ -2809,6 +2820,8 @@ innobase_trx_init( trx->check_unique_secondary = !thd_test_options( thd, OPTION_RELAXED_UNIQUE_CHECKS); + trx->snapshot_isolation = THDVAR(thd, snapshot_isolation) & 1; + #ifdef WITH_WSREP trx->wsrep = wsrep_on(thd); #endif @@ -4003,7 +4016,7 @@ static int innodb_init_params() data_mysql_default_charset_coll = (ulint) default_charset_info->number; -#ifdef HAVE_FCNTL_DIRECT +#if !defined _WIN32 && defined O_DIRECT if (srv_use_atomic_writes && my_may_have_atomic_write) { /* Force O_DIRECT on Unixes (on Windows writes are always @@ -4342,7 +4355,7 @@ innobase_start_trx_and_assign_read_view( Do this only if transaction is using REPEATABLE READ isolation level. */ trx->isolation_level = innobase_map_isolation_level( - thd_get_trx_isolation(thd)); + thd_get_trx_isolation(thd)) & 3; if (trx->isolation_level == TRX_ISO_REPEATABLE_READ) { trx->read_view.open(trx); @@ -5345,67 +5358,6 @@ test_normalize_table_name_low() } } } - -/********************************************************************* -Test ut_format_name(). */ -static -void -test_ut_format_name() -/*=================*/ -{ - char buf[NAME_LEN * 3]; - - struct { - const char* name; - ulint buf_size; - const char* expected; - } test_data[] = { - {"test/t1", sizeof(buf), "`test`.`t1`"}, - {"test/t1", 12, "`test`.`t1`"}, - {"test/t1", 11, "`test`.`t1"}, - {"test/t1", 10, "`test`.`t"}, - {"test/t1", 9, "`test`.`"}, - {"test/t1", 8, "`test`."}, - {"test/t1", 7, "`test`"}, - {"test/t1", 6, "`test"}, - {"test/t1", 5, "`tes"}, - {"test/t1", 4, "`te"}, - {"test/t1", 3, "`t"}, - {"test/t1", 2, "`"}, - {"test/t1", 1, ""}, - {"test/t1", 0, "BUF_NOT_CHANGED"}, - {"table", sizeof(buf), "`table`"}, - {"ta'le", sizeof(buf), "`ta'le`"}, - {"ta\"le", sizeof(buf), "`ta\"le`"}, - {"ta`le", sizeof(buf), "`ta``le`"}, - }; - - for (size_t i = 0; i < UT_ARR_SIZE(test_data); i++) { - - memcpy(buf, "BUF_NOT_CHANGED", strlen("BUF_NOT_CHANGED") + 1); - - char* ret; - - ret = ut_format_name(test_data[i].name, - buf, - test_data[i].buf_size); - - ut_a(ret == buf); - - if (strcmp(buf, test_data[i].expected) == 0) { - ib::info() << "ut_format_name(" << test_data[i].name - << ", buf, " << test_data[i].buf_size << ")," - " expected " << test_data[i].expected - << ", OK"; - } else { - ib::error() << "ut_format_name(" << test_data[i].name - << ", buf, " << test_data[i].buf_size << ")," - " expected " << test_data[i].expected - << ", ERROR: got " << buf; - ut_error; - } - } -} #endif /* !DBUG_OFF */ /** Match index columns between MySQL and InnoDB. @@ -5763,9 +5715,9 @@ func_exit: return ret; } -/********************************************************************//** -Get the upper limit of the MySQL integral and floating-point type. -@return maximum allowed value for the field */ +/** Get the maximum integer value of a numeric column. +@param field column definition +@return maximum allowed integer value */ ulonglong innobase_get_int_col_max_value(const Field *field) { ulonglong max_value = 0; @@ -5830,46 +5782,45 @@ ha_innobase::open(). @param[in,out] table persistent table @param[in] field the AUTO_INCREMENT column */ -static -void -initialize_auto_increment(dict_table_t* table, const Field* field) -{ - ut_ad(!table->is_temporary()); - - const unsigned col_no = innodb_col_no(field); - - table->autoinc_mutex.wr_lock(); - - table->persistent_autoinc = static_cast( - dict_table_get_nth_col_pos(table, col_no, NULL) + 1) - & dict_index_t::MAX_N_FIELDS; +static void initialize_auto_increment(dict_table_t *table, const Field& field, + const TABLE_SHARE &s) +{ + ut_ad(!table->is_temporary()); + const unsigned col_no= innodb_col_no(&field); + table->autoinc_mutex.wr_lock(); + table->persistent_autoinc= + uint16_t(dict_table_get_nth_col_pos(table, col_no, nullptr) + 1) & + dict_index_t::MAX_N_FIELDS; + if (table->autoinc) + /* Already initialized. Our caller checked + table->persistent_autoinc without + autoinc_mutex protection, and there might be multiple + ha_innobase::open() executing concurrently. */; + else if (srv_force_recovery >= SRV_FORCE_NO_UNDO_LOG_SCAN) + /* If innodb_force_recovery is set so high that writes + are disabled we force the AUTOINC counter to 0 + value effectively disabling writes to the table. + Secondly, we avoid reading the table in case the read + results in failure due to a corrupted table/index. + + We will not return an error to the client, so that the + tables can be dumped with minimal hassle. If an error + were returned in this case, the first attempt to read + the table would fail and subsequent SELECTs would succeed. */; + else if (table->persistent_autoinc) + { + uint64_t max_value= innobase_get_int_col_max_value(&field); + table->autoinc= + innobase_next_autoinc(btr_read_autoinc_with_fallback(table, col_no, + s.mysql_version, + max_value), + 1 /* need */, + 1 /* auto_increment_increment */, + 0 /* auto_increment_offset */, + max_value); + } - if (table->autoinc) { - /* Already initialized. Our caller checked - table->persistent_autoinc without - autoinc_mutex protection, and there might be multiple - ha_innobase::open() executing concurrently. */ - } else if (srv_force_recovery >= SRV_FORCE_NO_UNDO_LOG_SCAN) { - /* If the recovery level is set so high that writes - are disabled we force the AUTOINC counter to 0 - value effectively disabling writes to the table. - Secondly, we avoid reading the table in case the read - results in failure due to a corrupted table/index. - - We will not return an error to the client, so that the - tables can be dumped with minimal hassle. If an error - were returned in this case, the first attempt to read - the table would fail and subsequent SELECTs would succeed. */ - } else if (table->persistent_autoinc) { - table->autoinc = innobase_next_autoinc( - btr_read_autoinc_with_fallback(table, col_no), - 1 /* need */, - 1 /* auto_increment_increment */, - 0 /* auto_increment_offset */, - innobase_get_int_col_max_value(field)); - } - - table->autoinc_mutex.wr_unlock(); + table->autoinc_mutex.wr_unlock(); } /** Open an InnoDB table @@ -6105,7 +6056,7 @@ ha_innobase::open(const char* name, int, uint) || m_prebuilt->table->persistent_autoinc || !m_prebuilt->table->is_readable()) { } else if (const Field* ai = table->found_next_number_field) { - initialize_auto_increment(m_prebuilt->table, ai); + initialize_auto_increment(m_prebuilt->table, *ai, *table->s); } /* Set plugin parser for fulltext index */ @@ -7394,26 +7345,55 @@ ha_innobase::build_template( ulint num_v = 0; - if (active_index != MAX_KEY - && active_index == pushed_idx_cond_keyno) { - m_prebuilt->idx_cond = this; - goto icp; - } else if (pushed_rowid_filter && rowid_filter_is_active) { -icp: - /* Push down an index condition or an end_range check. */ + /* MDEV-31154: For pushed down index condition we don't support virtual + column and idx_cond_push() does check for it. For row ID filtering we + don't need such restrictions but we get into trouble trying to use the + ICP path. + + 1. It should be fine to follow no_icp path if primary key is generated. + However, with user specified primary key(PK), the row is identified by + the PK and those columns need to be converted to mysql format in + row_search_idx_cond_check before doing the comparison. Since secondary + indexes always have PK appended in innodb, it works with current ICP + handling code when fetch_primary_key_cols is set to TRUE. + + 2. Although ICP comparison and Row ID comparison works on different + columns the current ICP code can be shared by both. + + 3. In most cases, it works today by jumping to goto no_icp when we + encounter a virtual column. This is hackish and already have some + issues as it cannot handle PK and all states are not reset properly, + for example, idx_cond_n_cols is not reset. + + 4. We already encountered MDEV-28747 m_prebuilt->idx_cond was being set. + + Neither ICP nor row ID comparison needs virtual columns and the code is + simplified to handle both. It should handle the issues. */ + + const bool pushed_down = active_index != MAX_KEY + && active_index == pushed_idx_cond_keyno; + + m_prebuilt->idx_cond = pushed_down ? this : nullptr; + + if (m_prebuilt->idx_cond || m_prebuilt->pk_filter) { + /* Push down an index condition, end_range check or row ID + filter */ for (ulint i = 0; i < n_fields; i++) { const Field* field = table->field[i]; const bool is_v = !field->stored_in_db(); - if (is_v && skip_virtual) { - num_v++; - continue; - } + bool index_contains = index->contains_col_or_prefix( is_v ? num_v : i - num_v, is_v); - if (is_v && index_contains) { - m_prebuilt->n_template = 0; - num_v = 0; - goto no_icp; + + if (is_v) { + if (index_contains) { + /* We want to ensure that ICP is not + used with virtual columns. */ + ut_ad(!pushed_down); + m_prebuilt->idx_cond = nullptr; + } + num_v++; + continue; } /* Test if an end_range or an index condition @@ -7433,7 +7413,7 @@ icp: which would be acceptable if end_range==NULL. */ if (build_template_needs_field_in_icp( index, m_prebuilt, index_contains, - is_v ? num_v : i - num_v, is_v)) { + i - num_v, false)) { if (!whole_row) { field = build_template_needs_field( index_contains, @@ -7442,15 +7422,10 @@ icp: fetch_primary_key_cols, index, table, i, num_v); if (!field) { - if (is_v) { - num_v++; - } continue; } } - ut_ad(!is_v); - mysql_row_templ_t* templ= build_template_field( m_prebuilt, clust_index, index, table, field, i - num_v, 0); @@ -7527,15 +7502,16 @@ icp: */ } - if (is_v) { - num_v++; - } } - ut_ad(m_prebuilt->idx_cond_n_cols > 0); - ut_ad(m_prebuilt->idx_cond_n_cols == m_prebuilt->n_template); - num_v = 0; + ut_ad(m_prebuilt->idx_cond_n_cols == m_prebuilt->n_template); + if (m_prebuilt->idx_cond_n_cols == 0) { + /* No columns to push down. It is safe to jump to np ICP + path. */ + m_prebuilt->idx_cond = nullptr; + goto no_icp; + } /* Include the fields that are not needed in index condition pushdown. */ @@ -7550,7 +7526,7 @@ icp: bool index_contains = index->contains_col_or_prefix( is_v ? num_v : i - num_v, is_v); - if (!build_template_needs_field_in_icp( + if (is_v || !build_template_needs_field_in_icp( index, m_prebuilt, index_contains, is_v ? num_v : i - num_v, is_v)) { /* Not needed in ICP */ @@ -7583,7 +7559,7 @@ icp: } else { no_icp: /* No index condition pushdown */ - m_prebuilt->idx_cond = NULL; + ut_ad(!m_prebuilt->idx_cond); ut_ad(num_v == 0); for (ulint i = 0; i < n_fields; i++) { @@ -8737,6 +8713,7 @@ ha_innobase::delete_row( : PLAIN_DELETE; trx->fts_next_doc_id = 0; + ut_ad(!trx->is_bulk_insert()); error = row_update_for_mysql(m_prebuilt); #ifdef WITH_WSREP @@ -8844,47 +8821,63 @@ ha_innobase::index_end(void) DBUG_RETURN(0); } -/*********************************************************************//** -Converts a search mode flag understood by MySQL to a flag understood -by InnoDB. */ -page_cur_mode_t -convert_search_mode_to_innobase( -/*============================*/ - ha_rkey_function find_flag) -{ - switch (find_flag) { - case HA_READ_KEY_EXACT: - /* this does not require the index to be UNIQUE */ - case HA_READ_KEY_OR_NEXT: - return(PAGE_CUR_GE); - case HA_READ_AFTER_KEY: - return(PAGE_CUR_G); - case HA_READ_BEFORE_KEY: - return(PAGE_CUR_L); - case HA_READ_KEY_OR_PREV: - case HA_READ_PREFIX_LAST: - case HA_READ_PREFIX_LAST_OR_PREV: - return(PAGE_CUR_LE); - case HA_READ_MBR_CONTAIN: - return(PAGE_CUR_CONTAIN); - case HA_READ_MBR_INTERSECT: - return(PAGE_CUR_INTERSECT); - case HA_READ_MBR_WITHIN: - return(PAGE_CUR_WITHIN); - case HA_READ_MBR_DISJOINT: - return(PAGE_CUR_DISJOINT); - case HA_READ_MBR_EQUAL: - return(PAGE_CUR_MBR_EQUAL); - case HA_READ_PREFIX: - return(PAGE_CUR_UNSUPP); - /* do not use "default:" in order to produce a gcc warning: - enumeration value '...' not handled in switch - (if -Wswitch or -Wall is used) */ - } - - my_error(ER_CHECK_NOT_IMPLEMENTED, MYF(0), "this functionality"); - - return(PAGE_CUR_UNSUPP); +/** Convert a MariaDB search mode to an InnoDB search mode. +@tparam last_match whether last_match_mode is to be set +@param find_flag MariaDB search mode +@param mode InnoDB search mode +@param last_match_mode pointer to ha_innobase::m_last_match_mode +@return whether the search mode is unsupported */ +template +static bool convert_search_mode_to_innobase(ha_rkey_function find_flag, + page_cur_mode_t &mode, + uint *last_match_mode= nullptr) +{ + mode= PAGE_CUR_LE; + if (last_match) + *last_match_mode= 0; + + switch (find_flag) { + case HA_READ_KEY_EXACT: + /* this does not require the index to be UNIQUE */ + if (last_match) + *last_match_mode= ROW_SEL_EXACT; + /* fall through */ + case HA_READ_KEY_OR_NEXT: + mode= PAGE_CUR_GE; + return false; + case HA_READ_AFTER_KEY: + mode= PAGE_CUR_G; + return false; + case HA_READ_BEFORE_KEY: + mode= PAGE_CUR_L; + return false; + case HA_READ_PREFIX_LAST: + if (last_match) + *last_match_mode= ROW_SEL_EXACT_PREFIX; + /* fall through */ + case HA_READ_KEY_OR_PREV: + case HA_READ_PREFIX_LAST_OR_PREV: + return false; + case HA_READ_MBR_CONTAIN: + mode= PAGE_CUR_CONTAIN; + return false; + case HA_READ_MBR_INTERSECT: + mode= PAGE_CUR_INTERSECT; + return false; + case HA_READ_MBR_WITHIN: + mode= PAGE_CUR_WITHIN; + return false; + case HA_READ_MBR_DISJOINT: + mode= PAGE_CUR_DISJOINT; + return false; + case HA_READ_MBR_EQUAL: + mode= PAGE_CUR_MBR_EQUAL; + return false; + case HA_READ_PREFIX: + break; + } + + return true; } /* @@ -8962,8 +8955,7 @@ ha_innobase::index_read( mariadb_set_stats set_stats_temporary(handler_stats); DEBUG_SYNC_C("ha_innobase_index_read_begin"); - ut_a(m_prebuilt->trx == thd_to_trx(m_user_thd)); - ut_ad(key_len != 0 || find_flag != HA_READ_KEY_EXACT); + ut_ad(m_prebuilt->trx == thd_to_trx(m_user_thd)); dict_index_t* index = m_prebuilt->index; @@ -8999,7 +8991,8 @@ ha_innobase::index_read( build_template(false); } - if (key_ptr != NULL) { + if (key_len) { + ut_ad(key_ptr); /* Convert the search key value to InnoDB format into m_prebuilt->search_tuple */ @@ -9009,84 +9002,58 @@ ha_innobase::index_read( m_prebuilt->srch_key_val_len, index, (byte*) key_ptr, - (ulint) key_len); + key_len); DBUG_ASSERT(m_prebuilt->search_tuple->n_fields > 0); } else { + ut_ad(find_flag != HA_READ_KEY_EXACT); /* We position the cursor to the last or the first entry in the index */ dtuple_set_n_fields(m_prebuilt->search_tuple, 0); } - page_cur_mode_t mode = convert_search_mode_to_innobase(find_flag); - - ulint match_mode = 0; + page_cur_mode_t mode; - if (find_flag == HA_READ_KEY_EXACT) { - - match_mode = ROW_SEL_EXACT; - - } else if (find_flag == HA_READ_PREFIX_LAST) { - - match_mode = ROW_SEL_EXACT_PREFIX; + if (convert_search_mode_to_innobase(find_flag, mode, + &m_last_match_mode)) { + table->status = STATUS_NOT_FOUND; + DBUG_RETURN(HA_ERR_UNSUPPORTED); } - m_last_match_mode = (uint) match_mode; - - dberr_t ret = mode == PAGE_CUR_UNSUPP ? DB_UNSUPPORTED - : row_search_mvcc(buf, mode, m_prebuilt, match_mode, 0); + dberr_t ret = + row_search_mvcc(buf, mode, m_prebuilt, m_last_match_mode, 0); DBUG_EXECUTE_IF("ib_select_query_failure", ret = DB_ERROR;); - int error; - - switch (ret) { - case DB_SUCCESS: - error = 0; + if (UNIV_LIKELY(ret == DB_SUCCESS)) { table->status = 0; - break; - - case DB_RECORD_NOT_FOUND: - error = HA_ERR_KEY_NOT_FOUND; - table->status = STATUS_NOT_FOUND; - break; + DBUG_RETURN(0); + } - case DB_END_OF_INDEX: - error = HA_ERR_KEY_NOT_FOUND; - table->status = STATUS_NOT_FOUND; - break; + table->status = STATUS_NOT_FOUND; + switch (ret) { case DB_TABLESPACE_DELETED: ib_senderrf( m_prebuilt->trx->mysql_thd, IB_LOG_LEVEL_ERROR, ER_TABLESPACE_DISCARDED, table->s->table_name.str); - - table->status = STATUS_NOT_FOUND; - error = HA_ERR_TABLESPACE_MISSING; - break; - + DBUG_RETURN(HA_ERR_TABLESPACE_MISSING); + case DB_RECORD_NOT_FOUND: + case DB_END_OF_INDEX: + DBUG_RETURN(HA_ERR_KEY_NOT_FOUND); case DB_TABLESPACE_NOT_FOUND: - ib_senderrf( m_prebuilt->trx->mysql_thd, IB_LOG_LEVEL_ERROR, ER_TABLESPACE_MISSING, table->s->table_name.str); - - table->status = STATUS_NOT_FOUND; - error = HA_ERR_TABLESPACE_MISSING; - break; - + DBUG_RETURN(HA_ERR_TABLESPACE_MISSING); default: - error = convert_error_code_to_mysql( - ret, m_prebuilt->table->flags, m_user_thd); - - table->status = STATUS_NOT_FOUND; - break; + DBUG_RETURN(convert_error_code_to_mysql( + ret, m_prebuilt->table->flags, + m_user_thd)); } - - DBUG_RETURN(error); } /*******************************************************************//** @@ -9513,8 +9480,6 @@ ha_innobase::rnd_pos( DBUG_ENTER("rnd_pos"); DBUG_DUMP("key", pos, ref_length); - ut_a(m_prebuilt->trx == thd_to_trx(ha_thd())); - /* Note that we assume the length of the row reference is fixed for the table, and it is == ref_length */ @@ -9938,7 +9903,8 @@ wsrep_append_foreign_key( } ulint rcode = DB_SUCCESS; - char cache_key[513] = {'\0'}; + char cache_key[MAX_FULL_NAME_LEN] = {'\0'}; + char db_name[MAX_DATABASE_NAME_LEN+1] = {'\0'}; size_t cache_key_len = 0; if ( !((referenced) ? @@ -10028,14 +9994,38 @@ wsrep_append_foreign_key( return DB_ERROR; } - strncpy(cache_key, + char * fk_table = (wsrep_protocol_version > 1) ? ((referenced) ? foreign->referenced_table->name.m_name : foreign->foreign_table->name.m_name) : - foreign->foreign_table->name.m_name, sizeof(cache_key) - 1); - cache_key_len = strlen(cache_key); + foreign->foreign_table->name.m_name; + + /* convert db and table name parts separately to system charset */ + ulint db_name_len = dict_get_db_name_len(fk_table); + strmake(db_name, fk_table, db_name_len); + uint errors; + cache_key_len= innobase_convert_to_system_charset(cache_key, + db_name, sizeof(cache_key), &errors); + if (errors) { + WSREP_WARN("unexpected foreign key table %s %s", + foreign->referenced_table->name.m_name, + foreign->foreign_table->name.m_name); + return DB_ERROR; + } + /* after db name adding 0 and then converted table name */ + cache_key[db_name_len]= '\0'; + cache_key_len++; + + cache_key_len+= innobase_convert_to_system_charset(cache_key+cache_key_len, + fk_table+db_name_len+1, sizeof(cache_key), &errors); + if (errors) { + WSREP_WARN("unexpected foreign key table %s %s", + foreign->referenced_table->name.m_name, + foreign->foreign_table->name.m_name); + return DB_ERROR; + } #ifdef WSREP_DEBUG_PRINT ulint j; fprintf(stderr, "FK parent key, table: %s %s len: %lu ", @@ -10045,16 +10035,6 @@ wsrep_append_foreign_key( } fprintf(stderr, "\n"); #endif - char *p = strchr(cache_key, '/'); - - if (p) { - *p = '\0'; - } else { - WSREP_WARN("unexpected foreign key table %s %s", - foreign->referenced_table->name.m_name, - foreign->foreign_table->name.m_name); - } - wsrep_buf_t wkey_part[3]; wsrep_key_t wkey = {wkey_part, 3}; @@ -12269,7 +12249,7 @@ create_table_info_t::create_foreign_keys() dict_index_t* index = NULL; fkerr_t index_error = FK_SUCCESS; dict_index_t* err_index = NULL; - ulint err_col; + ulint err_col = 0; const bool tmp_table = m_flags2 & DICT_TF2_TEMPORARY; const CHARSET_INFO* cs = thd_charset(m_thd); const char* operation = "Create "; @@ -13383,6 +13363,49 @@ ha_innobase::discard_or_import_tablespace( DBUG_RETURN(0); } +/** Report a DROP TABLE failure due to a FOREIGN KEY constraint. +@param name table name +@param foreign constraint */ +ATTRIBUTE_COLD +static void delete_table_cannot_drop_foreign(const table_name_t &name, + const dict_foreign_t &foreign) +{ + mysql_mutex_lock(&dict_foreign_err_mutex); + rewind(dict_foreign_err_file); + ut_print_timestamp(dict_foreign_err_file); + fputs(" Cannot drop table ", dict_foreign_err_file); + ut_print_name(dict_foreign_err_file, nullptr, name.m_name); + fputs("\nbecause it is referenced by ", dict_foreign_err_file); + ut_print_name(dict_foreign_err_file, nullptr, foreign.foreign_table_name); + putc('\n', dict_foreign_err_file); + mysql_mutex_unlock(&dict_foreign_err_mutex); +} + +/** Check if DROP TABLE would fail due to a FOREIGN KEY constraint. +@param table table to be dropped +@param sqlcom thd_sql_command(current_thd) +@return whether child tables that refer to this table exist */ +static bool delete_table_check_foreigns(const dict_table_t &table, + enum_sql_command sqlcom) +{ + const bool drop_db{sqlcom == SQLCOM_DROP_DB}; + for (const auto foreign : table.referenced_set) + { + /* We should allow dropping a referenced table if creating + that referenced table has failed for some reason. For example + if referenced table is created but it column types that are + referenced do not match. */ + if (foreign->foreign_table == &table || + (drop_db && + dict_tables_have_same_db(table.name.m_name, + foreign->foreign_table_name_lookup))) + continue; + delete_table_cannot_drop_foreign(table.name, *foreign); + return true; + } + + return false; +} /** DROP TABLE (possibly as part of DROP DATABASE, CREATE/ALTER TABLE) @param name table name @@ -13397,8 +13420,8 @@ int ha_innobase::delete_table(const char *name) DBUG_EXECUTE_IF("test_normalize_table_name_low", test_normalize_table_name_low();); - DBUG_EXECUTE_IF("test_ut_format_name", test_ut_format_name();); + const enum_sql_command sqlcom= enum_sql_command(thd_sql_command(thd)); trx_t *parent_trx= check_trx_exists(thd); dict_table_t *table; @@ -13435,6 +13458,13 @@ int ha_innobase::delete_table(const char *name) DBUG_RETURN(0); } + if (parent_trx->check_foreigns && + delete_table_check_foreigns(*table, sqlcom)) + { + dict_sys.unlock(); + DBUG_RETURN(HA_ERR_ROW_IS_REFERENCED); + } + table->acquire(); dict_sys.unlock(); @@ -13467,14 +13497,7 @@ int ha_innobase::delete_table(const char *name) /* FOREIGN KEY constraints cannot exist on partitioned tables. */; #endif else - { - dict_sys.freeze(SRW_LOCK_CALL); - for (const dict_foreign_t* f : table->referenced_set) - if (dict_table_t* child= f->foreign_table) - if ((err= lock_table_for_trx(child, trx, LOCK_X)) != DB_SUCCESS) - break; - dict_sys.unfreeze(); - } + err= lock_table_children(table, trx); } dict_table_t *table_stats= nullptr, *index_stats= nullptr; @@ -13484,7 +13507,6 @@ int ha_innobase::delete_table(const char *name) const bool fts= err == DB_SUCCESS && (table->flags2 & (DICT_TF2_FTS_HAS_DOC_ID | DICT_TF2_FTS)); - const enum_sql_command sqlcom= enum_sql_command(thd_sql_command(thd)); if (fts) { @@ -13642,36 +13664,16 @@ err_exit: DBUG_RETURN(convert_error_code_to_mysql(err, 0, NULL)); } - if (!table->no_rollback() && trx->check_foreigns) + if (!table->no_rollback()) { - const bool drop_db= sqlcom == SQLCOM_DROP_DB; - for (auto foreign : table->referenced_set) + if (trx->check_foreigns && delete_table_check_foreigns(*table, sqlcom)) { - /* We should allow dropping a referenced table if creating - that referenced table has failed for some reason. For example - if referenced table is created but it column types that are - referenced do not match. */ - if (foreign->foreign_table == table || - (drop_db && - dict_tables_have_same_db(table->name.m_name, - foreign->foreign_table_name_lookup))) - continue; - mysql_mutex_lock(&dict_foreign_err_mutex); - rewind(dict_foreign_err_file); - ut_print_timestamp(dict_foreign_err_file); - fputs(" Cannot drop table ", dict_foreign_err_file); - ut_print_name(dict_foreign_err_file, trx, table->name.m_name); - fputs("\nbecause it is referenced by ", dict_foreign_err_file); - ut_print_name(dict_foreign_err_file, trx, foreign->foreign_table_name); - putc('\n', dict_foreign_err_file); - mysql_mutex_unlock(&dict_foreign_err_mutex); err= DB_CANNOT_DROP_CONSTRAINT; goto err_exit; } - } - if (!table->no_rollback()) err= trx->drop_table_foreign(table->name); + } if (err == DB_SUCCESS && table_stats && index_stats) err= trx->drop_table_statistics(table->name); @@ -13790,6 +13792,19 @@ int ha_innobase::truncate() update_thd(); +#ifdef UNIV_DEBUG + if (!thd_test_options(m_user_thd, OPTION_NO_FOREIGN_KEY_CHECKS)) + { + /* fk_truncate_illegal_if_parent() should have failed in + Sql_cmd_truncate_table::handler_truncate() if foreign_key_checks=ON + and child tables exist. */ + dict_sys.freeze(SRW_LOCK_CALL); + for (const auto foreign : m_prebuilt->table->referenced_set) + ut_ad(foreign->foreign_table == m_prebuilt->table); + dict_sys.unfreeze(); + } +#endif + if (is_read_only()) DBUG_RETURN(HA_ERR_TABLE_READONLY); @@ -13872,14 +13887,7 @@ int ha_innobase::truncate() dict_table_t *table_stats = nullptr, *index_stats = nullptr; MDL_ticket *mdl_table = nullptr, *mdl_index = nullptr; - dberr_t error= DB_SUCCESS; - - dict_sys.freeze(SRW_LOCK_CALL); - for (const dict_foreign_t *f : ib_table->referenced_set) - if (dict_table_t *child= f->foreign_table) - if ((error= lock_table_for_trx(child, trx, LOCK_X)) != DB_SUCCESS) - break; - dict_sys.unfreeze(); + dberr_t error= lock_table_children(ib_table, trx); if (error == DB_SUCCESS) error= lock_table_for_trx(ib_table, trx, LOCK_X); @@ -14070,16 +14078,7 @@ ha_innobase::rename_table( /* There is no need to lock any FOREIGN KEY child tables. */ } else if (dict_table_t *table = dict_table_open_on_name( norm_from, false, DICT_ERR_IGNORE_FK_NOKEY)) { - dict_sys.freeze(SRW_LOCK_CALL); - for (const dict_foreign_t* f : table->referenced_set) { - if (dict_table_t* child = f->foreign_table) { - error = lock_table_for_trx(child, trx, LOCK_X); - if (error != DB_SUCCESS) { - break; - } - } - } - dict_sys.unfreeze(); + error = lock_table_children(table, trx); if (error == DB_SUCCESS) { error = lock_table_for_trx(table, trx, LOCK_X); } @@ -14218,14 +14217,14 @@ ha_innobase::records_in_range( dict_index_t* index; dtuple_t* range_start; dtuple_t* range_end; - ha_rows n_rows; + ha_rows n_rows = HA_POS_ERROR; page_cur_mode_t mode1; page_cur_mode_t mode2; mem_heap_t* heap; DBUG_ENTER("records_in_range"); - ut_a(m_prebuilt->trx == thd_to_trx(ha_thd())); + ut_ad(m_prebuilt->trx == thd_to_trx(ha_thd())); m_prebuilt->trx->op_info = "estimating records in index range"; @@ -14238,12 +14237,7 @@ ha_innobase::records_in_range( /* There exists possibility of not being able to find requested index due to inconsistency between MySQL and InoDB dictionary info. Necessary message should have been printed in innobase_get_index() */ - if (!m_prebuilt->table->space) { - n_rows = HA_POS_ERROR; - goto func_exit; - } - if (!index) { - n_rows = HA_POS_ERROR; + if (!index || !m_prebuilt->table->space) { goto func_exit; } if (index->is_corrupted()) { @@ -14259,61 +14253,50 @@ ha_innobase::records_in_range( + sizeof(dtuple_t))); range_start = dtuple_create(heap, key->ext_key_parts); - dict_index_copy_types(range_start, index, key->ext_key_parts); range_end = dtuple_create(heap, key->ext_key_parts); - dict_index_copy_types(range_end, index, key->ext_key_parts); - - row_sel_convert_mysql_key_to_innobase( - range_start, - m_prebuilt->srch_key_val1, - m_prebuilt->srch_key_val_len, - index, - (byte*) (min_key ? min_key->key : (const uchar*) 0), - (ulint) (min_key ? min_key->length : 0)); - - DBUG_ASSERT(min_key - ? range_start->n_fields > 0 - : range_start->n_fields == 0); - - row_sel_convert_mysql_key_to_innobase( - range_end, - m_prebuilt->srch_key_val2, - m_prebuilt->srch_key_val_len, - index, - (byte*) (max_key ? max_key->key : (const uchar*) 0), - (ulint) (max_key ? max_key->length : 0)); - - DBUG_ASSERT(max_key - ? range_end->n_fields > 0 - : range_end->n_fields == 0); - - mode1 = convert_search_mode_to_innobase( - min_key ? min_key->flag : HA_READ_KEY_EXACT); - - mode2 = convert_search_mode_to_innobase( - max_key ? max_key->flag : HA_READ_KEY_EXACT); - - if (mode1 != PAGE_CUR_UNSUPP && mode2 != PAGE_CUR_UNSUPP) { - - if (dict_index_is_spatial(index)) { - /*Only min_key used in spatial index. */ - n_rows = rtr_estimate_n_rows_in_range( - index, range_start, mode1); - } else { - btr_pos_t tuple1(range_start, mode1, pages->first_page); - btr_pos_t tuple2(range_end, mode2, pages->last_page); - n_rows = btr_estimate_n_rows_in_range( - index, &tuple1, &tuple2); - pages->first_page= tuple1.page_id.raw(); - pages->last_page= tuple2.page_id.raw(); - } + + if (!min_key) { + mode1 = PAGE_CUR_GE; + dtuple_set_n_fields(range_start, 0); + } else if (convert_search_mode_to_innobase(min_key->flag, mode1)) { + goto unsupported; } else { + dict_index_copy_types(range_start, index, key->ext_key_parts); + row_sel_convert_mysql_key_to_innobase( + range_start, + m_prebuilt->srch_key_val1, + m_prebuilt->srch_key_val_len, + index, min_key->key, min_key->length); + DBUG_ASSERT(range_start->n_fields > 0); + } - n_rows = HA_POS_ERROR; + if (!max_key) { + mode2 = PAGE_CUR_GE; + dtuple_set_n_fields(range_end, 0); + } else if (convert_search_mode_to_innobase(max_key->flag, mode2)) { + goto unsupported; + } else { + dict_index_copy_types(range_end, index, key->ext_key_parts); + row_sel_convert_mysql_key_to_innobase( + range_end, + m_prebuilt->srch_key_val2, + m_prebuilt->srch_key_val_len, + index, max_key->key, max_key->length); + DBUG_ASSERT(range_end->n_fields > 0); } - mem_heap_free(heap); + if (dict_index_is_spatial(index)) { + /*Only min_key used in spatial index. */ + n_rows = rtr_estimate_n_rows_in_range( + index, range_start, mode1); + } else { + btr_pos_t tuple1(range_start, mode1, pages->first_page); + btr_pos_t tuple2(range_end, mode2, pages->last_page); + n_rows = btr_estimate_n_rows_in_range(index, &tuple1, &tuple2); + pages->first_page= tuple1.page_id.raw(); + pages->last_page= tuple2.page_id.raw(); + } DBUG_EXECUTE_IF( "print_btr_estimate_n_rows_in_range_return_value", @@ -14324,11 +14307,7 @@ ha_innobase::records_in_range( (longlong) n_rows); ); -func_exit: - - m_prebuilt->trx->op_info = (char*)""; - - /* The MySQL optimizer seems to believe an estimate of 0 rows is + /* The MariaDB optimizer seems to believe an estimate of 0 rows is always accurate and may return the result 'Empty set' based on that. The accuracy is not guaranteed, and even if it were, for a locking read we should anyway perform the search to set the next-key lock. @@ -14338,6 +14317,10 @@ func_exit: n_rows = 1; } +unsupported: + mem_heap_free(heap); +func_exit: + m_prebuilt->trx->op_info = ""; DBUG_RETURN((ha_rows) n_rows); } @@ -15140,6 +15123,7 @@ ha_innobase::check( ulint n_rows_in_table = ULINT_UNDEFINED; bool is_ok = true; dberr_t ret; + uint handler_flags= check_opt->handler_flags; DBUG_ENTER("ha_innobase::check"); DBUG_ASSERT(thd == ha_thd()); @@ -15148,6 +15132,27 @@ ha_innobase::check( ut_a(m_prebuilt->trx == thd_to_trx(thd)); ut_ad(m_prebuilt->trx->mysql_thd == thd); + if (handler_flags || check_for_upgrade(check_opt)) { + /* The file was already checked and fixed as part of open */ + print_check_msg(thd, table->s->db.str, table->s->table_name.str, + "check", "note", + (opt_readonly || high_level_read_only + || !(check_opt->sql_flags & TT_FOR_UPGRADE)) + ? "Auto_increment will be" + " checked on each open until" + " CHECK TABLE FOR UPGRADE is executed" + : "Auto_increment checked and" + " .frm file version updated", 1); + if (handler_flags && (check_opt->sql_flags & TT_FOR_UPGRADE)) { + /* + No other issues found (as handler_flags was only + set if there as not other problems with the table + than auto_increment). + */ + DBUG_RETURN(HA_ADMIN_OK); + } + } + if (m_prebuilt->mysql_template == NULL) { /* Build the template; we will use a dummy template in index scans done in checking */ @@ -15330,7 +15335,7 @@ ha_innobase::check( } /* Restore the original isolation level */ - m_prebuilt->trx->isolation_level = old_isolation_level; + m_prebuilt->trx->isolation_level = old_isolation_level & 3; #ifdef BTR_CUR_HASH_ADAPT # if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG /* We validate the whole adaptive hash index for all tables @@ -15351,6 +15356,35 @@ func_exit: DBUG_RETURN(is_ok ? HA_ADMIN_OK : HA_ADMIN_CORRUPT); } +/** +Check if we there is a problem with the InnoDB table. +@param check_opt check options +@retval HA_ADMIN_OK if Table is ok +@retval HA_ADMIN_NEEDS_ALTER User should run ALTER TABLE FOR UPGRADE +@retval HA_ADMIN_NEEDS_CHECK User should run CHECK TABLE FOR UPGRADE +@retval HA_ADMIN_FAILED if InnoDB is in read-only mode */ +int ha_innobase::check_for_upgrade(HA_CHECK_OPT *check_opt) +{ + /* + Check if there is a possibility that the auto increment value + stored in PAGE_ROOT_AUTO_INC could be corrupt. + */ + if (table->s->mysql_version >= 100210); + else if (const Field *auto_increment= table->found_next_number_field) + { + uint col_no= innodb_col_no(auto_increment); + const dict_col_t *autoinc_col= + dict_table_get_nth_col(m_prebuilt->table, col_no); + if (m_prebuilt->table->get_index(*autoinc_col)) + { + check_opt->handler_flags= 1; + return (high_level_read_only && !opt_readonly) + ? HA_ADMIN_FAILED : HA_ADMIN_NEEDS_CHECK; + } + } + return HA_ADMIN_OK; +} + /*******************************************************************//** Gets the foreign key create info for a table stored in InnoDB. @return own: character string in the form which can be inserted to the @@ -15408,7 +15442,6 @@ get_foreign_key_info( char tmp_buff[NAME_LEN+1]; char name_buff[NAME_LEN+1]; const char* ptr; - LEX_CSTRING* referenced_key_name; LEX_CSTRING* name = NULL; if (dict_table_t::is_temporary_name(foreign->foreign_table_name)) { @@ -15509,18 +15542,16 @@ get_foreign_key_info( if (foreign->referenced_index && foreign->referenced_index->name != NULL) { - referenced_key_name = thd_make_lex_string( + f_key_info.referenced_key_name = thd_make_lex_string( thd, - f_key_info.referenced_key_name, + nullptr, foreign->referenced_index->name, strlen(foreign->referenced_index->name), 1); } else { - referenced_key_name = NULL; + f_key_info.referenced_key_name = NULL; } - f_key_info.referenced_key_name = referenced_key_name; - pf_key_info = (FOREIGN_KEY_INFO*) thd_memdup(thd, &f_key_info, sizeof(FOREIGN_KEY_INFO)); @@ -15806,7 +15837,7 @@ ha_innobase::start_stmt( } /* fall through */ default: - trx->end_bulk_insert(*m_prebuilt->table); + trx->bulk_insert_apply_for_table(m_prebuilt->table); if (!trx->bulk_insert) { break; } @@ -16000,7 +16031,7 @@ ha_innobase::external_lock( } /* fall through */ default: - trx->end_bulk_insert(*m_prebuilt->table); + trx->bulk_insert_apply_for_table(m_prebuilt->table); if (!trx->bulk_insert) { break; } @@ -16370,7 +16401,7 @@ ha_innobase::store_lock( if (lock_type != TL_IGNORE && trx->n_mysql_tables_in_use == 0) { trx->isolation_level = innobase_map_isolation_level( - (enum_tx_isolation) thd_tx_isolation(thd)); + (enum_tx_isolation) thd_tx_isolation(thd)) & 3; if (trx->isolation_level <= TRX_ISO_READ_COMMITTED) { @@ -16600,6 +16631,13 @@ ha_innobase::get_auto_increment( if (error != DB_SUCCESS) { *first_value = (~(ulonglong) 0); + /* This is an error case. We do the error handling by calling + the error code conversion function. Specifically, we need to + call thd_mark_transaction_to_rollback() to inform sql that we + have rolled back innodb transaction after a deadlock error. We + ignore the returned mysql error code here. */ + std::ignore = convert_error_code_to_mysql( + error, m_prebuilt->table->flags, m_user_thd); return; } @@ -17535,6 +17573,7 @@ innodb_make_page_dirty(THD*, st_mysql_sys_var*, void*, const void* save) { mtr_t mtr; uint space_id = *static_cast(save); + srv_fil_make_page_dirty_debug= space_id; mysql_mutex_unlock(&LOCK_global_system_variables); fil_space_t* space = fil_space_t::get(space_id); @@ -18261,13 +18300,15 @@ buf_flush_list_now_set(THD*, st_mysql_sys_var*, void*, const void* save) return; const uint s= srv_fil_make_page_dirty_debug; mysql_mutex_unlock(&LOCK_global_system_variables); - if (s) - buf_flush_sync(); - else + if (s == 0 || srv_is_undo_tablespace(s)) { - while (buf_flush_list_space(fil_system.sys_space, nullptr)); + fil_space_t *space= fil_system.sys_space; + if (s) { space= fil_space_get(s); } + while (buf_flush_list_space(space, nullptr)); os_aio_wait_until_no_pending_writes(true); } + else + buf_flush_sync(); mysql_mutex_lock(&LOCK_global_system_variables); } @@ -18452,7 +18493,7 @@ static void innodb_log_file_size_update(THD *thd, st_mysql_sys_var*, const bool in_progress(buf_pool.get_oldest_modification(LSN_MAX) < log_sys.resize_in_progress()); if (in_progress) - my_cond_timedwait(&buf_pool.do_flush_list, + my_cond_timedwait(&buf_pool.done_flush_list, &buf_pool.flush_list_mutex.m_mutex, &abstime); mysql_mutex_unlock(&buf_pool.flush_list_mutex); if (!log_sys.resize_in_progress()) @@ -18463,6 +18504,15 @@ static void innodb_log_file_size_update(THD *thd, st_mysql_sys_var*, mysql_mutex_lock(&LOCK_global_system_variables); } +static void innodb_log_spin_wait_delay_update(THD *, st_mysql_sys_var*, + void *, const void *save) +{ + log_sys.latch.wr_lock(SRW_LOCK_CALL); + mtr_t::spin_wait_delay= *static_cast(save); + mtr_t::finisher_update(); + log_sys.latch.wr_unlock(); +} + /** Update innodb_status_output or innodb_status_output_locks, which control InnoDB "status monitor" output to the error log. @param[out] var current value @@ -19279,10 +19329,10 @@ static MYSQL_SYSVAR_ULONG(page_size, srv_page_size, NULL, NULL, UNIV_PAGE_SIZE_DEF, UNIV_PAGE_SIZE_MIN, UNIV_PAGE_SIZE_MAX, 0); -static MYSQL_SYSVAR_SIZE_T(log_buffer_size, log_sys.buf_size, +static MYSQL_SYSVAR_UINT(log_buffer_size, log_sys.buf_size, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, "Redo log buffer size in bytes.", - NULL, NULL, 16U << 20, 2U << 20, SIZE_T_MAX, 4096); + NULL, NULL, 16U << 20, 2U << 20, log_sys.buf_size_max, 4096); #if defined __linux__ || defined _WIN32 static MYSQL_SYSVAR_BOOL(log_file_buffering, log_sys.log_buffered, @@ -19297,6 +19347,12 @@ static MYSQL_SYSVAR_ULONGLONG(log_file_size, srv_log_file_size, nullptr, innodb_log_file_size_update, 96 << 20, 4 << 20, std::numeric_limits::max(), 4096); +static MYSQL_SYSVAR_UINT(log_spin_wait_delay, mtr_t::spin_wait_delay, + PLUGIN_VAR_OPCMDARG, + "Delay between log buffer spin lock polls (0 to use a blocking latch)", + nullptr, innodb_log_spin_wait_delay_update, + 0, 0, 6000, 0); + static MYSQL_SYSVAR_UINT(old_blocks_pct, innobase_old_blocks_pct, PLUGIN_VAR_RQCMDARG, "Percentage of the buffer pool to reserve for 'old' blocks.", @@ -19756,6 +19812,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(log_file_buffering), #endif MYSQL_SYSVAR(log_file_size), + MYSQL_SYSVAR(log_spin_wait_delay), MYSQL_SYSVAR(log_group_home_dir), MYSQL_SYSVAR(max_dirty_pages_pct), MYSQL_SYSVAR(max_dirty_pages_pct_lwm), @@ -19776,6 +19833,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(ft_server_stopword_table), MYSQL_SYSVAR(ft_user_stopword_table), MYSQL_SYSVAR(disable_sort_file_cache), + MYSQL_SYSVAR(snapshot_isolation), MYSQL_SYSVAR(stats_on_metadata), MYSQL_SYSVAR(stats_transient_sample_pages), MYSQL_SYSVAR(stats_persistent), diff --git a/storage/innobase/handler/ha_innodb.h b/storage/innobase/handler/ha_innodb.h index 1f42bf18..50ac423f 100644 --- a/storage/innobase/handler/ha_innodb.h +++ b/storage/innobase/handler/ha_innodb.h @@ -209,6 +209,7 @@ public: int rename_table(const char* from, const char* to) override; inline int defragment_table(); int check(THD* thd, HA_CHECK_OPT* check_opt) override; + int check_for_upgrade(HA_CHECK_OPT* check_opt) override; inline void reload_statistics(); @@ -909,6 +910,12 @@ unsigned innodb_col_no(const Field* field) MY_ATTRIBUTE((nonnull, warn_unused_result)); +/** Get the maximum integer value of a numeric column. +@param field column definition +@return maximum allowed integer value */ +ulonglong innobase_get_int_col_max_value(const Field *field) + MY_ATTRIBUTE((nonnull, warn_unused_result)); + /********************************************************************//** Helper function to push frm mismatch error to error log and if needed to sql-layer. */ diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 1401136f..6689b9ef 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -864,6 +864,9 @@ my_error_innodb( case DB_DEADLOCK: my_error(ER_LOCK_DEADLOCK, MYF(0)); break; + case DB_RECORD_CHANGED: + my_error(ER_CHECKREAD, MYF(0), table); + break; case DB_LOCK_WAIT_TIMEOUT: my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0)); break; @@ -1458,11 +1461,6 @@ struct ha_innobase_inplace_ctx : public inplace_alter_handler_ctx } }; -/********************************************************************//** -Get the upper limit of the MySQL integral and floating-point type. -@return maximum allowed value for the field */ -ulonglong innobase_get_int_col_max_value(const Field *field); - /** Determine if fulltext indexes exist in a given table. @param table MySQL table @return number of fulltext indexes */ @@ -1730,11 +1728,9 @@ instant_alter_column_possible( ut_ad(!is_null || nullable); n_nullable += nullable; n_add++; - uint l; + uint l = (*af)->pack_length(); switch ((*af)->type()) { case MYSQL_TYPE_VARCHAR: - l = reinterpret_cast - (*af)->get_length(); variable_length: if (l >= min_local_len) { max_size += blob_prefix @@ -1748,7 +1744,6 @@ instant_alter_column_possible( if (!is_null) { min_size += l; } - l = (*af)->pack_length(); max_size += l; lenlen += l > 255 ? 2 : 1; } @@ -1762,7 +1757,6 @@ instant_alter_column_possible( ((*af))->get_length(); goto variable_length; default: - l = (*af)->pack_length(); if (l > 255 && ib_table.not_redundant()) { goto variable_length; } @@ -2748,6 +2742,9 @@ cannot_create_many_fulltext_index: online = false; } + static constexpr const char *not_implemented + = "Not implemented for system-versioned operations"; + if (ha_alter_info->handler_flags & ALTER_ADD_NON_UNIQUE_NON_PRIM_INDEX) { /* ADD FULLTEXT|SPATIAL INDEX requires a lock. @@ -2775,6 +2772,12 @@ cannot_create_many_fulltext_index: goto cannot_create_many_fulltext_index; } + if (altered_table->versioned()) { + ha_alter_info->unsupported_reason + = not_implemented; + DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); + } + add_fulltext = true; if (ha_alter_info->online && !ha_alter_info->unsupported_reason) { @@ -2811,12 +2814,18 @@ cannot_create_many_fulltext_index: } } + if (m_prebuilt->table->is_stats_table()) { + if (ha_alter_info->online) { + ha_alter_info->unsupported_reason = + table_share->table_name.str; + } + online= false; + } + // FIXME: implement Online DDL for system-versioned operations if (ha_alter_info->handler_flags & INNOBASE_ALTER_VERSIONED_REBUILD) { - if (ha_alter_info->online) { - ha_alter_info->unsupported_reason = - "Not implemented for system-versioned operations"; + ha_alter_info->unsupported_reason = not_implemented; } online = false; @@ -7444,6 +7453,7 @@ error_handled: row_mysql_lock_data_dictionary(ctx->trx); } else { row_merge_drop_indexes(ctx->trx, user_table, true); + user_table->indexes.start->online_log = nullptr; ctx->trx->commit(); } @@ -9865,13 +9875,7 @@ commit_set_autoinc( const dict_col_t* autoinc_col = dict_table_get_nth_col(ctx->old_table, innodb_col_no(ai)); - dict_index_t* index - = dict_table_get_first_index(ctx->old_table); - while (index != NULL - && index->fields[0].col != autoinc_col) { - index = dict_table_get_next_index(index); - } - + auto index = ctx->old_table->get_index(*autoinc_col); ut_ad(index); ib_uint64_t max_in_table = index @@ -10246,6 +10250,7 @@ when rebuilding the table. @param ctx In-place ALTER TABLE context @param altered_table MySQL table that is being altered @param old_table MySQL table as it is before the ALTER operation +@param statistics_exist whether to update InnoDB persistent statistics @param trx Data dictionary transaction @param table_name Table name in MySQL @retval true Failure @@ -10519,6 +10524,7 @@ when not rebuilding the table. @param ha_alter_info Data used during in-place alter @param ctx In-place ALTER TABLE context @param old_table MySQL table as it is before the ALTER operation +@param statistics_exist whether to update InnoDB persistent statistics @param trx Data dictionary transaction @param table_name Table name in MySQL @retval true Failure @@ -10532,6 +10538,7 @@ commit_try_norebuild( ha_innobase_inplace_ctx*ctx, TABLE* altered_table, const TABLE* old_table, + bool statistics_exist, trx_t* trx, const char* table_name) { @@ -10646,6 +10653,10 @@ commit_try_norebuild( goto handle_error; } + if (!statistics_exist) { + continue; + } + error = dict_stats_delete_from_index_stats(db, table, index->name, trx); switch (error) { @@ -10657,7 +10668,8 @@ commit_try_norebuild( } } - if (const size_t size = ha_alter_info->rename_keys.size()) { + if (!statistics_exist) { + } else if (const size_t size = ha_alter_info->rename_keys.size()) { char tmp_name[5]; char db[MAX_DB_UTF8_LEN], table[MAX_TABLE_UTF8_LEN]; @@ -11224,16 +11236,7 @@ ha_innobase::commit_inplace_alter_table( fts_optimize_remove_table(ctx->old_table); } - dict_sys.freeze(SRW_LOCK_CALL); - for (auto f : ctx->old_table->referenced_set) { - if (dict_table_t* child = f->foreign_table) { - error = lock_table_for_trx(child, trx, LOCK_X); - if (error != DB_SUCCESS) { - break; - } - } - } - dict_sys.unfreeze(); + error = lock_table_children(ctx->old_table, trx); if (ctx->new_table->fts) { ut_ad(!ctx->new_table->fts->add_wq); @@ -11413,6 +11416,8 @@ err_index: } } + DEBUG_SYNC(m_user_thd, "innodb_commit_inplace_before_lock"); + DBUG_EXECUTE_IF("stats_lock_fail", error = DB_LOCK_WAIT_TIMEOUT; trx_rollback_for_mysql(trx);); @@ -11496,7 +11501,9 @@ fail: goto fail; } } else if (commit_try_norebuild(ha_alter_info, ctx, - altered_table, table, trx, + altered_table, table, + table_stats && index_stats, + trx, table_share->table_name.str)) { goto fail; } diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index 4ec07b81..e77401ed 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -24,6 +24,7 @@ Insert buffer Created 7/19/1997 Heikki Tuuri *******************************************************/ +#include #include "ibuf0ibuf.h" #include "btr0sea.h" @@ -1833,7 +1834,7 @@ corrupted: err = flst_add_last(ibuf_root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, block, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, - &mtr); + fil_system.sys_space->free_limit, &mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { goto corrupted; } @@ -1864,7 +1865,6 @@ Removes a page from the free list and frees it to the fsp system. */ static void ibuf_remove_free_page() { mtr_t mtr; - mtr_t mtr2; page_t* header_page; log_free_check(); @@ -1891,26 +1891,28 @@ early_exit: return; } - ibuf_mtr_start(&mtr2); - - buf_block_t* root = ibuf_tree_root_get(&mtr2); + buf_block_t* root = ibuf_tree_root_get(&mtr); if (UNIV_UNLIKELY(!root)) { - ibuf_mtr_commit(&mtr2); goto early_exit; } - mysql_mutex_unlock(&ibuf_mutex); - + const auto root_savepoint = mtr.get_savepoint() - 1; const uint32_t page_no = flst_get_last(PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST + root->page.frame).page; + if (page_no >= fil_system.sys_space->free_limit) { + goto early_exit; + } + + mysql_mutex_unlock(&ibuf_mutex); + /* NOTE that we must release the latch on the ibuf tree root because in fseg_free_page we access level 1 pages, and the root is a level 2 page. */ - - ibuf_mtr_commit(&mtr2); + root->page.lock.u_unlock(); + mtr.lock_register(root_savepoint, MTR_MEMO_BUF_FIX); ibuf_exit(&mtr); /* Since pessimistic inserts were prevented, we know that the @@ -1933,15 +1935,7 @@ early_exit: ibuf_enter(&mtr); mysql_mutex_lock(&ibuf_mutex); - - root = ibuf_tree_root_get(&mtr, &err); - if (UNIV_UNLIKELY(!root)) { - mysql_mutex_unlock(&ibuf_pessimistic_insert_mutex); - goto func_exit; - } - - ut_ad(page_no == flst_get_last(PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST - + root->page.frame).page); + mtr.upgrade_buffer_fix(root_savepoint, RW_X_LATCH); /* Remove the page from the free list and update the ibuf size data */ if (buf_block_t* block = @@ -1950,7 +1944,7 @@ early_exit: err = flst_remove(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, block, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, - &mtr); + fil_system.sys_space->free_limit, &mtr); } mysql_mutex_unlock(&ibuf_pessimistic_insert_mutex); @@ -2332,7 +2326,8 @@ func_exit: /** Merge the change buffer to some pages. */ static void ibuf_read_merge_pages(const uint32_t* space_ids, - const uint32_t* page_nos, ulint n_stored) + const uint32_t* page_nos, ulint n_stored, + bool slow_shutdown_cleanup) { for (ulint i = 0; i < n_stored; i++) { const uint32_t space_id = space_ids[i]; @@ -2357,30 +2352,28 @@ tablespace_deleted: if (UNIV_LIKELY(page_nos[i] < size)) { mtr.start(); dberr_t err; - buf_block_t *block = + /* Load the page and apply change buffers. */ + std::ignore = buf_page_get_gen(page_id_t(space_id, page_nos[i]), zip_size, RW_X_LATCH, nullptr, BUF_GET_POSSIBLY_FREED, &mtr, &err, true); - bool remove = !block - || fil_page_get_type(block->page.frame) - != FIL_PAGE_INDEX - || !page_is_leaf(block->page.frame); mtr.commit(); if (err == DB_TABLESPACE_DELETED) { s->x_unlock(); goto tablespace_deleted; } - if (!remove) { - s->x_unlock(); - continue; - } } s->x_unlock(); - if (srv_shutdown_state == SRV_SHUTDOWN_NONE - || srv_fast_shutdown) { + /* During slow shutdown cleanup, we apply all pending IBUF + changes and need to cleanup any left-over IBUF records. There + are a few cases when the changes are already discarded and IBUF + bitmap is cleaned but we miss to delete the record. Even after + the issues are fixed, we need to keep this safety measure for + upgraded DBs with such left over records. */ + if (!slow_shutdown_cleanup) { continue; } @@ -2451,7 +2444,7 @@ ATTRIBUTE_COLD ulint ibuf_contract() space_ids, page_nos, &n_pages); ibuf_mtr_commit(&mtr); - ibuf_read_merge_pages(space_ids, page_nos, n_pages); + ibuf_read_merge_pages(space_ids, page_nos, n_pages, true); return(sum_sizes + 1); } @@ -2532,7 +2525,7 @@ ibuf_merge_space( } #endif /* UNIV_DEBUG */ - ibuf_read_merge_pages(spaces, pages, n_pages); + ibuf_read_merge_pages(spaces, pages, n_pages, false); } return(n_pages); diff --git a/storage/innobase/include/btr0btr.h b/storage/innobase/include/btr0btr.h index b42c543c..83bdaa97 100644 --- a/storage/innobase/include/btr0btr.h +++ b/storage/innobase/include/btr0btr.h @@ -189,13 +189,16 @@ btr_read_autoinc(dict_index_t* index) /** Read the last used AUTO_INCREMENT value from PAGE_ROOT_AUTO_INC, or fall back to MAX(auto_increment_column). -@param[in] table table containing an AUTO_INCREMENT column -@param[in] col_no index of the AUTO_INCREMENT column -@return the AUTO_INCREMENT value -@retval 0 on error or if no AUTO_INCREMENT value was used yet */ -ib_uint64_t -btr_read_autoinc_with_fallback(const dict_table_t* table, unsigned col_no) - MY_ATTRIBUTE((nonnull, warn_unused_result)); +@param table table containing an AUTO_INCREMENT column +@param col_no index of the AUTO_INCREMENT column +@param mysql_version TABLE_SHARE::mysql_version +@param max the maximum value of the AUTO_INCREMENT column +@return the AUTO_INCREMENT value +@retval 0 on error or if no AUTO_INCREMENT value was used yet */ +uint64_t btr_read_autoinc_with_fallback(const dict_table_t *table, + unsigned col_no, ulong mysql_version, + uint64_t max) + MY_ATTRIBUTE((nonnull, warn_unused_result)); /** Write the next available AUTO_INCREMENT value to PAGE_ROOT_AUTO_INC. @param[in,out] index clustered index diff --git a/storage/innobase/include/btr0pcur.h b/storage/innobase/include/btr0pcur.h index c66a3bfa..5f84328d 100644 --- a/storage/innobase/include/btr0pcur.h +++ b/storage/innobase/include/btr0pcur.h @@ -28,7 +28,6 @@ Created 2/23/1996 Heikki Tuuri #include "dict0dict.h" #include "btr0cur.h" -#include "buf0block_hint.h" #include "btr0btr.h" #include "gis0rtree.h" @@ -332,8 +331,8 @@ struct btr_pcur_t /** BTR_PCUR_ON, BTR_PCUR_BEFORE, or BTR_PCUR_AFTER, depending on whether cursor was on, before, or after the old_rec record */ btr_pcur_pos_t rel_pos= btr_pcur_pos_t(0); - /** buffer block when the position was stored */ - buf::Block_hint block_when_stored; + /** the page identifier of old_rec */ + page_id_t old_page_id{0,0}; /** the modify clock value of the buffer block when the cursor position was stored */ ib_uint64_t modify_clock= 0; @@ -432,7 +431,8 @@ btr_pcur_open( } /** Open a cursor on the first user record satisfying the search condition; -in case of no match, after the last index record. */ +in case of no match, after the last index record. +@return DB_SUCCESS or error code */ MY_ATTRIBUTE((nonnull, warn_unused_result)) inline dberr_t diff --git a/storage/innobase/include/buf0block_hint.h b/storage/innobase/include/buf0block_hint.h deleted file mode 100644 index d4fee7c1..00000000 --- a/storage/innobase/include/buf0block_hint.h +++ /dev/null @@ -1,76 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2020, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2020, MariaDB Corporation. -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License, version 2.0, as published by the -Free Software Foundation. - -This program is also distributed with certain software (including but not -limited to OpenSSL) that is licensed under separate terms, as designated in a -particular file or component or in included license documentation. The authors -of MySQL hereby grant you an additional permission to link the program and -your derivative works with the separately licensed software that they have -included with MySQL. - -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, version 2.0, -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., -51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*****************************************************************************/ -#pragma once -#include "buf0buf.h" - -namespace buf { -class Block_hint { -public: - /** Stores the pointer to the block, which is currently buffer-fixed. - @param block a pointer to a buffer-fixed block to be stored */ - inline void store(buf_block_t *block) - { - ut_ad(block->page.buf_fix_count()); - m_block= block; - m_page_id= block->page.id(); - } - - /** Clears currently stored pointer. */ - inline void clear() { m_block= nullptr; } - - /** Invoke f on m_block(which may be null) - @param f The function to be executed. It will be passed the pointer. - If you wish to use the block pointer subsequently, - you need to ensure you buffer-fix it before returning from f. - @return the return value of f - */ - template - bool run_with_hint(const F &f) - { - buffer_fix_block_if_still_valid(); - /* m_block could be changed during f() call, so we use local - variable to remember which block we need to unfix */ - buf_block_t *block= m_block; - bool res= f(block); - if (block) - block->page.unfix(); - return res; - } - - buf_block_t *block() const { return m_block; } - - private: - /** The block pointer stored by store(). */ - buf_block_t *m_block= nullptr; - /** If m_block is non-null, the m_block->page.id at time it was stored. */ - page_id_t m_page_id{0, 0}; - - /** A helper function which checks if m_block is not a dangling pointer and - still points to block with page with m_page_id and if so, buffer-fixes it, - otherwise clear()s it */ - void buffer_fix_block_if_still_valid(); -}; -} // namespace buf diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index cd7cc294..c291615c 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -158,14 +158,25 @@ buf_block_free( #define buf_page_get(ID, SIZE, LA, MTR) \ buf_page_get_gen(ID, SIZE, LA, NULL, BUF_GET, MTR) -/** Try to acquire a page latch. -@param rw_latch RW_S_LATCH or RW_X_LATCH +/** Try to buffer-fix a page. @param block guessed block +@param id expected block->page.id() +@return block if it was buffer-fixed +@retval nullptr if the block no longer is valid */ +buf_block_t *buf_page_optimistic_fix(buf_block_t *block, page_id_t id) + MY_ATTRIBUTE((nonnull, warn_unused_result)); + +/** Try to acquire a page latch after buf_page_optimistic_fix(). +@param block buffer-fixed block +@param rw_latch RW_S_LATCH or RW_X_LATCH @param modify_clock expected value of block->modify_clock @param mtr mini-transaction -@return whether the latch was acquired (the page is an allocated file page) */ -bool buf_page_optimistic_get(ulint rw_latch, buf_block_t *block, - uint64_t modify_clock, mtr_t *mtr); +@return block if the latch was acquired +@retval nullptr if block->unfix() was called because it no longer is valid */ +buf_block_t *buf_page_optimistic_get(buf_block_t *block, + rw_lock_type_t rw_latch, + uint64_t modify_clock, mtr_t *mtr) + MY_ATTRIBUTE((nonnull, warn_unused_result)); /** Try to S-latch a page. Suitable for using when holding the lock_sys latches (as it avoids deadlock). @@ -290,15 +301,6 @@ on the block. */ UNIV_INLINE void buf_block_modify_clock_inc( -/*=======================*/ - buf_block_t* block); /*!< in: block */ -/********************************************************************//** -Returns the value of the modify clock. The caller must have an s-lock -or x-lock on the block. -@return value */ -UNIV_INLINE -ib_uint64_t -buf_block_get_modify_clock( /*=======================*/ buf_block_t* block); /*!< in: block */ #endif /* !UNIV_INNOCHECKSUM */ @@ -771,17 +773,16 @@ public: @retval DB_FAIL if the page contains the wrong ID */ dberr_t read_complete(const fil_node_t &node); - /** Note that a block is no longer dirty, while not removing - it from buf_pool.flush_list - @param temporary whether the page belongs to the temporary tablespace - @param error whether an error may have occurred while writing */ - inline void write_complete(bool temporary, bool error); + /** Release a write fix after a page write was completed. + @param persistent whether the page belongs to a persistent tablespace + @param error whether an error may have occurred while writing + @param state recently read state() value with the correct io-fix */ + void write_complete(bool persistent, bool error, uint32_t state); /** Write a flushable page to a file or free a freeable block. - @param evict whether to evict the page on write completion @param space tablespace @return whether a page write was initiated and buf_pool.mutex released */ - bool flush(bool evict, fil_space_t *space); + bool flush(fil_space_t *space); /** Notify that a page in a temporary tablespace has been modified. */ void set_temp_modified() @@ -1756,10 +1757,6 @@ public: /** Decrement the number of pending LRU flush */ inline void n_flush_dec(); - /** Decrement the number of pending LRU flush - while holding flush_list_mutex */ - inline void n_flush_dec_holding_mutex(); - /** @return whether flush_list flushing is active */ bool flush_list_active() const { @@ -1912,6 +1909,9 @@ public: /** Free a page whose underlying file page has been freed. */ ATTRIBUTE_COLD void release_freed_page(buf_page_t *bpage) noexcept; + /** Issue a warning that we could not free up buffer pool pages. */ + ATTRIBUTE_COLD void LRU_warn(); + private: /** Temporary memory for page_compressed and encrypted I/O */ struct io_buf_t diff --git a/storage/innobase/include/buf0buf.inl b/storage/innobase/include/buf0buf.inl index b3158cf1..050c8493 100644 --- a/storage/innobase/include/buf0buf.inl +++ b/storage/innobase/include/buf0buf.inl @@ -116,17 +116,3 @@ buf_block_modify_clock_inc( block->modify_clock++; } - -/********************************************************************//** -Returns the value of the modify clock. The caller must have an s-lock -or x-lock on the block. -@return value */ -UNIV_INLINE -ib_uint64_t -buf_block_get_modify_clock( -/*=======================*/ - buf_block_t* block) /*!< in: block */ -{ - ut_ad(block->page.lock.have_any()); - return(block->modify_clock); -} diff --git a/storage/innobase/include/buf0flu.h b/storage/innobase/include/buf0flu.h index 0cce514b..cc32a38a 100644 --- a/storage/innobase/include/buf0flu.h +++ b/storage/innobase/include/buf0flu.h @@ -85,16 +85,6 @@ buf_flush_init_for_writing( bool buf_flush_list_space(fil_space_t *space, ulint *n_flushed= nullptr) MY_ATTRIBUTE((warn_unused_result)); -/** Write out dirty blocks from buf_pool.LRU, -and move clean blocks to buf_pool.free. -The caller must invoke buf_dblwr.flush_buffered_writes() -after releasing buf_pool.mutex. -@param max_n wished maximum mumber of blocks flushed -@param evict whether to evict pages after flushing -@return evict ? number of processed pages : number of pages written -@retval 0 if a buf_pool.LRU batch is already running */ -ulint buf_flush_LRU(ulint max_n, bool evict); - /** Wait until a LRU flush batch ends. */ void buf_flush_wait_LRU_batch_end(); /** Wait until all persistent pages are flushed up to a limit. diff --git a/storage/innobase/include/cache.h b/storage/innobase/include/cache.h new file mode 100644 index 00000000..0647cbe6 --- /dev/null +++ b/storage/innobase/include/cache.h @@ -0,0 +1,33 @@ +/***************************************************************************** + +Copyright (c) 2024, MariaDB plc + +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; version 2 of the License. + +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., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + +*****************************************************************************/ + +#pragma once +#include + +#if defined __x86_64__ || defined __aarch64__ || defined __powerpc64__ +struct pmem_control +{ + void (*persist)(const void *, size_t); +public: + pmem_control(); +}; +extern const pmem_control pmem; +# define pmem_persist(buf, size) pmem.persist(buf, size) +#else +void pmem_persist(const void *buf, size_t size); +#endif diff --git a/storage/innobase/include/data0data.h b/storage/innobase/include/data0data.h index a5356e0d..fcb543eb 100644 --- a/storage/innobase/include/data0data.h +++ b/storage/innobase/include/data0data.h @@ -339,15 +339,12 @@ dtuple_set_types_binary( dtuple_t* tuple, /*!< in: data tuple */ ulint n) /*!< in: number of fields to set */ MY_ATTRIBUTE((nonnull)); -/**********************************************************************//** -Checks if a dtuple contains an SQL null value. -@return TRUE if some field is SQL null */ +/** Checks if a dtuple contains an SQL null value. +@param tuple tuple +@param fields_number number of fields in the tuple to check +@return true if some field is SQL null */ UNIV_INLINE -ibool -dtuple_contains_null( -/*=================*/ - const dtuple_t* tuple) /*!< in: dtuple */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); +bool dtuple_contains_null(const dtuple_t *tuple, ulint fields_number = 0); /**********************************************************//** Checks that a data field is typed. Asserts an error if not. @return TRUE if ok */ diff --git a/storage/innobase/include/data0data.inl b/storage/innobase/include/data0data.inl index 2d1bf5a2..b6c6ace8 100644 --- a/storage/innobase/include/data0data.inl +++ b/storage/innobase/include/data0data.inl @@ -596,28 +596,18 @@ data_write_sql_null( memset(data, 0, len); } -/**********************************************************************//** -Checks if a dtuple contains an SQL null value. -@return TRUE if some field is SQL null */ +/** Checks if a dtuple contains an SQL null value. +@param tuple tuple +@param fields_number number of fields in the tuple to check +@return true if some field is SQL null */ UNIV_INLINE -ibool -dtuple_contains_null( -/*=================*/ - const dtuple_t* tuple) /*!< in: dtuple */ +bool dtuple_contains_null(const dtuple_t *tuple, ulint fields_number) { - ulint n; - ulint i; - - n = dtuple_get_n_fields(tuple); - - for (i = 0; i < n; i++) { - if (dfield_is_null(dtuple_get_nth_field(tuple, i))) { - - return(TRUE); - } - } - - return(FALSE); + ulint n= fields_number ? fields_number : dtuple_get_n_fields(tuple); + for (ulint i= 0; i < n; i++) + if (dfield_is_null(dtuple_get_nth_field(tuple, i))) + return true; + return false; } /**************************************************************//** diff --git a/storage/innobase/include/db0err.h b/storage/innobase/include/db0err.h index 64182aab..960ec390 100644 --- a/storage/innobase/include/db0err.h +++ b/storage/innobase/include/db0err.h @@ -32,23 +32,25 @@ Created 5/24/1996 Heikki Tuuri enum dberr_t { DB_SUCCESS, - DB_SUCCESS_LOCKED_REC = 9, /*!< like DB_SUCCESS, but a new + DB_SUCCESS_LOCKED_REC= 9, /*!< like DB_SUCCESS, but a new explicit record lock was created */ /* The following are error codes */ - DB_ERROR = 11, + DB_RECORD_CHANGED, + DB_ERROR, DB_INTERRUPTED, DB_OUT_OF_MEMORY, DB_OUT_OF_FILE_SPACE, DB_LOCK_WAIT, DB_DEADLOCK, - DB_ROLLBACK, DB_DUPLICATE_KEY, DB_MISSING_HISTORY, /*!< required history data has been deleted due to lack of space in rollback segment */ - DB_CLUSTER_NOT_FOUND = 30, - DB_TABLE_NOT_FOUND, +#ifdef WITH_WSREP + DB_ROLLBACK, +#endif + DB_TABLE_NOT_FOUND= 31, DB_TOO_BIG_RECORD, /*!< a record in an index would not fit on a compressed page, or it would become bigger than 1/2 free space in diff --git a/storage/innobase/include/dict0dict.h b/storage/innobase/include/dict0dict.h index 5fafb2c5..3baac658 100644 --- a/storage/innobase/include/dict0dict.h +++ b/storage/innobase/include/dict0dict.h @@ -35,6 +35,7 @@ Created 1/8/1996 Heikki Tuuri #include #include +class MDL_context; class MDL_ticket; /** the first table or index ID for other than hard-coded system tables */ @@ -139,6 +140,21 @@ dict_acquire_mdl_shared(dict_table_t *table, MDL_ticket **mdl, dict_table_op_t table_op= DICT_TABLE_OP_NORMAL); +/** Acquire MDL shared for the table name. +@tparam trylock whether to use non-blocking operation +@param[in,out] table table object +@param[in,out] mdl_context MDL context +@param[out] mdl MDL ticket +@param[in] table_op operation to perform when opening +@return table object after locking MDL shared +@retval nullptr if the table is not readable, or if trylock && MDL blocked */ +template +__attribute__((nonnull, warn_unused_result)) +dict_table_t* +dict_acquire_mdl_shared(dict_table_t *table, + MDL_context *mdl_context, MDL_ticket **mdl, + dict_table_op_t table_op); + /** Look up a table by numeric identifier. @param[in] table_id table identifier @param[in] dict_locked data dictionary locked @@ -1314,13 +1330,7 @@ class dict_sys_t std::atomic latch_ex_wait_start; /** the rw-latch protecting the data dictionary cache */ - alignas(CPU_LEVEL1_DCACHE_LINESIZE) srw_lock latch; -#ifdef UNIV_DEBUG - /** whether latch is being held in exclusive mode (by any thread) */ - Atomic_relaxed latch_ex; - /** number of S-latch holders */ - Atomic_counter latch_readers; -#endif + alignas(CPU_LEVEL1_DCACHE_LINESIZE) IF_DBUG(srw_lock_debug,srw_lock) latch; public: /** Indexes of SYS_TABLE[] */ enum @@ -1488,15 +1498,12 @@ public: } #ifdef UNIV_DEBUG - /** @return whether any thread (not necessarily the current thread) - is holding the latch; that is, this check may return false - positives */ - bool frozen() const { return latch_readers || latch_ex; } - /** @return whether any thread (not necessarily the current thread) - is holding a shared latch */ - bool frozen_not_locked() const { return latch_readers; } + /** @return whether the current thread is holding the latch */ + bool frozen() const { return latch.have_any(); } + /** @return whether the current thread is holding a shared latch */ + bool frozen_not_locked() const { return latch.have_rd(); } /** @return whether the current thread holds the exclusive latch */ - bool locked() const { return latch_ex == pthread_self(); } + bool locked() const { return latch.have_wr(); } #endif private: /** Acquire the exclusive latch */ @@ -1511,13 +1518,7 @@ public: /** Exclusively lock the dictionary cache. */ void lock(SRW_LOCK_ARGS(const char *file, unsigned line)) { - if (latch.wr_lock_try()) - { - ut_ad(!latch_readers); - ut_ad(!latch_ex); - ut_d(latch_ex= pthread_self()); - } - else + if (!latch.wr_lock_try()) lock_wait(SRW_LOCK_ARGS(file, line)); } @@ -1530,27 +1531,11 @@ public: ATTRIBUTE_NOINLINE void unfreeze(); #else /** Unlock the data dictionary cache. */ - void unlock() - { - ut_ad(latch_ex == pthread_self()); - ut_ad(!latch_readers); - ut_d(latch_ex= 0); - latch.wr_unlock(); - } + void unlock() { latch.wr_unlock(); } /** Acquire a shared lock on the dictionary cache. */ - void freeze() - { - latch.rd_lock(); - ut_ad(!latch_ex); - ut_d(latch_readers++); - } + void freeze() { latch.rd_lock(); } /** Release a shared lock on the dictionary cache. */ - void unfreeze() - { - ut_ad(!latch_ex); - ut_ad(latch_readers--); - latch.rd_unlock(); - } + void unfreeze() { latch.rd_unlock(); } #endif /** Estimate the used memory occupied by the data dictionary diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h index fde2a714..0268a280 100644 --- a/storage/innobase/include/dict0mem.h +++ b/storage/innobase/include/dict0mem.h @@ -1010,8 +1010,6 @@ struct dict_index_t { /*!< number of columns the user defined to be in the index: in the internal representation we add more columns */ - unsigned nulls_equal:1; - /*!< if true, SQL NULL == SQL NULL */ unsigned n_uniq:10;/*!< number of fields from the beginning which are enough to determine an index entry uniquely */ @@ -2448,6 +2446,9 @@ public: /** @return number of unique columns in FTS_DOC_ID index */ unsigned fts_n_uniq() const { return versioned() ? 2 : 1; } + /** @return the index for that starts with a specific column */ + dict_index_t *get_index(const dict_col_t &col) const; + /** Create metadata. @param name table name @param space tablespace diff --git a/storage/innobase/include/dict0mem.inl b/storage/innobase/include/dict0mem.inl index d60ee5d9..edb7cf92 100644 --- a/storage/innobase/include/dict0mem.inl +++ b/storage/innobase/include/dict0mem.inl @@ -63,6 +63,5 @@ dict_mem_fill_index_struct( & index->MAX_N_FIELDS; /* The '1 +' above prevents allocation of an empty mem block */ - index->nulls_equal = false; ut_d(index->magic_n = DICT_INDEX_MAGIC_N); } diff --git a/storage/innobase/include/dyn0buf.h b/storage/innobase/include/dyn0buf.h index 06af4dcc..7a4e6760 100644 --- a/storage/innobase/include/dyn0buf.h +++ b/storage/innobase/include/dyn0buf.h @@ -57,11 +57,7 @@ public: /** Gets the number of used bytes in a block. @return number of bytes used */ - ulint used() const - MY_ATTRIBUTE((warn_unused_result)) - { - return(static_cast(m_used & ~DYN_BLOCK_FULL_FLAG)); - } + uint32_t used() const { return m_used; } /** Gets pointer to the start of data. @@ -153,8 +149,7 @@ public: /** Storage */ byte m_data[MAX_DATA_SIZE]; - /** number of data bytes used in this block; - DYN_BLOCK_FULL_FLAG is set when the block becomes full */ + /** number of data bytes used in this block */ uint32_t m_used; friend class mtr_buf_t; diff --git a/storage/innobase/include/dyn0types.h b/storage/innobase/include/dyn0types.h index 83d0b0d6..af7f663d 100644 --- a/storage/innobase/include/dyn0types.h +++ b/storage/innobase/include/dyn0types.h @@ -33,7 +33,4 @@ Created 2013-03-16 Sunny Bains /** This is the initial 'payload' size of a dynamic array */ #define DYN_ARRAY_DATA_SIZE 512 -/** Flag for dyn_block_t::used that indicates a full block */ -#define DYN_BLOCK_FULL_FLAG 0x1000000UL - #endif /* dyn0types_h */ diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index cdc32515..dfda1178 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -63,7 +63,7 @@ enum srv_flush_t SRV_LITTLESYNC, /** do not flush after writing */ SRV_NOSYNC, - /** invoke os_file_set_nocache() on data files. This implies using + /** Open or create files with O_DIRECT. This implies using unbuffered I/O but still fdatasync(), because some filesystems might not flush meta-data on write completion */ SRV_O_DIRECT, @@ -347,7 +347,6 @@ struct fil_space_t final ~fil_space_t() { ut_ad(!latch_owner); - ut_ad(!latch_count); latch.destroy(); } @@ -411,9 +410,9 @@ private: /** The reference count */ static constexpr uint32_t PENDING= ~(STOPPING | CLOSING | NEEDS_FSYNC); /** latch protecting all page allocation bitmap pages */ - srw_lock latch; + IF_DBUG(srw_lock_debug, srw_lock) latch; + /** the thread that holds the exclusive latch, or 0 */ pthread_t latch_owner; - ut_d(Atomic_relaxed latch_count;) public: /** MariaDB encryption data */ fil_space_crypt_t *crypt_data; @@ -1004,40 +1003,32 @@ public: bool recheck, bool encrypt); #ifdef UNIV_DEBUG - bool is_latched() const { return latch_count != 0; } + bool is_latched() const { return latch.have_any(); } #endif - bool is_owner() const { return latch_owner == pthread_self(); } + bool is_owner() const + { + const bool owner{latch_owner == pthread_self()}; + ut_ad(owner == latch.have_wr()); + return owner; + } /** Acquire the allocation latch in exclusive mode */ void x_lock() { latch.wr_lock(SRW_LOCK_CALL); ut_ad(!latch_owner); latch_owner= pthread_self(); - ut_ad(!latch_count.fetch_add(1)); } /** Release the allocation latch from exclusive mode */ void x_unlock() { - ut_ad(latch_count.fetch_sub(1) == 1); ut_ad(latch_owner == pthread_self()); latch_owner= 0; latch.wr_unlock(); } /** Acquire the allocation latch in shared mode */ - void s_lock() - { - ut_ad(!is_owner()); - latch.rd_lock(SRW_LOCK_CALL); - ut_ad(!latch_owner); - ut_d(latch_count.fetch_add(1)); - } + void s_lock() { latch.rd_lock(SRW_LOCK_CALL); } /** Release the allocation latch from shared mode */ - void s_unlock() - { - ut_ad(latch_count.fetch_sub(1)); - ut_ad(!latch_owner); - latch.rd_unlock(); - } + void s_unlock() { latch.rd_unlock(); } typedef span name_type; @@ -1637,17 +1628,34 @@ void fil_close_tablespace(uint32_t id); /*******************************************************************//** Allocates and builds a file name from a path, a table or tablespace name and a suffix. The string must be freed by caller with ut_free(). -@param[in] path NULL or the directory path or the full path and filename. +@param[in] path nullptr or the directory path or the full path and filename @param[in] name {} if path is full, or Table/Tablespace name -@param[in] ext the file extension to use -@param[in] trim_name true if the last name on the path should be trimmed. +@param[in] extension the file extension to use +@param[in] trim_name true if the last name on the path should be trimmed @return own: file name */ -char* fil_make_filepath(const char *path, const fil_space_t::name_type &name, - ib_extention ext, bool trim_name); +char* fil_make_filepath_low(const char *path, + const fil_space_t::name_type &name, + ib_extention extension, bool trim_name); char *fil_make_filepath(const char* path, const table_name_t name, ib_extention suffix, bool strip_name); +/** Wrapper function over fil_make_filepath_low to build file name. +@param path nullptr or the directory path or the full path and filename +@param name {} if path is full, or Table/Tablespace name +@param extension the file extension to use +@param trim_name true if the last name on the path should be trimmed +@return own: file name */ +static inline char* +fil_make_filepath(const char* path, const fil_space_t::name_type &name, + ib_extention extension, bool trim_name) +{ + /* If we are going to strip a name off the path, there better be a + path and a new name to put back on. */ + ut_ad(!trim_name || (path && name.data())); + return fil_make_filepath_low(path, name, extension, trim_name); +} + /** Create a tablespace file. @param[in] space_id Tablespace ID @param[in] name Tablespace name in dbname/tablename format. diff --git a/storage/innobase/include/fsp0fsp.h b/storage/innobase/include/fsp0fsp.h index 26261554..99459bcb 100644 --- a/storage/innobase/include/fsp0fsp.h +++ b/storage/innobase/include/fsp0fsp.h @@ -209,24 +209,6 @@ typedef byte fseg_inode_t; static constexpr byte FSEG_MAGIC_N_BYTES[4]={0x05,0xd6,0x69,0xd2}; -#define FSEG_FILLFACTOR 8 /* If the number of unused but reserved - pages in a segment is less than - reserved pages / FSEG_FILLFACTOR, - and there are - at least FSEG_FRAG_LIMIT used pages, - then we allow a new empty extent to - be added to the segment in - fseg_alloc_free_page_general(). - Otherwise, we - use unused pages of the segment. */ - -#define FSEG_FRAG_LIMIT FSEG_FRAG_ARR_N_SLOTS - /* If the segment has >= this many - used pages, it may be expanded by - allocating extents to the segment; - until that only individual fragment - pages are allocated from the space */ - #define FSEG_FREE_LIST_LIMIT 40 /* If the reserved size of a segment is at least this many extents, we allow extents to be put to the free @@ -294,7 +276,7 @@ Determine if a page is marked free. @param[in] descr extent descriptor @param[in] offset page offset within extent @return whether the page is free */ -inline bool xdes_is_free(const xdes_t *descr, ulint offset) +inline bool xdes_is_free(const xdes_t *descr, uint32_t offset) { ut_ad(offset < FSP_EXTENT_SIZE); ulint index= XDES_FREE_BIT + XDES_BITS_PER_PAGE * offset; diff --git a/storage/innobase/include/fts0fts.h b/storage/innobase/include/fts0fts.h index c0151b44..1d2b409b 100644 --- a/storage/innobase/include/fts0fts.h +++ b/storage/innobase/include/fts0fts.h @@ -163,6 +163,9 @@ struct fts_token_t; struct fts_doc_ids_t; struct fts_index_cache_t; +/** Compare two DOC_ID. */ +int fts_doc_id_cmp(const void *p1, const void *p2) + __attribute__((nonnull, warn_unused_result)); /** Initialize the "fts_table" for internal query into FTS auxiliary tables */ @@ -412,6 +415,9 @@ inline void fts_doc_ids_free(fts_doc_ids_t* doc_ids) mem_heap_free(static_cast(doc_ids->self_heap->arg)); } +/** Sort an array of doc_id */ +void fts_doc_ids_sort(ib_vector_t *doc_ids); + /******************************************************************//** Notify the FTS system about an operation on an FTS-indexed table. */ void diff --git a/storage/innobase/include/fts0priv.h b/storage/innobase/include/fts0priv.h index ae0bb036..04faceb9 100644 --- a/storage/innobase/include/fts0priv.h +++ b/storage/innobase/include/fts0priv.h @@ -271,27 +271,6 @@ fts_index_fetch_nodes( word, /*!< in: the word to fetch */ fts_fetch_t* fetch) /*!< in: fetch callback.*/ MY_ATTRIBUTE((nonnull)); -/******************************************************************//** -Compare two fts_trx_table_t instances, we actually compare the -table id's here. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_trx_table_cmp( -/*==============*/ - const void* v1, /*!< in: id1 */ - const void* v2) /*!< in: id2 */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); -/******************************************************************//** -Compare a table id with a trx_table_t table id. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_trx_table_id_cmp( -/*=================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); #define fts_sql_commit(trx) trx_commit_for_mysql(trx) #define fts_sql_rollback(trx) (trx)->rollback() /******************************************************************//** diff --git a/storage/innobase/include/fts0priv.inl b/storage/innobase/include/fts0priv.inl index 3cb09c92..3d937bb3 100644 --- a/storage/innobase/include/fts0priv.inl +++ b/storage/innobase/include/fts0priv.inl @@ -52,47 +52,3 @@ fts_read_object_id( if the id is HEX or DEC and do the right thing with it. */ return(sscanf(str, UINT64PFx, id) == 1); } - -/******************************************************************//** -Compare two fts_trx_table_t instances. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_trx_table_cmp( -/*==============*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const dict_table_t* table1 - = (*static_cast(p1))->table; - - const dict_table_t* table2 - = (*static_cast(p2))->table; - - return((table1->id > table2->id) - ? 1 - : (table1->id == table2->id) - ? 0 - : -1); -} - -/******************************************************************//** -Compare a table id with a fts_trx_table_t table id. -@return < 0 if n1 < n2, 0 if n1 == n2,> 0 if n1 > n2 */ -UNIV_INLINE -int -fts_trx_table_id_cmp( -/*=================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const uintmax_t* table_id = static_cast(p1); - const dict_table_t* table2 - = (*static_cast(p2))->table; - - return((*table_id > table2->id) - ? 1 - : (*table_id == table2->id) - ? 0 - : -1); -} diff --git a/storage/innobase/include/fts0types.h b/storage/innobase/include/fts0types.h index fb278d54..7b95348b 100644 --- a/storage/innobase/include/fts0types.h +++ b/storage/innobase/include/fts0types.h @@ -277,44 +277,6 @@ struct fts_token_t { /** It's defined in fts/fts0fts.c */ extern const fts_index_selector_t fts_index_selector[]; -/******************************************************************//** -Compare two fts_trx_row_t instances doc_ids. */ -UNIV_INLINE -int -fts_trx_row_doc_id_cmp( -/*===================*/ - /*!< out: - < 0 if n1 < n2, - 0 if n1 == n2, - > 0 if n1 > n2 */ - const void* p1, /*!< in: id1 */ - const void* p2); /*!< in: id2 */ - -/******************************************************************//** -Compare two fts_ranking_t instances doc_ids. */ -UNIV_INLINE -int -fts_ranking_doc_id_cmp( -/*===================*/ - /*!< out: - < 0 if n1 < n2, - 0 if n1 == n2, - > 0 if n1 > n2 */ - const void* p1, /*!< in: id1 */ - const void* p2); /*!< in: id2 */ - -/******************************************************************//** -Compare two doc_ids. */ -UNIV_INLINE -int fts_doc_id_cmp( -/*==================*/ - /*!< out: - < 0 if n1 < n2, - 0 if n1 == n2, - > 0 if n1 > n2 */ - const void* p1, /*!< in: id1 */ - const void* p2); /*!< in: id2 */ - /******************************************************************//** Duplicate a string. */ UNIV_INLINE diff --git a/storage/innobase/include/fts0types.inl b/storage/innobase/include/fts0types.inl index facc1e5c..5b57cad7 100644 --- a/storage/innobase/include/fts0types.inl +++ b/storage/innobase/include/fts0types.inl @@ -46,53 +46,6 @@ fts_string_dup( dst->f_n_char = src->f_n_char; } -/******************************************************************//** -Compare two fts_trx_row_t doc_ids. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_trx_row_doc_id_cmp( -/*===================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const fts_trx_row_t* tr1 = (const fts_trx_row_t*) p1; - const fts_trx_row_t* tr2 = (const fts_trx_row_t*) p2; - - return((int)(tr1->doc_id - tr2->doc_id)); -} - -/******************************************************************//** -Compare two fts_ranking_t doc_ids. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_ranking_doc_id_cmp( -/*===================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const fts_ranking_t* rk1 = (const fts_ranking_t*) p1; - const fts_ranking_t* rk2 = (const fts_ranking_t*) p2; - - return((int)(rk1->doc_id - rk2->doc_id)); -} - -/******************************************************************//** -Compare two doc_ids. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int fts_doc_id_cmp( -/*==================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const doc_id_t* up1 = static_cast(p1); - const doc_id_t* up2 = static_cast(p2); - - return static_cast(*up1 - *up2); -} - /******************************************************************//** Get the first character's code position for FTS index partition */ extern diff --git a/storage/innobase/include/fut0lst.h b/storage/innobase/include/fut0lst.h index 746dab80..1adec365 100644 --- a/storage/innobase/include/fut0lst.h +++ b/storage/innobase/include/fut0lst.h @@ -78,34 +78,40 @@ void flst_init(const buf_block_t &block, byte *base, mtr_t *mtr) MY_ATTRIBUTE((nonnull)); /** Append a file list node to a list. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] add block to be added -@param[in] aoffset byte offset of the node to be added -@param[in,out] mtr mini-transaction +@param base base node block +@param boffset byte offset of the base node +@param add block to be added +@param aoffset byte offset of the node to be added +@param limit fil_space_t::free_limit +@param mtr mini-transaction @return error code */ dberr_t flst_add_last(buf_block_t *base, uint16_t boffset, - buf_block_t *add, uint16_t aoffset, mtr_t *mtr) + buf_block_t *add, uint16_t aoffset, + uint32_t limit, mtr_t *mtr) MY_ATTRIBUTE((nonnull, warn_unused_result)); /** Prepend a file list node to a list. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] add block to be added -@param[in] aoffset byte offset of the node to be added -@param[in,out] mtr mini-transaction +@param base base node block +@param boffset byte offset of the base node +@param add block to be added +@param aoffset byte offset of the node to be added +@param limit fil_space_t::free_limit +@param mtr mini-transaction @return error code */ dberr_t flst_add_first(buf_block_t *base, uint16_t boffset, - buf_block_t *add, uint16_t aoffset, mtr_t *mtr) + buf_block_t *add, uint16_t aoffset, + uint32_t limit, mtr_t *mtr) MY_ATTRIBUTE((nonnull, warn_unused_result)); /** Remove a file list node. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] cur block to be removed -@param[in] coffset byte offset of the current record to be removed -@param[in,out] mtr mini-transaction +@param base base node block +@param boffset byte offset of the base node +@param cur block to be removed +@param coffset byte offset of the current record to be removed +@param limit fil_space_t::free_limit +@param mtr mini-transaction @return error code */ dberr_t flst_remove(buf_block_t *base, uint16_t boffset, - buf_block_t *cur, uint16_t coffset, mtr_t *mtr) + buf_block_t *cur, uint16_t coffset, + uint32_t limit, mtr_t *mtr) MY_ATTRIBUTE((nonnull, warn_unused_result)); /** @return the length of a list */ @@ -117,11 +123,9 @@ inline uint32_t flst_get_len(const flst_base_node_t *base) /** @return a file address */ inline fil_addr_t flst_read_addr(const byte *faddr) { - fil_addr_t addr= { mach_read_from_4(faddr + FIL_ADDR_PAGE), - mach_read_from_2(faddr + FIL_ADDR_BYTE) }; - ut_a(addr.page == FIL_NULL || addr.boffset >= FIL_PAGE_DATA); - ut_a(ut_align_offset(faddr, srv_page_size) >= FIL_PAGE_DATA); - return addr; + ut_ad(ut_align_offset(faddr, srv_page_size) >= FIL_PAGE_DATA); + return fil_addr_t{mach_read_from_4(faddr + FIL_ADDR_PAGE), + mach_read_from_2(faddr + FIL_ADDR_BYTE)}; } /** @return list first node address */ diff --git a/storage/innobase/include/gis0type.h b/storage/innobase/include/gis0type.h index d6a4ef67..2dc25a89 100644 --- a/storage/innobase/include/gis0type.h +++ b/storage/innobase/include/gis0type.h @@ -66,10 +66,7 @@ typedef std::vector > rtr_rec_vector; /* Structure for matched records on the leaf page */ typedef struct matched_rec { - byte* bufp; /*!< aligned buffer point */ - byte rec_buf[UNIV_PAGE_SIZE_MAX * 2]; - /*!< buffer used to copy matching rec */ - buf_block_t block; /*!< the shadow buffer block */ + buf_block_t* block; /*!< the shadow buffer block */ ulint used; /*!< memory used */ rtr_rec_vector* matched_recs; /*!< vector holding the matching rec */ mysql_mutex_t rtr_match_mutex;/*!< mutex protect the match_recs @@ -107,7 +104,6 @@ typedef struct rtr_info{ /*!< mutex protect the "path" vector */ rtr_mbr_t mbr; /*!< the search MBR */ que_thr_t* thr; /*!< the search thread */ - mem_heap_t* heap; /*!< memory heap */ btr_cur_t* cursor; /*!< cursor used for search */ dict_index_t* index; /*!< index it is searching */ bool need_prdt_lock; diff --git a/storage/innobase/include/lock0lock.h b/storage/innobase/include/lock0lock.h index 59ee7f55..08b9f4bc 100644 --- a/storage/innobase/include/lock0lock.h +++ b/storage/innobase/include/lock0lock.h @@ -438,6 +438,13 @@ dberr_t lock_table_for_trx(dict_table_t *table, trx_t *trx, lock_mode mode, bool no_wait= false) MY_ATTRIBUTE((nonnull, warn_unused_result)); +/** Lock the child tables of a table. +@param table parent table +@param trx transaction +@return error code */ +dberr_t lock_table_children(dict_table_t *table, trx_t *trx) + MY_ATTRIBUTE((nonnull, warn_unused_result)); + /** Exclusively lock the data dictionary tables. @param trx dictionary transaction @return error code @@ -724,13 +731,8 @@ private: bool m_initialised; /** mutex proteting the locks */ - alignas(CPU_LEVEL1_DCACHE_LINESIZE) srw_spin_lock latch; -#ifdef UNIV_DEBUG - /** The owner of exclusive latch (0 if none); protected by latch */ - std::atomic writer{0}; - /** Number of shared latches */ - std::atomic readers{0}; -#endif + alignas(CPU_LEVEL1_DCACHE_LINESIZE) + IF_DBUG(srw_lock_debug,srw_spin_lock) latch; #ifdef SUX_LOCK_GENERIC protected: /** mutex for hash_latch::wait() */ @@ -789,71 +791,35 @@ public: void wr_lock() { mysql_mutex_assert_not_owner(&wait_mutex); - ut_ad(!is_writer()); latch.wr_lock(); - ut_ad(!writer.exchange(pthread_self(), - std::memory_order_relaxed)); } /** Release exclusive lock_sys.latch */ - void wr_unlock() - { - ut_ad(writer.exchange(0, std::memory_order_relaxed) == - pthread_self()); - latch.wr_unlock(); - } + void wr_unlock() { latch.wr_unlock(); } /** Acquire shared lock_sys.latch */ void rd_lock() { mysql_mutex_assert_not_owner(&wait_mutex); - ut_ad(!is_writer()); latch.rd_lock(); - ut_ad(!writer.load(std::memory_order_relaxed)); - ut_d(readers.fetch_add(1, std::memory_order_relaxed)); } /** Release shared lock_sys.latch */ - void rd_unlock() - { - ut_ad(!is_writer()); - ut_ad(readers.fetch_sub(1, std::memory_order_relaxed)); - latch.rd_unlock(); - } + void rd_unlock() { latch.rd_unlock(); } #endif /** Try to acquire exclusive lock_sys.latch @return whether the latch was acquired */ - bool wr_lock_try() - { - ut_ad(!is_writer()); - if (!latch.wr_lock_try()) return false; - ut_ad(!writer.exchange(pthread_self(), - std::memory_order_relaxed)); - return true; - } + bool wr_lock_try() { return latch.wr_lock_try(); } /** Try to acquire shared lock_sys.latch @return whether the latch was acquired */ - bool rd_lock_try() - { - ut_ad(!is_writer()); - if (!latch.rd_lock_try()) return false; - ut_ad(!writer.load(std::memory_order_relaxed)); - ut_d(readers.fetch_add(1, std::memory_order_relaxed)); - return true; - } + bool rd_lock_try() { return latch.rd_lock_try(); } /** Assert that wr_lock() has been invoked by this thread */ - void assert_locked() const { ut_ad(is_writer()); } + void assert_locked() const { ut_ad(latch.have_wr()); } /** Assert that wr_lock() has not been invoked by this thread */ - void assert_unlocked() const { ut_ad(!is_writer()); } + void assert_unlocked() const { ut_ad(!latch.have_wr()); } #ifdef UNIV_DEBUG /** @return whether the current thread is the lock_sys.latch writer */ - bool is_writer() const - { -# ifdef SUX_LOCK_GENERIC - return writer.load(std::memory_order_relaxed) == pthread_self(); -# else - return writer.load(std::memory_order_relaxed) == pthread_self() || - (xtest() && !latch.is_locked_or_waiting()); -# endif - } + bool is_writer() const { return latch.have_wr(); } + /** @return whether the current thread is holding lock_sys.latch */ + bool is_holder() const { return latch.have_any(); } /** Assert that a lock shard is exclusively latched (by some thread) */ void assert_locked(const lock_t &lock) const; /** Assert that a table lock shard is exclusively latched by this thread */ @@ -965,14 +931,14 @@ extern lock_sys_t lock_sys; /** @return the index of an array element */ inline ulint lock_sys_t::hash_table::calc_hash(ulint fold) const { - ut_ad(lock_sys.is_writer() || lock_sys.readers); + ut_ad(lock_sys.is_holder()); return calc_hash(fold, n_cells); } /** Get a hash table cell. */ inline hash_cell_t *lock_sys_t::hash_table::cell_get(ulint fold) const { - ut_ad(lock_sys.is_writer() || lock_sys.readers); + ut_ad(lock_sys.is_holder()); return &array[calc_hash(fold)]; } diff --git a/storage/innobase/include/log0crypt.h b/storage/innobase/include/log0crypt.h index 22c0c963..2500ac05 100644 --- a/storage/innobase/include/log0crypt.h +++ b/storage/innobase/include/log0crypt.h @@ -28,6 +28,9 @@ MDEV-11782: Rewritten for MariaDB 10.2 by Marko Mäkelä, MariaDB Corporation. #include "log0log.h" +/** innodb_encrypt_log: whether to encrypt the redo log */ +extern my_bool srv_encrypt_log; + /** Initialize the redo log encryption key and random parameters when creating a new redo log. The random parameters will be persisted in the log header. diff --git a/storage/innobase/include/log0log.h b/storage/innobase/include/log0log.h index 54851ca0..cef0dcae 100644 --- a/storage/innobase/include/log0log.h +++ b/storage/innobase/include/log0log.h @@ -132,6 +132,9 @@ public: /** Redo log buffer */ struct log_t { + /** The maximum buf_size */ + static constexpr unsigned buf_size_max= os_file_request_size_max; + /** The original (not version-tagged) InnoDB redo log format */ static constexpr uint32_t FORMAT_3_23= 0; /** The MySQL 5.7.9/MariaDB 10.2.2 log format */ @@ -165,60 +168,92 @@ struct log_t static constexpr lsn_t FIRST_LSN= START_OFFSET; private: - /** The log sequence number of the last change of durable InnoDB files */ + /** the lock bit in buf_free */ + static constexpr size_t buf_free_LOCK= ~(~size_t{0} >> 1); alignas(CPU_LEVEL1_DCACHE_LINESIZE) + /** first free offset within buf used; + the most significant bit is set by lock_lsn() to protect this field + as well as write_to_buf, waits */ + std::atomic buf_free; +public: + /** number of write requests (to buf); protected by lock_lsn() or lsn_lock */ + size_t write_to_buf; + /** log record buffer, written to by mtr_t::commit() */ + byte *buf; +private: + /** The log sequence number of the last change of durable InnoDB files; + protected by lock_lsn() or lsn_lock or latch.wr_lock() */ std::atomic lsn; /** the first guaranteed-durable log sequence number */ std::atomic flushed_to_disk_lsn; - /** log sequence number when log resizing was initiated, or 0 */ - std::atomic resize_lsn; - /** set when there may be need to initiate a log checkpoint. - This must hold if lsn - last_checkpoint_lsn > max_checkpoint_age. */ - std::atomic need_checkpoint; +public: + /** number of append_prepare_wait(); protected by lock_lsn() or lsn_lock */ + size_t waits; + /** innodb_log_buffer_size (size of buf,flush_buf if !is_pmem(), in bytes) */ + unsigned buf_size; + /** log file size in bytes, including the header */ + lsn_t file_size; + +#ifdef LOG_LATCH_DEBUG + typedef srw_lock_debug log_rwlock; + typedef srw_mutex log_lsn_lock; -#if defined(__aarch64__) - /* On ARM, we do more spinning */ + bool latch_have_wr() const { return latch.have_wr(); } + bool latch_have_rd() const { return latch.have_rd(); } + bool latch_have_any() const { return latch.have_any(); } +#else +# ifndef UNIV_DEBUG +# elif defined SUX_LOCK_GENERIC + bool latch_have_wr() const { return true; } + bool latch_have_rd() const { return true; } + bool latch_have_any() const { return true; } +# else + bool latch_have_wr() const { return latch.is_write_locked(); } + bool latch_have_rd() const { return latch.is_locked(); } + bool latch_have_any() const { return latch.is_locked(); } +# endif +# ifdef __aarch64__ + /* On ARM, we spin more */ typedef srw_spin_lock log_rwlock; typedef pthread_mutex_wrapper log_lsn_lock; -#else +# else typedef srw_lock log_rwlock; typedef srw_mutex log_lsn_lock; +# endif #endif - -public: - /** rw-lock protecting writes to buf; normal mtr_t::commit() - outside any log checkpoint is covered by a shared latch */ + /** exclusive latch for checkpoint, shared for mtr_t::commit() to buf */ alignas(CPU_LEVEL1_DCACHE_LINESIZE) log_rwlock latch; -private: - /** mutex protecting buf_free et al, together with latch */ - log_lsn_lock lsn_lock; -public: - /** first free offset within buf use; protected by lsn_lock */ - Atomic_relaxed buf_free; - /** number of write requests (to buf); protected by lsn_lock */ - size_t write_to_buf; - /** number of append_prepare_wait(); protected by lsn_lock */ - size_t waits; -private: + + /** number of std::swap(buf, flush_buf) and writes from buf to log; + protected by latch.wr_lock() */ + ulint write_to_log; + /** Last written LSN */ lsn_t write_lsn; -public: - /** log record buffer, written to by mtr_t::commit() */ - byte *buf; + /** buffer for writing data to ib_logfile0, or nullptr if is_pmem() In write_buf(), buf and flush_buf are swapped */ byte *flush_buf; - /** number of std::swap(buf, flush_buf) and writes from buf to log; - protected by latch.wr_lock() */ - ulint write_to_log; - + /** set when there may be need to initiate a log checkpoint. + This must hold if lsn - last_checkpoint_lsn > max_checkpoint_age. */ + std::atomic need_checkpoint; + /** whether a checkpoint is pending; protected by latch.wr_lock() */ + Atomic_relaxed checkpoint_pending; + /** next checkpoint number (protected by latch.wr_lock()) */ + byte next_checkpoint_no; + /** recommended maximum buf_free size, after which the buffer is flushed */ + unsigned max_buf_free; /** Log sequence number when a log file overwrite (broken crash recovery) was noticed. Protected by latch.wr_lock(). */ lsn_t overwrite_warned; - /** innodb_log_buffer_size (size of buf,flush_buf if !is_pmem(), in bytes) */ - size_t buf_size; + /** latest completed checkpoint (protected by latch.wr_lock()) */ + Atomic_relaxed last_checkpoint_lsn; + /** next checkpoint LSN (protected by latch.wr_lock()) */ + lsn_t next_checkpoint_lsn; + /** Log file */ + log_file_t log; private: /** Log file being constructed during resizing; protected by latch */ log_file_t resize_log; @@ -229,18 +264,14 @@ private: /** Buffer for writing to resize_log; @see flush_buf */ byte *resize_flush_buf; - void init_lsn_lock() {lsn_lock.init(); } - void lock_lsn() { lsn_lock.wr_lock(); } - void unlock_lsn() {lsn_lock.wr_unlock(); } - void destroy_lsn_lock() { lsn_lock.destroy(); } - -public: - /** recommended maximum size of buf, after which the buffer is flushed */ - size_t max_buf_free; + /** Special implementation of lock_lsn() for IA-32 and AMD64 */ + void lsn_lock_bts() noexcept; + /** Acquire a lock for updating buf_free and related fields. + @return the value of buf_free */ + size_t lock_lsn() noexcept; - /** log file size in bytes, including the header */ - lsn_t file_size; -private: + /** log sequence number when log resizing was initiated, or 0 */ + std::atomic resize_lsn; /** the log sequence number at the start of the log file */ lsn_t first_lsn; #if defined __linux__ || defined _WIN32 @@ -250,8 +281,6 @@ private: public: /** format of the redo log: e.g., FORMAT_10_8 */ uint32_t format; - /** Log file */ - log_file_t log; #if defined __linux__ || defined _WIN32 /** whether file system caching is enabled for the log */ my_bool log_buffered; @@ -279,21 +308,29 @@ public: /*!< this is the maximum allowed value for lsn - last_checkpoint_lsn when a new query step is started */ - /** latest completed checkpoint (protected by latch.wr_lock()) */ - Atomic_relaxed last_checkpoint_lsn; - /** next checkpoint LSN (protected by log_sys.latch) */ - lsn_t next_checkpoint_lsn; - /** next checkpoint number (protected by latch.wr_lock()) */ - ulint next_checkpoint_no; - /** whether a checkpoint is pending */ - Atomic_relaxed checkpoint_pending; /** buffer for checkpoint header */ byte *checkpoint_buf; /* @} */ +private: + /** A lock when the spin-only lock_lsn() is not being used */ + log_lsn_lock lsn_lock; +public: + bool is_initialised() const noexcept { return max_buf_free != 0; } + /** whether there is capacity in the log buffer */ + bool buf_free_ok() const noexcept + { + ut_ad(!is_pmem()); + return (buf_free.load(std::memory_order_relaxed) & ~buf_free_LOCK) < + max_buf_free; + } + + void set_buf_free(size_t f) noexcept + { ut_ad(f < buf_free_LOCK); buf_free.store(f, std::memory_order_relaxed); } + #ifdef HAVE_PMEM bool is_pmem() const noexcept { return !flush_buf; } #else @@ -302,7 +339,7 @@ public: bool is_opened() const noexcept { return log.is_opened(); } - /** @return target write LSN to react on buf_free >= max_buf_free */ + /** @return target write LSN to react on !buf_free_ok() */ inline lsn_t get_write_target() const; /** @return LSN at which log resizing was started and is still in progress @@ -402,9 +439,7 @@ public: void set_recovered_lsn(lsn_t lsn) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_write_locked()); -#endif /* SUX_LOCK_GENERIC */ + ut_ad(latch_have_wr()); write_lsn= lsn; this->lsn.store(lsn, std::memory_order_relaxed); flushed_to_disk_lsn.store(lsn, std::memory_order_relaxed); @@ -444,17 +479,23 @@ public: private: /** Wait in append_prepare() for buffer to become available - @param lsn log sequence number to write up to - @param ex whether log_sys.latch is exclusively locked */ - ATTRIBUTE_COLD void append_prepare_wait(lsn_t lsn, bool ex) noexcept; + @tparam spin whether to use the spin-only lock_lsn() + @param b the value of buf_free + @param ex whether log_sys.latch is exclusively locked + @param lsn log sequence number to write up to + @return the new value of buf_free */ + template + ATTRIBUTE_COLD size_t append_prepare_wait(size_t b, bool ex, lsn_t lsn) + noexcept; public: /** Reserve space in the log buffer for appending data. + @tparam spin whether to use the spin-only lock_lsn() @tparam pmem log_sys.is_pmem() @param size total length of the data to append(), in bytes @param ex whether log_sys.latch is exclusively locked @return the start LSN and the buffer position for append() */ - template - inline std::pair append_prepare(size_t size, bool ex) noexcept; + template + std::pair append_prepare(size_t size, bool ex) noexcept; /** Append a string of bytes to the redo log. @param d destination @@ -462,9 +503,7 @@ public: @param size length of str, in bytes */ void append(byte *&d, const void *s, size_t size) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_locked()); -#endif + ut_ad(latch_have_any()); ut_ad(d + size <= buf + (is_pmem() ? file_size : buf_size)); memcpy(d, s, size); d+= size; diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index c916edc9..bfa66216 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -695,14 +695,40 @@ private: /** Encrypt the log */ ATTRIBUTE_NOINLINE void encrypt(); + /** Commit the mini-transaction log. + @tparam pmem log_sys.is_pmem() + @param mtr mini-transaction + @param lsns {start_lsn,flush_ahead} */ + template + static void commit_log(mtr_t *mtr, std::pair lsns); + /** Append the redo log records to the redo log buffer. @return {start_lsn,flush_ahead} */ std::pair do_write(); /** Append the redo log records to the redo log buffer. + @tparam spin whether to use the spin-only log_sys.lock_lsn() + @tparam pmem log_sys.is_pmem() + @param mtr mini-transaction @param len number of bytes to write @return {start_lsn,flush_ahead} */ - std::pair finish_write(size_t len); + template static + std::pair finish_writer(mtr_t *mtr, size_t len); + + /** The applicable variant of commit_log() */ + static void (*commit_logger)(mtr_t *, std::pair); + /** The applicable variant of finish_writer() */ + static std::pair (*finisher)(mtr_t *, size_t); + + std::pair finish_write(size_t len) + { return finisher(this, len); } +public: + /** Poll interval in log_sys.lock_lsn(); 0 to use log_sys.lsn_lock. + Protected by LOCK_global_system_variables and log_sys.latch. */ + static unsigned spin_wait_delay; + /** Update finisher when spin_wait_delay is changing to or from 0. */ + static void finisher_update(); +private: /** Release all latches. */ void release(); diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index c8374515..7eba359f 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -46,6 +46,18 @@ Created 10/21/1995 Heikki Tuuri #include #endif /* !_WIN32 */ +/** The maximum size of a read or write request. + +According to Linux "man 2 read" and "man 2 write" this applies to +both 32-bit and 64-bit systems. + +On FreeBSD, the limit is close to the Linux one, INT_MAX. + +On Microsoft Windows, the limit is UINT_MAX (4 GiB - 1). + +On other systems, the limit typically is up to SSIZE_T_MAX. */ +static constexpr unsigned os_file_request_size_max= 0x7ffff000; + extern bool os_has_said_disk_full; /** File offset in bytes */ @@ -109,25 +121,21 @@ struct pfs_os_file_t /** Options for os_file_create_func @{ */ enum os_file_create_t { - OS_FILE_OPEN = 51, /*!< to open an existing file (if - doesn't exist, error) */ - OS_FILE_CREATE, /*!< to create new file (if - exists, error) */ - OS_FILE_OVERWRITE, /*!< to create a new file, if exists - the overwrite old file */ - OS_FILE_OPEN_RAW, /*!< to open a raw device or disk - partition */ - OS_FILE_CREATE_PATH, /*!< to create the directories */ - OS_FILE_OPEN_RETRY, /*!< open with retry */ - - /** Flags that can be combined with the above values. Please ensure - that the above values stay below 128. */ - - OS_FILE_ON_ERROR_NO_EXIT = 128, /*!< do not exit on unknown errors */ - OS_FILE_ON_ERROR_SILENT = 256 /*!< don't print diagnostic messages to - the log unless it is a fatal error, - this flag is only used if - ON_ERROR_NO_EXIT is set */ + /** create a new file */ + OS_FILE_CREATE= 0, + /** open an existing file */ + OS_FILE_OPEN, + /** retry opening an existing file */ + OS_FILE_OPEN_RETRY, + /** open a raw block device */ + OS_FILE_OPEN_RAW, + + /** do not display diagnostic messages */ + OS_FILE_ON_ERROR_SILENT= 4, + + OS_FILE_CREATE_SILENT= OS_FILE_CREATE | OS_FILE_ON_ERROR_SILENT, + OS_FILE_OPEN_SILENT= OS_FILE_OPEN | OS_FILE_ON_ERROR_SILENT, + OS_FILE_OPEN_RETRY_SILENT= OS_FILE_OPEN_RETRY | OS_FILE_ON_ERROR_SILENT }; static const ulint OS_FILE_READ_ONLY = 333; @@ -144,7 +152,7 @@ static const ulint OS_FILE_NORMAL = 62; /** Types for file create @{ */ static constexpr ulint OS_DATA_FILE = 100; static constexpr ulint OS_LOG_FILE = 101; -#if defined _WIN32 || defined HAVE_FCNTL_DIRECT +#if defined _WIN32 || defined O_DIRECT static constexpr ulint OS_DATA_FILE_NO_O_DIRECT = 103; #endif /* @} */ @@ -191,14 +199,10 @@ public: WRITE_ASYNC= WRITE_SYNC | 1, /** A doublewrite batch */ DBLWR_BATCH= WRITE_ASYNC | 8, - /** Write data; evict the block on write completion */ - WRITE_LRU= WRITE_ASYNC | 32, /** Write data and punch hole for the rest */ - PUNCH= WRITE_ASYNC | 64, - /** Write data and punch hole; evict the block on write completion */ - PUNCH_LRU= PUNCH | WRITE_LRU, + PUNCH= WRITE_ASYNC | 16, /** Zero out a range of bytes in fil_space_t::io() */ - PUNCH_RANGE= WRITE_SYNC | 128, + PUNCH_RANGE= WRITE_SYNC | 32, }; constexpr IORequest(buf_page_t *bpage, buf_tmp_buffer_t *slot, @@ -211,7 +215,6 @@ public: bool is_read() const { return (type & READ_SYNC) != 0; } bool is_write() const { return (type & WRITE_SYNC) != 0; } - bool is_LRU() const { return (type & (WRITE_LRU ^ WRITE_ASYNC)) != 0; } bool is_async() const { return (type & (READ_SYNC ^ READ_ASYNC)) != 0; } void write_complete(int io_error) const; @@ -349,7 +352,7 @@ A simple function to open or create a file. pfs_os_file_t os_file_create_simple_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success); @@ -358,7 +361,7 @@ os_file_create_simple_func( os_file_create_simple_no_error_handling(), not directly this function! A simple function to open or create a file. @param[in] name name of the file or path as a null-terminated string -@param[in] create_mode create mode +@param[in] create_mode OS_FILE_CREATE or OS_FILE_OPEN @param[in] access_type OS_FILE_READ_ONLY, OS_FILE_READ_WRITE, or OS_FILE_READ_ALLOW_DELETE; the last option is used by a backup program reading the file @@ -369,28 +372,12 @@ A simple function to open or create a file. pfs_os_file_t os_file_create_simple_no_error_handling_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success) MY_ATTRIBUTE((warn_unused_result)); -#ifndef HAVE_FCNTL_DIRECT -#define os_file_set_nocache(fd, file_name, operation_name) do{}while(0) -#else -/** Tries to disable OS caching on an opened file descriptor. -@param[in] fd file descriptor to alter -@param[in] file_name file name, used in the diagnostic message -@param[in] name "open" or "create"; used in the diagnostic - message */ -void -os_file_set_nocache( -/*================*/ - int fd, /*!< in: file descriptor to alter */ - const char* file_name, - const char* operation_name); -#endif - #ifndef _WIN32 /* On Microsoft Windows, mandatory locking is used */ /** Obtain an exclusive lock on a file. @param fd file descriptor @@ -419,7 +406,7 @@ Opens an existing file or creates a new. pfs_os_file_t os_file_create_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint purpose, ulint type, bool read_only, @@ -617,7 +604,7 @@ pfs_os_file_t pfs_os_file_create_simple_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success, @@ -633,7 +620,7 @@ monitor file creation/open. @param[in] key Performance Schema Key @param[in] name name of the file or path as a null-terminated string -@param[in] create_mode create mode +@param[in] create_mode OS_FILE_CREATE or OS_FILE_OPEN @param[in] access_type OS_FILE_READ_ONLY, OS_FILE_READ_WRITE, or OS_FILE_READ_ALLOW_DELETE; the last option is used by a backup program reading the file @@ -648,7 +635,7 @@ pfs_os_file_t pfs_os_file_create_simple_no_error_handling_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success, @@ -681,7 +668,7 @@ pfs_os_file_t pfs_os_file_create_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint purpose, ulint type, bool read_only, diff --git a/storage/innobase/include/os0file.inl b/storage/innobase/include/os0file.inl index 7de31505..a7603028 100644 --- a/storage/innobase/include/os0file.inl +++ b/storage/innobase/include/os0file.inl @@ -45,7 +45,7 @@ pfs_os_file_t pfs_os_file_create_simple_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success, @@ -80,7 +80,7 @@ monitor file creation/open. @param[in] key Performance Schema Key @param[in] name name of the file or path as a null-terminated string -@param[in] create_mode create mode +@param[in] create_mode OS_FILE_CREATE or OS_FILE_OPEN @param[in] access_type OS_FILE_READ_ONLY, OS_FILE_READ_WRITE, or OS_FILE_READ_ALLOW_DELETE; the last option is used by a backup program reading the file @@ -95,7 +95,7 @@ pfs_os_file_t pfs_os_file_create_simple_no_error_handling_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success, @@ -146,7 +146,7 @@ pfs_os_file_t pfs_os_file_create_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint purpose, ulint type, bool read_only, diff --git a/storage/innobase/include/row0merge.h b/storage/innobase/include/row0merge.h index 93ea650d..1c2af128 100644 --- a/storage/innobase/include/row0merge.h +++ b/storage/innobase/include/row0merge.h @@ -165,14 +165,11 @@ row_merge_drop_indexes( prepare_inplace_alter_table_dict(). */ void row_merge_drop_temp_indexes(); -/** Create temporary merge files in the given paramater path, and if -UNIV_PFS_IO defined, register the file descriptor with Performance Schema. -@param[in] path location for creating temporary merge files, or NULL +/** Create a temporary file at the specified path. +@param path location for creating temporary merge files, or nullptr @return File descriptor */ -pfs_os_file_t -row_merge_file_create_low( - const char* path) - MY_ATTRIBUTE((warn_unused_result)); +pfs_os_file_t row_merge_file_create_low(const char *path) + MY_ATTRIBUTE((warn_unused_result)); /*********************************************************************//** Destroy a merge file. And de-register the file from Performance Schema if UNIV_PFS_IO is defined. */ diff --git a/storage/innobase/include/row0row.h b/storage/innobase/include/row0row.h index a1350740..7056c77f 100644 --- a/storage/innobase/include/row0row.h +++ b/storage/innobase/include/row0row.h @@ -370,6 +370,12 @@ row_search_index_entry( mtr_t* mtr) /*!< in: mtr */ MY_ATTRIBUTE((nonnull, warn_unused_result)); +/** Get the byte offset of the DB_TRX_ID column +@param[in] rec clustered index record +@param[in] index clustered index +@return the byte offset of DB_TRX_ID, from the start of rec */ +ulint row_trx_id_offset(const rec_t* rec, const dict_index_t* index); + #define ROW_COPY_DATA 1 #define ROW_COPY_POINTERS 2 diff --git a/storage/innobase/include/row0sel.h b/storage/innobase/include/row0sel.h index 8134c60f..54e4a1d2 100644 --- a/storage/innobase/include/row0sel.h +++ b/storage/innobase/include/row0sel.h @@ -115,8 +115,8 @@ row_sel_convert_mysql_key_to_innobase( ulint buf_len, /*!< in: buffer length */ dict_index_t* index, /*!< in: index of the key value */ const byte* key_ptr, /*!< in: MySQL key value */ - ulint key_len); /*!< in: MySQL key value length */ - + ulint key_len) /*!< in: MySQL key value length */ + MY_ATTRIBUTE((nonnull(1,4,5))); /** Search for rows in the database using cursor. Function is mainly used for tables that are shared across connections and diff --git a/storage/innobase/include/srv0mon.h b/storage/innobase/include/srv0mon.h index 51f3049b..2ed26748 100644 --- a/storage/innobase/include/srv0mon.h +++ b/storage/innobase/include/srv0mon.h @@ -194,7 +194,6 @@ enum monitor_id_t { MONITOR_FLUSH_ADAPTIVE_AVG_PASS, MONITOR_LRU_GET_FREE_LOOPS, - MONITOR_LRU_GET_FREE_WAITS, MONITOR_FLUSH_AVG_PAGE_RATE, MONITOR_FLUSH_LSN_AVG_RATE, @@ -215,7 +214,6 @@ enum monitor_id_t { MONITOR_LRU_BATCH_SCANNED_PER_CALL, MONITOR_LRU_BATCH_FLUSH_TOTAL_PAGE, MONITOR_LRU_BATCH_EVICT_TOTAL_PAGE, - MONITOR_LRU_SINGLE_FLUSH_FAILURE_COUNT, MONITOR_LRU_GET_FREE_SEARCH, MONITOR_LRU_SEARCH_SCANNED, MONITOR_LRU_SEARCH_SCANNED_NUM_CALL, diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h index 457d9ab5..5e6bfc33 100644 --- a/storage/innobase/include/srv0srv.h +++ b/storage/innobase/include/srv0srv.h @@ -121,10 +121,6 @@ struct srv_stats_t ulint_ctr_n_t n_temp_blocks_decrypted; }; -/** We are prepared for a situation that we have this many threads waiting for -a transactional lock inside InnoDB. srv_start() sets the value. */ -extern ulint srv_max_n_threads; - extern const char* srv_main_thread_op_info; /** Prefix used by MySQL to indicate pre-5.1 table name encoding */ diff --git a/storage/innobase/include/srw_lock.h b/storage/innobase/include/srw_lock.h index 01067322..98c256d3 100644 --- a/storage/innobase/include/srw_lock.h +++ b/storage/innobase/include/srw_lock.h @@ -153,7 +153,7 @@ template class srw_lock_impl; /** Slim shared-update-exclusive lock with no recursion */ template -class ssux_lock_impl final +class ssux_lock_impl { #ifdef UNIV_PFS_RWLOCK friend class ssux_lock; @@ -550,3 +550,51 @@ typedef srw_lock_impl srw_lock; typedef srw_lock_impl srw_spin_lock; #endif + +#ifdef UNIV_DEBUG +# include + +class srw_lock_debug : private srw_lock +{ + /** The owner of the exclusive lock (0 if none) */ + std::atomic writer; + /** Protects readers */ + mutable srw_mutex readers_lock; + /** Threads that hold the lock in shared mode */ + std::atomic*> readers; + + /** Register a read lock. */ + void readers_register(); + +public: + void SRW_LOCK_INIT(mysql_pfs_key_t key); + void destroy(); + +#ifndef SUX_LOCK_GENERIC + /** @return whether any lock may be held by any thread */ + bool is_locked_or_waiting() const noexcept + { return srw_lock::is_locked_or_waiting(); } + /** @return whether an exclusive lock may be held by any thread */ + bool is_write_locked() const noexcept { return srw_lock::is_write_locked(); } +#endif + + /** Acquire an exclusive lock */ + void wr_lock(SRW_LOCK_ARGS(const char *file, unsigned line)); + /** @return whether an exclusive lock was acquired */ + bool wr_lock_try(); + /** Release after wr_lock() */ + void wr_unlock(); + /** Acquire a shared lock */ + void rd_lock(SRW_LOCK_ARGS(const char *file, unsigned line)); + /** @return whether a shared lock was acquired */ + bool rd_lock_try(); + /** Release after rd_lock() */ + void rd_unlock(); + /** @return whether this thread is between rd_lock() and rd_unlock() */ + bool have_rd() const noexcept; + /** @return whether this thread is between wr_lock() and wr_unlock() */ + bool have_wr() const noexcept; + /** @return whether this thread is holding rd_lock() or wr_lock() */ + bool have_any() const noexcept; +}; +#endif diff --git a/storage/innobase/include/trx0purge.h b/storage/innobase/include/trx0purge.h index 0f4f8afa..1fb6cd68 100644 --- a/storage/innobase/include/trx0purge.h +++ b/storage/innobase/include/trx0purge.h @@ -55,80 +55,74 @@ Run a purge batch. @return number of undo log pages handled in the batch */ ulint trx_purge(ulint n_tasks, ulint history_size); -/** Rollback segements from a given transaction with trx-no -scheduled for purge. */ -class TrxUndoRsegs { -private: - typedef std::vector > - trx_rsegs_t; -public: - typedef trx_rsegs_t::iterator iterator; - typedef trx_rsegs_t::const_iterator const_iterator; - - TrxUndoRsegs() = default; - - /** Constructor */ - TrxUndoRsegs(trx_rseg_t& rseg) - : trx_no(rseg.last_trx_no()), m_rsegs(1, &rseg) {} - /** Constructor */ - TrxUndoRsegs(trx_id_t trx_no, trx_rseg_t& rseg) - : trx_no(trx_no), m_rsegs(1, &rseg) {} - - bool operator!=(const TrxUndoRsegs& other) const - { return trx_no != other.trx_no; } - bool empty() const { return m_rsegs.empty(); } - void erase(iterator& it) { m_rsegs.erase(it); } - iterator begin() { return(m_rsegs.begin()); } - iterator end() { return(m_rsegs.end()); } - const_iterator begin() const { return m_rsegs.begin(); } - const_iterator end() const { return m_rsegs.end(); } - - /** Compare two TrxUndoRsegs based on trx_no. - @param elem1 first element to compare - @param elem2 second element to compare - @return true if elem1 > elem2 else false.*/ - bool operator()(const TrxUndoRsegs& lhs, const TrxUndoRsegs& rhs) - { - return(lhs.trx_no > rhs.trx_no); - } - - /** Copy of trx_rseg_t::last_trx_no() */ - trx_id_t trx_no= 0; -private: - /** Rollback segments of a transaction, scheduled for purge. */ - trx_rsegs_t m_rsegs{}; -}; - -typedef std::priority_queue< - TrxUndoRsegs, - std::vector >, - TrxUndoRsegs> purge_pq_t; - -/** Chooses the rollback segment with the oldest committed transaction */ -struct TrxUndoRsegsIterator { - /** Constructor */ - TrxUndoRsegsIterator(); - /** Sets the next rseg to purge in purge_sys. - Executed in the purge coordinator thread. - @retval false when nothing is to be purged - @retval true when purge_sys.rseg->latch was locked */ - inline bool set_next(); - -private: - // Disable copying - TrxUndoRsegsIterator(const TrxUndoRsegsIterator&); - TrxUndoRsegsIterator& operator=(const TrxUndoRsegsIterator&); - - /** The current element to process */ - TrxUndoRsegs m_rsegs; - /** Track the current element in m_rsegs */ - TrxUndoRsegs::const_iterator m_iter; -}; - /** The control structure used in the purge operation */ class purge_sys_t { - friend TrxUndoRsegsIterator; + /** Min-heap based priority queue of (trx_no, trx_sys.rseg_array index) + pairs, ordered on trx_no. The highest 64-TRX_NO_SHIFT bits of each element is + trx_no, the lowest 8 bits is rseg's index in trx_sys.rseg_array. */ + class purge_queue + { + public: + typedef std::vector> container_type; + /** Number of bits reseved to shift trx_no in purge queue element */ + static constexpr unsigned TRX_NO_SHIFT= 8; + + bool empty() const { return m_array.empty(); } + void clear() { m_array.clear(); } + + /** Push (trx_no, trx_sys.rseg_array index) into min-heap. + @param trx_no_rseg (trx_no << TRX_NO_SHIFT | (trx_sys.rseg_array index)) */ + void push_trx_no_rseg(container_type::value_type trx_no_rseg) + { + m_array.push_back(trx_no_rseg); + std::push_heap(m_array.begin(), m_array.end(), + std::greater()); + } + + /** Push rseg to priority queue. + @param trx_no trx_no of committed transaction + @param rseg rseg of committed transaction*/ + void push(trx_id_t trx_no, const trx_rseg_t &rseg) + { + ut_ad(trx_no < 1ULL << (DATA_TRX_ID_LEN * CHAR_BIT)); + ut_ad(&rseg >= trx_sys.rseg_array); + ut_ad(&rseg < trx_sys.rseg_array + TRX_SYS_N_RSEGS); + push_trx_no_rseg(trx_no << TRX_NO_SHIFT | + byte(&rseg - trx_sys.rseg_array)); + } + + /** Extracts rseg from (trx_no, trx_sys.rseg_array index) pair. + @param trx_no_rseg (trx_no << TRX_NO_SHIFT | (trx_sys.rseg_array index) + @return pointer to rseg in trx_sys.rseg_array */ + static trx_rseg_t *rseg(container_type::value_type trx_no_rseg) { + byte i= static_cast(trx_no_rseg); + ut_ad(i < TRX_SYS_N_RSEGS); + return &trx_sys.rseg_array[i]; + } + + /** Pop rseg from priority queue. + @return pointer to popped trx_rseg_t object */ + trx_rseg_t *pop() + { + ut_ad(!empty()); + std::pop_heap(m_array.begin(), m_array.end(), + std::greater()); + trx_rseg_t *r = rseg(m_array.back()); + m_array.pop_back(); + return r; + } + + /** Clone m_array. + @return m_array clone */ + container_type clone_container() const{ return m_array; } + + private: + /** Array of (trx_no, trx_sys.rseg_array index) pairs. */ + container_type m_array; + }; + + public: /** latch protecting view, m_enabled */ alignas(CPU_LEVEL1_DCACHE_LINESIZE) mutable srw_spin_lock latch; @@ -244,15 +238,36 @@ private: record */ uint16_t hdr_offset; /*!< Header byte offset on the page */ + /** Binary min-heap of (trx_no, trx_sys.rseg_array index) pairs, ordered on + trx_no. It is protected by the pq_mutex */ + purge_queue purge_queue; + + /** Mutex protecting purge_queue */ + mysql_mutex_t pq_mutex; - TrxUndoRsegsIterator - rseg_iter; /*!< Iterator to get the next rseg - to process */ public: - purge_pq_t purge_queue; /*!< Binary min-heap, ordered on - TrxUndoRsegs::trx_no. It is protected - by the pq_mutex */ - mysql_mutex_t pq_mutex; /*!< Mutex protecting purge_queue */ + + void enqueue(trx_id_t trx_no, const trx_rseg_t &rseg) { + mysql_mutex_assert_owner(&pq_mutex); + purge_queue.push(trx_no, rseg); + } + + /** Push to purge queue without acquiring pq_mutex. + @param rseg rseg to push */ + void enqueue(const trx_rseg_t &rseg) { enqueue(rseg.last_trx_no(), rseg); } + + /** Clone purge queue container. + @return purge queue container clone */ + purge_queue::container_type clone_queue_container() const { + mysql_mutex_assert_owner(&pq_mutex); + return purge_queue.clone_container(); + } + + /** Acquare purge_queue_mutex */ + void queue_lock() { mysql_mutex_lock(&pq_mutex); } + + /** Release purge queue mutex */ + void queue_unlock() { mysql_mutex_unlock(&pq_mutex); } /** innodb_undo_log_truncate=ON state; only modified by purge_coordinator_callback() */ @@ -332,8 +347,9 @@ private: /** Update the last not yet purged history log info in rseg when we have purged a whole undo log. Advances also purge_trx_no - past the purged log. */ - void rseg_get_next_history_log(); + past the purged log. + @return whether anything is to be purged */ + bool rseg_get_next_history_log(); public: /** @@ -438,6 +454,11 @@ public: @param already_stopped True indicates purge threads were already stopped */ void stop_FTS(const dict_table_t &table, bool already_stopped=false); + + /** Cleanse purge queue to remove the rseg that reside in undo-tablespace + marked for truncate. + @param space undo tablespace being truncated */ + void cleanse_purge_queue(const fil_space_t &space); }; /** The global data structure coordinating a purge */ diff --git a/storage/innobase/include/trx0rseg.h b/storage/innobase/include/trx0rseg.h index 7fa43047..e0051b2a 100644 --- a/storage/innobase/include/trx0rseg.h +++ b/storage/innobase/include/trx0rseg.h @@ -59,7 +59,7 @@ struct alignas(CPU_LEVEL1_DCACHE_LINESIZE) trx_rseg_t /** tablespace containing the rollback segment; constant after init() */ fil_space_t *space; /** latch protecting everything except page_no, space */ - srw_spin_lock latch; + IF_DBUG(srw_lock_debug,srw_spin_lock) latch; /** rollback segment header page number; constant after init() */ uint32_t page_no; /** length of the TRX_RSEG_HISTORY list (number of transactions) */ @@ -170,19 +170,21 @@ public: /** Last not yet purged undo log header; FIL_NULL if all purged */ uint32_t last_page_no; - /** trx_t::no | last_offset << 48 */ + /** trx_t::no << 16 | last_offset */ uint64_t last_commit_and_offset; /** @return the commit ID of the last committed transaction */ trx_id_t last_trx_no() const - { return last_commit_and_offset & ((1ULL << 48) - 1); } + { return last_commit_and_offset >> 16; } /** @return header offset of the last committed transaction */ uint16_t last_offset() const - { return static_cast(last_commit_and_offset >> 48); } + { + return static_cast(last_commit_and_offset); + } void set_last_commit(uint16_t last_offset, trx_id_t trx_no) { - last_commit_and_offset= static_cast(last_offset) << 48 | trx_no; + last_commit_and_offset= trx_no << 16 | static_cast(last_offset); } /** @return the page identifier */ diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h index 0a3e0d62..15255354 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -785,13 +785,19 @@ public: const char* op_info; /*!< English text describing the current operation, or an empty string */ - uint isolation_level;/*!< TRX_ISO_REPEATABLE_READ, ... */ - bool check_foreigns; /*!< normally TRUE, but if the user - wants to suppress foreign key checks, - (in table imports, for example) we - set this FALSE */ + /** TRX_ISO_REPEATABLE_READ, ... */ + unsigned isolation_level:2; + /** when set, REPEATABLE READ will actually be Snapshot Isolation, due to + detecting write/write conflicts and disabling "semi-consistent read" */ + unsigned snapshot_isolation:1; + /** normally set; "SET foreign_key_checks=0" can be issued to suppress + foreign key checks, in table imports, for example */ + unsigned check_foreigns:1; + /** normally set; "SET unique_checks=0, foreign_key_checks=0" + enables bulk insert into an empty table */ + unsigned check_unique_secondary:1; /** whether an insert into an empty table is active */ - bool bulk_insert; + unsigned bulk_insert:1; /*------------------------------*/ /* MySQL has a transaction coordinator to coordinate two phase commit between multiple storage engines and the binary log. When @@ -805,13 +811,6 @@ public: /** whether this is holding the prepare mutex */ bool active_commit_ordered; /*------------------------------*/ - bool check_unique_secondary; - /*!< normally TRUE, but if the user - wants to speed up inserts by - suppressing unique key checks - for secondary indexes when we decide - if we can use the insert buffer for - them, we set this FALSE */ bool flush_log_later;/* In 2PC, we hold the prepare_commit mutex across both phases. In that case, we @@ -1189,10 +1188,16 @@ public: return UNIV_UNLIKELY(bulk_insert) ? bulk_insert_apply_low(): DB_SUCCESS; } + /** Do the bulk insert for the buffered insert operation of a table. + @param table bulk insert operation + @return DB_SUCCESS or error code. */ + dberr_t bulk_insert_apply_for_table(dict_table_t *table); private: /** Apply the buffered bulk inserts. */ dberr_t bulk_insert_apply_low(); + /** Rollback the bulk insert operation for the transaction */ + void bulk_rollback_low(); /** Assign a rollback segment for modifying temporary tables. @return the assigned rollback segment */ trx_rseg_t *assign_temp_rseg(); diff --git a/storage/innobase/include/trx0undo.inl b/storage/innobase/include/trx0undo.inl index 9f05989f..023e2b98 100644 --- a/storage/innobase/include/trx0undo.inl +++ b/storage/innobase/include/trx0undo.inl @@ -125,5 +125,6 @@ trx_undo_page_get_next_rec(const buf_block_t *undo_page, uint16_t rec, { uint16_t end= trx_undo_page_get_end(undo_page, page_no, offset); uint16_t next= mach_read_from_2(undo_page->page.frame + rec); - return next == end ? nullptr : undo_page->page.frame + next; + ut_ad(next <= end); + return next >= end ? nullptr : undo_page->page.frame + next; } diff --git a/storage/innobase/include/ut0new.h b/storage/innobase/include/ut0new.h index f4183e4c..3ff5f885 100644 --- a/storage/innobase/include/ut0new.h +++ b/storage/innobase/include/ut0new.h @@ -1071,9 +1071,8 @@ static inline void *ut_malloc_dontdump(size_t n_bytes, ...) { void *ptr = my_large_malloc(&n_bytes, MYF(0)); - ut_dontdump(ptr, n_bytes, true); - if (ptr) { + ut_dontdump(ptr, n_bytes, true); os_total_large_mem_allocated += n_bytes; } return ptr; diff --git a/storage/innobase/include/ut0ut.h b/storage/innobase/include/ut0ut.h index fe16ce14..500b6455 100644 --- a/storage/innobase/include/ut0ut.h +++ b/storage/innobase/include/ut0ut.h @@ -242,20 +242,6 @@ ut_print_name( FILE* ef, /*!< in: stream */ const trx_t* trx, /*!< in: transaction */ const char* name); /*!< in: table name to print */ -/** Format a table name, quoted as an SQL identifier. -If the name contains a slash '/', the result will contain two -identifiers separated by a period (.), as in SQL -database_name.table_name. -@see table_name_t -@param[in] name table or index name -@param[out] formatted formatted result, will be NUL-terminated -@param[in] formatted_size size of the buffer in bytes -@return pointer to 'formatted' */ -char* -ut_format_name( - const char* name, - char* formatted, - ulint formatted_size); /**********************************************************************//** Catenate files. */ diff --git a/storage/innobase/include/ut0vec.h b/storage/innobase/include/ut0vec.h index f4660f96..ad43e1c8 100644 --- a/storage/innobase/include/ut0vec.h +++ b/storage/innobase/include/ut0vec.h @@ -200,15 +200,6 @@ ib_vector_last_const( /* out: pointer to last element */ const ib_vector_t* vec); /* in: vector */ -/******************************************************************** -Sort the vector elements. */ -UNIV_INLINE -void -ib_vector_sort( -/*===========*/ - ib_vector_t* vec, /* in/out: vector */ - ib_compare_t compare); /* in: the comparator to use for sort */ - /******************************************************************** The default ib_vector_t heap free. Does nothing. */ UNIV_INLINE diff --git a/storage/innobase/include/ut0vec.inl b/storage/innobase/include/ut0vec.inl index 531f0f22..1a844dd8 100644 --- a/storage/innobase/include/ut0vec.inl +++ b/storage/innobase/include/ut0vec.inl @@ -304,19 +304,6 @@ ib_vector_remove( return((old_used_count != vec->used) ? current : NULL); } -/******************************************************************** -Sort the vector elements. */ -UNIV_INLINE -void -ib_vector_sort( -/*===========*/ - /* out: void */ - ib_vector_t* vec, /* in: vector */ - ib_compare_t compare)/* in: the comparator to use for sort */ -{ - qsort(vec->data, vec->used, vec->sizeof_value, compare); -} - /******************************************************************** Destroy the vector. Make sure the vector owns the allocator, e.g., the heap in the the heap allocator. */ diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index df51ceb1..a2107007 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -47,6 +47,7 @@ Created 5/7/1996 Heikki Tuuri #include "que0que.h" #include "scope.h" #include +#include #include @@ -173,7 +174,7 @@ void lock_sys_t::assert_locked(const dict_table_t &table) const ut_ad(!table.is_temporary()); if (is_writer()) return; - ut_ad(readers); + ut_ad(latch.have_rd()); ut_ad(table.lock_mutex_is_owner()); } @@ -182,7 +183,7 @@ void lock_sys_t::hash_table::assert_locked(const page_id_t id) const { if (lock_sys.is_writer()) return; - ut_ad(lock_sys.readers); + ut_ad(lock_sys.is_holder()); ut_ad(latch(cell_get(id.fold()))->is_locked()); } @@ -191,7 +192,7 @@ void lock_sys_t::assert_locked(const hash_cell_t &cell) const { if (is_writer()) return; - ut_ad(lock_sys.readers); + ut_ad(lock_sys.is_holder()); ut_ad(hash_table::latch(const_cast(&cell))->is_locked()); } #endif @@ -426,13 +427,10 @@ void lock_sys_t::wr_lock(const char *file, unsigned line) { mysql_mutex_assert_not_owner(&wait_mutex); latch.wr_lock(file, line); - ut_ad(!writer.exchange(pthread_self(), std::memory_order_relaxed)); } /** Release exclusive lock_sys.latch */ void lock_sys_t::wr_unlock() { - ut_ad(writer.exchange(0, std::memory_order_relaxed) == - pthread_self()); latch.wr_unlock(); } @@ -441,15 +439,11 @@ void lock_sys_t::rd_lock(const char *file, unsigned line) { mysql_mutex_assert_not_owner(&wait_mutex); latch.rd_lock(file, line); - ut_ad(!writer.load(std::memory_order_relaxed)); - ut_d(readers.fetch_add(1, std::memory_order_relaxed)); } /** Release shared lock_sys.latch */ void lock_sys_t::rd_unlock() { - ut_ad(!writer.load(std::memory_order_relaxed)); - ut_ad(readers.fetch_sub(1, std::memory_order_relaxed)); latch.rd_unlock(); } #endif @@ -976,8 +970,31 @@ func_exit: for (lock_t *lock= UT_LIST_GET_FIRST(table->locks); lock; lock= UT_LIST_GET_NEXT(un_member.tab_lock.locks, lock)) { - /* if victim has also BF status, but has earlier seqno, we have to wait */ - if (lock->trx != trx && + /* Victim trx needs to be different from BF trx and it has to have a + THD so that we can kill it. Victim might not have THD in two cases: + + (1) An incomplete transaction that was recovered from undo logs + on server startup (and not yet rolled back). + + (2) Transaction that is in XA PREPARE state and whose client + connection was disconnected. + + Neither of these can complete before lock_wait_wsrep() releases + lock_sys.latch. + + (1) trx_t::commit_in_memory() is clearing both + trx_t::state and trx_t::is_recovered before it invokes + lock_release(trx_t*) (which would be blocked by the exclusive + lock_sys.latch that we are holding here). Hence, it is not + possible to write a debug assertion to document this scenario. + + (2) If is in XA PREPARE state, it would eventually be rolled + back and the lock conflict would be resolved when an XA COMMIT + or XA ROLLBACK statement is executed in some other connection. + + If victim has also BF status, but has earlier seqno, we have to wait. + */ + if (lock->trx != trx && lock->trx->mysql_thd && !(wsrep_thd_is_BF(lock->trx->mysql_thd, false) && wsrep_thd_order_before(lock->trx->mysql_thd, trx->mysql_thd))) { @@ -1009,8 +1026,11 @@ func_exit: lock= lock_rec_get_next(heap_no, lock); do { - /* if victim has also BF status, but has earlier seqno, we have to wait */ - if (lock->trx != trx && + /* This is similar case as above except here we have + record-locks instead of table locks. See details + from comment above. + */ + if (lock->trx != trx && lock->trx->mysql_thd && !(wsrep_thd_is_BF(lock->trx->mysql_thd, false) && wsrep_thd_order_before(lock->trx->mysql_thd, trx->mysql_thd))) { @@ -1036,8 +1056,12 @@ func_exit: std::vector> victim_id; for (trx_t *v : victims) + { + /* Victim must have THD */ + ut_ad(v->mysql_thd); victim_id.emplace_back(std::pair {thd_get_thread_id(v->mysql_thd), v->id}); + } DBUG_EXECUTE_IF("sync.before_wsrep_thd_abort", { @@ -3940,6 +3964,8 @@ static void lock_table_dequeue(lock_t *in_lock, bool owns_wait_mutex) dberr_t lock_table_for_trx(dict_table_t *table, trx_t *trx, lock_mode mode, bool no_wait) { + ut_ad(!dict_sys.frozen()); + mem_heap_t *heap= mem_heap_create(512); sel_node_t *node= sel_node_create(heap); que_thr_t *thr= pars_complete_graph_for_exec(node, trx, heap, nullptr); @@ -3976,6 +4002,67 @@ run_again: return err; } +/** Lock the child tables of a table. +@param table parent table +@param trx transaction +@return error code */ +dberr_t lock_table_children(dict_table_t *table, trx_t *trx) +{ + MDL_context *mdl_context= + static_cast(thd_mdl_context(trx->mysql_thd)); + ut_ad(mdl_context); + struct table_mdl{dict_table_t* table; MDL_ticket *mdl;}; + std::vector children; + children.emplace_back(table_mdl{table, nullptr}); + + dberr_t err= DB_SUCCESS; + dict_sys.freeze(SRW_LOCK_CALL); + + rescan: + for (auto f : table->referenced_set) + if (dict_table_t *child= f->foreign_table) + { + if (std::find_if(children.begin(), children.end(), + [&](const table_mdl &c){ return c.table == child; }) != + children.end()) + continue; /* We already acquired MDL on this child table. */ + MDL_ticket *mdl= nullptr; + child->acquire(); + child= dict_acquire_mdl_shared(child, mdl_context, &mdl, + DICT_TABLE_OP_NORMAL); + if (child) + { + if (!mdl) + child->release(); + children.emplace_back(table_mdl{child, mdl}); + goto rescan; + } + err= DB_LOCK_WAIT_TIMEOUT; + break; + } + dict_sys.unfreeze(); + + if (err == DB_SUCCESS) + for (const table_mdl &child : children) + if (child.mdl) + if ((err= lock_table_for_trx(child.table, trx, LOCK_X)) != DB_SUCCESS) + break; + + dict_sys.freeze(SRW_LOCK_CALL); + for (table_mdl &child : children) + { + if (child.mdl) + { + child.table->release(); + mdl_context->release_lock(child.mdl); + } + } + dict_sys.unfreeze(); + + return err; +} + + /** Exclusively lock the data dictionary tables. @param trx dictionary transaction @return error code @@ -4125,7 +4212,7 @@ restart: ulint count= 1000; /* We will not attempt hardware lock elision (memory transaction) here. Both lock_rec_dequeue_from_page() and lock_table_dequeue() - would likely lead to a memory transaction due to a system call, to + would likely lead to a memory transaction abort due to a system call, to wake up a waiting transaction. */ lock_sys.rd_lock(SRW_LOCK_CALL); trx->mutex_lock(); @@ -4295,28 +4382,82 @@ void lock_release_on_drop(trx_t *trx) } } -/** Reset lock bit for supremum and rebuild waiting queue. +/** Reset a lock bit and rebuild waiting queue. @param cell rec hash cell of in_lock @param lock the lock with supemum bit set */ -static void lock_rec_unlock_supremum(hash_cell_t &cell, lock_t *lock) +static void lock_rec_unlock(hash_cell_t &cell, lock_t *lock, ulint heap_no) { - ut_ad(lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM)); + ut_ad(lock_rec_get_nth_bit(lock, heap_no)); #ifdef SAFE_MUTEX ut_ad(!mysql_mutex_is_owner(&lock_sys.wait_mutex)); #endif /* SAFE_MUTEX */ ut_ad(!lock->is_table()); ut_ad(lock_sys.is_writer() || lock->trx->mutex_is_owner()); - lock_rec_reset_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM); + lock_rec_reset_nth_bit(lock, heap_no); - lock_t *first_lock= lock_sys_t::get_first( - cell, lock->un_member.rec_lock.page_id, PAGE_HEAP_NO_SUPREMUM); + lock_t *first_lock= + lock_sys_t::get_first(cell, lock->un_member.rec_lock.page_id, heap_no); lock_rec_rebuild_waiting_queue( #if defined(UNIV_DEBUG) || !defined(DBUG_OFF) lock->trx, #endif /* defined(UNIV_DEBUG) || !defined(DBUG_OFF) */ - cell, first_lock, PAGE_HEAP_NO_SUPREMUM); + cell, first_lock, heap_no); +} + +/** Release locks to unmodified records on a clustered index page. +@param cell lock_sys.rec_hash cell of lock +@param lock record lock +@param offsets storage for rec_get_offsets() +@param heap storage for rec_get_offsets() +@param mtr mini-transaction (will be started and committed) */ +static void lock_rec_unlock_unmodified(hash_cell_t &cell, lock_t *lock, + rec_offs *&offsets, mem_heap_t *&heap, + mtr_t &mtr) +{ + ut_ad(!lock->is_waiting()); + + dict_index_t *const index= lock->index; + + mtr.start(); + if (buf_block_t *block= + btr_block_get(*index, lock->un_member.rec_lock.page_id.page_no(), + RW_S_LATCH, true, &mtr)) + { + if (UNIV_UNLIKELY(!page_is_leaf(block->page.frame))) + { + ut_ad("corrupted lock system" == 0); + goto func_exit; + } + + for (ulint i= PAGE_HEAP_NO_USER_LOW; i < lock_rec_get_n_bits(lock); ++i) + { + if (!lock_rec_get_nth_bit(lock, i)); + else if (const rec_t *rec= + page_find_rec_with_heap_no(block->page.frame, i)) + { + if (index->is_clust()) + { + if (trx_read_trx_id(rec + row_trx_id_offset(rec, index)) == + lock->trx->id) + continue; + unlock_rec: + lock_rec_unlock(cell, lock, i); + } + else + { + offsets= rec_get_offsets(rec, index, offsets, index->n_core_fields, + ULINT_UNDEFINED, &heap); + if (lock->trx != + lock_sec_rec_some_has_impl(lock->trx, rec, index, offsets)) + goto unlock_rec; + } + } + } + } +func_exit: + mtr.commit(); } /** Release non-exclusive locks on XA PREPARE, @@ -4334,6 +4475,12 @@ static bool lock_release_on_prepare_try(trx_t *trx) DBUG_ASSERT(trx->state == TRX_STATE_PREPARED); bool all_released= true; + mtr_t mtr; + rec_offs offsets_[REC_OFFS_NORMAL_SIZE]; + rec_offs *offsets= offsets_; + mem_heap_t *heap= nullptr; + rec_offs_init(offsets_); + lock_sys.rd_lock(SRW_LOCK_CALL); trx->mutex_lock(); @@ -4350,20 +4497,24 @@ static bool lock_release_on_prepare_try(trx_t *trx) if (!lock->is_table()) { ut_ad(!lock->index->table->is_temporary()); - bool supremum_bit = lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM); - bool rec_granted_exclusive_not_gap = + bool supremum_bit= lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM); + bool rec_granted_exclusive_not_gap= lock->is_rec_granted_exclusive_not_gap(); if (!supremum_bit && rec_granted_exclusive_not_gap) continue; - auto &lock_hash= lock_sys.hash_get(lock->type_mode); - auto cell= lock_hash.cell_get(lock->un_member.rec_lock.page_id.fold()); + if (UNIV_UNLIKELY(lock->type_mode & (LOCK_PREDICATE | LOCK_PRDT_PAGE))) + continue; /* SPATIAL INDEX locking is broken. */ + auto cell= + lock_sys.rec_hash.cell_get(lock->un_member.rec_lock.page_id.fold()); auto latch= lock_sys_t::hash_table::latch(cell); if (latch->try_acquire()) { if (!rec_granted_exclusive_not_gap) lock_rec_dequeue_from_page(lock, false); else if (supremum_bit) - lock_rec_unlock_supremum(*cell, lock); + lock_rec_unlock(*cell, lock, PAGE_HEAP_NO_SUPREMUM); + else + lock_rec_unlock_unmodified(*cell, lock, offsets, heap, mtr); latch->release(); } else @@ -4396,6 +4547,8 @@ static bool lock_release_on_prepare_try(trx_t *trx) lock_sys.rd_unlock(); trx->mutex_unlock(); + if (UNIV_LIKELY_NULL(heap)) + mem_heap_free(heap); return all_released; } @@ -4409,52 +4562,71 @@ void lock_release_on_prepare(trx_t *trx) if (lock_release_on_prepare_try(trx)) return; - LockMutexGuard g{SRW_LOCK_CALL}; - trx->mutex_lock(); + mtr_t mtr; + rec_offs offsets_[REC_OFFS_NORMAL_SIZE]; + rec_offs *offsets= offsets_; + mem_heap_t *heap= nullptr; + + rec_offs_init(offsets_); - for (lock_t *prev, *lock= UT_LIST_GET_LAST(trx->lock.trx_locks); lock; - lock= prev) { - ut_ad(lock->trx == trx); - prev= UT_LIST_GET_PREV(trx_locks, lock); - if (!lock->is_table()) + LockMutexGuard g{SRW_LOCK_CALL}; + trx->mutex_lock(); + + for (lock_t *prev, *lock= UT_LIST_GET_LAST(trx->lock.trx_locks); lock; + lock= prev) { - ut_ad(!lock->index->table->is_temporary()); - if (!lock->is_rec_granted_exclusive_not_gap()) - lock_rec_dequeue_from_page(lock, false); - else if (lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM)) + ut_ad(lock->trx == trx); + prev= UT_LIST_GET_PREV(trx_locks, lock); + if (!lock->is_table()) { - auto &lock_hash= lock_sys.hash_get(lock->type_mode); - auto cell= lock_hash.cell_get(lock->un_member.rec_lock.page_id.fold()); - lock_rec_unlock_supremum(*cell, lock); + ut_ad(!lock->index->table->is_temporary()); + if (!lock->is_rec_granted_exclusive_not_gap()) + lock_rec_dequeue_from_page(lock, false); + else if (UNIV_UNLIKELY(lock->type_mode & + (LOCK_PREDICATE | LOCK_PRDT_PAGE))) + /* SPATIAL INDEX locking is broken. */; + else + { + auto cell= lock_sys.rec_hash.cell_get(lock->un_member.rec_lock. + page_id.fold()); + if (lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM)) + lock_rec_unlock(*cell, lock, PAGE_HEAP_NO_SUPREMUM); + else + { + ut_ad(lock->trx->isolation_level > TRX_ISO_READ_COMMITTED || + /* Insert-intention lock is valid for supremum for isolation + level > TRX_ISO_READ_COMMITTED */ + lock->mode() == LOCK_X || + !lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM)); + lock_rec_unlock_unmodified(*cell, lock, offsets, heap, mtr); + } + } } else - ut_ad(lock->trx->isolation_level > TRX_ISO_READ_COMMITTED || - /* Insert-intention lock is valid for supremum for isolation - level > TRX_ISO_READ_COMMITTED */ - lock->mode() == LOCK_X || - !lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM)); - } - else - { - ut_d(dict_table_t *table= lock->un_member.tab_lock.table); - ut_ad(!table->is_temporary()); - switch (lock->mode()) { - case LOCK_IS: - case LOCK_S: - lock_table_dequeue(lock, false); - break; - case LOCK_IX: - case LOCK_X: - ut_ad(table->id >= DICT_HDR_FIRST_ID || trx->dict_operation); - /* fall through */ - default: - break; + { + ut_d(dict_table_t *table= lock->un_member.tab_lock.table); + ut_ad(!table->is_temporary()); + switch (lock->mode()) { + case LOCK_IS: + case LOCK_S: + lock_table_dequeue(lock, false); + break; + case LOCK_IX: + case LOCK_X: + ut_ad(table->id >= DICT_HDR_FIRST_ID || trx->dict_operation); + /* fall through */ + default: + break; + } } } } trx->mutex_unlock(); + + if (UNIV_LIKELY_NULL(heap)) + mem_heap_free(heap); } /** Release locks on a table whose creation is being rolled back */ @@ -5414,47 +5586,43 @@ lock_rec_insert_check_and_lock( return err; } -/*********************************************************************//** -Creates an explicit record lock for a running transaction that currently only -has an implicit lock on the record. The transaction instance must have a -reference count > 0 so that it can't be committed and freed before this -function has completed. */ -static -bool -lock_rec_convert_impl_to_expl_for_trx( -/*==================================*/ - trx_t* trx, /*!< in/out: active transaction */ - const page_id_t id, /*!< in: page identifier */ - const rec_t* rec, /*!< in: user record on page */ - dict_index_t* index) /*!< in: index of record */ +/** Create an explicit record lock for a transaction that currently only +has an implicit lock on the record. +@param trx referenced, active transaction, or nullptr +@param id page identifier +@param rec record in the page +@param index the index B-tree that the record belongs to +@return trx, with the reference released */ +static trx_t *lock_rec_convert_impl_to_expl_for_trx(trx_t *trx, + const page_id_t id, + const rec_t *rec, + dict_index_t *index) { - if (!trx) - return false; - - ut_ad(trx->is_referenced()); - ut_ad(page_rec_is_leaf(rec)); - ut_ad(!rec_is_metadata(rec, *index)); + if (trx) + { + ut_ad(trx->is_referenced()); + ut_ad(page_rec_is_leaf(rec)); + ut_ad(!rec_is_metadata(rec, *index)); - DEBUG_SYNC_C("before_lock_rec_convert_impl_to_expl_for_trx"); - ulint heap_no= page_rec_get_heap_no(rec); + ulint heap_no= page_rec_get_heap_no(rec); - { - LockGuard g{lock_sys.rec_hash, id}; - trx->mutex_lock(); - ut_ad(!trx_state_eq(trx, TRX_STATE_NOT_STARTED)); + { + LockGuard g{lock_sys.rec_hash, id}; + trx->mutex_lock(); + ut_ad(!trx_state_eq(trx, TRX_STATE_NOT_STARTED)); + + if (!trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY) && + !lock_rec_has_expl(LOCK_X | LOCK_REC_NOT_GAP, g.cell(), id, heap_no, + trx)) + lock_rec_add_to_queue(LOCK_X | LOCK_REC_NOT_GAP, g.cell(), id, + page_align(rec), heap_no, index, trx, true); + } - if (!trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY) && - !lock_rec_has_expl(LOCK_X | LOCK_REC_NOT_GAP, g.cell(), id, heap_no, - trx)) - lock_rec_add_to_queue(LOCK_X | LOCK_REC_NOT_GAP, g.cell(), id, - page_align(rec), heap_no, index, trx, true); + trx->release_reference(); + trx->mutex_unlock(); } - trx->mutex_unlock(); - trx->release_reference(); - - DEBUG_SYNC_C("after_lock_rec_convert_impl_to_expl_for_trx"); - return false; + return trx; } @@ -5545,10 +5713,11 @@ should be created. @param[in] rec record on the leaf page @param[in] index the index of the record @param[in] offsets rec_get_offsets(rec,index) -@return whether caller_trx already holds an exclusive lock on rec */ +@return unsafe pointer to a transaction that held an exclusive lock on rec +@retval nullptr if no transaction held an exclusive lock */ template static -bool +const trx_t * lock_rec_convert_impl_to_expl( trx_t* caller_trx, page_id_t id, @@ -5572,10 +5741,10 @@ lock_rec_convert_impl_to_expl( trx_id = lock_clust_rec_some_has_impl(rec, index, offsets); if (trx_id == 0) { - return false; + return nullptr; } if (UNIV_UNLIKELY(trx_id == caller_trx->id)) { - return true; + return caller_trx; } trx = trx_sys.find(caller_trx, trx_id); @@ -5586,7 +5755,7 @@ lock_rec_convert_impl_to_expl( offsets); if (trx == caller_trx) { trx->release_reference(); - return true; + return trx; } ut_d(lock_rec_other_trx_holds_expl(caller_trx, trx, rec, id)); @@ -5631,11 +5800,18 @@ lock_clust_rec_modify_check_and_lock( /* If a transaction has no explicit x-lock set on the record, set one for it */ - if (lock_rec_convert_impl_to_expl(thr_get_trx(thr), - block->page.id(), + trx_t *trx = thr_get_trx(thr); + if (const trx_t *owner = + lock_rec_convert_impl_to_expl(trx, block->page.id(), rec, index, offsets)) { - /* We already hold an implicit exclusive lock. */ - return DB_SUCCESS; + if (owner == trx) { + /* We already hold an exclusive lock. */ + return DB_SUCCESS; + } + + if (trx->snapshot_isolation && trx->read_view.is_open()) { + return DB_RECORD_CHANGED; + } } err = lock_rec_lock(true, LOCK_X | LOCK_REC_NOT_GAP, @@ -5798,12 +5974,19 @@ lock_sec_rec_read_check_and_lock( return DB_SUCCESS; } - if (!page_rec_is_supremum(rec) - && lock_rec_convert_impl_to_expl( - trx, block->page.id(), rec, index, offsets) - && gap_mode == LOCK_REC_NOT_GAP) { - /* We already hold an implicit exclusive lock. */ - return DB_SUCCESS; + if (page_rec_is_supremum(rec)) { + } else if (const trx_t *owner = + lock_rec_convert_impl_to_expl(trx, block->page.id(), + rec, index, offsets)) { + if (owner == trx) { + if (gap_mode == LOCK_REC_NOT_GAP) { + /* We already hold an exclusive lock. */ + return DB_SUCCESS; + } + } else if (trx->snapshot_isolation + && trx->read_view.is_open()) { + return DB_RECORD_CHANGED; + } } #ifdef WITH_WSREP @@ -5883,13 +6066,28 @@ lock_clust_rec_read_check_and_lock( ulint heap_no = page_rec_get_heap_no(rec); trx_t *trx = thr_get_trx(thr); - if (!lock_table_has(trx, index->table, LOCK_X) - && heap_no != PAGE_HEAP_NO_SUPREMUM - && lock_rec_convert_impl_to_expl(trx, id, - rec, index, offsets) - && gap_mode == LOCK_REC_NOT_GAP) { - /* We already hold an implicit exclusive lock. */ - return DB_SUCCESS; + if (lock_table_has(trx, index->table, LOCK_X) + || heap_no == PAGE_HEAP_NO_SUPREMUM) { + } else if (const trx_t *owner = + lock_rec_convert_impl_to_expl(trx, id, + rec, index, offsets)) { + if (owner == trx) { + if (gap_mode == LOCK_REC_NOT_GAP) { + /* We already hold an exclusive lock. */ + return DB_SUCCESS; + } + } else if (trx->snapshot_isolation + && trx->read_view.is_open()) { + return DB_RECORD_CHANGED; + } + } + + if (heap_no > PAGE_HEAP_NO_SUPREMUM && gap_mode != LOCK_GAP + && trx->snapshot_isolation + && trx->read_view.is_open() + && !trx->read_view.changes_visible( + trx_read_trx_id(rec + row_trx_id_offset(rec, index)))) { + return DB_RECORD_CHANGED; } dberr_t err = lock_rec_lock(false, gap_mode | mode, @@ -6656,6 +6854,7 @@ and less modified rows. Bit 0 is used to prefer orig_trx in case of a tie. print(buf); } + DBUG_EXECUTE_IF("innodb_deadlock_victim_self", victim= trx;); ut_ad(victim->state == TRX_STATE_ACTIVE); /* victim->lock.was_chosen_as_deadlock_victim must always be set before diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index 9f39b303..ea717de2 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -69,9 +69,7 @@ log_t log_sys; void log_t::set_capacity() { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); /* Margin for the free space in the smallest log, before a new query step which modifies the database, is started */ @@ -134,7 +132,6 @@ bool log_t::create() #endif latch.SRW_LOCK_INIT(log_latch_key); - init_lsn_lock(); last_checkpoint_lsn= FIRST_LSN; log_capacity= 0; @@ -143,7 +140,7 @@ bool log_t::create() next_checkpoint_lsn= 0; checkpoint_pending= false; - buf_free= 0; + set_buf_free(0); ut_ad(is_initialised()); #ifndef HAVE_PMEM @@ -175,11 +172,13 @@ void log_file_t::write(os_offset_t offset, span buf) noexcept ut_ad(is_opened()); if (dberr_t err= os_file_write_func(IORequestWrite, "ib_logfile0", m_file, buf.data(), offset, buf.size())) - ib::fatal() << "write(\"ib_logfile0\") returned " << err; + ib::fatal() << "write(\"ib_logfile0\") returned " << err + << ". Operating system error number " + << IF_WIN(GetLastError(), errno) << "."; } #ifdef HAVE_PMEM -# include +# include "cache.h" /** Attempt to memory map a file. @param file log file handle @@ -236,12 +235,13 @@ void log_t::attach_low(log_file_t file, os_offset_t size) log.close(); mprotect(ptr, size_t(size), PROT_READ); buf= static_cast(ptr); - max_buf_free= size; + max_buf_free= 1; # if defined __linux__ || defined _WIN32 set_block_size(CPU_LEVEL1_DCACHE_LINESIZE); # endif log_maybe_unbuffered= true; log_buffered= false; + mtr_t::finisher_update(); return true; } } @@ -276,6 +276,7 @@ void log_t::attach_low(log_file_t file, os_offset_t size) block_size); #endif + mtr_t::finisher_update(); #ifdef HAVE_PMEM checkpoint_buf= static_cast(aligned_malloc(block_size, block_size)); memset_aligned<64>(checkpoint_buf, 0, block_size); @@ -311,9 +312,7 @@ void log_t::header_write(byte *buf, lsn_t lsn, bool encrypted) void log_t::create(lsn_t lsn) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_write_locked()); -#endif + ut_ad(latch_have_wr()); ut_ad(!recv_no_log_write); ut_ad(is_latest()); ut_ad(this == &log_sys); @@ -330,12 +329,12 @@ void log_t::create(lsn_t lsn) noexcept { mprotect(buf, size_t(file_size), PROT_READ | PROT_WRITE); memset_aligned<4096>(buf, 0, 4096); - buf_free= START_OFFSET; + set_buf_free(START_OFFSET); } else #endif { - buf_free= 0; + set_buf_free(0); memset_aligned<4096>(flush_buf, 0, buf_size); memset_aligned<4096>(buf, 0, buf_size); } @@ -464,8 +463,7 @@ log_t::resize_start_status log_t::resize_start(os_offset_t size) noexcept resize_lsn.store(1, std::memory_order_relaxed); resize_target= 0; resize_log.m_file= - os_file_create_func(path.c_str(), - OS_FILE_CREATE | OS_FILE_ON_ERROR_NO_EXIT, + os_file_create_func(path.c_str(), OS_FILE_CREATE, OS_FILE_NORMAL, OS_LOG_FILE, false, &success); if (success) { @@ -812,9 +810,7 @@ ATTRIBUTE_COLD void log_t::resize_write_buf(size_t length) noexcept @return the current log sequence number */ template inline lsn_t log_t::write_buf() noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_write_locked()); -#endif + ut_ad(latch_have_wr()); ut_ad(!is_pmem()); ut_ad(!srv_read_only_mode); @@ -930,7 +926,7 @@ wait and check if an already running write is covering the request. void log_write_up_to(lsn_t lsn, bool durable, const completion_callback *callback) { - ut_ad(!srv_read_only_mode || (log_sys.buf_free < log_sys.max_buf_free)); + ut_ad(!srv_read_only_mode || log_sys.buf_free_ok()); ut_ad(lsn != LSN_MAX); ut_ad(lsn != 0); @@ -1067,7 +1063,7 @@ NOTE that this function may only be called while not holding any synchronization objects except dict_sys.latch. */ void log_free_check() { - ut_ad(!lock_sys.is_writer()); + ut_ad(!lock_sys.is_holder()); if (log_sys.check_for_checkpoint()) { ut_ad(!recv_no_log_write); @@ -1291,6 +1287,7 @@ log_print( void log_t::close() { ut_ad(this == &log_sys); + ut_ad(!(buf_free & buf_free_LOCK)); if (!is_initialised()) return; close_file(); @@ -1308,7 +1305,6 @@ void log_t::close() #endif latch.destroy(); - destroy_lsn_lock(); recv_sys.close(); diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index e72f842f..6b6a6868 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -844,8 +844,7 @@ processed: inside recv_sys_t::recover_deferred(). */ bool success; handle= os_file_create(innodb_data_file_key, filename, - OS_FILE_CREATE | OS_FILE_ON_ERROR_NO_EXIT | - OS_FILE_ON_ERROR_SILENT, + OS_FILE_CREATE_SILENT, OS_FILE_AIO, OS_DATA_FILE, false, &success); } space->add(filename, handle, size, false, false); @@ -1714,7 +1713,7 @@ dberr_t recv_sys_t::find_checkpoint() std::string path{get_log_file_path()}; bool success; os_file_t file{os_file_create_func(path.c_str(), - OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT, + OS_FILE_OPEN, OS_FILE_NORMAL, OS_LOG_FILE, srv_read_only_mode, &success)}; if (file == OS_FILE_CLOSED) @@ -1744,8 +1743,7 @@ dberr_t recv_sys_t::find_checkpoint() { path= get_log_file_path(LOG_FILE_NAME_PREFIX).append(std::to_string(i)); file= os_file_create_func(path.c_str(), - OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT | - OS_FILE_ON_ERROR_SILENT, + OS_FILE_OPEN_SILENT, OS_FILE_NORMAL, OS_LOG_FILE, true, &success); if (file == OS_FILE_CLOSED) break; @@ -2520,11 +2518,9 @@ recv_sys_t::parse_mtr_result recv_sys_t::parse(source &l, bool if_exists) noexcept { restart: -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked() || + ut_ad(log_sys.latch_have_wr() || srv_operation == SRV_OPERATION_BACKUP || srv_operation == SRV_OPERATION_BACKUP_NO_DEFER); -#endif mysql_mutex_assert_owner(&mutex); ut_ad(log_sys.next_checkpoint_lsn); ut_ad(log_sys.is_latest()); @@ -4052,9 +4048,7 @@ static bool recv_scan_log(bool last_phase) lsn_t rewound_lsn= 0; for (ut_d(lsn_t source_offset= 0);;) { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); #ifdef UNIV_DEBUG const bool wrap{source_offset + recv_sys.len == log_sys.file_size}; #endif @@ -4120,9 +4114,10 @@ static bool recv_scan_log(bool last_phase) const lsn_t end{recv_sys.file_checkpoint}; ut_ad(!end || end == recv_sys.lsn); + bool corrupt_fs= recv_sys.is_corrupt_fs(); mysql_mutex_unlock(&recv_sys.mutex); - if (!end) + if (!end && !corrupt_fs) { recv_sys.set_corrupt_log(); sql_print_error("InnoDB: Missing FILE_CHECKPOINT(" LSN_PF @@ -4448,9 +4443,7 @@ recv_init_crash_recovery_spaces(bool rescan, bool& missing_tablespace) static dberr_t recv_rename_files() { mysql_mutex_assert_owner(&recv_sys.mutex); -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); dberr_t err= DB_SUCCESS; @@ -4602,6 +4595,9 @@ read_only_recovery: LSN_PF, recv_sys.lsn); goto err_exit; } + if (recv_sys.is_corrupt_fs()) { + goto err_exit; + } ut_ad(recv_sys.file_checkpoint); if (rewind) { recv_sys.lsn = log_sys.next_checkpoint_lsn; @@ -4640,9 +4636,9 @@ read_only_recovery: do { rescan = recv_scan_log(false); - ut_ad(!recv_sys.is_corrupt_fs()); - if (recv_sys.is_corrupt_log()) { + if (recv_sys.is_corrupt_log() || + recv_sys.is_corrupt_fs()) { goto err_exit; } @@ -4730,7 +4726,7 @@ err_exit: PROT_READ | PROT_WRITE); #endif } - log_sys.buf_free = recv_sys.offset; + log_sys.set_buf_free(recv_sys.offset); if (recv_needed_recovery && srv_operation <= SRV_OPERATION_EXPORT_RESTORED) { /* Write a FILE_CHECKPOINT marker as the first thing, diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index 01641f74..74d3adb2 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -37,6 +37,31 @@ Created 11/26/1995 Heikki Tuuri #include "srv0start.h" #include "log.h" #include "mariadb_stats.h" +#include "my_cpu.h" + +#ifdef HAVE_PMEM +void (*mtr_t::commit_logger)(mtr_t *, std::pair); +#endif +std::pair (*mtr_t::finisher)(mtr_t *, size_t); +unsigned mtr_t::spin_wait_delay; + +void mtr_t::finisher_update() +{ + ut_ad(log_sys.latch_have_wr()); +#ifdef HAVE_PMEM + if (log_sys.is_pmem()) + { + commit_logger= mtr_t::commit_log; + finisher= spin_wait_delay + ? mtr_t::finish_writer : mtr_t::finish_writer; + return; + } + commit_logger= mtr_t::commit_log; +#endif + finisher= + (spin_wait_delay + ? mtr_t::finish_writer : mtr_t::finish_writer); +} void mtr_memo_slot_t::release() const { @@ -82,9 +107,7 @@ void mtr_memo_slot_t::release() const inline buf_page_t *buf_pool_t::prepare_insert_into_flush_list(lsn_t lsn) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(recv_recovery_is_on() || log_sys.latch.is_locked()); -#endif + ut_ad(recv_recovery_is_on() || log_sys.latch_have_any()); ut_ad(lsn >= log_sys.last_checkpoint_lsn); mysql_mutex_assert_owner(&flush_list_mutex); static_assert(log_t::FIRST_LSN >= 2, "compatibility"); @@ -234,7 +257,14 @@ static void insert_imported(buf_block_t *block) if (block->page.oldest_modification() <= 1) { log_sys.latch.rd_lock(SRW_LOCK_CALL); - const lsn_t lsn= log_sys.last_checkpoint_lsn; + /* For unlogged mtrs (MTR_LOG_NO_REDO), we use the current system LSN. The + mtr that generated the LSN is either already committed or in mtr_t::commit. + Shared latch and relaxed atomics should be fine here as it is guaranteed + that both the current mtr and the mtr that generated the LSN would have + added the dirty pages to flush list before we access the minimum LSN during + checkpoint. log_checkpoint_low() acquires exclusive log_sys.latch before + commencing. */ + const lsn_t lsn= log_sys.get_lsn(); mysql_mutex_lock(&buf_pool.flush_list_mutex); buf_pool.insert_into_flush_list (buf_pool.prepare_insert_into_flush_list(lsn), block, lsn); @@ -310,12 +340,9 @@ void mtr_t::release() inline lsn_t log_t::get_write_target() const { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_locked()); -#endif - if (UNIV_LIKELY(buf_free < max_buf_free)) + ut_ad(latch_have_any()); + if (UNIV_LIKELY(buf_free_ok())) return 0; - ut_ad(!is_pmem()); /* The LSN corresponding to the end of buf is write_lsn - (first_lsn & 4095) + buf_free, but we use simpler arithmetics to return a smaller write target in @@ -324,151 +351,161 @@ inline lsn_t log_t::get_write_target() const return write_lsn + max_buf_free / 2; } -/** Commit a mini-transaction. */ -void mtr_t::commit() +template +void mtr_t::commit_log(mtr_t *mtr, std::pair lsns) { - ut_ad(is_active()); - ut_ad(!is_inside_ibuf()); - - /* This is a dirty read, for debugging. */ - ut_ad(!m_modifications || !recv_no_log_write); - ut_ad(!m_modifications || m_log_mode != MTR_LOG_NONE); - ut_ad(!m_latch_ex); + size_t modified= 0; + const lsn_t write_lsn= pmem ? 0 : log_sys.get_write_target(); - if (m_modifications && (m_log_mode == MTR_LOG_NO_REDO || !m_log.empty())) + if (mtr->m_made_dirty) { - if (UNIV_UNLIKELY(!is_logged())) + auto it= mtr->m_memo.rbegin(); + + mysql_mutex_lock(&buf_pool.flush_list_mutex); + + buf_page_t *const prev= + buf_pool.prepare_insert_into_flush_list(lsns.first); + + while (it != mtr->m_memo.rend()) { - release_unlogged(); - goto func_exit; + const mtr_memo_slot_t &slot= *it++; + if (slot.type & MTR_MEMO_MODIFY) + { + ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY || + slot.type == MTR_MEMO_PAGE_SX_MODIFY); + modified++; + buf_block_t *b= static_cast(slot.object); + ut_ad(b->page.id() < end_page_id); + ut_d(const auto s= b->page.state()); + ut_ad(s > buf_page_t::FREED); + ut_ad(s < buf_page_t::READ_FIX); + ut_ad(mach_read_from_8(b->page.frame + FIL_PAGE_LSN) <= + mtr->m_commit_lsn); + mach_write_to_8(b->page.frame + FIL_PAGE_LSN, mtr->m_commit_lsn); + if (UNIV_LIKELY_NULL(b->page.zip.data)) + memcpy_aligned<8>(FIL_PAGE_LSN + b->page.zip.data, + FIL_PAGE_LSN + b->page.frame, 8); + buf_pool.insert_into_flush_list(prev, b, lsns.first); + } } - ut_ad(!srv_read_only_mode); - std::pair lsns{do_write()}; - process_freed_pages(); - size_t modified= 0; - const lsn_t write_lsn= log_sys.get_write_target(); + ut_ad(modified); + buf_pool.flush_list_requests+= modified; + buf_pool.page_cleaner_wakeup(); + mysql_mutex_unlock(&buf_pool.flush_list_mutex); - if (m_made_dirty) + if (mtr->m_latch_ex) { - auto it= m_memo.rbegin(); - - mysql_mutex_lock(&buf_pool.flush_list_mutex); + log_sys.latch.wr_unlock(); + mtr->m_latch_ex= false; + } + else + log_sys.latch.rd_unlock(); - buf_page_t *const prev= - buf_pool.prepare_insert_into_flush_list(lsns.first); + mtr->release(); + } + else + { + if (mtr->m_latch_ex) + { + log_sys.latch.wr_unlock(); + mtr->m_latch_ex= false; + } + else + log_sys.latch.rd_unlock(); - while (it != m_memo.rend()) - { - const mtr_memo_slot_t &slot= *it++; + for (auto it= mtr->m_memo.rbegin(); it != mtr->m_memo.rend(); ) + { + const mtr_memo_slot_t &slot= *it++; + ut_ad(slot.object); + switch (slot.type) { + case MTR_MEMO_S_LOCK: + static_cast(slot.object)->s_unlock(); + break; + case MTR_MEMO_SPACE_X_LOCK: + static_cast(slot.object)->set_committed_size(); + static_cast(slot.object)->x_unlock(); + break; + case MTR_MEMO_X_LOCK: + case MTR_MEMO_SX_LOCK: + static_cast(slot.object)-> + u_or_x_unlock(slot.type == MTR_MEMO_SX_LOCK); + break; + default: + buf_page_t *bpage= static_cast(slot.object); + ut_d(const auto s=) + bpage->unfix(); if (slot.type & MTR_MEMO_MODIFY) { ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY || slot.type == MTR_MEMO_PAGE_SX_MODIFY); - modified++; - buf_block_t *b= static_cast(slot.object); - ut_ad(b->page.id() < end_page_id); - ut_d(const auto s= b->page.state()); - ut_ad(s > buf_page_t::FREED); + ut_ad(bpage->oldest_modification() > 1); + ut_ad(bpage->oldest_modification() < mtr->m_commit_lsn); + ut_ad(bpage->id() < end_page_id); + ut_ad(s >= buf_page_t::FREED); ut_ad(s < buf_page_t::READ_FIX); - ut_ad(mach_read_from_8(b->page.frame + FIL_PAGE_LSN) <= - m_commit_lsn); - mach_write_to_8(b->page.frame + FIL_PAGE_LSN, m_commit_lsn); - if (UNIV_LIKELY_NULL(b->page.zip.data)) - memcpy_aligned<8>(FIL_PAGE_LSN + b->page.zip.data, - FIL_PAGE_LSN + b->page.frame, 8); - buf_pool.insert_into_flush_list(prev, b, lsns.first); + ut_ad(mach_read_from_8(bpage->frame + FIL_PAGE_LSN) <= + mtr->m_commit_lsn); + mach_write_to_8(bpage->frame + FIL_PAGE_LSN, mtr->m_commit_lsn); + if (UNIV_LIKELY_NULL(bpage->zip.data)) + memcpy_aligned<8>(FIL_PAGE_LSN + bpage->zip.data, + FIL_PAGE_LSN + bpage->frame, 8); + modified++; + } + switch (auto latch= slot.type & ~MTR_MEMO_MODIFY) { + case MTR_MEMO_PAGE_S_FIX: + bpage->lock.s_unlock(); + continue; + case MTR_MEMO_PAGE_SX_FIX: + case MTR_MEMO_PAGE_X_FIX: + bpage->lock.u_or_x_unlock(latch == MTR_MEMO_PAGE_SX_FIX); + continue; + default: + ut_ad(latch == MTR_MEMO_BUF_FIX); } } + } - ut_ad(modified); - buf_pool.flush_list_requests+= modified; - buf_pool.page_cleaner_wakeup(); - mysql_mutex_unlock(&buf_pool.flush_list_mutex); + buf_pool.add_flush_list_requests(modified); + mtr->m_memo.clear(); + } - if (m_latch_ex) - { - log_sys.latch.wr_unlock(); - m_latch_ex= false; - } - else - log_sys.latch.rd_unlock(); + mariadb_increment_pages_updated(modified); - release(); - } - else - { - if (m_latch_ex) - { - log_sys.latch.wr_unlock(); - m_latch_ex= false; - } - else - log_sys.latch.rd_unlock(); + if (UNIV_UNLIKELY(lsns.second != PAGE_FLUSH_NO)) + buf_flush_ahead(mtr->m_commit_lsn, lsns.second == PAGE_FLUSH_SYNC); - for (auto it= m_memo.rbegin(); it != m_memo.rend(); ) - { - const mtr_memo_slot_t &slot= *it++; - ut_ad(slot.object); - switch (slot.type) { - case MTR_MEMO_S_LOCK: - static_cast(slot.object)->s_unlock(); - break; - case MTR_MEMO_SPACE_X_LOCK: - static_cast(slot.object)->set_committed_size(); - static_cast(slot.object)->x_unlock(); - break; - case MTR_MEMO_X_LOCK: - case MTR_MEMO_SX_LOCK: - static_cast(slot.object)-> - u_or_x_unlock(slot.type == MTR_MEMO_SX_LOCK); - break; - default: - buf_page_t *bpage= static_cast(slot.object); - ut_d(const auto s=) - bpage->unfix(); - if (slot.type & MTR_MEMO_MODIFY) - { - ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY || - slot.type == MTR_MEMO_PAGE_SX_MODIFY); - ut_ad(bpage->oldest_modification() > 1); - ut_ad(bpage->oldest_modification() < m_commit_lsn); - ut_ad(bpage->id() < end_page_id); - ut_ad(s >= buf_page_t::FREED); - ut_ad(s < buf_page_t::READ_FIX); - ut_ad(mach_read_from_8(bpage->frame + FIL_PAGE_LSN) <= - m_commit_lsn); - mach_write_to_8(bpage->frame + FIL_PAGE_LSN, m_commit_lsn); - if (UNIV_LIKELY_NULL(bpage->zip.data)) - memcpy_aligned<8>(FIL_PAGE_LSN + bpage->zip.data, - FIL_PAGE_LSN + bpage->frame, 8); - modified++; - } - switch (auto latch= slot.type & ~MTR_MEMO_MODIFY) { - case MTR_MEMO_PAGE_S_FIX: - bpage->lock.s_unlock(); - continue; - case MTR_MEMO_PAGE_SX_FIX: - case MTR_MEMO_PAGE_X_FIX: - bpage->lock.u_or_x_unlock(latch == MTR_MEMO_PAGE_SX_FIX); - continue; - default: - ut_ad(latch == MTR_MEMO_BUF_FIX); - } - } - } + if (!pmem && UNIV_UNLIKELY(write_lsn != 0)) + log_write_up_to(write_lsn, false); +} - buf_pool.add_flush_list_requests(modified); - m_memo.clear(); - } +/** Commit a mini-transaction. */ +void mtr_t::commit() +{ + ut_ad(is_active()); + ut_ad(!is_inside_ibuf()); - mariadb_increment_pages_updated(modified); + /* This is a dirty read, for debugging. */ + ut_ad(!m_modifications || !recv_no_log_write); + ut_ad(!m_modifications || m_log_mode != MTR_LOG_NONE); + ut_ad(!m_latch_ex); - if (UNIV_UNLIKELY(lsns.second != PAGE_FLUSH_NO)) - buf_flush_ahead(m_commit_lsn, lsns.second == PAGE_FLUSH_SYNC); + if (m_modifications && (m_log_mode == MTR_LOG_NO_REDO || !m_log.empty())) + { + if (UNIV_UNLIKELY(!is_logged())) + { + release_unlogged(); + goto func_exit; + } - if (UNIV_UNLIKELY(write_lsn != 0)) - log_write_up_to(write_lsn, false); + ut_ad(!srv_read_only_mode); + std::pair lsns{do_write()}; + process_freed_pages(); +#ifdef HAVE_PMEM + commit_logger(this, lsns); +#else + commit_log(this, lsns); +#endif } else { @@ -513,10 +550,8 @@ void mtr_t::rollback_to_savepoint(ulint begin, ulint end) /** Set create_lsn. */ inline void fil_space_t::set_create_lsn(lsn_t lsn) { -#ifndef SUX_LOCK_GENERIC /* Concurrent log_checkpoint_low() must be impossible. */ - ut_ad(latch.is_write_locked()); -#endif + ut_ad(latch.have_wr()); create_lsn= lsn; } @@ -529,7 +564,6 @@ void mtr_t::commit_shrink(fil_space_t &space, uint32_t size) ut_ad(!is_inside_ibuf()); ut_ad(!high_level_read_only); ut_ad(m_modifications); - ut_ad(m_made_dirty); ut_ad(!m_memo.empty()); ut_ad(!recv_recovery_is_on()); ut_ad(m_log_mode == MTR_LOG_ALL); @@ -554,9 +588,7 @@ void mtr_t::commit_shrink(fil_space_t &space, uint32_t size) /* Durably write the reduced FSP_SIZE before truncating the data file. */ log_write_and_flush(); -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); os_file_truncate(space.chain.start->name, space.chain.start->handle, os_offset_t{size} << srv_page_size_shift, true); @@ -713,9 +745,7 @@ This is to be used at log_checkpoint(). @return current LSN */ ATTRIBUTE_COLD lsn_t mtr_t::commit_files(lsn_t checkpoint_lsn) { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); ut_ad(is_active()); ut_ad(!is_inside_ibuf()); ut_ad(m_log_mode == MTR_LOG_ALL); @@ -870,13 +900,111 @@ ATTRIBUTE_COLD static void log_overwrite_warning(lsn_t lsn) ? ". Shutdown is in progress" : ""); } -/** Wait in append_prepare() for buffer to become available -@param lsn log sequence number to write up to -@param ex whether log_sys.latch is exclusively locked */ -ATTRIBUTE_COLD void log_t::append_prepare_wait(lsn_t lsn, bool ex) noexcept +static ATTRIBUTE_NOINLINE void lsn_delay(size_t delay, size_t mult) noexcept +{ + delay*= mult * 2; // GCC 13.2.0 -O2 targeting AMD64 wants to unroll twice + HMT_low(); + do + MY_RELAX_CPU(); + while (--delay); + HMT_medium(); +} + +#if defined __clang_major__ && __clang_major__ < 10 +/* Only clang-10 introduced support for asm goto */ +#elif defined __APPLE__ +/* At least some versions of Apple Xcode do not support asm goto */ +#elif defined __GNUC__ && (defined __i386__ || defined __x86_64__) +# if SIZEOF_SIZE_T == 8 +# define LOCK_TSET \ + __asm__ goto("lock btsq $63, %0\n\t" "jnc %l1" \ + : : "m"(buf_free) : "cc", "memory" : got) +# else +# define LOCK_TSET \ + __asm__ goto("lock btsl $31, %0\n\t" "jnc %l1" \ + : : "m"(buf_free) : "cc", "memory" : got) +# endif +#elif defined _MSC_VER && (defined _M_IX86 || defined _M_X64) +# if SIZEOF_SIZE_T == 8 +# define LOCK_TSET \ + if (!_interlockedbittestandset64 \ + (reinterpret_cast(&buf_free), 63)) return +# else +# define LOCK_TSET \ + if (!_interlockedbittestandset \ + (reinterpret_cast(&buf_free), 31)) return +# endif +#endif + +#ifdef LOCK_TSET +ATTRIBUTE_NOINLINE +void log_t::lsn_lock_bts() noexcept +{ + LOCK_TSET; + { + const size_t m= mtr_t::spin_wait_delay; + constexpr size_t DELAY= 10, MAX_ITERATIONS= 10; + for (size_t delay_count= DELAY, delay_iterations= 1;; + lsn_delay(delay_iterations, m)) + { + if (!(buf_free.load(std::memory_order_relaxed) & buf_free_LOCK)) + LOCK_TSET; + if (!delay_count); + else if (delay_iterations < MAX_ITERATIONS) + delay_count= DELAY, delay_iterations++; + else + delay_count--; + } + } + +# ifdef __GNUC__ + got: + return; +# endif +} + +inline +#else +ATTRIBUTE_NOINLINE +#endif +size_t log_t::lock_lsn() noexcept +{ +#ifdef LOCK_TSET + lsn_lock_bts(); + return ~buf_free_LOCK & buf_free.load(std::memory_order_relaxed); +# undef LOCK_TSET +#else + size_t b= buf_free.fetch_or(buf_free_LOCK, std::memory_order_acquire); + if (b & buf_free_LOCK) + { + const size_t m= mtr_t::spin_wait_delay; + constexpr size_t DELAY= 10, MAX_ITERATIONS= 10; + for (size_t delay_count= DELAY, delay_iterations= 1; + ((b= buf_free.load(std::memory_order_relaxed)) & buf_free_LOCK) || + (buf_free_LOCK & (b= buf_free.fetch_or(buf_free_LOCK, + std::memory_order_acquire))); + lsn_delay(delay_iterations, m)) + if (!delay_count); + else if (delay_iterations < MAX_ITERATIONS) + delay_count= DELAY, delay_iterations++; + else + delay_count--; + } + return b; +#endif +} + +template +ATTRIBUTE_COLD size_t log_t::append_prepare_wait(size_t b, bool ex, lsn_t lsn) + noexcept { waits++; - unlock_lsn(); + ut_ad(buf_free.load(std::memory_order_relaxed) == + (spin ? (b | buf_free_LOCK) : b)); + if (spin) + buf_free.store(b, std::memory_order_release); + else + lsn_lock.wr_unlock(); if (ex) latch.wr_unlock(); @@ -890,51 +1018,57 @@ ATTRIBUTE_COLD void log_t::append_prepare_wait(lsn_t lsn, bool ex) noexcept else latch.rd_lock(SRW_LOCK_CALL); - lock_lsn(); + if (spin) + return lock_lsn(); + + lsn_lock.wr_lock(); + return buf_free.load(std::memory_order_relaxed); } /** Reserve space in the log buffer for appending data. +@tparam spin whether to use the spin-only lock_lsn() @tparam pmem log_sys.is_pmem() @param size total length of the data to append(), in bytes @param ex whether log_sys.latch is exclusively locked @return the start LSN and the buffer position for append() */ -template +template inline std::pair log_t::append_prepare(size_t size, bool ex) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_locked()); -# ifndef _WIN32 // there is no accurate is_write_locked() on SRWLOCK - ut_ad(ex == latch.is_write_locked()); -# endif -#endif + ut_ad(ex ? latch_have_wr() : latch_have_rd()); ut_ad(pmem == is_pmem()); - lock_lsn(); + if (!spin) + lsn_lock.wr_lock(); + size_t b{spin ? lock_lsn() : buf_free.load(std::memory_order_relaxed)}; write_to_buf++; const lsn_t l{lsn.load(std::memory_order_relaxed)}, end_lsn{l + size}; - size_t b{buf_free}; if (UNIV_UNLIKELY(pmem ? (end_lsn - get_flushed_lsn(std::memory_order_relaxed)) > capacity() : b + size >= buf_size)) - { - append_prepare_wait(l, ex); - b= buf_free; - } + b= append_prepare_wait(b, ex, l); - lsn.store(end_lsn, std::memory_order_relaxed); size_t new_buf_free= b + size; if (pmem && new_buf_free >= file_size) new_buf_free-= size_t(capacity()); - buf_free= new_buf_free; - unlock_lsn(); + + lsn.store(end_lsn, std::memory_order_relaxed); if (UNIV_UNLIKELY(end_lsn >= last_checkpoint_lsn + log_capacity)) - set_check_for_checkpoint(); + set_check_for_checkpoint(true); + + byte *our_buf= buf; + if (spin) + buf_free.store(new_buf_free, std::memory_order_release); + else + { + buf_free.store(new_buf_free, std::memory_order_relaxed); + lsn_lock.wr_unlock(); + } - return {l, &buf[b]}; + return {l, our_buf + b}; } /** Finish appending data to the log. @@ -942,9 +1076,7 @@ std::pair log_t::append_prepare(size_t size, bool ex) noexcept @return whether buf_flush_ahead() will have to be invoked */ static mtr_t::page_flush_ahead log_close(lsn_t lsn) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_locked()); -#endif + ut_ad(log_sys.latch_have_any()); const lsn_t checkpoint_age= lsn - log_sys.last_checkpoint_lsn; @@ -1009,9 +1141,7 @@ std::pair mtr_t::do_write() ut_ad(!recv_no_log_write); ut_ad(is_logged()); ut_ad(m_log.size()); -#ifndef SUX_LOCK_GENERIC - ut_ad(!m_latch_ex || log_sys.latch.is_write_locked()); -#endif + ut_ad(!m_latch_ex || log_sys.latch_have_wr()); #ifndef DBUG_OFF do @@ -1069,9 +1199,7 @@ func_exit: inline void log_t::resize_write(lsn_t lsn, const byte *end, size_t len, size_t seq) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_locked()); -#endif + ut_ad(latch_have_any()); if (UNIV_LIKELY_NULL(resize_buf)) { @@ -1176,50 +1304,47 @@ inline void log_t::resize_write(lsn_t lsn, const byte *end, size_t len, } } +template std::pair -mtr_t::finish_write(size_t len) +mtr_t::finish_writer(mtr_t *mtr, size_t len) { + ut_ad(log_sys.is_latest()); ut_ad(!recv_no_log_write); - ut_ad(is_logged()); -#ifndef SUX_LOCK_GENERIC -# ifndef _WIN32 // there is no accurate is_write_locked() on SRWLOCK - ut_ad(m_latch_ex == log_sys.latch.is_write_locked()); -# endif -#endif + ut_ad(mtr->is_logged()); + ut_ad(mtr->m_latch_ex ? log_sys.latch_have_wr() : log_sys.latch_have_rd()); - const size_t size{m_commit_lsn ? 5U + 8U : 5U}; - std::pair start; + const size_t size{mtr->m_commit_lsn ? 5U + 8U : 5U}; + std::pair start= + log_sys.append_prepare(len, mtr->m_latch_ex); - if (!log_sys.is_pmem()) + if (!pmem) { - start= log_sys.append_prepare(len, m_latch_ex); - m_log.for_each_block([&start](const mtr_buf_t::block_t *b) + mtr->m_log.for_each_block([&start](const mtr_buf_t::block_t *b) { log_sys.append(start.second, b->begin(), b->used()); return true; }); #ifdef HAVE_PMEM write_trailer: #endif *start.second++= log_sys.get_sequence_bit(start.first + len - size); - if (m_commit_lsn) + if (mtr->m_commit_lsn) { - mach_write_to_8(start.second, m_commit_lsn); - m_crc= my_crc32c(m_crc, start.second, 8); + mach_write_to_8(start.second, mtr->m_commit_lsn); + mtr->m_crc= my_crc32c(mtr->m_crc, start.second, 8); start.second+= 8; } - mach_write_to_4(start.second, m_crc); + mach_write_to_4(start.second, mtr->m_crc); start.second+= 4; } #ifdef HAVE_PMEM else { - start= log_sys.append_prepare(len, m_latch_ex); if (UNIV_LIKELY(start.second + len <= &log_sys.buf[log_sys.file_size])) { - m_log.for_each_block([&start](const mtr_buf_t::block_t *b) + mtr->m_log.for_each_block([&start](const mtr_buf_t::block_t *b) { log_sys.append(start.second, b->begin(), b->used()); return true; }); goto write_trailer; } - m_log.for_each_block([&start](const mtr_buf_t::block_t *b) + mtr->m_log.for_each_block([&start](const mtr_buf_t::block_t *b) { size_t size{b->used()}; const size_t size_left(&log_sys.buf[log_sys.file_size] - start.second); @@ -1242,14 +1367,14 @@ mtr_t::finish_write(size_t len) byte tail[5 + 8]; tail[0]= log_sys.get_sequence_bit(start.first + len - size); - if (m_commit_lsn) + if (mtr->m_commit_lsn) { - mach_write_to_8(tail + 1, m_commit_lsn); - m_crc= my_crc32c(m_crc, tail + 1, 8); - mach_write_to_4(tail + 9, m_crc); + mach_write_to_8(tail + 1, mtr->m_commit_lsn); + mtr->m_crc= my_crc32c(mtr->m_crc, tail + 1, 8); + mach_write_to_4(tail + 9, mtr->m_crc); } else - mach_write_to_4(tail + 1, m_crc); + mach_write_to_4(tail + 1, mtr->m_crc); ::memcpy(start.second, tail, size_left); ::memcpy(log_sys.buf + log_sys.START_OFFSET, tail + size_left, @@ -1258,12 +1383,14 @@ mtr_t::finish_write(size_t len) ((size >= size_left) ? log_sys.START_OFFSET : log_sys.file_size) + (size - size_left); } +#else + static_assert(!pmem, ""); #endif log_sys.resize_write(start.first, start.second, len, size); - m_commit_lsn= start.first + len; - return {start.first, log_close(m_commit_lsn)}; + mtr->m_commit_lsn= start.first + len; + return {start.first, log_close(mtr->m_commit_lsn)}; } bool mtr_t::have_x_latch(const buf_block_t &block) const @@ -1385,7 +1512,7 @@ void mtr_t::upgrade_buffer_fix(ulint savepoint, rw_lock_type_t rw_latch) ut_ad(slot.type == MTR_MEMO_BUF_FIX); buf_block_t *block= static_cast(slot.object); ut_d(const auto state= block->page.state()); - ut_ad(state > buf_page_t::UNFIXED); + ut_ad(state > buf_page_t::FREED); ut_ad(state > buf_page_t::WRITE_FIX || state < buf_page_t::READ_FIX); static_assert(int{MTR_MEMO_PAGE_S_FIX} == int{RW_S_LATCH}, ""); static_assert(int{MTR_MEMO_PAGE_X_FIX} == int{RW_X_LATCH}, ""); diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index 31bec346..3293db12 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -200,17 +200,10 @@ os_file_handle_error_cond_exit( bool on_error_silent); /** Does error handling when a file operation fails. -@param[in] name name of a file or NULL -@param[in] operation operation name that failed -@return true if we should retry the operation */ -static -bool -os_file_handle_error( - const char* name, - const char* operation) +@param operation name of operation that failed */ +static void os_file_handle_error(const char *operation) { - /* Exit in case of unknown error */ - return(os_file_handle_error_cond_exit(name, operation, true, false)); + os_file_handle_error_cond_exit(nullptr, operation, true, false); } /** Does error handling when a file operation fails. @@ -327,6 +320,12 @@ private: ssize_t m_n; /** Offset from where to read/write */ os_offset_t m_offset; + + /** Do the read/write + @param request The IO context and type + @param n Number of bytes to read/write + @return the number of bytes read/written or negative value on error */ + ssize_t execute_low(const IORequest& request, ssize_t n); }; #ifndef _WIN32 /* On Microsoft Windows, mandatory locking is used */ @@ -678,30 +677,48 @@ os_file_create_subdirs_if_needed( +/** Do the read/write +@param[in] request The IO context and type +@param[in] n Number of bytes to read/write +@return the number of bytes read/written or negative value on error */ +ssize_t +SyncFileIO::execute_low(const IORequest& request, ssize_t n) +{ + ut_ad(n > 0); + ut_ad(size_t(n) <= os_file_request_size_max); + + if (request.is_read()) + return IF_WIN(tpool::pread(m_fh, m_buf, n, m_offset), pread(m_fh, m_buf, n, m_offset)); + return IF_WIN(tpool::pwrite(m_fh, m_buf, n, m_offset), pwrite(m_fh, m_buf, n, m_offset)); +} + /** Do the read/write @param[in] request The IO context and type @return the number of bytes read/written or negative value on error */ ssize_t SyncFileIO::execute(const IORequest& request) { - ssize_t n_bytes; + ssize_t n_bytes= 0; + ut_ad(m_n > 0); - if (request.is_read()) { -#ifdef _WIN32 - n_bytes = tpool::pread(m_fh, m_buf, m_n, m_offset); -#else - n_bytes = pread(m_fh, m_buf, m_n, m_offset); -#endif - } else { - ut_ad(request.is_write()); -#ifdef _WIN32 - n_bytes = tpool::pwrite(m_fh, m_buf, m_n, m_offset); -#else - n_bytes = pwrite(m_fh, m_buf, m_n, m_offset); -#endif - } + while (size_t(m_n) > os_file_request_size_max) + { + ssize_t n_partial_bytes= execute_low(request, os_file_request_size_max); + if (n_partial_bytes < 0) + return n_partial_bytes; + n_bytes+= n_partial_bytes; + if (n_partial_bytes != os_file_request_size_max) + return n_bytes; + advance(os_file_request_size_max); + } - return(n_bytes); + if (ssize_t n= execute_low(request, m_n)) + { + if (n < 0) + return n; + n_bytes += n; + } + return n_bytes; } #ifndef _WIN32 @@ -942,7 +959,7 @@ os_file_flush_func( ib::error() << "The OS said file flush did not succeed"; - os_file_handle_error(NULL, "flush"); + os_file_handle_error("flush"); /* It is a fatal error if a file flush does not succeed, because then the database can get corrupt on disk */ @@ -965,7 +982,7 @@ A simple function to open or create a file. pfs_os_file_t os_file_create_simple_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success) @@ -974,76 +991,52 @@ os_file_create_simple_func( *success = false; - int create_flag; - const char* mode_str __attribute__((unused)); - - ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); - ut_a(!(create_mode & OS_FILE_ON_ERROR_NO_EXIT)); - - if (create_mode == OS_FILE_OPEN) { - mode_str = "OPEN"; - - if (access_type == OS_FILE_READ_ONLY) { - - create_flag = O_RDONLY; - - } else if (read_only) { - - create_flag = O_RDONLY; - - } else { - create_flag = O_RDWR; - } - - } else if (read_only) { - - mode_str = "OPEN"; - create_flag = O_RDONLY; + int create_flag = O_RDONLY | O_CLOEXEC; + if (read_only) { } else if (create_mode == OS_FILE_CREATE) { - - mode_str = "CREATE"; - create_flag = O_RDWR | O_CREAT | O_EXCL; - - } else if (create_mode == OS_FILE_CREATE_PATH) { - - mode_str = "CREATE PATH"; - /* Create subdirs along the path if needed. */ - - *success = os_file_create_subdirs_if_needed(name); - - if (!*success) { - - ib::error() - << "Unable to create subdirectories '" - << name << "'"; - - return(OS_FILE_CLOSED); - } - - create_flag = O_RDWR | O_CREAT | O_EXCL; - create_mode = OS_FILE_CREATE; + create_flag = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC; } else { - - ib::error() - << "Unknown file create mode (" - << create_mode - << " for file '" << name << "'"; - - return(OS_FILE_CLOSED); + ut_ad(create_mode == OS_FILE_OPEN); + if (access_type != OS_FILE_READ_ONLY) { + create_flag = O_RDWR | O_CLOEXEC; + } } bool retry; +#ifdef O_DIRECT + int direct_flag = 0; + /* This function is always called for data files, we should disable + OS caching (O_DIRECT) here as we do in os_file_create_func(), so + we open the same file in the same mode, see man page of open(2). */ + switch (srv_file_flush_method) { + case SRV_O_DSYNC: + case SRV_O_DIRECT: + case SRV_O_DIRECT_NO_FSYNC: + direct_flag = O_DIRECT; + break; + } +#else + constexpr int direct_flag = 0; +#endif + do { - file = open(name, create_flag | O_CLOEXEC, os_innodb_umask); + file = open(name, create_flag | direct_flag, os_innodb_umask); if (file == -1) { +#ifdef O_DIRECT + if (direct_flag && errno == EINVAL) { + direct_flag = 0; + retry = true; + continue; + } +#endif *success = false; - retry = os_file_handle_error( + retry = os_file_handle_error_no_exit( name, - create_mode == OS_FILE_OPEN - ? "open" : "create"); + create_mode == OS_FILE_CREATE + ? "create" : "open", false); } else { *success = true; retry = false; @@ -1051,24 +1044,6 @@ os_file_create_simple_func( } while (retry); -#ifdef HAVE_FCNTL_DIRECT - /* This function is always called for data files, we should disable - OS caching (O_DIRECT) here as we do in os_file_create_func(), so - we open the same file in the same mode, see man page of open(2). */ - if (!srv_read_only_mode && *success) { - switch (srv_file_flush_method) { - case SRV_O_DSYNC: - case SRV_O_DIRECT: - case SRV_O_DIRECT_NO_FSYNC: - os_file_set_nocache(file, name, mode_str); - break; - default: - break; - } - } -#endif - -#ifndef _WIN32 if (!read_only && *success && access_type == OS_FILE_READ_WRITE @@ -1079,7 +1054,6 @@ os_file_create_simple_func( close(file); file = -1; } -#endif /* !_WIN32 */ return(file); } @@ -1113,6 +1087,61 @@ os_file_create_directory( return(true); } +#ifdef O_DIRECT +# if defined __linux +/** Note that the log file uses buffered I/O. */ +static ATTRIBUTE_COLD void os_file_log_buffered() +{ + log_sys.log_maybe_unbuffered= false; + log_sys.log_buffered= true; + log_sys.set_block_size(512); +} +# endif + +/** @return whether the log file may work with unbuffered I/O. */ +static ATTRIBUTE_COLD bool os_file_log_maybe_unbuffered(const struct stat &st) +{ + MSAN_STAT_WORKAROUND(&st); +# ifdef __linux__ + char b[20 + sizeof "/sys/dev/block/" ":" "/../queue/physical_block_size"]; + if (snprintf(b, sizeof b, "/sys/dev/block/%u:%u/queue/physical_block_size", + major(st.st_dev), minor(st.st_dev)) >= + static_cast(sizeof b)) + return false; + int f= open(b, O_RDONLY); + if (f == -1) + { + if (snprintf(b, sizeof b, "/sys/dev/block/%u:%u/../queue/" + "physical_block_size", + major(st.st_dev), minor(st.st_dev)) >= + static_cast(sizeof b)) + return false; + f= open(b, O_RDONLY); + } + unsigned long s= 0; + if (f != -1) + { + ssize_t l= read(f, b, sizeof b); + if (l > 0 && size_t(l) < sizeof b && b[l - 1] == '\n') + { + char *end= b; + s= strtoul(b, &end, 10); + if (b == end || *end != '\n') + s = 0; + } + close(f); + } + if (s > 4096 || s < 64 || !ut_is_2pow(s)) + return false; + log_sys.set_block_size(uint32_t(s)); +# else + constexpr unsigned long s= 4096; +# endif + + return !(st.st_size & (s - 1)); +} +#endif + /** NOTE! Use the corresponding macro os_file_create(), not directly this function! Opens an existing file or creates a new. @@ -1133,73 +1162,83 @@ Opens an existing file or creates a new. pfs_os_file_t os_file_create_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint purpose, ulint type, bool read_only, bool* success) { - bool on_error_no_exit; - bool on_error_silent; - *success = false; DBUG_EXECUTE_IF( "ib_create_table_fail_disk_full", - *success = false; errno = ENOSPC; return(OS_FILE_CLOSED); ); - int create_flag; - const char* mode_str __attribute__((unused)); - - on_error_no_exit = create_mode & OS_FILE_ON_ERROR_NO_EXIT - ? true : false; - on_error_silent = create_mode & OS_FILE_ON_ERROR_SILENT - ? true : false; + int create_flag; - create_mode &= ulint(~(OS_FILE_ON_ERROR_NO_EXIT - | OS_FILE_ON_ERROR_SILENT)); - - if (create_mode == OS_FILE_OPEN - || create_mode == OS_FILE_OPEN_RAW - || create_mode == OS_FILE_OPEN_RETRY) { - - mode_str = "OPEN"; - - create_flag = read_only ? O_RDONLY : O_RDWR; - - } else if (read_only) { - - mode_str = "OPEN"; - - create_flag = O_RDONLY; - - } else if (create_mode == OS_FILE_CREATE) { - - mode_str = "CREATE"; - create_flag = O_RDWR | O_CREAT | O_EXCL; + if (read_only) { + create_flag = O_RDONLY | O_CLOEXEC; + } else if (create_mode == OS_FILE_CREATE + || create_mode == OS_FILE_CREATE_SILENT) { + create_flag = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC; + } else { + ut_ad(create_mode == OS_FILE_OPEN + || create_mode == OS_FILE_OPEN_SILENT + || create_mode == OS_FILE_OPEN_RETRY + || create_mode == OS_FILE_OPEN_RETRY_SILENT + || create_mode == OS_FILE_OPEN_RAW); + create_flag = O_RDWR | O_CLOEXEC; + } - } else if (create_mode == OS_FILE_OVERWRITE) { +#ifdef O_DIRECT + struct stat st; + ut_a(type == OS_LOG_FILE + || type == OS_DATA_FILE || type == OS_DATA_FILE_NO_O_DIRECT); + int direct_flag = 0; - mode_str = "OVERWRITE"; - create_flag = O_RDWR | O_CREAT | O_TRUNC; + if (type == OS_DATA_FILE) { + switch (srv_file_flush_method) { + case SRV_O_DSYNC: + case SRV_O_DIRECT: + case SRV_O_DIRECT_NO_FSYNC: + direct_flag = O_DIRECT; + break; + default: + break; + } +# ifdef __linux__ + } else if (type != OS_LOG_FILE) { + } else if (log_sys.log_buffered) { + skip_o_direct: + os_file_log_buffered(); + } else if (create_mode != OS_FILE_CREATE + && create_mode != OS_FILE_CREATE_SILENT + && !log_sys.is_opened()) { + if (stat(name, &st)) { + if (errno == ENOENT) { + if (create_mode & OS_FILE_ON_ERROR_SILENT) { + goto not_found; + } + sql_print_error( + "InnoDB: File %s was not found", name); + goto not_found; + } + goto skip_o_direct; + } - } else { - ib::error() - << "Unknown file create mode (" << create_mode << ")" - << " for file '" << name << "'"; + if (!os_file_log_maybe_unbuffered(st)) { + goto skip_o_direct; + } - return(OS_FILE_CLOSED); + direct_flag = O_DIRECT; + log_sys.log_maybe_unbuffered= true; +# endif } - -#ifdef HAVE_FCNTL_DIRECT - ut_a(type == OS_LOG_FILE - || type == OS_DATA_FILE - || type == OS_DATA_FILE_NO_O_DIRECT); #else ut_a(type == OS_LOG_FILE || type == OS_DATA_FILE); + constexpr int direct_flag = 0; #endif ut_a(purpose == OS_FILE_AIO || purpose == OS_FILE_NORMAL); @@ -1216,115 +1255,66 @@ os_file_create_func( } os_file_t file; - bool retry; - do { - file = open(name, create_flag | O_CLOEXEC, os_innodb_umask); + for (;;) { + file = open(name, create_flag | direct_flag, os_innodb_umask); if (file == -1) { - const char* operation; - - operation = (create_mode == OS_FILE_CREATE - && !read_only) ? "create" : "open"; - - *success = false; - - if (on_error_no_exit) { - retry = os_file_handle_error_no_exit( - name, operation, on_error_silent); - } else { - retry = os_file_handle_error(name, operation); +#ifdef O_DIRECT + if (direct_flag && errno == EINVAL) { + direct_flag = 0; +# ifdef __linux__ + if (type == OS_LOG_FILE) { + os_file_log_buffered(); + } +# endif + if (create_mode == OS_FILE_CREATE + || create_mode == OS_FILE_CREATE_SILENT) { + /* Linux may create the file + before rejecting the O_DIRECT. */ + unlink(name); + } + continue; + } +#endif + if (!os_file_handle_error_no_exit( + name, (create_flag & O_CREAT) + ? "create" : "open", + create_mode & OS_FILE_ON_ERROR_SILENT)) { + break; } } else { *success = true; - retry = false; + break; } - - } while (retry); + } if (!*success) { - return file; +#ifdef __linux__ +not_found: +#endif + return OS_FILE_CLOSED; } -#ifdef HAVE_FCNTL_DIRECT - if (type == OS_DATA_FILE) { - switch (srv_file_flush_method) { - case SRV_O_DSYNC: - case SRV_O_DIRECT: - case SRV_O_DIRECT_NO_FSYNC: -# ifdef __linux__ -use_o_direct: -# endif - os_file_set_nocache(file, name, mode_str); - break; - default: - break; - } - } -# ifdef __linux__ - else if (type == OS_LOG_FILE && !log_sys.is_opened()) { - struct stat st; - char b[20 + sizeof "/sys/dev/block/" ":" - "/../queue/physical_block_size"]; - int f; - if (fstat(file, &st)) { - goto skip_o_direct; - } - MSAN_STAT_WORKAROUND(&st); - if (snprintf(b, sizeof b, - "/sys/dev/block/%u:%u/queue/physical_block_size", - major(st.st_dev), minor(st.st_dev)) - >= static_cast(sizeof b)) { - goto skip_o_direct; - } - if ((f = open(b, O_RDONLY)) == -1) { - if (snprintf(b, sizeof b, - "/sys/dev/block/%u:%u/../queue/" - "physical_block_size", - major(st.st_dev), minor(st.st_dev)) - >= static_cast(sizeof b)) { - goto skip_o_direct; - } - f = open(b, O_RDONLY); - } - if (f != -1) { - ssize_t l = read(f, b, sizeof b); - unsigned long s = 0; - - if (l > 0 && static_cast(l) < sizeof b - && b[l - 1] == '\n') { - char* end = b; - s = strtoul(b, &end, 10); - if (b == end || *end != '\n') { - s = 0; - } - } - close(f); - if (s > 4096 || s < 64 || !ut_is_2pow(s)) { - goto skip_o_direct; - } - log_sys.log_maybe_unbuffered= true; - log_sys.set_block_size(uint32_t(s)); - if (!log_sys.log_buffered && !(st.st_size & (s - 1))) { - goto use_o_direct; - } +#ifdef __linux__ + if ((create_flag & O_CREAT) && type == OS_LOG_FILE) { + if (fstat(file, &st) || !os_file_log_maybe_unbuffered(st)) { + os_file_log_buffered(); } else { -skip_o_direct: - log_sys.log_maybe_unbuffered= false; - log_sys.log_buffered= true; - log_sys.set_block_size(512); + close(file); + return os_file_create_func(name, OS_FILE_OPEN, purpose, + type, false, success); } } -# endif #endif -#ifndef _WIN32 if (!read_only && create_mode != OS_FILE_OPEN_RAW && !my_disable_locking && os_file_lock(file, name)) { - if (create_mode == OS_FILE_OPEN_RETRY) { + if (create_mode == OS_FILE_OPEN_RETRY + || create_mode == OS_FILE_OPEN_RETRY_SILENT) { ib::info() << "Retrying to lock the first data file"; @@ -1346,7 +1336,6 @@ skip_o_direct: close(file); file = -1; } -#endif /* !_WIN32 */ return(file); } @@ -1356,7 +1345,7 @@ os_file_create_simple_no_error_handling(), not directly this function! A simple function to open or create a file. @param[in] name name of the file or path as a null-terminated string -@param[in] create_mode create mode +@param[in] create_mode OS_FILE_CREATE or OS_FILE_OPEN @param[in] access_type OS_FILE_READ_ONLY, OS_FILE_READ_WRITE, or OS_FILE_READ_ALLOW_DELETE; the last option is used by a backup program reading the file @@ -1367,59 +1356,33 @@ A simple function to open or create a file. pfs_os_file_t os_file_create_simple_no_error_handling_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success) { os_file_t file; - int create_flag; - - ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); - ut_a(!(create_mode & OS_FILE_ON_ERROR_NO_EXIT)); + int create_flag = O_RDONLY | O_CLOEXEC; *success = false; - if (create_mode == OS_FILE_OPEN) { - - if (access_type == OS_FILE_READ_ONLY) { - - create_flag = O_RDONLY; - - } else if (read_only) { - - create_flag = O_RDONLY; - - } else { - + if (read_only) { + } else if (create_mode == OS_FILE_CREATE) { + create_flag = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC; + } else { + ut_ad(create_mode == OS_FILE_OPEN); + if (access_type != OS_FILE_READ_ONLY) { ut_a(access_type == OS_FILE_READ_WRITE || access_type == OS_FILE_READ_ALLOW_DELETE); create_flag = O_RDWR; } - - } else if (read_only) { - - create_flag = O_RDONLY; - - } else if (create_mode == OS_FILE_CREATE) { - - create_flag = O_RDWR | O_CREAT | O_EXCL; - - } else { - - ib::error() - << "Unknown file create mode " - << create_mode << " for file '" << name << "'"; - - return(OS_FILE_CLOSED); } - file = open(name, create_flag | O_CLOEXEC, os_innodb_umask); + file = open(name, create_flag, os_innodb_umask); *success = (file != -1); -#ifndef _WIN32 if (!read_only && *success && access_type == OS_FILE_READ_WRITE @@ -1431,7 +1394,6 @@ os_file_create_simple_no_error_handling_func( file = -1; } -#endif /* !_WIN32 */ return(file); } @@ -1537,7 +1499,7 @@ bool os_file_close_func(os_file_t file) if (!ret) return true; - os_file_handle_error(NULL, "close"); + os_file_handle_error("close"); return false; } @@ -1810,7 +1772,7 @@ bool os_file_flush_func(os_file_t file) if (srv_start_raw_disk_in_use && GetLastError() == ERROR_INVALID_FUNCTION) return true; - os_file_handle_error(nullptr, "flush"); + os_file_handle_error("flush"); /* It is a fatal error if a file flush does not succeed, because then the database can get corrupt on disk */ @@ -1924,7 +1886,7 @@ A simple function to open or create a file. pfs_os_file_t os_file_create_simple_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success) @@ -1933,82 +1895,31 @@ os_file_create_simple_func( *success = false; - DWORD access; + DWORD access = GENERIC_READ; DWORD create_flag; DWORD attributes = 0; - ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); - ut_a(!(create_mode & OS_FILE_ON_ERROR_NO_EXIT)); ut_ad(srv_operation == SRV_OPERATION_NORMAL); - if (create_mode == OS_FILE_OPEN) { - - create_flag = OPEN_EXISTING; - - } else if (read_only) { - + if (read_only || create_mode == OS_FILE_OPEN) { create_flag = OPEN_EXISTING; - - } else if (create_mode == OS_FILE_CREATE) { - - create_flag = CREATE_NEW; - - } else if (create_mode == OS_FILE_CREATE_PATH) { - - /* Create subdirs along the path if needed. */ - *success = os_file_create_subdirs_if_needed(name); - - if (!*success) { - - ib::error() - << "Unable to create subdirectories '" - << name << "'"; - - return(OS_FILE_CLOSED); - } - - create_flag = CREATE_NEW; - create_mode = OS_FILE_CREATE; - } else { - - ib::error() - << "Unknown file create mode (" - << create_mode << ") for file '" - << name << "'"; - - return(OS_FILE_CLOSED); + ut_ad(create_mode == OS_FILE_CREATE); + create_flag = CREATE_NEW; } if (access_type == OS_FILE_READ_ONLY) { - - access = GENERIC_READ; - } else if (read_only) { - ib::info() << "Read only mode set. Unable to" " open file '" << name << "' in RW mode, " << "trying RO mode"; - - access = GENERIC_READ; - - } else if (access_type == OS_FILE_READ_WRITE) { - - access = GENERIC_READ | GENERIC_WRITE; - } else { - - ib::error() - << "Unknown file access type (" << access_type << ") " - "for file '" << name << "'"; - - return(OS_FILE_CLOSED); + ut_ad(access_type == OS_FILE_READ_WRITE); + access = GENERIC_READ | GENERIC_WRITE; } - bool retry; - - do { + for (;;) { /* Use default security attributes and no template file. */ file = CreateFile( @@ -2016,22 +1927,18 @@ os_file_create_simple_func( FILE_SHARE_READ | FILE_SHARE_DELETE, my_win_file_secattr(), create_flag, attributes, NULL); - if (file == INVALID_HANDLE_VALUE) { - - *success = false; - - retry = os_file_handle_error( - name, create_mode == OS_FILE_OPEN ? - "open" : "create"); - - } else { - - retry = false; - + if (file != INVALID_HANDLE_VALUE) { *success = true; + break; } - } while (retry); + if (!os_file_handle_error_no_exit(name, + create_flag == CREATE_NEW + ? "create" : "open", + false)) { + break; + } + } return(file); } @@ -2100,16 +2007,13 @@ Opens an existing file or creates a new. pfs_os_file_t os_file_create_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint purpose, ulint type, bool read_only, bool* success) { os_file_t file; - bool retry; - bool on_error_no_exit; - bool on_error_silent; *success = false; @@ -2120,54 +2024,30 @@ os_file_create_func( return(OS_FILE_CLOSED); ); - DWORD create_flag; + DWORD create_flag = OPEN_EXISTING; DWORD share_mode = read_only ? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE : FILE_SHARE_READ | FILE_SHARE_DELETE; - on_error_no_exit = create_mode & OS_FILE_ON_ERROR_NO_EXIT - ? true : false; - - on_error_silent = create_mode & OS_FILE_ON_ERROR_SILENT - ? true : false; - - create_mode &= ~(OS_FILE_ON_ERROR_NO_EXIT | OS_FILE_ON_ERROR_SILENT); - - if (create_mode == OS_FILE_OPEN_RAW) { - + switch (create_mode) { + case OS_FILE_OPEN_RAW: ut_a(!read_only); - /* On Windows Physical devices require admin privileges and have to have the write-share mode set. See the remarks section for the CreateFile() function documentation in MSDN. */ share_mode |= FILE_SHARE_WRITE; - - create_flag = OPEN_EXISTING; - - } else if (create_mode == OS_FILE_OPEN - || create_mode == OS_FILE_OPEN_RETRY) { - - create_flag = OPEN_EXISTING; - - } else if (read_only) { - - create_flag = OPEN_EXISTING; - - } else if (create_mode == OS_FILE_CREATE) { - + break; + case OS_FILE_CREATE_SILENT: + case OS_FILE_CREATE: create_flag = CREATE_NEW; - - } else if (create_mode == OS_FILE_OVERWRITE) { - - create_flag = CREATE_ALWAYS; - - } else { - ib::error() - << "Unknown file create mode (" << create_mode << ") " - << " for file '" << name << "'"; - - return(OS_FILE_CLOSED); + break; + default: + ut_ad(create_mode == OS_FILE_OPEN + || create_mode == OS_FILE_OPEN_SILENT + || create_mode == OS_FILE_OPEN_RETRY_SILENT + || create_mode == OS_FILE_OPEN_RETRY); + break; } DWORD attributes = (purpose == OS_FILE_AIO && srv_use_native_aio) @@ -2225,18 +2105,11 @@ os_file_create_func( break; } - operation = (create_mode == OS_FILE_CREATE && !read_only) ? - "create" : "open"; + operation = create_flag == CREATE_NEW ? "create" : "open"; - if (on_error_no_exit) { - retry = os_file_handle_error_no_exit( - name, operation, on_error_silent); - } - else { - retry = os_file_handle_error(name, operation); - } - - if (!retry) { + if (!os_file_handle_error_no_exit(name, operation, + create_mode + & OS_FILE_ON_ERROR_SILENT)) { break; } } @@ -2263,79 +2136,42 @@ A simple function to open or create a file. pfs_os_file_t os_file_create_simple_no_error_handling_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success) { os_file_t file; - *success = false; - - DWORD access; - DWORD create_flag; + DWORD access = GENERIC_READ; + DWORD create_flag = OPEN_EXISTING; DWORD attributes = 0; - DWORD share_mode = read_only - ? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE - : FILE_SHARE_READ | FILE_SHARE_DELETE; + DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_DELETE; ut_a(name); - ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); - ut_a(!(create_mode & OS_FILE_ON_ERROR_NO_EXIT)); - - if (create_mode == OS_FILE_OPEN) { - - create_flag = OPEN_EXISTING; - - } else if (read_only) { - - create_flag = OPEN_EXISTING; - - } else if (create_mode == OS_FILE_CREATE) { - - create_flag = CREATE_NEW; - + if (read_only) { + share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE + | FILE_SHARE_DELETE; } else { + if (create_mode == OS_FILE_CREATE) { + create_flag = CREATE_NEW; + } else { + ut_ad(create_mode == OS_FILE_OPEN); + } - ib::error() - << "Unknown file create mode (" << create_mode << ") " - << " for file '" << name << "'"; - - return(OS_FILE_CLOSED); - } - - if (access_type == OS_FILE_READ_ONLY) { - - access = GENERIC_READ; - - } else if (read_only) { - - access = GENERIC_READ; - - } else if (access_type == OS_FILE_READ_WRITE) { - - access = GENERIC_READ | GENERIC_WRITE; - - } else if (access_type == OS_FILE_READ_ALLOW_DELETE) { - - ut_a(!read_only); - - access = GENERIC_READ; - - /*!< A backup program has to give mysqld the maximum - freedom to do what it likes with the file */ - - share_mode |= FILE_SHARE_DELETE | FILE_SHARE_WRITE - | FILE_SHARE_READ; - - } else { - - ib::error() - << "Unknown file access type (" << access_type << ") " - << "for file '" << name << "'"; - - return(OS_FILE_CLOSED); + switch (access_type) { + case OS_FILE_READ_ONLY: break; + case OS_FILE_READ_WRITE: + access = GENERIC_READ | GENERIC_WRITE; + break; + default: + ut_ad(access_type == OS_FILE_READ_ALLOW_DELETE); + /* A backup program has to give mariadbd the maximum + freedom to do what it likes with the file */ + share_mode |= FILE_SHARE_DELETE | FILE_SHARE_WRITE + | FILE_SHARE_READ; + } } file = CreateFile((LPCTSTR) name, @@ -2503,7 +2339,7 @@ bool os_file_close_func(os_file_t file) ut_ad(file); if (!CloseHandle(file)) { - os_file_handle_error(NULL, "close"); + os_file_handle_error("close"); return false; } @@ -2941,8 +2777,8 @@ os_file_read_func( if (ulint(n_bytes) == n || err != DB_SUCCESS) return err; - os_file_handle_error_cond_exit(type.node ? type.node->name : nullptr, "read", - false, false); + os_file_handle_error_no_exit(type.node ? type.node->name : nullptr, "read", + false); sql_print_error("InnoDB: Tried to read %zu bytes at offset %llu" " of file %s, but was only able to read %zd", n, offset, type.node ? type.node->name : "(unknown)", @@ -3045,36 +2881,6 @@ os_file_handle_error_cond_exit( return(false); } -#ifdef HAVE_FCNTL_DIRECT -/** Tries to disable OS caching on an opened file descriptor. -@param[in] fd file descriptor to alter -@param[in] file_name file name, used in the diagnostic message -@param[in] name "open" or "create"; used in the diagnostic - message */ -void -os_file_set_nocache(int fd, const char *file_name, const char *operation_name) -{ - if (fcntl(fd, F_SETFL, O_DIRECT) == -1) { - int errno_save = errno; - static bool warning_message_printed = false; - if (errno_save == EINVAL) { - if (!warning_message_printed) { - warning_message_printed = true; - ib::info() - << "Setting O_DIRECT on file " - << file_name << " failed"; - } - } else { - ib::warn() - << "Failed to set O_DIRECT on file " - << file_name << "; " << operation_name - << " : " << strerror(errno_save) - << ", continuing anyway."; - } - } -} -#endif /* HAVE_FCNTL_DIRECT */ - /** Check if the file system supports sparse files. @param fh file handle @return true if the file system supports sparse files */ @@ -3859,8 +3665,9 @@ func_exit: if (srv_thread_pool->submit_io(cb)) { slots->release(cb); - os_file_handle_error(type.node->name, type.is_read() - ? "aio read" : "aio write"); + os_file_handle_error_no_exit(type.node->name, type.is_read() + ? "aio read" : "aio write", + false); err = DB_IO_ERROR; type.node->space->release(); } diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc index 89e6d149..e375fbfb 100644 --- a/storage/innobase/page/page0zip.cc +++ b/storage/innobase/page/page0zip.cc @@ -3269,7 +3269,6 @@ page_zip_validate_low( ibool sloppy) /*!< in: FALSE=strict, TRUE=ignore the MIN_REC_FLAG */ { - page_zip_des_t temp_page_zip; ibool valid; if (memcmp(page_zip->data + FIL_PAGE_PREV, page + FIL_PAGE_PREV, @@ -3310,7 +3309,7 @@ page_zip_validate_low( MEM_CHECK_DEFINED(page, srv_page_size); MEM_CHECK_DEFINED(page_zip->data, page_zip_get_size(page_zip)); - temp_page_zip = *page_zip; + page_zip_des_t temp_page_zip(*page_zip); valid = page_zip_decompress_low(&temp_page_zip, temp_page, TRUE); if (!valid) { fputs("page_zip_validate(): failed to decompress\n", stderr); diff --git a/storage/innobase/rem/rem0rec.cc b/storage/innobase/rem/rem0rec.cc index a862edd7..47be5e44 100644 --- a/storage/innobase/rem/rem0rec.cc +++ b/storage/innobase/rem/rem0rec.cc @@ -427,7 +427,7 @@ start: } if (!field->fixed_len - || (format == REC_LEAF_TEMP + || (format <= REC_LEAF_TEMP_INSTANT && !dict_col_get_fixed_size(col, true))) { /* Variable-length field: read the length */ len = *lens--; diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index 2516e24e..6194e9c3 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -45,9 +45,11 @@ Created 2012-02-08 by Sunny Bains. #include "lzo/lzo1x.h" #include "snappy-c.h" #include "log.h" +#include "table.h" +#include "ha_innodb.h" #include "scope.h" - +#include "dict0crea.h" #include #ifdef HAVE_MY_AES_H @@ -192,6 +194,60 @@ struct row_import { dberr_t match_flags(THD *thd) const ; + ulint find_fts_idx_offset() const + { + for (ulint i= 0; i < m_n_indexes; i++) + { + const char* index_name= + reinterpret_cast(m_indexes[i].m_name); + if (!strcmp(index_name, FTS_DOC_ID_INDEX_NAME)) + return i; + } + return ULINT_UNDEFINED; + } + + const row_index_t *find_index_by_name(const char *name) const + { + for (ulint i= 0; i < m_n_indexes; i++) + { + const char* index_name= + reinterpret_cast(m_indexes[i].m_name); + if (!strcmp(index_name, name)) + return &m_indexes[i]; + } + return nullptr; + } + + /** @return whether cfg file has FTS_DOC_ID + & FTS_DOC_ID_INDEX*/ + bool has_hidden_fts() const + { + if (m_missing) return false; + ulint col_offset= find_col(FTS_DOC_ID_COL_NAME); + if (col_offset == ULINT_UNDEFINED) return false; + + const dict_col_t *col= &m_cols[col_offset]; + if (col->mtype != DATA_INT + || (col->prtype & ~(DATA_NOT_NULL + | DATA_UNSIGNED | DATA_BINARY_TYPE + | DATA_FTS_DOC_ID)) + || col->len != sizeof(doc_id_t)) + return false; + + return find_index_by_name(FTS_DOC_ID_INDEX_NAME) != nullptr; + } + + /** Need to check whether the table need to add system + generated fts column and system generated fts document index + @param table table to be imported + @return whether the table has to add system generated + fts column and fts index */ + bool need_hidden_fts(dict_table_t *table) const + { + return has_hidden_fts() && !table->fts_doc_id_index && + m_n_cols == static_cast(table->n_cols + 1) && + m_n_indexes == UT_LIST_GET_LEN(table->indexes) + 1; + } dict_table_t* m_table; /*!< Table instance */ @@ -547,7 +603,7 @@ protected: if (m_xdes != 0) { const xdes_t* xdesc = xdes(page_no, m_xdes); - ulint pos = page_no % FSP_EXTENT_SIZE; + uint32_t pos = page_no % FSP_EXTENT_SIZE; return xdes_is_free(xdesc, pos); } @@ -1079,7 +1135,6 @@ row_import::find_col( return(i); } } - return(ULINT_UNDEFINED); } @@ -1800,14 +1855,39 @@ PageConverter::update_records( bool clust_index = m_index->m_srv_index == m_cluster_index; /* This will also position the cursor on the first user record. */ + rec_t* rec = m_rec_iter.open(block, m_index->m_srv_index); - if (!m_rec_iter.open(block, m_index->m_srv_index)) { + if (!rec) { return DB_CORRUPTION; } + ulint deleted; + + if (!page_has_prev(block->page.frame) + && m_index->m_srv_index->is_instant()) { + /* Expect to find the hidden metadata record */ + if (page_rec_is_supremum(rec)) { + return DB_CORRUPTION; + } + + const ulint info_bits = rec_get_info_bits(rec, comp); + + if (!(info_bits & REC_INFO_MIN_REC_FLAG)) { + return DB_CORRUPTION; + } + + if (!(info_bits & REC_INFO_DELETED_FLAG) + != !m_index->m_srv_index->table->instant) { + return DB_CORRUPTION; + } + + deleted = 0; + goto first; + } + while (!m_rec_iter.end()) { - rec_t* rec = m_rec_iter.current(); - ibool deleted = rec_get_deleted_flag(rec, comp); + rec = m_rec_iter.current(); + deleted = rec_get_deleted_flag(rec, comp); /* For the clustered index we have to adjust the BLOB reference and the system fields irrespective of the @@ -1815,6 +1895,7 @@ PageConverter::update_records( cluster records is required for purge to work later. */ if (deleted || clust_index) { +first: m_offsets = rec_get_offsets( rec, m_index->m_srv_index, m_offsets, m_index->m_srv_index->n_core_fields, @@ -2101,14 +2182,30 @@ dberr_t PageConverter::operator()(buf_block_t* block) UNIV_NOTHROW return DB_SUCCESS; } -/*****************************************************************//** -Clean up after import tablespace. */ -static MY_ATTRIBUTE((nonnull, warn_unused_result)) +static void reload_fts_table(row_prebuilt_t *prebuilt, + dict_table_t* table) +{ + ut_ad(prebuilt->table != table); + /* Reload the table in case of hidden fts column */ + const table_id_t id= prebuilt->table->id; + prebuilt->table->release(); + dict_sys.remove(prebuilt->table); + prebuilt->table= + dict_table_open_on_id(id, true, DICT_TABLE_OP_NORMAL); + prebuilt->table->space= table->space; +} + +/** Clean up after import tablespace. +@param prebuilt prebuilt from handler +@param err error code +@param fts_table constructed table which has system generated + fulltext document id +@return error code or DB_SUCCESS */ +static dberr_t -row_import_cleanup( -/*===============*/ - row_prebuilt_t* prebuilt, /*!< in/out: prebuilt from handler */ - dberr_t err) /*!< in: error code */ +row_import_cleanup(row_prebuilt_t* prebuilt, + dberr_t err, + dict_table_t* fts_table = nullptr) { if (err != DB_SUCCESS) { dict_table_t* table = prebuilt->table; @@ -2128,11 +2225,44 @@ row_import_cleanup( index = UT_LIST_GET_NEXT(indexes, index)) { index->page = FIL_NULL; } + + prebuilt->trx->rollback(); + } + else { + DBUG_EXECUTE_IF("ib_import_before_commit_crash", DBUG_SUICIDE();); + prebuilt->trx->commit(); } - DBUG_EXECUTE_IF("ib_import_before_commit_crash", DBUG_SUICIDE();); + if (fts_table && fts_table != prebuilt->table) { - prebuilt->trx->commit(); + if (err == DB_SUCCESS) { + reload_fts_table(prebuilt, fts_table); + ib::warn() << "Added system generated FTS_DOC_ID " + "and FTS_DOC_ID_INDEX while importing " + "the tablespace " << prebuilt->table->name; + } else if (fts_table->space) { + fil_close_tablespace(fts_table->space_id); + fts_table->space = NULL; + } + + if (!prebuilt->trx->dict_operation_lock_mode) { + dict_sys.lock(SRW_LOCK_CALL); + } + + dict_index_t* index = UT_LIST_GET_FIRST( + fts_table->indexes); + while (index) { + dict_index_t* next_index = + UT_LIST_GET_NEXT(indexes, index); + dict_index_remove_from_cache(fts_table, index); + index = next_index; + } + dict_mem_table_free(fts_table); + + if (!prebuilt->trx->dict_operation_lock_mode) { + dict_sys.unlock(); + } + } if (prebuilt->trx->dict_operation_lock_mode) { row_mysql_unlock_data_dictionary(prebuilt->trx); @@ -2145,14 +2275,17 @@ row_import_cleanup( return(err); } -/*****************************************************************//** -Report error during tablespace import. */ -static MY_ATTRIBUTE((nonnull, warn_unused_result)) +/** Report error during tablespace import. +@param prebuilt prebuilt from the handler +@param err error code +@param fts_table table definition containing hidden FTS_DOC_ID column +@return error code or DB_SUCCESS */ +static dberr_t row_import_error( -/*=============*/ - row_prebuilt_t* prebuilt, /*!< in/out: prebuilt from handler */ - dberr_t err) /*!< in: error code */ + row_prebuilt_t* prebuilt, + dberr_t err, + dict_table_t* fts_table=nullptr) { if (!trx_is_interrupted(prebuilt->trx)) { char table_name[MAX_FULL_NAME_LEN + 1]; @@ -2167,7 +2300,7 @@ row_import_error( table_name, (ulong) err, ut_strerr(err)); } - return row_import_cleanup(prebuilt, err); + return row_import_cleanup(prebuilt, err, fts_table); } /*****************************************************************//** @@ -3059,7 +3192,139 @@ static size_t get_buf_size() ); } -/* find, parse instant metadata, performing variaous checks, +/** Add fts index to the table +@param table fts index to be added on the table */ +static void add_fts_index(dict_table_t *table) +{ + dict_index_t *fts_index= dict_mem_index_create( + table, FTS_DOC_ID_INDEX_NAME, DICT_UNIQUE, 2); + fts_index->page= FIL_NULL; + fts_index->cached= 1; + fts_index->n_uniq= 1; + /* Add fields for FTS_DOC_ID_INDEX */ + dict_index_add_col( + fts_index, table, + &table->cols[table->n_cols - (DATA_N_SYS_COLS + 1)], 0); + dict_index_t *clust_index= UT_LIST_GET_FIRST(table->indexes); + for (ulint i= 0; i < clust_index->n_uniq; i++) + dict_index_add_col(fts_index, table, clust_index->fields[i].col, + clust_index->fields[i].prefix_len); +#ifdef BTR_CUR_HASH_ADAPT + fts_index->search_info= btr_search_info_create(fts_index->heap); + fts_index->search_info->ref_count= 0; +#endif /* BTR_CUR_HASH_ADAPT */ + UT_LIST_ADD_LAST(fts_index->table->indexes, fts_index); +} + +/** Append the hidden fts column and fts doc index to the +existing table +@param table table to be imported +@param thd thread +@param cfg metadata required by import +@return table which has fts doc id and fts doc id index */ +static dict_table_t *build_fts_hidden_table( + dict_table_t *table, const row_import &cfg) +{ + dict_table_t *new_table= dict_table_t::create( + {table->name.m_name, strlen(table->name.m_name)}, + table->space, table->n_t_cols - (DATA_N_SYS_COLS - 1), + table->n_v_cols, table->flags, + table->flags2); + + new_table->id= table->id; + new_table->space_id= table->space_id; + const char* col_name= &table->col_names[0]; + /* Copy columns from old table to new fts table */ + for (ulint new_i= 0; + new_i < ulint(new_table->n_cols - (DATA_N_SYS_COLS + 1)); + new_i++) + { + dict_mem_table_add_col(new_table, new_table->heap, col_name, + table->cols[new_i].mtype, + table->cols[new_i].prtype, + table->cols[new_i].len); + col_name+= strlen(col_name) + 1; + } + + unsigned fts_col_ind= unsigned(table->n_cols - DATA_N_SYS_COLS); + fts_add_doc_id_column(new_table, new_table->heap); + new_table->cols[fts_col_ind].ind= + fts_col_ind & dict_index_t::MAX_N_FIELDS; + new_table->cols[fts_col_ind].ord_part= 1; + dict_table_add_system_columns(new_table, new_table->heap); + + col_name= &table->v_col_names[0]; + for (ulint new_i= 0; new_i < new_table->n_v_cols; new_i++) + { + dict_col_t old_vcol= table->v_cols[new_i].m_col; + dict_mem_table_add_v_col(new_table, new_table->heap, col_name, + old_vcol.mtype, old_vcol.prtype, + old_vcol.len, old_vcol.ind + 1, + table->v_cols[new_i].num_base); + for (ulint i= 0; i < table->v_cols[new_i].num_base; i++) + { + dict_col_t *base_col= dict_table_get_nth_col( + new_table, table->v_cols[new_i].base_col[i]->ind); + new_table->v_cols[new_i].base_col[i]= base_col; + } + col_name+= strlen(col_name) + 1; + } + + bool is_clustered= true; + /* Copy indexes from old table to new table */ + for (dict_index_t *old_index= UT_LIST_GET_FIRST(table->indexes); + old_index; is_clustered= false) + { + dict_index_t *new_index= dict_mem_index_create( + new_table, old_index->name, old_index->type, + old_index->n_fields + is_clustered); + + new_index->id= old_index->id; + new_index->n_uniq= old_index->n_uniq; + new_index->type= old_index->type; + new_index->cached= 1; + new_index->n_user_defined_cols= old_index->n_user_defined_cols; + new_index->n_core_null_bytes= old_index->n_core_null_bytes; + /* Copy all fields from old index to new index */ + for (ulint i= 0; i < old_index->n_fields; i++) + { + dict_field_t *field= dict_index_get_nth_field(old_index, i); + dict_col_t *col= field->col; + if (col->is_virtual()) + { + dict_v_col_t *v_col= reinterpret_cast(col); + col= &new_table->v_cols[v_col->v_pos].m_col; + } + else + { + unsigned ind= field->col->ind; + if (ind >= fts_col_ind) ind++; + col= &new_table->cols[ind]; + } + dict_index_add_col(new_index, new_table, col, + field->prefix_len); + if (i < old_index->n_uniq) col->ord_part= 1; + } + + if (is_clustered) + { + /* Add fts doc id in clustered index */ + dict_index_add_col( + new_index, new_table, &table->cols[fts_col_ind], 0); + new_index->fields[old_index->n_fields].fixed_len= sizeof(doc_id_t); + } + + new_index->search_info= old_index->search_info; + UT_LIST_ADD_LAST(new_index->table->indexes, new_index); + old_index= UT_LIST_GET_NEXT(indexes, old_index); + if (UT_LIST_GET_LEN(new_table->indexes) + == cfg.find_fts_idx_offset()) + add_fts_index(new_table); + } + return new_table; +} + +/* find, parse instant metadata, performing various checks, and apply it to dict_table_t @return DB_SUCCESS or some error */ static dberr_t handle_instant_metadata(dict_table_t *table, @@ -4228,6 +4493,107 @@ fil_tablespace_iterate( return(err); } +static void row_import_autoinc(dict_table_t *table, row_prebuilt_t *prebuilt, + uint64_t autoinc) +{ + if (!table->persistent_autoinc) + { + ut_ad(!autoinc); + return; + } + + if (autoinc) + { + btr_write_autoinc(dict_table_get_first_index(table), autoinc - 1); + autoinc_set: + table->autoinc= autoinc; + sql_print_information("InnoDB: %`.*s.%`s autoinc value set to " UINT64PF, + int(table->name.dblen()), table->name.m_name, + table->name.basename(), autoinc); + } + else if (TABLE *t= prebuilt->m_mysql_table) + { + if (const Field *ai= t->found_next_number_field) + { + autoinc= 1 + + btr_read_autoinc_with_fallback(table, innodb_col_no(ai), + t->s->mysql_version, + innobase_get_int_col_max_value(ai)); + goto autoinc_set; + } + } +} + +/** Update the virtual column position in SYS_COLUMNS and SYS_VIRTUAL +@param table_id table identifier +@param new_pos position value +@param trx transaction +@return DB_SUCCESS or error code */ +dberr_t update_vcol_pos(table_id_t table_id, ulint new_pos, trx_t *trx) +{ + pars_info_t *info= pars_info_create(); + pars_info_add_ull_literal(info, "id", table_id); + pars_info_add_int4_literal(info, "old_pos", new_pos - 1); + DBUG_EXECUTE_IF("ib_import_vcol_update_fail", + return DB_DUPLICATE_KEY;); + return que_eval_sql(info, + "PROCEDURE UPDATE_VCOL () IS\n" + "BEGIN\n" + "UPDATE SYS_COLUMNS SET POS = POS + 1 " + "WHERE TABLE_ID= :id AND POS = :old_pos;\n" + "UPDATE SYS_VIRTUAL SET POS = POS + 1 " + "WHERE TABLE_ID= :id AND POS = :old_pos;\n" + "END\n;", trx); +} + +/** +1) Update the position of the columns and +2) Insert the hidden fts doc id in the sys columns table +3) Insert the hidden fts doc id in the sys indexes and +sys_fields table +@param table table to be imported +@param fts_pos position of fts doc id column +@param trx transaction +@return DB_SUCCESS or error code */ +static +dberr_t innodb_insert_hidden_fts_col(dict_table_t* table, + ulint fts_pos, + trx_t* trx) +{ + dict_index_t* fts_idx= + dict_table_get_index_on_name(table, FTS_DOC_ID_INDEX_NAME); + if (!fts_idx) return DB_ERROR; + for (ulint new_i= 0; new_i < table->n_v_cols; new_i++) + { + ulint pos= dict_create_v_col_pos( + table->v_cols[new_i].v_pos, + table->v_cols[new_i].m_col.ind); + if (dberr_t err= update_vcol_pos(table->id, pos, trx)) + return err; + } + pars_info_t *info= pars_info_create(); + pars_info_add_ull_literal(info, "id", table->id); + dict_hdr_get_new_id(NULL, &fts_idx->id, NULL); + pars_info_add_ull_literal(info, "idx_id", fts_idx->id); + pars_info_add_int4_literal(info, "pos", fts_pos); + pars_info_add_int4_literal(info, "space", fts_idx->table->space_id); + pars_info_add_int4_literal(info, "page_no", fts_idx->page); + + return que_eval_sql(info, + "PROCEDURE ADD_FTS_COL () IS\n" + "BEGIN\n" + "INSERT INTO SYS_COLUMNS VALUES" + "(:id,:pos,'FTS_DOC_ID',6, 1795, 8, 0);\n" + "UPDATE SYS_TABLES SET N_COLS = N_COLS + 1" + " WHERE ID = :id;\n" + "INSERT INTO SYS_INDEXES VALUES" + "(:id, :idx_id, 'FTS_DOC_ID_INDEX', 1," + " 2, :space, :page_no, 50);\n" + "INSERT INTO SYS_FIELDS VALUES" + "(:idx_id, 1, 'FTS_DOC_ID');\n" + "END;\n", trx); +} + /*****************************************************************//** Imports a tablespace. The space id in the .ibd file must match the space id of the table in the data dictionary. @@ -4253,9 +4619,27 @@ row_import_for_mysql( ut_ad(trx); ut_ad(trx->state == TRX_STATE_ACTIVE); ut_ad(!table->is_readable()); + ut_ad(prebuilt->table == table); ibuf_delete_for_discarded_space(table->space_id); +#ifdef BTR_CUR_HASH_ADAPT + /* On DISCARD TABLESPACE, we did not drop any adaptive hash + index entries. If we replaced the discarded tablespace with a + smaller one here, there could still be some adaptive hash + index entries that point to cached garbage pages in the buffer + pool, because PageConverter::operator() only evicted those + pages that were replaced by the imported pages. We must + detach any remaining adaptive hash index entries, because the + adaptive hash index must be a subset of the table contents; + false positives are not tolerated. */ + for (dict_index_t* index = UT_LIST_GET_FIRST(table->indexes); index; + index = UT_LIST_GET_NEXT(indexes, index)) { + index = index->clone_if_needed(); + } +#endif /* BTR_CUR_HASH_ADAPT */ + UT_LIST_GET_FIRST(table->indexes)->clear_instant_alter(); + /* Assign an undo segment for the transaction, so that the transaction will be recovered after a crash. */ @@ -4281,7 +4665,6 @@ row_import_for_mysql( row_import cfg; THD* thd = trx->mysql_thd; - err = row_import_read_cfg(table, thd, cfg); /* Check if the table column definitions match the contents @@ -4289,8 +4672,16 @@ row_import_for_mysql( if (err == DB_SUCCESS) { - if (dberr_t err = handle_instant_metadata(table, cfg)) { - return row_import_error(prebuilt, err); + if (cfg.need_hidden_fts(table)) { + cfg.m_table = table = build_fts_hidden_table( + table, cfg); + } + + err = handle_instant_metadata(table, cfg); + if (err != DB_SUCCESS) { +import_error: + return row_import_error( + prebuilt, err, table); } /* We have a schema file, try and match it with our @@ -4326,7 +4717,7 @@ row_import_for_mysql( "table %s when .cfg file is missing.", table->name.m_name); err = DB_ERROR; - return row_import_error(prebuilt, err); + goto import_error; } FetchIndexRootPages fetchIndexRootPages(table, trx); @@ -4355,7 +4746,7 @@ row_import_for_mysql( } if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } trx->op_info = "importing tablespace"; @@ -4375,21 +4766,6 @@ row_import_for_mysql( DBUG_EXECUTE_IF("ib_import_reset_space_and_lsn_failure", err = DB_TOO_MANY_CONCURRENT_TRXS;); -#ifdef BTR_CUR_HASH_ADAPT - /* On DISCARD TABLESPACE, we did not drop any adaptive hash - index entries. If we replaced the discarded tablespace with a - smaller one here, there could still be some adaptive hash - index entries that point to cached garbage pages in the buffer - pool, because PageConverter::operator() only evicted those - pages that were replaced by the imported pages. We must - detach any remaining adaptive hash index entries, because the - adaptive hash index must be a subset of the table contents; - false positives are not tolerated. */ - for (dict_index_t* index = UT_LIST_GET_FIRST(table->indexes); index; - index = UT_LIST_GET_NEXT(indexes, index)) { - index = index->clone_if_needed(); - } -#endif /* BTR_CUR_HASH_ADAPT */ if (err != DB_SUCCESS) { char table_name[MAX_FULL_NAME_LEN + 1]; @@ -4406,7 +4782,7 @@ row_import_for_mysql( table_name, ut_strerr(err)); } - return row_import_cleanup(prebuilt, err); + goto import_error; } /* If the table is stored in a remote tablespace, we need to @@ -4469,7 +4845,8 @@ row_import_for_mysql( dict_index_t* index = dict_table_get_first_index(table); if (!dict_index_is_clust(index)) { - return row_import_error(prebuilt, DB_CORRUPTION); + err = DB_CORRUPTION; + goto import_error; } /* Update the Btree segment headers for index node and @@ -4481,7 +4858,7 @@ row_import_for_mysql( err = DB_CORRUPTION;); if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } else if (cfg.requires_purge(index->name)) { /* Purge any delete-marked records that couldn't be @@ -4500,7 +4877,7 @@ row_import_for_mysql( DBUG_EXECUTE_IF("ib_import_cluster_failure", err = DB_CORRUPTION;); if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } /* For secondary indexes, purge any records that couldn't be purged @@ -4513,7 +4890,7 @@ row_import_for_mysql( err = DB_CORRUPTION;); if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } /* Ensure that the next available DB_ROW_ID is not smaller than @@ -4528,9 +4905,9 @@ row_import_for_mysql( /* Ensure that all pages dirtied during the IMPORT make it to disk. The only dirty pages generated should be from the pessimistic purge of delete marked records that couldn't be purged in Phase I. */ - while (buf_flush_list_space(prebuilt->table->space)); + while (buf_flush_list_space(table->space)); - for (ulint count = 0; prebuilt->table->space->referenced(); count++) { + for (ulint count = 0; table->space->referenced(); count++) { /* Issue a warning every 10.24 seconds, starting after 2.56 seconds */ if ((count & 511) == 128) { @@ -4541,38 +4918,48 @@ row_import_for_mysql( } ib::info() << "Phase IV - Flush complete"; - prebuilt->table->space->set_imported(); + /* Set tablespace purpose as FIL_TYPE_TABLESPACE, + so that rollback can go ahead smoothly */ + table->space->set_imported(); + err = lock_sys_tables(trx); + if (err != DB_SUCCESS) { + goto import_error; + } /* The dictionary latches will be released in in row_import_cleanup() after the transaction commit, for both success and error. */ row_mysql_lock_data_dictionary(trx); + if (prebuilt->table != table) { + /* Add fts_doc_id and fts_doc_idx in data dictionary */ + err = innodb_insert_hidden_fts_col( + table, cfg.find_col(FTS_DOC_ID_COL_NAME), trx); + DBUG_EXECUTE_IF("ib_import_fts_error", + err= DB_DUPLICATE_KEY;); + if (err != DB_SUCCESS) { + goto import_error; + } + } /* Update the root pages of the table's indexes. */ err = row_import_update_index_root(trx, table, false); if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } err = row_import_update_discarded_flag(trx, table->id, false); if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } table->file_unreadable = false; table->flags2 &= ~DICT_TF2_DISCARDED & ((1U << DICT_TF2_BITS) - 1); /* Set autoinc value read from .cfg file, if one was specified. - Otherwise, keep the PAGE_ROOT_AUTO_INC as is. */ - if (autoinc) { - ib::info() << table->name << " autoinc value set to " - << autoinc; - - table->autoinc = autoinc--; - btr_write_autoinc(dict_table_get_first_index(table), autoinc); - } + Otherwise, read the PAGE_ROOT_AUTO_INC and set it to table autoinc. */ + row_import_autoinc(table, prebuilt, autoinc); - return row_import_cleanup(prebuilt, err); + return row_import_cleanup(prebuilt, err, table); } diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index 9c3c5d22..1f319aae 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -2000,7 +2000,7 @@ row_ins_dupl_error_with_rec( /* In a unique secondary index we allow equal key values if they contain SQL NULLs */ - if (!dict_index_is_clust(index) && !index->nulls_equal) { + if (!dict_index_is_clust(index)) { for (i = 0; i < n_unique; i++) { if (dfield_is_null(dtuple_get_nth_field(entry, i))) { @@ -2102,16 +2102,8 @@ row_ins_scan_sec_index_for_duplicate( /* If the secondary index is unique, but one of the fields in the n_unique first fields is NULL, a unique key violation cannot occur, since we define NULL != NULL in this case */ - - if (!index->nulls_equal) { - for (ulint i = 0; i < n_unique; i++) { - if (UNIV_SQL_NULL == dfield_get_len( - dtuple_get_nth_field(entry, i))) { - - DBUG_RETURN(DB_SUCCESS); - } - } - } + if (index->n_nullable && dtuple_contains_null(entry, n_unique)) + DBUG_RETURN(DB_SUCCESS); /* Store old value on n_fields_cmp */ @@ -2569,12 +2561,6 @@ row_ins_index_entry_big_rec( return(error); } -#ifdef HAVE_REPLICATION /* Working around MDEV-24622 */ -extern "C" int thd_is_slave(const MYSQL_THD thd); -#else -# define thd_is_slave(thd) 0 -#endif - #if defined __aarch64__&&defined __GNUC__&&__GNUC__==4&&!defined __clang__ /* Avoid GCC 4.8.5 internal compiler error due to srw_mutex::wr_unlock(). We would only need this for row_ins_clust_index_entry_low(), @@ -2728,7 +2714,8 @@ err_exit: && !index->table->is_active_ddl() && !index->table->has_spatial_index() && !index->table->versioned() - && !thd_is_slave(trx->mysql_thd) /* FIXME: MDEV-24622 */) { + && (!dict_table_is_partition(index->table) + || thd_sql_command(trx->mysql_thd) == SQLCOM_INSERT)) { DEBUG_SYNC_C("empty_root_page_insert"); trx->bulk_insert = true; diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index 188d8ba5..6fb530f0 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -526,8 +526,6 @@ static ulint row_merge_bulk_buf_add(row_merge_buf_t* buf, @param[in,out] row table row @param[in] ext cache of externally stored column prefixes, or NULL -@param[in] history_fts row is historical in a system-versioned table - on which a FTS_DOC_ID_INDEX(FTS_DOC_ID) exists @param[in,out] doc_id Doc ID if we are creating FTS index @param[in,out] conv_heap memory heap where to allocate data when @@ -550,7 +548,6 @@ row_merge_buf_add( fts_psort_t* psort_info, dtuple_t* row, const row_ext_t* ext, - const bool history_fts, doc_id_t* doc_id, mem_heap_t* conv_heap, dberr_t* err, @@ -615,7 +612,7 @@ error: : NULL; /* Process the Doc ID column */ - if (!v_col && (history_fts || *doc_id) + if (!v_col && *doc_id && col->ind == index->table->fts->doc_col) { fts_write_doc_id((byte*) &write_doc_id, *doc_id); @@ -676,7 +673,7 @@ error: } /* Tokenize and process data for FTS */ - if (!history_fts && (index->type & DICT_FTS)) { + if (index->type & DICT_FTS) { fts_doc_item_t* doc_item; byte* value; void* ptr; @@ -1895,6 +1892,7 @@ row_merge_read_clustered_index( DBUG_ENTER("row_merge_read_clustered_index"); ut_ad((old_table == new_table) == !col_map); + ut_ad(old_table->fts || !new_table->fts || !new_table->versioned()); ut_ad(!defaults || col_map); ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); ut_ad(trx->id); @@ -2120,7 +2118,6 @@ corrupted_metadata: dtuple_t* row; row_ext_t* ext; page_cur_t* cur = btr_pcur_get_page_cur(&pcur); - bool history_row, history_fts = false; stage->n_pk_recs_inc(); @@ -2382,11 +2379,6 @@ end_of_index: row_heap); ut_ad(row); - history_row = new_table->versioned() - && dtuple_get_nth_field(row, new_table->vers_end) - ->vers_history_row(); - history_fts = history_row && new_table->fts; - for (ulint i = 0; i < n_nonnull; i++) { dfield_t* field = &row->fields[nonnull[i]]; @@ -2415,7 +2407,7 @@ end_of_index: } /* Get the next Doc ID */ - if (add_doc_id && !history_fts) { + if (add_doc_id) { doc_id++; } else { doc_id = 0; @@ -2455,7 +2447,9 @@ end_of_index: add_autoinc); if (new_table->versioned()) { - if (history_row) { + if (dtuple_get_nth_field(row, + new_table->vers_end) + ->vers_history_row()) { if (dfield_get_type(dfield)->prtype & DATA_NOT_NULL) { err = DB_UNSUPPORTED; my_error(ER_UNSUPPORTED_EXTENSION, MYF(0), @@ -2571,7 +2565,7 @@ write_buffers: if (UNIV_LIKELY (row && (rows_added = row_merge_buf_add( buf, fts_index, old_table, new_table, - psort_info, row, ext, history_fts, + psort_info, row, ext, &doc_id, conv_heap, &err, &v_heap, eval_table, trx, col_collate)))) { @@ -2904,7 +2898,7 @@ write_buffers: (!(rows_added = row_merge_buf_add( buf, fts_index, old_table, new_table, psort_info, - row, ext, history_fts, &doc_id, + row, ext, &doc_id, conv_heap, &err, &v_heap, eval_table, trx, col_collate)))) { /* An empty buffer should have enough @@ -4355,9 +4349,7 @@ void row_merge_drop_temp_indexes() UNIV_PFS_IO defined, register the file descriptor with Performance Schema. @param[in] path location for creating temporary merge files, or NULL @return File descriptor */ -pfs_os_file_t -row_merge_file_create_low( - const char* path) +static pfs_os_file_t row_merge_file_create_mode(const char *path, int mode) { if (!path) { path = mysql_tmpdir; @@ -4398,6 +4390,13 @@ row_merge_file_create_low( return(fd); } +/** Create a temporary file at the specified path. +@param path location for creating temporary merge files, or nullptr +@return File descriptor */ +pfs_os_file_t row_merge_file_create_low(const char *path) +{ + return row_merge_file_create_mode(path, O_BINARY | O_SEQUENTIAL); +} /** Create a merge file in the given location. @param[out] merge_file merge file structure @@ -4408,17 +4407,16 @@ row_merge_file_create( merge_file_t* merge_file, const char* path) { - merge_file->fd = row_merge_file_create_low(path); merge_file->offset = 0; merge_file->n_rec = 0; -#ifdef HAVE_FCNTL_DIRECT - if (merge_file->fd != OS_FILE_CLOSED) { - if (srv_disable_sort_file_cache) { - os_file_set_nocache(merge_file->fd, - "row0merge.cc", "sort"); - } - } + merge_file->fd = + row_merge_file_create_mode(path, +#if !defined _WIN32 && defined O_DIRECT + srv_disable_sort_file_cache + ? O_DIRECT | O_BINARY | O_SEQUENTIAL + : #endif + O_BINARY | O_SEQUENTIAL); return(merge_file->fd); } @@ -5353,18 +5351,8 @@ dberr_t trx_mod_table_time_t::write_bulk(dict_table_t *table, trx_t *trx) return err; } -dberr_t trx_t::bulk_insert_apply_low() +void trx_t::bulk_rollback_low() { - ut_ad(bulk_insert); - ut_ad(!check_unique_secondary); - ut_ad(!check_foreigns); - dberr_t err; - for (auto& t : mod_tables) - if (t.second.is_bulk_insert()) - if ((err= t.second.write_bulk(t.first, this)) != DB_SUCCESS) - goto bulk_rollback; - return DB_SUCCESS; -bulk_rollback: undo_no_t low_limit= UINT64_MAX; for (auto& t : mod_tables) { @@ -5374,9 +5362,37 @@ bulk_rollback: low_limit= t.second.get_first(); delete t.second.bulk_store; t.second.bulk_store= nullptr; + t.second.end_bulk_insert(); } } trx_savept_t bulk_save{low_limit}; rollback(&bulk_save); - return err; +} + +dberr_t trx_t::bulk_insert_apply_for_table(dict_table_t *table) +{ + auto it= mod_tables.find(table); + if (it != mod_tables.end()) + { + if (dberr_t err= it->second.write_bulk(table, this)) + { + bulk_rollback_low(); + return err; + } + it->second.end_bulk_insert(); + } + return DB_SUCCESS; +} + +dberr_t trx_t::bulk_insert_apply_low() +{ + ut_ad(bulk_insert); + for (auto& t : mod_tables) + if (t.second.is_bulk_insert()) + if (dberr_t err= t.second.write_bulk(t.first, this)) + { + bulk_rollback_low(); + return err; + } + return DB_SUCCESS; } diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index c5ee3be7..6a71cf3a 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -695,6 +695,7 @@ handle_new_error: DBUG_RETURN(true); case DB_DEADLOCK: + case DB_RECORD_CHANGED: case DB_LOCK_TABLE_FULL: rollback: /* Roll back the whole transaction; this resolution was added @@ -1585,7 +1586,8 @@ init_fts_doc_id_for_ref( for (dict_foreign_t* foreign : table->referenced_set) { ut_ad(foreign->foreign_table); - if (foreign->foreign_table->fts) { + if (foreign->foreign_table->space + && foreign->foreign_table->fts) { fts_init_doc_id(foreign->foreign_table); } @@ -2383,7 +2385,6 @@ row_discard_tablespace( dict_table_change_id_in_cache(table, new_id); dict_index_t* index = UT_LIST_GET_FIRST(table->indexes); - if (index) index->clear_instant_alter(); /* Reset the root page numbers. */ for (; index; index = UT_LIST_GET_NEXT(indexes, index)) { diff --git a/storage/innobase/row/row0quiesce.cc b/storage/innobase/row/row0quiesce.cc index e927096f..057b20c7 100644 --- a/storage/innobase/row/row0quiesce.cc +++ b/storage/innobase/row/row0quiesce.cc @@ -431,6 +431,10 @@ row_quiesce_write_header( /*********************************************************************//** Write the table meta data after quiesce. @return DB_SUCCESS or error code */ + +/* Stack size 20904 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_quiesce_write_cfg( @@ -488,6 +492,7 @@ row_quiesce_write_cfg( return(err); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /*********************************************************************//** Check whether a table has an FTS index defined on it. diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc index 33f4d81f..944f7358 100644 --- a/storage/innobase/row/row0sel.cc +++ b/storage/innobase/row/row0sel.cc @@ -864,6 +864,11 @@ row_sel_build_committed_vers_for_mysql( column version if any */ mtr_t* mtr) /*!< in: mtr */ { + if (prebuilt->trx->snapshot_isolation) { + *old_vers = rec; + return; + } + if (prebuilt->old_vers_heap) { mem_heap_empty(prebuilt->old_vers_heap); } else { @@ -1184,11 +1189,11 @@ sel_set_rtr_rec_lock( ut_ad(page_align(first_rec) == cur_block->page.frame); ut_ad(match->valid); - match->block.page.lock.x_lock(); + match->block->page.lock.x_lock(); retry: cur_block = btr_pcur_get_block(pcur); - ut_ad(match->block.page.lock.have_x() - || match->block.page.lock.have_s()); + ut_ad(match->block->page.lock.have_x() + || match->block->page.lock.have_s()); ut_ad(page_is_leaf(cur_block->page.frame)); err = lock_sec_rec_read_check_and_lock( @@ -1288,7 +1293,7 @@ re_scan: ULINT_UNDEFINED, &heap); err = lock_sec_rec_read_check_and_lock( - 0, &match->block, rtr_rec->r_rec, index, + 0, match->block, rtr_rec->r_rec, index, my_offsets, static_cast(mode), type, thr); @@ -1304,7 +1309,7 @@ re_scan: match->locked = true; func_end: - match->block.page.lock.x_unlock(); + match->block->page.lock.x_unlock(); if (heap != NULL) { mem_heap_free(heap); } @@ -3401,7 +3406,7 @@ Row_sel_get_clust_rec_for_mysql::operator()( if (dict_index_is_spatial(sec_index) && btr_cur->rtr_info->matches && (page_align(rec) - == btr_cur->rtr_info->matches->block.page.frame + == btr_cur->rtr_info->matches->block->page.frame || rec != btr_pcur_get_rec(prebuilt->pcur))) { #ifdef UNIV_DEBUG rtr_info_t* rtr_info = btr_cur->rtr_info; @@ -4456,13 +4461,11 @@ early_not_found: DBUG_RETURN(DB_RECORD_NOT_FOUND); } +#if SIZEOF_SIZE_T < 8 + if (UNIV_LIKELY(~prebuilt->n_rows_fetched)) +#endif prebuilt->n_rows_fetched++; - if (prebuilt->n_rows_fetched > 1000000000) { - /* Prevent wrap-over */ - prebuilt->n_rows_fetched = 500000000; - } - mode = pcur->search_mode; } diff --git a/storage/innobase/row/row0umod.cc b/storage/innobase/row/row0umod.cc index a01eaea5..52f54443 100644 --- a/storage/innobase/row/row0umod.cc +++ b/storage/innobase/row/row0umod.cc @@ -190,7 +190,7 @@ row_undo_mod_clust_low( @param[in] rec clustered index record @param[in] index clustered index @return the byte offset of DB_TRX_ID, from the start of rec */ -static ulint row_trx_id_offset(const rec_t* rec, const dict_index_t* index) +ulint row_trx_id_offset(const rec_t* rec, const dict_index_t* index) { ut_ad(index->n_uniq <= MAX_REF_PARTS); ulint trx_id_offset = index->trx_id_offset; diff --git a/storage/innobase/srv/srv0mon.cc b/storage/innobase/srv/srv0mon.cc index 75798241..62229842 100644 --- a/storage/innobase/srv/srv0mon.cc +++ b/storage/innobase/srv/srv0mon.cc @@ -364,11 +364,6 @@ static monitor_info_t innodb_counter_info[] = MONITOR_NONE, MONITOR_DEFAULT_START, MONITOR_LRU_GET_FREE_LOOPS}, - {"buffer_LRU_get_free_waits", "buffer", - "Total sleep waits in LRU get free.", - MONITOR_NONE, - MONITOR_DEFAULT_START, MONITOR_LRU_GET_FREE_WAITS}, - {"buffer_flush_avg_page_rate", "buffer", "Average number of pages at which flushing is happening", MONITOR_NONE, @@ -472,11 +467,6 @@ static monitor_info_t innodb_counter_info[] = MONITOR_EXISTING | MONITOR_DEFAULT_ON), MONITOR_DEFAULT_START, MONITOR_LRU_BATCH_EVICT_TOTAL_PAGE}, - {"buffer_LRU_single_flush_failure_count", "Buffer", - "Number of times attempt to flush a single page from LRU failed", - MONITOR_NONE, - MONITOR_DEFAULT_START, MONITOR_LRU_SINGLE_FLUSH_FAILURE_COUNT}, - {"buffer_LRU_get_free_search", "Buffer", "Number of searches performed for a clean page", MONITOR_NONE, diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 738e0a7e..fc557673 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -91,10 +91,6 @@ Created 2/16/1996 Heikki Tuuri #include "zlib.h" #include "log.h" -/** We are prepared for a situation that we have this many threads waiting for -a transactional lock inside InnoDB. srv_start() sets the value. */ -ulint srv_max_n_threads; - /** Log sequence number at shutdown */ lsn_t srv_shutdown_lsn; @@ -201,7 +197,7 @@ static dberr_t create_log_file(bool create_new_db, lsn_t lsn) bool ret; os_file_t file{ os_file_create_func(logfile0.c_str(), - OS_FILE_CREATE | OS_FILE_ON_ERROR_NO_EXIT, + OS_FILE_CREATE, OS_FILE_NORMAL, OS_LOG_FILE, false, &ret) }; @@ -632,15 +628,15 @@ static uint32_t srv_undo_tablespace_open(bool create, const char* name, } } - pfs_os_file_t fh= os_file_create(innodb_data_file_key, name, OS_FILE_OPEN | - OS_FILE_ON_ERROR_NO_EXIT | - OS_FILE_ON_ERROR_SILENT, + pfs_os_file_t fh= os_file_create(innodb_data_file_key, name, + OS_FILE_OPEN_SILENT, OS_FILE_AIO, OS_DATA_FILE, srv_read_only_mode, &success); if (!success) return 0; + ulint n_retries = 5; os_offset_t size= os_file_get_size(fh); ut_a(size != os_offset_t(-1)); @@ -648,15 +644,25 @@ static uint32_t srv_undo_tablespace_open(bool create, const char* name, { page_t *page= static_cast(aligned_malloc(srv_page_size, srv_page_size)); +undo_retry: if (os_file_read(IORequestRead, fh, page, 0, srv_page_size, nullptr) != DB_SUCCESS) { err_exit: + if (n_retries && srv_operation == SRV_OPERATION_BACKUP) + { + sql_print_information("InnoDB: Retrying to read undo " + "tablespace %s", name); + n_retries--; + goto undo_retry; + } ib::error() << "Unable to read first page of file " << name; aligned_free(page); return ~0U; } + DBUG_EXECUTE_IF("undo_space_read_fail", goto err_exit;); + uint32_t id= mach_read_from_4(FIL_PAGE_SPACE_ID + page); if (id == 0 || id >= SRV_SPACE_ID_UPPER_BOUND || memcmp_aligned<2>(FIL_PAGE_SPACE_ID + page, @@ -731,9 +737,7 @@ srv_check_undo_redo_logs_exists() fh = os_file_create_func( name, - OS_FILE_OPEN_RETRY - | OS_FILE_ON_ERROR_NO_EXIT - | OS_FILE_ON_ERROR_SILENT, + OS_FILE_OPEN_RETRY_SILENT, OS_FILE_NORMAL, OS_DATA_FILE, srv_read_only_mode, @@ -755,8 +759,7 @@ srv_check_undo_redo_logs_exists() auto logfilename = get_log_file_path(); fh = os_file_create_func(logfilename.c_str(), - OS_FILE_OPEN_RETRY | OS_FILE_ON_ERROR_NO_EXIT - | OS_FILE_ON_ERROR_SILENT, + OS_FILE_OPEN_RETRY_SILENT, OS_FILE_NORMAL, OS_LOG_FILE, srv_read_only_mode, &ret); @@ -1179,12 +1182,6 @@ dberr_t srv_start(bool create_new_db) mysql_stage_register("innodb", srv_stages, static_cast(UT_ARR_SIZE(srv_stages))); - srv_max_n_threads = - 1 /* dict_stats_thread */ - + 1 /* fts_optimize_thread */ - + 128 /* safety margin */ - + max_connections; - srv_boot(); ib::info() << my_crc32c_implementation(); @@ -1523,6 +1520,71 @@ dberr_t srv_start(bool create_new_db) fil_system.space_id_reuse_warned = false; + if (srv_operation > SRV_OPERATION_EXPORT_RESTORED) { + ut_ad(srv_operation == SRV_OPERATION_RESTORE_EXPORT + || srv_operation == SRV_OPERATION_RESTORE); + return(err); + } + + /* Upgrade or resize or rebuild the redo logs before + generating any dirty pages, so that the old redo log + file will not be written to. */ + + if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) { + /* Completely ignore the redo log. */ + } else if (srv_read_only_mode) { + /* Leave the redo log alone. */ + } else if (log_sys.file_size == srv_log_file_size + && log_sys.format + == (srv_encrypt_log + ? log_t::FORMAT_ENC_10_8 + : log_t::FORMAT_10_8)) { + /* No need to add or remove encryption, + upgrade, or resize. */ + delete_log_files(); + } else { + /* Prepare to delete the old redo log file */ + const lsn_t lsn{srv_prepare_to_delete_redo_log_file()}; + + DBUG_EXECUTE_IF("innodb_log_abort_1", + return(srv_init_abort(DB_ERROR));); + /* Prohibit redo log writes from any other + threads until creating a log checkpoint at the + end of create_log_file(). */ + ut_d(recv_no_log_write = true); + ut_ad(!os_aio_pending_reads()); + ut_d(mysql_mutex_lock(&buf_pool.flush_list_mutex)); + ut_ad(!buf_pool.get_oldest_modification(0)); + ut_d(mysql_mutex_unlock(&buf_pool.flush_list_mutex)); + /* os_aio_pending_writes() may hold here if + some write_io_callback() did not release the + slot yet. However, the page write itself must + have completed, because the buf_pool.flush_list + is empty. In debug builds, we wait for this to + happen, hoping to get a hung process if this + assumption does not hold. */ + ut_d(os_aio_wait_until_no_pending_writes(false)); + + /* Close the redo log file, so that we can replace it */ + log_sys.close_file(); + + DBUG_EXECUTE_IF("innodb_log_abort_5", + return(srv_init_abort(DB_ERROR));); + DBUG_PRINT("ib_log", ("After innodb_log_abort_5")); + + err = create_log_file(false, lsn); + + if (err == DB_SUCCESS && log_sys.resize_rename()) { + err = DB_ERROR; + } + + if (err != DB_SUCCESS) { + return(srv_init_abort(err)); + } + } + + recv_sys.debug_free(); + if (!srv_read_only_mode) { const uint32_t flags = FSP_FLAGS_PAGE_SSIZE(); for (uint32_t id = srv_undo_space_id_start; @@ -1607,71 +1669,6 @@ dberr_t srv_start(bool create_new_db) return(srv_init_abort(DB_ERROR)); } } - - if (srv_operation > SRV_OPERATION_EXPORT_RESTORED) { - ut_ad(srv_operation == SRV_OPERATION_RESTORE_EXPORT - || srv_operation == SRV_OPERATION_RESTORE); - return(err); - } - - /* Upgrade or resize or rebuild the redo logs before - generating any dirty pages, so that the old redo log - file will not be written to. */ - - if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) { - /* Completely ignore the redo log. */ - } else if (srv_read_only_mode) { - /* Leave the redo log alone. */ - } else if (log_sys.file_size == srv_log_file_size - && log_sys.format - == (srv_encrypt_log - ? log_t::FORMAT_ENC_10_8 - : log_t::FORMAT_10_8)) { - /* No need to add or remove encryption, - upgrade, or resize. */ - delete_log_files(); - } else { - /* Prepare to delete the old redo log file */ - const lsn_t lsn{srv_prepare_to_delete_redo_log_file()}; - - DBUG_EXECUTE_IF("innodb_log_abort_1", - return(srv_init_abort(DB_ERROR));); - /* Prohibit redo log writes from any other - threads until creating a log checkpoint at the - end of create_log_file(). */ - ut_d(recv_no_log_write = true); - ut_ad(!os_aio_pending_reads()); - ut_d(mysql_mutex_lock(&buf_pool.flush_list_mutex)); - ut_ad(!buf_pool.get_oldest_modification(0)); - ut_d(mysql_mutex_unlock(&buf_pool.flush_list_mutex)); - /* os_aio_pending_writes() may hold here if - some write_io_callback() did not release the - slot yet. However, the page write itself must - have completed, because the buf_pool.flush_list - is empty. In debug builds, we wait for this to - happen, hoping to get a hung process if this - assumption does not hold. */ - ut_d(os_aio_wait_until_no_pending_writes(false)); - - /* Close the redo log file, so that we can replace it */ - log_sys.close_file(); - - DBUG_EXECUTE_IF("innodb_log_abort_5", - return(srv_init_abort(DB_ERROR));); - DBUG_PRINT("ib_log", ("After innodb_log_abort_5")); - - err = create_log_file(false, lsn); - - if (err == DB_SUCCESS && log_sys.resize_rename()) { - err = DB_ERROR; - } - - if (err != DB_SUCCESS) { - return(srv_init_abort(err)); - } - } - - recv_sys.debug_free(); } ut_ad(err == DB_SUCCESS); diff --git a/storage/innobase/sync/cache.cc b/storage/innobase/sync/cache.cc new file mode 100644 index 00000000..43d642d0 --- /dev/null +++ b/storage/innobase/sync/cache.cc @@ -0,0 +1,160 @@ +/***************************************************************************** + +Copyright (c) 2024, MariaDB plc + +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; version 2 of the License. + +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., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + +*****************************************************************************/ + +/* This is based on the implementation of pmem_persist() in +https://github.com/pmem/pmdk/, Copyright 2014-2020, Intel Corporation, +last revised in libpmem-1.12.0. */ + +#include "my_global.h" +#include "cache.h" +#include + +#if defined __x86_64__ || defined __aarch64__ || defined __powerpc64__ +# ifdef __x86_64__ +static void pmem_clflush(const void *buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + __asm__ __volatile__("clflush %0" :: + "m"(*reinterpret_cast(u)) : "memory"); +} + +static void pmem_clflushopt(const void *buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + __asm__ __volatile__(".byte 0x66; clflush %0" /* clflushopt */ :: + "m"(*reinterpret_cast(u)) : "memory"); + __asm__ __volatile__("sfence" ::: "memory"); +} + +static void pmem_clwb(const void *buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + __asm__ __volatile__(".byte 0x66; xsaveopt %0" /* clwb */ :: + "m"(*reinterpret_cast(u)) : "memory"); + __asm__ __volatile__("sfence" ::: "memory"); +} + +# include +static decltype(pmem_control::persist) pmem_persist_init() +{ + uint32_t eax= 0, ebx= 0, ecx= 0, edx= 0; + __cpuid_count(7, 0, eax, ebx, ecx, edx); + if (ebx & 1U<<24 /* CLWB */) + return pmem_clwb; + else if (ebx & 1U<<23 /* CLFLUSHOPT */) + return pmem_clflushopt; + else + return pmem_clflush; +} +# elif defined __aarch64__ +static void pmem_cvac(const void* buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + __asm__ __volatile__("dc cvac, %0" :: "r"(u) : "memory"); + __asm__ __volatile__("dmb ishst" ::: "memory"); +} + +static void pmem_cvap(const void* buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + __asm__ __volatile__(".arch armv8.2-a\n dc cvap, %0" :: "r"(u) : "memory"); + __asm__ __volatile__("dmb ishst" ::: "memory"); +} + +# include +# include +# ifndef HWCAP_DCPOP +# define HWCAP_DCPOP (1 << 16) +# endif + +static decltype(pmem_control::persist) pmem_persist_init() +{ + return (getauxval(AT_HWCAP) & HWCAP_DCPOP) ? pmem_cvap : pmem_cvac; +} +# elif defined __powerpc64__ +static void pmem_phwsync(const void* buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + { + /* GCC is just passing the inline asm snippets to the assembler, + and it does not even define these mnemonics by itself. Clang does, + and it includes a built-in assembler. + + Let us hope that having a recent enough GCC is an adequate proxy + for having a recent enough assembler. */ +# if __GNUC__ >= 11 || (defined __clang_major__ && __clang_major__ >= 12) + __asm__ __volatile__("dcbstps 0,%0" :: "r"(u) : "memory"); +# else + __asm__ __volatile__(".long (0x7cc000AC | %0 << 11)" :: "r"(u) : "memory"); +# endif + } + +# if __GNUC__ >= 11 || (defined __clang_major__ && __clang_major__ >= 18) + __asm__ __volatile__("phwsync" ::: "memory"); +# else + __asm__ __volatile__(".long 0x7c80040a" ::: "memory"); +# endif +} + +# include +static void pmem_fence(const void*, size_t) +{ + std::atomic_thread_fence(std::memory_order_seq_cst); +} + +# include +# ifndef AT_HWCAP2 +# define AT_HWCAP2 26 +# endif +# ifndef PPC_FEATURE2_ARCH_3_1 +# define PPC_FEATURE2_ARCH_3_1 4 +# endif + +static decltype(pmem_control::persist) pmem_persist_init() +{ + return (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_1) + ? pmem_phwsync : pmem_fence; +} +# endif + +pmem_control::pmem_control() : persist(pmem_persist_init()) {} +const pmem_control pmem; +#else +void pmem_persist(const void *buf, size_t size) +{ +# if defined __riscv && __riscv_xlen == 64 + __asm__ __volatile__("fence w,w" ::: "memory"); +# elif defined __loongarch64 + __asm__ __volatile__("dbar 0" ::: "memory"); +# else +# error "Missing implementation; recompile with cmake -DWITH_INNODB_PMEM=OFF" +# endif +} +#endif diff --git a/storage/innobase/sync/srw_lock.cc b/storage/innobase/sync/srw_lock.cc index 5afb79f2..19db1245 100644 --- a/storage/innobase/sync/srw_lock.cc +++ b/storage/innobase/sync/srw_lock.cc @@ -548,3 +548,124 @@ template void ssux_lock_impl::rd_unlock(); template void ssux_lock_impl::u_unlock(); template void ssux_lock_impl::wr_unlock(); #endif /* UNIV_PFS_RWLOCK */ + +#ifdef UNIV_DEBUG +void srw_lock_debug::SRW_LOCK_INIT(mysql_pfs_key_t key) +{ + srw_lock::SRW_LOCK_INIT(key); + readers_lock.init(); + ut_ad(!readers.load(std::memory_order_relaxed)); + ut_ad(!have_any()); +} + +void srw_lock_debug::destroy() +{ + ut_ad(!writer); + if (auto r= readers.load(std::memory_order_relaxed)) + { + readers.store(0, std::memory_order_relaxed); + ut_ad(r->empty()); + delete r; + } + srw_lock::destroy(); +} + +bool srw_lock_debug::wr_lock_try() +{ + ut_ad(!have_any()); + if (!srw_lock::wr_lock_try()) + return false; + ut_ad(!writer); + writer.store(pthread_self(), std::memory_order_relaxed); + return true; +} + +void srw_lock_debug::wr_lock(SRW_LOCK_ARGS(const char *file, unsigned line)) +{ + ut_ad(!have_any()); + srw_lock::wr_lock(SRW_LOCK_ARGS(file, line)); + ut_ad(!writer); + writer.store(pthread_self(), std::memory_order_relaxed); +} + +void srw_lock_debug::wr_unlock() +{ + ut_ad(have_wr()); + writer.store(0, std::memory_order_relaxed); + srw_lock::wr_unlock(); +} + +void srw_lock_debug::readers_register() +{ + readers_lock.wr_lock(); + auto r= readers.load(std::memory_order_relaxed); + if (!r) + { + r= new std::unordered_multiset(); + readers.store(r, std::memory_order_relaxed); + } + r->emplace(pthread_self()); + readers_lock.wr_unlock(); +} + +bool srw_lock_debug::rd_lock_try() +{ + ut_ad(!have_any()); + if (!srw_lock::rd_lock_try()) + return false; + readers_register(); + return true; +} + +void srw_lock_debug::rd_lock(SRW_LOCK_ARGS(const char *file, unsigned line)) +{ + ut_ad(!have_any()); + srw_lock::rd_lock(SRW_LOCK_ARGS(file, line)); + readers_register(); +} + +void srw_lock_debug::rd_unlock() +{ + const pthread_t self= pthread_self(); + ut_ad(writer != self); + readers_lock.wr_lock(); + auto r= readers.load(std::memory_order_relaxed); + ut_ad(r); + auto i= r->find(self); + ut_ad(i != r->end()); + r->erase(i); + readers_lock.wr_unlock(); + + srw_lock::rd_unlock(); +} + +bool srw_lock_debug::have_rd() const noexcept +{ + if (auto r= readers.load(std::memory_order_relaxed)) + { + readers_lock.wr_lock(); + bool found= r->find(pthread_self()) != r->end(); + readers_lock.wr_unlock(); +# ifndef SUX_LOCK_GENERIC + ut_ad(!found || is_locked()); +# endif + return found; + } + return false; +} + +bool srw_lock_debug::have_wr() const noexcept +{ + if (writer != pthread_self()) + return false; +# ifndef SUX_LOCK_GENERIC + ut_ad(is_write_locked()); +# endif + return true; +} + +bool srw_lock_debug::have_any() const noexcept +{ + return have_wr() || have_rd(); +} +#endif diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index cff16d9c..f32f4de5 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -56,84 +56,6 @@ purge_sys_t purge_sys; my_bool srv_purge_view_update_only_debug; #endif /* UNIV_DEBUG */ -/** Sentinel value */ -static const TrxUndoRsegs NullElement; - -/** Default constructor */ -TrxUndoRsegsIterator::TrxUndoRsegsIterator() - : m_rsegs(NullElement), m_iter(m_rsegs.begin()) -{ -} - -/** Sets the next rseg to purge in purge_sys. -Executed in the purge coordinator thread. -@retval false when nothing is to be purged -@retval true when purge_sys.rseg->latch was locked */ -inline bool TrxUndoRsegsIterator::set_next() -{ - ut_ad(!purge_sys.next_stored); - mysql_mutex_lock(&purge_sys.pq_mutex); - - /* Only purge consumes events from the priority queue, user - threads only produce the events. */ - - /* Check if there are more rsegs to process in the - current element. */ - if (m_iter != m_rsegs.end()) { - /* We are still processing rollback segment from - the same transaction and so expected transaction - number shouldn't increase. Undo the increment of - expected commit done by caller assuming rollback - segments from given transaction are done. */ - purge_sys.tail.trx_no = (*m_iter)->last_trx_no(); - } else if (!purge_sys.purge_queue.empty()) { - m_rsegs = purge_sys.purge_queue.top(); - purge_sys.purge_queue.pop(); - ut_ad(purge_sys.purge_queue.empty() - || purge_sys.purge_queue.top() != m_rsegs); - m_iter = m_rsegs.begin(); - } else { - /* Queue is empty, reset iterator. */ - purge_sys.rseg = NULL; - mysql_mutex_unlock(&purge_sys.pq_mutex); - m_rsegs = NullElement; - m_iter = m_rsegs.begin(); - return false; - } - - purge_sys.rseg = *m_iter++; - mysql_mutex_unlock(&purge_sys.pq_mutex); - - /* We assume in purge of externally stored fields that space - id is in the range of UNDO tablespace space ids */ - ut_ad(purge_sys.rseg->space->id == TRX_SYS_SPACE - || srv_is_undo_tablespace(purge_sys.rseg->space->id)); - - purge_sys.rseg->latch.wr_lock(SRW_LOCK_CALL); - trx_id_t last_trx_no = purge_sys.rseg->last_trx_no(); - purge_sys.hdr_offset = purge_sys.rseg->last_offset(); - purge_sys.hdr_page_no = purge_sys.rseg->last_page_no; - - /* Only the purge_coordinator_task will access this object - purge_sys.rseg_iter, or any of purge_sys.hdr_page_no, - purge_sys.tail. - The field purge_sys.head and purge_sys.view are modified by - purge_sys_t::clone_end_view() - in the purge_coordinator_task - while holding exclusive purge_sys.latch. - The purge_sys.view may also be modified by - purge_sys_t::wake_if_not_active() while holding exclusive - purge_sys.latch. - The purge_sys.head may be read by - purge_truncation_callback(). */ - ut_ad(last_trx_no == m_rsegs.trx_no); - ut_a(purge_sys.hdr_page_no != FIL_NULL); - ut_a(purge_sys.tail.trx_no <= last_trx_no); - purge_sys.tail.trx_no = last_trx_no; - - return(true); -} - /** Build a purge 'query' graph. The actual purge is performed by executing this query graph. @return own: the query graph */ @@ -345,7 +267,8 @@ trx_purge_add_undo_to_history(const trx_t* trx, trx_undo_t*& undo, mtr_t* mtr) that is known to be corrupted. */ ut_a(flst_add_first(rseg_header, TRX_RSEG + TRX_RSEG_HISTORY, undo_page, uint16_t(page_offset(undo_header) + - TRX_UNDO_HISTORY_NODE), mtr) == DB_SUCCESS); + TRX_UNDO_HISTORY_NODE), rseg->space->free_limit, + mtr) == DB_SUCCESS); mtr->write<2>(*undo_page, TRX_UNDO_SEG_HDR + TRX_UNDO_STATE + undo_page->page.frame, undo_state); @@ -396,9 +319,7 @@ static void trx_purge_free_segment(buf_block_t *rseg_hdr, buf_block_t *block, void purge_sys_t::rseg_enable(trx_rseg_t &rseg) { ut_ad(this == &purge_sys); -#ifndef SUX_LOCK_GENERIC - ut_ad(rseg.latch.is_write_locked()); -#endif + ut_ad(rseg.latch.have_wr()); uint8_t skipped= skipped_rseg; ut_ad(skipped < TRX_SYS_N_RSEGS); if (&rseg == &trx_sys.rseg_array[skipped]) @@ -437,6 +358,19 @@ inline dberr_t purge_sys_t::iterator::free_history_rseg(trx_rseg_t &rseg) const mtr_t mtr; bool freed= false; uint32_t rseg_ref= 0; + const auto last_boffset= srv_page_size - TRX_UNDO_LOG_OLD_HDR_SIZE; + /* Technically, rseg.space->free_limit is not protected by + rseg.latch, which we are holding, but rseg.space->latch. The value + that we are reading may become stale (too small) if other pages are + being allocated in this tablespace, for other rollback + segments. Nothing can be added to this rseg without holding + rseg.latch, and hence we can validate the entire file-based list + against the limit that we are reading here. + + Note: The read here may look like a data race. On none of our target + architectures this should be an actual problem, because the uint32_t + value should always fit in a register and be correctly aligned. */ + const auto last_page= rseg.space->free_limit; mtr.start(); @@ -452,13 +386,23 @@ func_exit: } hdr_addr= flst_get_last(TRX_RSEG + TRX_RSEG_HISTORY + rseg_hdr->page.frame); - hdr_addr.boffset= static_cast(hdr_addr.boffset - - TRX_UNDO_HISTORY_NODE); -loop: if (hdr_addr.page == FIL_NULL) goto func_exit; + if (hdr_addr.page >= last_page || + hdr_addr.boffset < TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE || + hdr_addr.boffset >= last_boffset) + { + corrupted: + err= DB_CORRUPTION; + goto func_exit; + } + + hdr_addr.boffset= static_cast(hdr_addr.boffset - + TRX_UNDO_HISTORY_NODE); + +loop: buf_block_t *b= buf_page_get_gen(page_id_t(rseg.space->id, hdr_addr.page), 0, RW_X_LATCH, nullptr, BUF_GET_POSSIBLY_FREED, @@ -507,11 +451,18 @@ loop: fil_addr_t prev_hdr_addr= flst_get_prev_addr(b->page.frame + hdr_addr.boffset + TRX_UNDO_HISTORY_NODE); + if (prev_hdr_addr.page == FIL_NULL); + else if (prev_hdr_addr.page >= last_page || + prev_hdr_addr.boffset < TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE || + prev_hdr_addr.boffset >= last_boffset) + goto corrupted; + prev_hdr_addr.boffset= static_cast(prev_hdr_addr.boffset - TRX_UNDO_HISTORY_NODE); err= flst_remove(rseg_hdr, TRX_RSEG + TRX_RSEG_HISTORY, b, - uint16_t(hdr_addr.boffset + TRX_UNDO_HISTORY_NODE), &mtr); + uint16_t(hdr_addr.boffset + TRX_UNDO_HISTORY_NODE), + last_page, &mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) goto func_exit; @@ -571,45 +522,21 @@ loop: ut_ad(rseg_hdr->page.id() == rseg.page_id()); mtr.memo_push(rseg_hdr, MTR_MEMO_PAGE_X_FIX); + if (hdr_addr.page == FIL_NULL) + goto func_exit; + goto loop; } -/** Cleanse purge queue to remove the rseg that reside in undo-tablespace -marked for truncate. -@param[in] space undo tablespace being truncated */ -static void trx_purge_cleanse_purge_queue(const fil_space_t& space) +void purge_sys_t::cleanse_purge_queue(const fil_space_t &space) { - typedef std::vector purge_elem_list_t; - purge_elem_list_t purge_elem_list; - - mysql_mutex_lock(&purge_sys.pq_mutex); - - /* Remove rseg instances that are in the purge queue before we start - truncate of corresponding UNDO truncate. */ - while (!purge_sys.purge_queue.empty()) { - purge_elem_list.push_back(purge_sys.purge_queue.top()); - purge_sys.purge_queue.pop(); - } - - for (purge_elem_list_t::iterator it = purge_elem_list.begin(); - it != purge_elem_list.end(); - ++it) { - - for (TrxUndoRsegs::iterator it2 = it->begin(); - it2 != it->end(); - ++it2) { - if ((*it2)->space == &space) { - it->erase(it2); - break; - } - } - - if (!it->empty()) { - purge_sys.purge_queue.push(*it); - } - } - - mysql_mutex_unlock(&purge_sys.pq_mutex); + mysql_mutex_lock(&pq_mutex); + auto purge_elem_list= clone_queue_container(); + purge_queue.clear(); + for (auto elem : purge_elem_list) + if (purge_queue::rseg(elem)->space != &space) + purge_queue.push_trx_no_rseg(elem); + mysql_mutex_unlock(&pq_mutex); } dberr_t purge_sys_t::iterator::free_history() const @@ -672,7 +599,9 @@ fil_space_t *purge_sys_t::truncating_tablespace() if (space || srv_undo_tablespaces_active < 2 || !srv_undo_log_truncate) return space; - const uint32_t size= uint32_t(srv_max_undo_log_size >> srv_page_size_shift); + const uint32_t size= + uint32_t(std::min(ulonglong{std::numeric_limits::max()}, + srv_max_undo_log_size >> srv_page_size_shift)); for (uint32_t i= truncate_undo_space.last, j= i;; ) { if (fil_space_t *s= undo_truncate_try(srv_undo_space_id_start + i, size)) @@ -751,7 +680,7 @@ not_free: const char *file_name= UT_LIST_GET_FIRST(space->chain)->name; sql_print_information("InnoDB: Truncating %s", file_name); - trx_purge_cleanse_purge_queue(*space); + purge_sys.cleanse_purge_queue(*space); /* Lock all modified pages of the tablespace. @@ -870,13 +799,11 @@ buf_block_t *purge_sys_t::get_page(page_id_t id) return nullptr; } -void purge_sys_t::rseg_get_next_history_log() +bool purge_sys_t::rseg_get_next_history_log() { fil_addr_t prev_log_addr; -#ifndef SUX_LOCK_GENERIC - ut_ad(rseg->latch.is_write_locked()); -#endif + ut_ad(rseg->latch.have_wr()); ut_a(rseg->last_page_no != FIL_NULL); tail.trx_no= rseg->last_trx_no() + 1; @@ -888,21 +815,24 @@ void purge_sys_t::rseg_get_next_history_log() { const byte *log_hdr= undo_page->page.frame + rseg->last_offset(); prev_log_addr= flst_get_prev_addr(log_hdr + TRX_UNDO_HISTORY_NODE); + if (prev_log_addr.boffset < TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE || + prev_log_addr.boffset >= srv_page_size - TRX_UNDO_LOG_OLD_HDR_SIZE) + goto corrupted; prev_log_addr.boffset = static_cast(prev_log_addr.boffset - TRX_UNDO_HISTORY_NODE); } else - prev_log_addr.page= FIL_NULL; + goto corrupted; - if (prev_log_addr.page == FIL_NULL) + if (prev_log_addr.page >= rseg->space->free_limit) + corrupted: rseg->last_page_no= FIL_NULL; else { /* Read the previous log header. */ trx_id_t trx_no= 0; if (const buf_block_t* undo_page= - get_page(page_id_t(rseg->space->id, - prev_log_addr.page))) + get_page(page_id_t(rseg->space->id, prev_log_addr.page))) { const byte *log_hdr= undo_page->page.frame + prev_log_addr.boffset; trx_no= mach_read_from_8(log_hdr + TRX_UNDO_TRX_NO); @@ -920,12 +850,13 @@ void purge_sys_t::rseg_get_next_history_log() can never produce events from an empty rollback segment. */ mysql_mutex_lock(&pq_mutex); - purge_queue.push(*rseg); + enqueue(*rseg); mysql_mutex_unlock(&pq_mutex); } } rseg->latch.wr_unlock(); + return choose_next_log(); } /** Position the purge sys "iterator" on the undo record to use for purging. @@ -933,11 +864,37 @@ void purge_sys_t::rseg_get_next_history_log() @retval true when purge_sys.rseg->latch was locked */ bool purge_sys_t::choose_next_log() { - if (!rseg_iter.set_next()) - return false; + ut_ad(!next_stored); - hdr_offset= rseg->last_offset(); - hdr_page_no= rseg->last_page_no; + mysql_mutex_lock(&pq_mutex); + if (purge_queue.empty()) { + rseg = nullptr; + mysql_mutex_unlock(&purge_sys.pq_mutex); + return false; + } + rseg= purge_queue.pop(); + mysql_mutex_unlock(&purge_sys.pq_mutex); + + /* We assume in purge of externally stored fields that space + id is in the range of UNDO tablespace space ids */ + ut_ad(rseg->space == fil_system.sys_space || + srv_is_undo_tablespace(rseg->space->id)); + + rseg->latch.wr_lock(SRW_LOCK_CALL); + trx_id_t last_trx_no = rseg->last_trx_no(); + hdr_offset = rseg->last_offset(); + hdr_page_no = rseg->last_page_no; + + /* Only the purge_coordinator_task will access this any of + purge_sys.hdr_page_no, purge_sys.tail. The field purge_sys.head and + purge_sys.view are modified by clone_end_view() in the + purge_coordinator_task while holding exclusive purge_sys.latch. The + purge_sys.view may also be modified by wake_if_not_active() while holding + exclusive purge_sys.latch. The purge_sys.head may be read by + purge_truncation_callback(). */ + ut_a(hdr_page_no != FIL_NULL); + ut_a(tail.trx_no <= last_trx_no); + tail.trx_no = last_trx_no; if (!rseg->needs_purge) { @@ -968,7 +925,7 @@ bool purge_sys_t::choose_next_log() if (!b) goto purge_nothing; undo_rec= - trx_undo_page_get_first_rec(b, page_no, hdr_offset); + trx_undo_page_get_first_rec(b, hdr_page_no, hdr_offset); if (!undo_rec) goto purge_nothing; } @@ -992,18 +949,13 @@ inline trx_purge_rec_t purge_sys_t::get_next_rec(roll_ptr_t roll_ptr) { ut_ad(next_stored); ut_ad(tail.trx_no < low_limit_no()); -#ifndef SUX_LOCK_GENERIC - ut_ad(rseg->latch.is_write_locked()); -#endif + ut_ad(rseg->latch.have_wr()); if (!offset) { - /* It is the dummy undo log record, which means that there is no - need to purge this undo log */ - rseg_get_next_history_log(); - - /* Look for the next undo log and record to purge */ - if (choose_next_log()) + /* It is the dummy undo log record, which means that there is no need to + purge this undo log. Look for the next undo log and record to purge */ + if (rseg_get_next_history_log()) rseg->latch.wr_unlock(); return {nullptr, 1}; } @@ -1051,9 +1003,8 @@ inline trx_purge_rec_t purge_sys_t::get_next_rec(roll_ptr_t roll_ptr) else { got_no_rec: - rseg_get_next_history_log(); /* Look for the next undo log and record to purge */ - locked= choose_next_log(); + locked= rseg_get_next_history_log(); } if (locked) diff --git a/storage/innobase/trx/trx0rseg.cc b/storage/innobase/trx/trx0rseg.cc index 87a2ac7b..964dca94 100644 --- a/storage/innobase/trx/trx0rseg.cc +++ b/storage/innobase/trx/trx0rseg.cc @@ -201,7 +201,7 @@ bool trx_rseg_read_wsrep_checkpoint(const buf_block_t *rseg_header, XID &xid) memcpy(xid.data, TRX_RSEG + TRX_RSEG_WSREP_XID_DATA + rseg_header->page.frame, XIDDATASIZE); - return true; + return wsrep_is_wsrep_xid(&xid); } /** Read the WSREP XID from the TRX_SYS page (in case of upgrade). @@ -210,6 +210,11 @@ bool trx_rseg_read_wsrep_checkpoint(const buf_block_t *rseg_header, XID &xid) @return whether the WSREP XID is present */ static bool trx_rseg_init_wsrep_xid(const page_t* page, XID& xid) { + if (memcmp(TRX_SYS + TRX_SYS_WSREP_XID_INFO + page, + field_ref_zero, TRX_SYS_WSREP_XID_LEN) == 0) { + return false; + } + if (mach_read_from_4(TRX_SYS + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_MAGIC_N_FLD + page) @@ -232,7 +237,8 @@ static bool trx_rseg_init_wsrep_xid(const page_t* page, XID& xid) memcpy(xid.data, TRX_SYS + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA + page, XIDDATASIZE); - return true; + + return wsrep_is_wsrep_xid(&xid); } /** Recover the latest WSREP checkpoint XID. @@ -448,7 +454,14 @@ static dberr_t trx_rseg_mem_restore(trx_rseg_t *rseg, mtr_t *mtr) { if (!rseg->space) return DB_TABLESPACE_NOT_FOUND; + + /* Access the tablespace header page to recover rseg->space->free_limit */ + page_id_t page_id{rseg->space->id, 0}; dberr_t err; + if (!buf_page_get_gen(page_id, 0, RW_S_LATCH, nullptr, BUF_GET, mtr, &err)) + return err; + mtr->release_last_page(); + page_id.set_page_no(rseg->page_no); const buf_block_t *rseg_hdr= buf_page_get_gen(rseg->page_id(), 0, RW_S_LATCH, nullptr, BUF_GET, mtr, &err); @@ -493,10 +506,17 @@ static dberr_t trx_rseg_mem_restore(trx_rseg_t *rseg, mtr_t *mtr) trx_sys.recovered_binlog_offset= binlog_offset; trx_sys.recovered_binlog_is_legacy_pos= false; } + } #ifdef WITH_WSREP - trx_rseg_read_wsrep_checkpoint(rseg_hdr, trx_sys.recovered_wsrep_xid); + XID tmp_xid; + tmp_xid.null(); + /* Update recovered wsrep xid only if we found wsrep xid from + rseg header page and read xid seqno is larger than currently + recovered xid seqno. */ + if (trx_rseg_read_wsrep_checkpoint(rseg_hdr, tmp_xid) && + wsrep_xid_seqno(&tmp_xid) > wsrep_xid_seqno(&trx_sys.recovered_wsrep_xid)) + trx_sys.recovered_wsrep_xid.set(&tmp_xid); #endif - } } if (srv_operation == SRV_OPERATION_RESTORE) @@ -518,6 +538,11 @@ static dberr_t trx_rseg_mem_restore(trx_rseg_t *rseg, mtr_t *mtr) fil_addr_t node_addr= flst_get_last(TRX_RSEG + TRX_RSEG_HISTORY + rseg_hdr->page.frame); + if (node_addr.page >= rseg->space->free_limit || + node_addr.boffset < TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE || + node_addr.boffset >= srv_page_size - TRX_UNDO_LOG_OLD_HDR_SIZE) + return DB_CORRUPTION; + node_addr.boffset= static_cast(node_addr.boffset - TRX_UNDO_HISTORY_NODE); rseg->last_page_no= node_addr.page; @@ -544,7 +569,7 @@ static dberr_t trx_rseg_mem_restore(trx_rseg_t *rseg, mtr_t *mtr) if (rseg->last_page_no != FIL_NULL) /* There is no need to cover this operation by the purge mutex because we are still bootstrapping. */ - purge_sys.purge_queue.push(*rseg); + purge_sys.enqueue(*rseg); } trx_sys.set_undo_non_empty(rseg->history_size > 0); @@ -567,10 +592,6 @@ static void trx_rseg_init_binlog_info(const page_t* page) + TRX_SYS + page); trx_sys.recovered_binlog_is_legacy_pos= true; } - -#ifdef WITH_WSREP - trx_rseg_init_wsrep_xid(page, trx_sys.recovered_wsrep_xid); -#endif } /** Initialize or recover the rollback segments at startup. */ @@ -589,7 +610,17 @@ dberr_t trx_rseg_array_init() #endif mtr_t mtr; dberr_t err = DB_SUCCESS; - + /* mariabackup --prepare only deals with the redo log and the data + files, not with transactions or the data dictionary, that's why + trx_lists_init_at_db_start() does not invoke purge_sys.create() and + purge queue mutex stays uninitialized, and trx_rseg_mem_restore() quits + before initializing undo log lists. */ + if (srv_operation != SRV_OPERATION_RESTORE) + /* Acquiring purge queue mutex here should be fine from the + deadlock prevention point of view, because executing that + function is a prerequisite for starting the purge subsystem or + any transactions. */ + purge_sys.queue_lock(); for (ulint rseg_id = 0; rseg_id < TRX_SYS_N_RSEGS; rseg_id++) { mtr.start(); if (const buf_block_t* sys = trx_sysf_get(&mtr, false)) { @@ -602,7 +633,11 @@ dberr_t trx_rseg_array_init() + sys->page.frame); trx_rseg_init_binlog_info(sys->page.frame); #ifdef WITH_WSREP - wsrep_sys_xid.set(&trx_sys.recovered_wsrep_xid); + if (trx_rseg_init_wsrep_xid( + sys->page.frame, trx_sys.recovered_wsrep_xid)) { + wsrep_sys_xid.set( + &trx_sys.recovered_wsrep_xid); + } #endif } @@ -655,7 +690,8 @@ dberr_t trx_rseg_array_init() mtr.commit(); } - + if (srv_operation != SRV_OPERATION_RESTORE) + purge_sys.queue_unlock(); if (err != DB_SUCCESS) { for (auto& rseg : trx_sys.rseg_array) { while (auto u = UT_LIST_GET_FIRST(rseg.undo_list)) { @@ -667,7 +703,7 @@ dberr_t trx_rseg_array_init() } #ifdef WITH_WSREP - if (!wsrep_sys_xid.is_null()) { + if (srv_operation == SRV_OPERATION_NORMAL && !wsrep_sys_xid.is_null()) { /* Upgrade from a version prior to 10.3.5, where WSREP XID was stored in TRX_SYS page. If no rollback segment has a WSREP XID set, diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index 942b8bd4..1d22b853 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -412,12 +412,12 @@ void trx_t::free() #endif read_view.mem_noaccess(); MEM_NOACCESS(&lock, sizeof lock); - MEM_NOACCESS(&op_info, sizeof op_info); - MEM_NOACCESS(&isolation_level, sizeof isolation_level); - MEM_NOACCESS(&check_foreigns, sizeof check_foreigns); + MEM_NOACCESS(&op_info, sizeof op_info + + sizeof(unsigned) /* isolation_level, snapshot_isolation, + check_foreigns, check_unique_secondary, + bulk_insert */); MEM_NOACCESS(&is_registered, sizeof is_registered); MEM_NOACCESS(&active_commit_ordered, sizeof active_commit_ordered); - MEM_NOACCESS(&check_unique_secondary, sizeof check_unique_secondary); MEM_NOACCESS(&flush_log_later, sizeof flush_log_later); MEM_NOACCESS(&duplicates, sizeof duplicates); MEM_NOACCESS(&dict_operation, sizeof dict_operation); @@ -1142,15 +1142,23 @@ inline void trx_t::write_serialisation_history(mtr_t *mtr) } else if (rseg->last_page_no == FIL_NULL) { - mysql_mutex_lock(&purge_sys.pq_mutex); + /* trx_sys.assign_new_trx_no() and + purge_sys.enqueue() must be invoked in the same + critical section protected with purge queue mutex to avoid rseg with + greater last commit number to be pushed to purge queue prior to rseg with + lesser last commit number. In other words pushing to purge queue must be + serialized along with assigning trx_no. Otherwise purge coordinator + thread can also fetch redo log records from rseg with greater last commit + number before rseg with lesser one. */ + purge_sys.queue_lock(); trx_sys.assign_new_trx_no(this); const trx_id_t end{rw_trx_hash_element->no}; + rseg->last_page_no= undo->hdr_page_no; /* end cannot be less than anything in rseg. User threads only produce events when a rollback segment is empty. */ - purge_sys.purge_queue.push(TrxUndoRsegs{end, *rseg}); - mysql_mutex_unlock(&purge_sys.pq_mutex); - rseg->last_page_no= undo->hdr_page_no; rseg->set_last_commit(undo->hdr_offset, end); + purge_sys.enqueue(end, *rseg); + purge_sys.queue_unlock(); } else trx_sys.assign_new_trx_no(this); diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index ccc68dfe..c0f5b1fb 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -134,8 +134,9 @@ trx_undo_page_get_first_rec(const buf_block_t *block, uint32_t page_no, uint16_t offset) { uint16_t start= trx_undo_page_get_start(block, page_no, offset); - return start == trx_undo_page_get_end(block, page_no, offset) - ? nullptr : block->page.frame + start; + uint16_t end= trx_undo_page_get_end(block, page_no, offset); + ut_ad(start <= end); + return start >= end ? nullptr : block->page.frame + start; } /** Get the last undo log record on a page. @@ -149,8 +150,10 @@ trx_undo_rec_t* trx_undo_page_get_last_rec(const buf_block_t *block, uint32_t page_no, uint16_t offset) { + uint16_t start= trx_undo_page_get_start(block, page_no, offset); uint16_t end= trx_undo_page_get_end(block, page_no, offset); - return trx_undo_page_get_start(block, page_no, offset) == end + ut_ad(start <= end); + return start >= end ? nullptr : block->page.frame + mach_read_from_2(block->page.frame + end - 2); } @@ -510,7 +513,7 @@ trx_undo_seg_create(fil_space_t *space, buf_block_t *rseg_hdr, ulint *id, *err = flst_add_last(block, TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST, block, TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE, - mtr); + space->free_limit, mtr); *id = slot_no; mtr->write<4>(*rseg_hdr, TRX_RSEG + TRX_RSEG_UNDO_SLOTS @@ -693,7 +696,8 @@ buf_block_t *trx_undo_add_page(trx_undo_t *undo, mtr_t *mtr, dberr_t *err) mtr->undo_create(*new_block); trx_undo_page_init(*new_block); *err= flst_add_last(header_block, TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST, - new_block, TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE, mtr); + new_block, TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE, + rseg->space->free_limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) new_block= nullptr; else @@ -744,9 +748,11 @@ trx_undo_free_page( buf_page_make_young_if_needed(&header_block->page); + const uint32_t limit = rseg->space->free_limit; + *err = flst_remove(header_block, TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST, undo_block, TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE, - mtr); + limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { return FIL_NULL; @@ -755,7 +761,13 @@ trx_undo_free_page( const fil_addr_t last_addr = flst_get_last( TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST + header_block->page.frame); - if (UNIV_UNLIKELY(last_addr.page == page_no)) { + if (UNIV_UNLIKELY(last_addr.page == page_no) + || UNIV_UNLIKELY(last_addr.page != FIL_NULL + && last_addr.page >= limit) + || UNIV_UNLIKELY(last_addr.boffset < TRX_UNDO_PAGE_HDR + + TRX_UNDO_PAGE_NODE) + || UNIV_UNLIKELY(last_addr.boffset >= srv_page_size + - TRX_UNDO_LOG_OLD_HDR_SIZE)) { *err = DB_CORRUPTION; return FIL_NULL; } @@ -972,8 +984,8 @@ trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no) ut_ad(id < TRX_RSEG_N_SLOTS); mtr.start(); - const buf_block_t* block = buf_page_get( - page_id_t(rseg->space->id, page_no), 0, RW_X_LATCH, &mtr); + const page_id_t page_id{rseg->space->id, page_no}; + const buf_block_t* block = buf_page_get(page_id, 0, RW_X_LATCH, &mtr); if (UNIV_UNLIKELY(!block)) { corrupted: mtr.commit(); @@ -1075,6 +1087,15 @@ corrupted_type: fil_addr_t last_addr = flst_get_last( TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST + block->page.frame); + if (last_addr.page >= rseg->space->free_limit + || last_addr.boffset < TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE + || last_addr.boffset >= srv_page_size + - TRX_UNDO_LOG_OLD_HDR_SIZE) { + corrupted_undo: + ut_free(undo); + goto corrupted; + } + undo->last_page_no = last_addr.page; undo->top_page_no = last_addr.page; @@ -1083,8 +1104,7 @@ corrupted_type: RW_X_LATCH, &mtr); if (UNIV_UNLIKELY(!last)) { - ut_free(undo); - goto corrupted; + goto corrupted_undo; } if (const trx_undo_rec_t* rec = trx_undo_page_get_last_rec( diff --git a/storage/innobase/unittest/CMakeLists.txt b/storage/innobase/unittest/CMakeLists.txt index 7dd7c111..9330d231 100644 --- a/storage/innobase/unittest/CMakeLists.txt +++ b/storage/innobase/unittest/CMakeLists.txt @@ -17,6 +17,10 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/unittest/mytap ${CMAKE_SOURCE_DIR}/storage/innobase/include ${CMAKE_SOURCE_DIR}/tpool) +ADD_EXECUTABLE(innodb_rbt-t innodb_rbt-t.cc ../ut/ut0rbt.cc) +TARGET_LINK_LIBRARIES(innodb_rbt-t mysys mytap) +ADD_DEPENDENCIES(innodb_rbt-t GenError) +MY_ADD_TEST(innodb_rbt) ADD_EXECUTABLE(innodb_fts-t innodb_fts-t.cc) TARGET_LINK_LIBRARIES(innodb_fts-t mysys mytap) ADD_DEPENDENCIES(innodb_fts-t GenError) diff --git a/storage/innobase/unittest/innodb_rbt-t.cc b/storage/innobase/unittest/innodb_rbt-t.cc new file mode 100644 index 00000000..38b980da --- /dev/null +++ b/storage/innobase/unittest/innodb_rbt-t.cc @@ -0,0 +1,83 @@ +#include "tap.h" +#include "ut0rbt.h" +#include "ut0new.h" + +const size_t alloc_max_retries= 0; +void os_thread_sleep(ulint) { abort(); } +void ut_dbg_assertion_failed(const char *, const char *, unsigned) +{ abort(); } +namespace ib { fatal_or_error::~fatal_or_error() { abort(); } } +#ifdef UNIV_PFS_MEMORY +PSI_memory_key mem_key_other, mem_key_std; +PSI_memory_key ut_new_get_key_by_file(uint32_t) { return mem_key_std; } +#endif + +static const uint64_t doc_ids[]= +{ + 103571, 104018, 106821, 108647, 109352, 109379, + 110325, 122868, 210682130, 231275441, 234172769, 366236849, + 526467159, 1675241735, 1675243405, 1947751899, 1949940363, 2033691953, + 2148227299, 2256289791, 2294223591, 2367501260, 2792700091, 2792701220, + 2817121627, 2820680352, 2821165664, 3253312130, 3404918378, 3532599429, + 3538712078, 3539373037, 3546479309, 3566641838, 3580209634, 3580871267, + 3693930556, 3693932734, 3693932983, 3781949558, 3839877411, 3930968983 +}; + +static int fts_doc_id_cmp(const void *p1, const void *p2) +{ + uint64_t a= *static_cast(p1), + b= *static_cast(p2); + return b > a ? -1 : a > b; +} + + +static int fts_doc_id_buggy_cmp(const void *p1, const void *p2) +{ + return int(*static_cast(p1) - + *static_cast(p2)); +} + +typedef int (*comparator) (const void*, const void*); + +static void rbt_populate(ib_rbt_t *rbt) +{ + ib_rbt_bound_t parent; + for (const uint64_t &doc_id : doc_ids) + { + if (rbt_search(rbt, &parent, &doc_id)) + rbt_add_node(rbt, &parent, &doc_id); + } +} + +static void rbt_populate2(ib_rbt_t *rbt) +{ + for (const uint64_t &doc_id : doc_ids) + rbt_insert(rbt, &doc_id, &doc_id); +} + +static bool rbt_search_all(ib_rbt_t *rbt) +{ + ib_rbt_bound_t parent; + for (const uint64_t &doc_id : doc_ids) + if (rbt_search(rbt, &parent, &doc_id)) + return false; + return true; +} + +static void rbt_test(comparator cmp, bool buggy) +{ + ib_rbt_t *rbt= rbt_create(sizeof(uint64_t), cmp); + rbt_populate(rbt); + ok(rbt_search_all(rbt) != buggy, "search after populate"); + rbt_free(rbt); + rbt= rbt_create(sizeof(uint64_t), cmp); + rbt_populate2(rbt); + ok(rbt_search_all(rbt) != buggy, "search after populate2"); + rbt_free(rbt); +} + +int main () +{ + rbt_test(fts_doc_id_buggy_cmp, true); + rbt_test(fts_doc_id_cmp, false); +} diff --git a/storage/innobase/ut/ut0ut.cc b/storage/innobase/ut/ut0ut.cc index 7b69042c..5b3bc185 100644 --- a/storage/innobase/ut/ut0ut.cc +++ b/storage/innobase/ut/ut0ut.cc @@ -258,47 +258,6 @@ ut_print_name( } } -/** Format a table name, quoted as an SQL identifier. -If the name contains a slash '/', the result will contain two -identifiers separated by a period (.), as in SQL -database_name.table_name. -@see table_name_t -@param[in] name table or index name -@param[out] formatted formatted result, will be NUL-terminated -@param[in] formatted_size size of the buffer in bytes -@return pointer to 'formatted' */ -char* -ut_format_name( - const char* name, - char* formatted, - ulint formatted_size) -{ - switch (formatted_size) { - case 1: - formatted[0] = '\0'; - /* FALL-THROUGH */ - case 0: - return(formatted); - } - - char* end; - - end = innobase_convert_name(formatted, formatted_size, - name, strlen(name), NULL); - - /* If the space in 'formatted' was completely used, then sacrifice - the last character in order to write '\0' at the end. */ - if ((ulint) (end - formatted) == formatted_size) { - end--; - } - - ut_a((ulint) (end - formatted) < formatted_size); - - *end = '\0'; - - return(formatted); -} - /**********************************************************************//** Catenate files. */ void @@ -353,14 +312,16 @@ ut_strerr( return("Lock wait"); case DB_DEADLOCK: return("Deadlock"); + case DB_RECORD_CHANGED: + return("Record changed"); +#ifdef WITH_WSREP case DB_ROLLBACK: return("Rollback"); +#endif case DB_DUPLICATE_KEY: return("Duplicate key"); case DB_MISSING_HISTORY: return("Required history data has been deleted"); - case DB_CLUSTER_NOT_FOUND: - return("Cluster not found"); case DB_TABLE_NOT_FOUND: return("Table not found"); case DB_TOO_BIG_RECORD: diff --git a/storage/maria/CMakeLists.txt b/storage/maria/CMakeLists.txt index f55d78f0..426a19f0 100644 --- a/storage/maria/CMakeLists.txt +++ b/storage/maria/CMakeLists.txt @@ -124,7 +124,7 @@ ENDIF() IF (CURL_FOUND) INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIRS}) MYSQL_ADD_PLUGIN(s3 ha_s3.cc ${S3_SOURCES} COMPONENT s3-engine - LINK_LIBRARIES ${CURL_LIBRARIES} z STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf) + LINK_LIBRARIES ${CURL_LIBRARIES} ${ZLIB_LIBRARIES} STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf) ENDIF() SET(CPACK_RPM_s3-engine_PACKAGE_SUMMARY "Amazon S3 archival storage engine for MariaDB" PARENT_SCOPE) @@ -132,7 +132,7 @@ SET(CPACK_RPM_s3-engine_PACKAGE_DESCRIPTION "The S3 storage engine allows one to IF(TARGET s3) MYSQL_ADD_EXECUTABLE(aria_s3_copy aria_s3_copy.cc ${S3_SOURCES} COMPONENT s3-engine) - TARGET_LINK_LIBRARIES(aria_s3_copy aria myisam mysys mysys_ssl ${CURL_LIBRARIES} ${ZLIB_LIBRARY}) + TARGET_LINK_LIBRARIES(aria_s3_copy aria myisam mysys mysys_ssl ${CURL_LIBRARIES} ${ZLIB_LIBRARIES}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libmarias3) ADD_DEFINITIONS(-DWITH_S3_STORAGE_ENGINE) ENDIF() diff --git a/storage/maria/aria_chk.c b/storage/maria/aria_chk.c index 143110dc..4bbe513b 100644 --- a/storage/maria/aria_chk.c +++ b/storage/maria/aria_chk.c @@ -145,7 +145,8 @@ int main(int argc, char **argv) { if ((ma_control_file_open(FALSE, opt_require_control_file || !(check_param.testflag & T_SILENT), - TRUE))) + TRUE, + control_file_open_flags))) { if (opt_require_control_file || (opt_transaction_logging && (check_param.testflag & T_REP_ANY))) diff --git a/storage/maria/aria_pack.c b/storage/maria/aria_pack.c index 40e7e399..464a08fb 100644 --- a/storage/maria/aria_pack.c +++ b/storage/maria/aria_pack.c @@ -239,7 +239,8 @@ int main(int argc, char **argv) if (!opt_ignore_control_file && (no_control_file= ma_control_file_open(FALSE, (opt_require_control_file || - !silent), FALSE)) && + !silent), FALSE, + control_file_open_flags)) && opt_require_control_file) { error= 1; diff --git a/storage/maria/aria_read_log.c b/storage/maria/aria_read_log.c index c0c76ed5..2997314d 100644 --- a/storage/maria/aria_read_log.c +++ b/storage/maria/aria_read_log.c @@ -104,7 +104,7 @@ int main(int argc, char **argv) goto end; } /* we don't want to create a control file, it MUST exist */ - if (ma_control_file_open(FALSE, TRUE, TRUE)) + if (ma_control_file_open(FALSE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't open control file (%d)\n", errno); goto err; diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 66dd9867..b3b0ba0f 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -38,6 +38,7 @@ C_MODE_START #include "ma_recovery.h" C_MODE_END #include "ma_trnman.h" +#include "ma_loghandler.h" //#include "sql_priv.h" #include "protocol.h" @@ -45,6 +46,7 @@ C_MODE_END #include "key.h" #include "log.h" #include "sql_parse.h" +#include "mysql/service_print_check_msg.h" #include "debug.h" /* @@ -428,10 +430,8 @@ static void _ma_check_print_msg(HA_CHECK *param, const LEX_CSTRING *msg_type, const char *fmt, va_list args) { THD *thd= (THD *) param->thd; - Protocol *protocol= thd->protocol; - size_t length, msg_length; + size_t msg_length __attribute__((unused)); char msgbuf[MYSQL_ERRMSG_SIZE]; - char name[NAME_LEN * 2 + 2]; if (param->testflag & T_SUPPRESS_ERR_HANDLING) return; @@ -460,27 +460,10 @@ static void _ma_check_print_msg(HA_CHECK *param, const LEX_CSTRING *msg_type, _ma_check_print(param, msg_type, msgbuf); return; } - length= (uint) (strxmov(name, param->db_name, ".", param->table_name, - NullS) - name); - /* - TODO: switch from protocol to push_warning here. The main reason we didn't - it yet is parallel repair, which threads have no THD object accessible via - current_thd. - - Also we likely need to lock mutex here (in both cases with protocol and - push_warning). - */ - protocol->prepare_for_resend(); - protocol->store(name, (uint)length, system_charset_info); - protocol->store(param->op_name, strlen(param->op_name), system_charset_info); - protocol->store(msg_type, system_charset_info); - protocol->store(msgbuf, msg_length, system_charset_info); - if (protocol->write()) - sql_print_error("Failed on my_net_write, writing to stderr instead: %s.%s: %s\n", - param->db_name, param->table_name, msgbuf); - else if (thd->variables.log_warnings > 2) + print_check_msg(thd, param->db_name, param->table_name, + param->op_name, msg_type->str, msgbuf, 0); + if (thd->variables.log_warnings > 2) _ma_check_print(param, msg_type, msgbuf); - return; } @@ -1952,41 +1935,46 @@ int ha_maria::preload_keys(THD * thd, HA_CHECK_OPT *check_opt) SYNOPSIS disable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ disable all non-unique keys - HA_KEY_SWITCH_ALL disable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE dis. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE dis. all keys and make persistent - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_ALL_SAVE is not implemented. + DESCRIPTION + See handler::ha_disable_indexes() RETURN 0 ok HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_maria::disable_indexes(uint mode) +int ha_maria::disable_indexes(key_map map, bool persist) { int error; - if (mode == HA_KEY_SWITCH_ALL) + if (!persist) { /* call a storage engine function to switch the key map */ + DBUG_ASSERT(map.is_clear_all()); error= maria_disable_indexes(file); } - else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE) + else { - maria_extra(file, HA_EXTRA_NO_KEYS, 0); + /* auto-inc key cannot be disabled */ + if (table->s->next_number_index < MAX_KEY) + DBUG_ASSERT(map.is_set(table->s->next_number_index)); + + /* unique keys cannot be disabled either */ + for (uint i=0; i < table->s->keys; i++) + DBUG_ASSERT(!(table->key_info[i].flags & HA_NOSAME) || map.is_set(i)); + + ulonglong ullmap= map.to_ulonglong(); + + /* make sure auto-inc key is enabled even if it's > 64 */ + if (map.length() > MARIA_KEYMAP_BITS && + table->s->next_number_index < MAX_KEY) + maria_set_key_active(ullmap, table->s->next_number_index); + + maria_extra(file, HA_EXTRA_NO_KEYS, &ullmap); info(HA_STATUS_CONST); // Read new key info error= 0; } - else - { - /* mode not implemented */ - error= HA_ERR_WRONG_COMMAND; - } return error; } @@ -1996,21 +1984,14 @@ int ha_maria::disable_indexes(uint mode) SYNOPSIS enable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ enable all non-unique keys - HA_KEY_SWITCH_ALL enable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE en. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE en. all keys and make persistent DESCRIPTION Enable indexes, which might have been disabled by disable_index() before. - The modes without _SAVE work only if both data and indexes are empty, - since the MARIA repair would enable them persistently. + If persist=false, it works only if both data and indexes are empty, + since the Aria repair would enable them persistently. To be sure in these cases, call handler::delete_all_rows() before. - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_ALL_SAVE is not implemented. + See also handler::ha_enable_indexes() RETURN 0 ok @@ -2019,18 +2000,19 @@ int ha_maria::disable_indexes(uint mode) HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_maria::enable_indexes(uint mode) +int ha_maria::enable_indexes(key_map map, bool persist) { int error; ha_rows start_rows= file->state->records; - DBUG_PRINT("info", ("ha_maria::enable_indexes mode: %d", mode)); + DBUG_PRINT("info", ("ha_maria::enable_indexes mode: %d", persist)); if (maria_is_all_keys_active(file->s->state.key_map, file->s->base.keys)) { /* All indexes are enabled already. */ return 0; } - if (mode == HA_KEY_SWITCH_ALL) + DBUG_ASSERT(map.is_prefix(table->s->keys)); + if (!persist) { error= maria_enable_indexes(file); /* @@ -2039,7 +2021,7 @@ int ha_maria::enable_indexes(uint mode) but mode==HA_KEY_SWITCH_ALL forbids it. */ } - else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE) + else { THD *thd= table->in_use; HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param); @@ -2104,11 +2086,6 @@ int ha_maria::enable_indexes(uint mode) info(HA_STATUS_CONST); thd_proc_info(thd, save_proc_info); } - else - { - /* mode not implemented */ - error= HA_ERR_WRONG_COMMAND; - } DBUG_EXECUTE_IF("maria_flush_whole_log", { DBUG_PRINT("maria_flush_whole_log", ("now")); @@ -2311,7 +2288,7 @@ int ha_maria::end_bulk_insert() { int first_error, first_errno= 0, error; my_bool abort= file->s->deleting, empty_table= 0; - uint enable_index_mode= HA_KEY_SWITCH_NONUNIQ_SAVE; + bool enable_persistently= true; DBUG_ENTER("ha_maria::end_bulk_insert"); if ((first_error= maria_end_bulk_insert(file, abort))) @@ -2340,7 +2317,7 @@ int ha_maria::end_bulk_insert() first_error= 1; first_errno= my_errno; } - enable_index_mode= HA_KEY_SWITCH_ALL; + enable_persistently= false; empty_table= 1; /* Ignore all changed pages, required by _ma_renable_logging_for_table() @@ -2352,7 +2329,7 @@ int ha_maria::end_bulk_insert() if (!abort && can_enable_indexes) { - if ((error= enable_indexes(enable_index_mode))) + if ((error= enable_indexes(key_map(table->s->keys), enable_persistently))) { if (!first_error) { @@ -3361,6 +3338,8 @@ int ha_maria::create(const char *name, TABLE *table_arg, if (ha_create_info->tmp_table()) { create_flags|= HA_CREATE_TMP_TABLE | HA_CREATE_DELAY_KEY_WRITE; + if (ha_create_info->options & HA_LEX_CREATE_GLOBAL_TMP_TABLE) + create_flags|= HA_CREATE_GLOBAL_TMP_TABLE; create_info.transactional= 0; } if (ha_create_info->options & HA_CREATE_KEEP_FILES) @@ -3894,7 +3873,8 @@ static int ha_maria_init(void *p) if (!aria_readonly) res= maria_upgrade(); res= res || maria_init(); - tmp= ma_control_file_open(!aria_readonly, !aria_readonly, !aria_readonly); + tmp= ma_control_file_open(!aria_readonly, !aria_readonly, !aria_readonly, + control_file_open_flags); res= res || aria_readonly ? tmp == CONTROL_FILE_LOCKED : tmp != 0; res= res || ((force_start_after_recovery_failures != 0 && !aria_readonly) && diff --git a/storage/maria/ha_maria.h b/storage/maria/ha_maria.h index 2b8b5dc9..41f64436 100644 --- a/storage/maria/ha_maria.h +++ b/storage/maria/ha_maria.h @@ -122,8 +122,8 @@ public: int external_lock(THD * thd, int lock_type) override; int start_stmt(THD *thd, thr_lock_type lock_type) override final; int delete_all_rows(void) override final; - int disable_indexes(uint mode) override final; - int enable_indexes(uint mode) override final; + int disable_indexes(key_map map, bool persist) override final; + int enable_indexes(key_map map, bool persist) override final; int indexes_are_disabled(void) override final; void start_bulk_insert(ha_rows rows, uint flags) override final; int end_bulk_insert() override final; diff --git a/storage/maria/ma_bitmap.c b/storage/maria/ma_bitmap.c index 61fe4f9d..91f93755 100644 --- a/storage/maria/ma_bitmap.c +++ b/storage/maria/ma_bitmap.c @@ -232,7 +232,7 @@ my_bool _ma_bitmap_init(MARIA_SHARE *share, File file, uint max_page_size; MARIA_FILE_BITMAP *bitmap= &share->bitmap; uint size= share->block_size; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf flag= MY_WME | share->malloc_flag; pgcache_page_no_t first_bitmap_with_space; #ifndef DBUG_OFF /* We want to have a copy of the bitmap to be able to print differences */ diff --git a/storage/maria/ma_blockrec.c b/storage/maria/ma_blockrec.c index 543ddcca..561cc324 100644 --- a/storage/maria/ma_blockrec.c +++ b/storage/maria/ma_blockrec.c @@ -488,7 +488,7 @@ my_bool _ma_init_block_record(MARIA_HA *info) { MARIA_ROW *row= &info->cur_row, *new_row= &info->new_row; MARIA_SHARE *share= info->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf flag= MY_WME | share->malloc_flag; uint default_extents; DBUG_ENTER("_ma_init_block_record"); @@ -2654,7 +2654,6 @@ static my_bool write_block_record(MARIA_HA *info, LSN lsn; my_off_t position; uint save_my_errno; - myf myflag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); DBUG_ENTER("write_block_record"); head_block= bitmap_blocks->block; @@ -2721,7 +2720,7 @@ static my_bool write_block_record(MARIA_HA *info, for every data segment we want to store. */ if (_ma_alloc_buffer(&info->rec_buff, &info->rec_buff_size, - row->head_length, myflag)) + row->head_length, MY_WME | share->malloc_flag)) DBUG_RETURN(1); tmp_data_used= 0; /* Either 0 or last used uchar in 'data' */ @@ -4750,7 +4749,7 @@ int _ma_read_block_record2(MARIA_HA *info, uchar *record, MARIA_EXTENT_CURSOR extent; MARIA_COLUMNDEF *column, *end_column; MARIA_ROW *cur_row= &info->cur_row; - myf myflag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf myflag= MY_WME | share->malloc_flag; DBUG_ENTER("_ma_read_block_record2"); start_of_data= data; @@ -5089,7 +5088,6 @@ static my_bool read_row_extent_info(MARIA_HA *info, uchar *buff, uint flag, row_extents, row_extents_size; uint field_lengths __attribute__ ((unused)); uchar *extents, *end; - myf myflag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); DBUG_ENTER("read_row_extent_info"); if (!(data= get_record_position(share, buff, @@ -5113,7 +5111,7 @@ static my_bool read_row_extent_info(MARIA_HA *info, uchar *buff, if (info->cur_row.extents_buffer_length < row_extents_size && _ma_alloc_buffer(&info->cur_row.extents, &info->cur_row.extents_buffer_length, - row_extents_size, myflag)) + row_extents_size, MY_WME | share->malloc_flag)) DBUG_RETURN(1); memcpy(info->cur_row.extents, data, ROW_EXTENT_SIZE); data+= ROW_EXTENT_SIZE; @@ -5283,7 +5281,7 @@ my_bool _ma_cmp_block_unique(MARIA_HA *info, MARIA_UNIQUEDEF *def, my_bool _ma_scan_init_block_record(MARIA_HA *info) { MARIA_SHARE *share= info->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf flag= MY_WME | share->malloc_flag; DBUG_ENTER("_ma_scan_init_block_record"); DBUG_ASSERT(info->dfile.file == share->bitmap.file.file); diff --git a/storage/maria/ma_check.c b/storage/maria/ma_check.c index 1f6aa2ee..e4ba0726 100644 --- a/storage/maria/ma_check.c +++ b/storage/maria/ma_check.c @@ -125,6 +125,7 @@ void maria_chk_init(HA_CHECK *param) param->max_stage= 1; param->stack_end_ptr= &my_thread_var->stack_ends_here; param->max_allowed_lsn= (LSN) ~0ULL; + /* Flag when initializing buffers possible used by parallel repair threads */ param->malloc_flags= MY_THREAD_SPECIFIC; } @@ -1305,7 +1306,6 @@ static int check_dynamic_record(HA_CHECK *param, MARIA_HA *info, int extend, ulong UNINIT_VAR(left_length); uint b_type; char llbuff[22],llbuff2[22],llbuff3[22]; - myf myflag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); DBUG_ENTER("check_dynamic_record"); pos= 0; @@ -1413,7 +1413,8 @@ static int check_dynamic_record(HA_CHECK *param, MARIA_HA *info, int extend, { if (_ma_alloc_buffer(&info->rec_buff, &info->rec_buff_size, block_info.rec_len + - share->base.extra_rec_buff_size, myflag)) + share->base.extra_rec_buff_size, + MY_WME | share->malloc_flag)) { _ma_check_print_error(param, @@ -2130,7 +2131,7 @@ int maria_chk_data_link(HA_CHECK *param, MARIA_HA *info, my_bool extend) if (!(record= (uchar*) my_malloc(PSI_INSTRUMENT_ME, share->base.default_rec_buff_size, - MYF(param->malloc_flags)))) + MYF(MY_THREAD_SPECIFIC)))) { _ma_check_print_error(param,"Not enough memory for record"); DBUG_RETURN(-1); @@ -2507,6 +2508,11 @@ static int initialize_variables_for_repair(HA_CHECK *param, maria_versioning(info, 0); /* remember original number of rows */ *info->state= info->s->state.state; + if (share->data_file_type == BLOCK_RECORD) + share->state.state.data_file_length= MY_ALIGN(sort_info->filelength, + share->block_size); + else + share->state.state.data_file_length= sort_info->filelength; return 0; } @@ -2743,7 +2749,7 @@ int maria_repair(HA_CHECK *param, register MARIA_HA *info, READ_CACHE, share->pack.header_length, 1, MYF(MY_WME))) goto err; } - if (sort_info.new_info->s->data_file_type != BLOCK_RECORD) + if (!block_record) { /* When writing to not block records, we need a write buffer */ if (!rep_quick) @@ -2756,7 +2762,7 @@ int maria_repair(HA_CHECK *param, register MARIA_HA *info, sort_info.new_info->opt_flag|=WRITE_CACHE_USED; } } - else if (block_record) + else { scan_inited= 1; if (maria_scan_init(sort_info.info)) @@ -2766,10 +2772,10 @@ int maria_repair(HA_CHECK *param, register MARIA_HA *info, if (!(sort_param.record= (uchar *) my_malloc(PSI_INSTRUMENT_ME, (uint) share->base.default_rec_buff_size, - MYF(param->malloc_flags))) || + MYF(MY_THREAD_SPECIFIC))) || _ma_alloc_buffer(&sort_param.rec_buff, &sort_param.rec_buff_size, share->base.default_rec_buff_size, - MYF(param->malloc_flags))) + MYF(MY_THREAD_SPECIFIC))) { _ma_check_print_error(param, "Not enough memory for extra record"); goto err; @@ -3389,7 +3395,7 @@ static int sort_one_index(HA_CHECK *param, MARIA_HA *info, length= page.size; bzero(buff+length,keyinfo->block_length-length); if (write_page(share, new_file, buff, keyinfo->block_length, - new_page_pos, MYF(MY_NABP | MY_WAIT_IF_FULL))) + new_page_pos, MYF(MY_NABP | MY_WAIT_IF_FULL) & param->myf_rw)) { _ma_check_print_error(param,"Can't write indexblock, error: %d",my_errno); goto err; @@ -3721,7 +3727,7 @@ int maria_filecopy(HA_CHECK *param, File to,File from,my_off_t start, buff_length=(ulong) MY_MIN(param->write_buffer_length,length); if (!(buff=my_malloc(PSI_INSTRUMENT_ME, buff_length, - MYF(param->malloc_flags)))) + MYF(MY_THREAD_SPECIFIC)))) { buff=tmp_buff; buff_length=IO_SIZE; } @@ -3867,10 +3873,10 @@ int maria_repair_by_sort(HA_CHECK *param, register MARIA_HA *info, if (!(sort_param.record= (uchar*) my_malloc(PSI_INSTRUMENT_ME, (size_t) share->base.default_rec_buff_size, - MYF(param->malloc_flags))) || + MYF(MY_THREAD_SPECIFIC))) || _ma_alloc_buffer(&sort_param.rec_buff, &sort_param.rec_buff_size, share->base.default_rec_buff_size, - MYF(param->malloc_flags))) + MYF(MY_THREAD_SPECIFIC))) { _ma_check_print_error(param, "Not enough memory for extra record"); goto err; @@ -3889,7 +3895,7 @@ int maria_repair_by_sort(HA_CHECK *param, register MARIA_HA *info, sort_param.wordlist=NULL; init_alloc_root(PSI_INSTRUMENT_ME, &sort_param.wordroot, FTPARSER_MEMROOT_ALLOC_SIZE, 0, - MYF(param->malloc_flags)); + MYF(MY_THREAD_SPECIFIC)); sort_param.key_cmp=sort_key_cmp; sort_param.lock_in_memory=maria_lock_memory; @@ -4109,6 +4115,9 @@ int maria_repair_by_sort(HA_CHECK *param, register MARIA_HA *info, _ma_check_print_error(param, "Couldn't change to new data file"); goto err; } + /* Inform sort_delete_record that we are using the new file */ + sort_info.new_info->dfile.file= info->rec_cache.file= info->dfile.file; + if (param->testflag & T_UNPACK) restore_data_file_type(share); @@ -4457,7 +4466,7 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info, if (!(sort_param=(MARIA_SORT_PARAM *) my_malloc(PSI_INSTRUMENT_ME, (uint) share->base.keys * (sizeof(MARIA_SORT_PARAM) + share->base.pack_reclength), - MYF(MY_ZEROFILL | param->malloc_flags)))) + MYF(MY_ZEROFILL | MY_THREAD_SPECIFIC)))) { _ma_check_print_error(param,"Not enough memory for key!"); goto err; @@ -4515,9 +4524,10 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info, sort_param[i].record= (((uchar *)(sort_param+share->base.keys))+ (share->base.pack_reclength * i)); + /* These buffers are per thread */ if (_ma_alloc_buffer(&sort_param[i].rec_buff, &sort_param[i].rec_buff_size, share->base.default_rec_buff_size, - MYF(param->malloc_flags))) + MYF(0))) { _ma_check_print_error(param,"Not enough memory!"); goto err; @@ -4546,7 +4556,7 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info, sort_param[i].key_length+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN; init_alloc_root(PSI_INSTRUMENT_ME, &sort_param[i].wordroot, FTPARSER_MEMROOT_ALLOC_SIZE, 0, - MYF(param->malloc_flags)); + MYF(MY_THREAD_SPECIFIC)); } } sort_info.total_keys=i; @@ -6105,7 +6115,7 @@ static MA_SORT_KEY_BLOCKS *alloc_key_blocks(HA_CHECK *param, uint blocks, if (!(block= (MA_SORT_KEY_BLOCKS*) my_malloc(PSI_INSTRUMENT_ME, (sizeof(MA_SORT_KEY_BLOCKS)+buffer_length+IO_SIZE)*blocks, - MYF(param->malloc_flags)))) + MYF(MY_THREAD_SPECIFIC)))) { _ma_check_print_error(param,"Not enough memory for sort-key-blocks"); return(0); diff --git a/storage/maria/ma_control_file.c b/storage/maria/ma_control_file.c index 21befb70..03513c46 100644 --- a/storage/maria/ma_control_file.c +++ b/storage/maria/ma_control_file.c @@ -272,7 +272,8 @@ static int lock_control_file(const char *name, my_bool do_retry) CONTROL_FILE_ERROR ma_control_file_open(my_bool create_if_missing, my_bool print_error, - my_bool wait_for_lock) + my_bool wait_for_lock, + int open_flags) { uchar buffer[CF_MAX_SIZE]; char name[FN_REFLEN], errmsg_buff[256]; @@ -280,7 +281,6 @@ CONTROL_FILE_ERROR ma_control_file_open(my_bool create_if_missing, " file is probably in use by another process"; uint new_cf_create_time_size, new_cf_changeable_size, new_block_size; my_off_t file_size; - int open_flags= O_BINARY | /*O_DIRECT |*/ O_RDWR | O_CLOEXEC; int error= CONTROL_FILE_UNKNOWN_ERROR; DBUG_ENTER("ma_control_file_open"); @@ -460,6 +460,15 @@ err: DBUG_RETURN(error); } +/* + The most common way to open the control file when writing tests +*/ + +CONTROL_FILE_ERROR ma_control_file_open_or_create() +{ + return ma_control_file_open(TRUE, TRUE, TRUE, + control_file_open_flags); +} /* Write information durably to the control file; stores this information into @@ -630,7 +639,7 @@ my_bool print_aria_log_control() int error= CONTROL_FILE_UNKNOWN_ERROR; uint recovery_fails; File file; - DBUG_ENTER("ma_control_file_open"); + DBUG_ENTER("print_aria_log_control"); if (fn_format(name, CONTROL_FILE_BASE_NAME, maria_data_root, "", MYF(MY_WME)) == NullS) diff --git a/storage/maria/ma_control_file.h b/storage/maria/ma_control_file.h index 40428f66..b2b95e36 100644 --- a/storage/maria/ma_control_file.h +++ b/storage/maria/ma_control_file.h @@ -68,10 +68,13 @@ typedef enum enum_control_file_error { CONTROL_FILE_ERROR ma_control_file_open(my_bool create_if_missing, my_bool print_error, - my_bool wait_for_lock); + my_bool wait_for_lock, + int open_flags); int ma_control_file_write_and_force(LSN last_checkpoint_lsn_arg, uint32 last_logno_arg, TrID max_trid_arg, uint8 recovery_failures_arg); +/* For simple programs that creates Aria files*/ +CONTROL_FILE_ERROR ma_control_file_open_or_create(); int ma_control_file_end(void); my_bool ma_control_file_inited(void); my_bool print_aria_log_control(void); diff --git a/storage/maria/ma_create.c b/storage/maria/ma_create.c index 7fd739d1..9ce48ae9 100644 --- a/storage/maria/ma_create.c +++ b/storage/maria/ma_create.c @@ -101,7 +101,7 @@ int maria_create(const char *name, enum data_file_type datafile_type, DBUG_ASSERT(maria_inited); - if (flags & HA_CREATE_TMP_TABLE) + if ((flags & HA_CREATE_TMP_TABLE) && !(flags & HA_CREATE_GLOBAL_TMP_TABLE)) common_flag|= MY_THREAD_SPECIFIC; if (!ci) diff --git a/storage/maria/ma_dynrec.c b/storage/maria/ma_dynrec.c index 33f238d9..fed1bf41 100644 --- a/storage/maria/ma_dynrec.c +++ b/storage/maria/ma_dynrec.c @@ -1488,7 +1488,6 @@ int _ma_read_dynamic_record(MARIA_HA *info, uchar *buf, uchar *UNINIT_VAR(to); uint UNINIT_VAR(left_length); MARIA_SHARE *share= info->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); DBUG_ENTER("_ma_read_dynamic_record"); if (filepos == HA_OFFSET_ERROR) @@ -1525,7 +1524,8 @@ int _ma_read_dynamic_record(MARIA_HA *info, uchar *buf, { if (_ma_alloc_buffer(&info->rec_buff, &info->rec_buff_size, block_info.rec_len + - share->base.extra_rec_buff_size, flag)) + share->base.extra_rec_buff_size, + MY_WME | share->malloc_flag)) goto err; } to= info->rec_buff; @@ -1784,7 +1784,6 @@ int _ma_read_rnd_dynamic_record(MARIA_HA *info, uchar *UNINIT_VAR(to); MARIA_BLOCK_INFO block_info; MARIA_SHARE *share= info->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); DBUG_ENTER("_ma_read_rnd_dynamic_record"); #ifdef MARIA_EXTERNAL_LOCKING @@ -1875,7 +1874,8 @@ int _ma_read_rnd_dynamic_record(MARIA_HA *info, { if (_ma_alloc_buffer(&info->rec_buff, &info->rec_buff_size, block_info.rec_len + - share->base.extra_rec_buff_size, flag)) + share->base.extra_rec_buff_size, + MY_WME | share->malloc_flag)) goto err; } to= info->rec_buff; diff --git a/storage/maria/ma_extra.c b/storage/maria/ma_extra.c index 425cb421..9ffc551c 100644 --- a/storage/maria/ma_extra.c +++ b/storage/maria/ma_extra.c @@ -239,25 +239,17 @@ int maria_extra(MARIA_HA *info, enum ha_extra_function function, break; /* we're going to modify pieces of the state, stall Checkpoint */ - mysql_mutex_lock(&share->intern_lock); if (info->lock_type == F_UNLCK) { - mysql_mutex_unlock(&share->intern_lock); error= 1; /* Not possibly if not lock */ break; } + mysql_mutex_lock(&share->intern_lock); if (maria_is_any_key_active(share->state.key_map)) { - MARIA_KEYDEF *key= share->keyinfo; - uint i; - for (i =0 ; i < share->base.keys ; i++,key++) - { - if (!(key->flag & HA_NOSAME) && info->s->base.auto_key != i+1) - { - maria_clear_key_active(share->state.key_map, i); - info->update|= HA_STATE_CHANGED; - } - } + if (share->state.key_map != *(ulonglong*)extra_arg) + info->update|= HA_STATE_CHANGED; + share->state.key_map= *(ulonglong*)extra_arg; if (!share->changed) { @@ -542,7 +534,7 @@ int maria_reset(MARIA_HA *info) { int error= 0; MARIA_SHARE *share= info->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf flag= MY_WME | share->malloc_flag; DBUG_ENTER("maria_reset"); /* Free buffers and reset the following flags: @@ -601,6 +593,20 @@ uint _ma_file_callback_to_id(void *callback_data) return share ? share->id : 0; } +/* + Disable MY_WAIT_IF_FULL flag for temporary tables + + Temporary tables does not have MY_WAIT_IF_FULL in share->write_flags +*/ + +uint _ma_write_flags_callback(void *callback_data, myf flags) +{ + MARIA_SHARE *share= (MARIA_SHARE*) callback_data; + if (share) + flags&= ~(~share->write_flag & MY_WAIT_IF_FULL); + return flags; +} + /** @brief flushes the data and/or index file of a table diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c index bfeb5e0c..05347b2d 100644 --- a/storage/maria/ma_loghandler.c +++ b/storage/maria/ma_loghandler.c @@ -1099,10 +1099,6 @@ static TRANSLOG_FILE *get_current_logfile() uchar maria_trans_file_magic[]= { (uchar) 254, (uchar) 254, (uchar) 11, '\001', 'M', 'A', 'R', 'I', 'A', 'L', 'O', 'G' }; -#define LOG_HEADER_DATA_SIZE (sizeof(maria_trans_file_magic) + \ - 8 + 4 + 4 + 4 + 2 + 3 + \ - LSN_STORE_SIZE) - /* Write log file page header in the just opened new log file @@ -3605,6 +3601,9 @@ static my_bool translog_is_LSN_chunk(uchar type) @retval 1 Error */ +/* Stack size 26120 from clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + my_bool translog_init_with_table(const char *directory, uint32 log_file_max_size, uint32 server_version, @@ -4238,6 +4237,7 @@ err: ma_message_no_user(0, "log initialization failed"); DBUG_RETURN(1); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /* diff --git a/storage/maria/ma_loghandler.h b/storage/maria/ma_loghandler.h index 3e5c58a8..db592adf 100644 --- a/storage/maria/ma_loghandler.h +++ b/storage/maria/ma_loghandler.h @@ -534,5 +534,13 @@ typedef enum } enum_maria_sync_log_dir; extern ulong sync_log_dir; +/* sizeof(maria_trans_file_magic) */ +#define LOG_MAGIC_SIZE 12 +#define LOG_HEADER_DATA_SIZE (LOG_MAGIC_SIZE + \ + 8 + 4 + 4 + 4 + 2 + 3 + \ + LSN_STORE_SIZE) +/* Flags when creating aria_log_control */ +#define control_file_open_flags (O_BINARY | /*O_DIRECT |*/ O_RDWR | O_CLOEXEC) + C_MODE_END #endif diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index ad98a534..35578877 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -94,7 +94,7 @@ static MARIA_HA *maria_clone_internal(MARIA_SHARE *share, uint errpos; MARIA_HA info,*m_info; my_bitmap_map *changed_fields_bitmap; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf flag= MY_WME | share->malloc_flag; DBUG_ENTER("maria_clone_internal"); errpos= 0; @@ -171,7 +171,6 @@ static MARIA_HA *maria_clone_internal(MARIA_SHARE *share, mysql_mutex_lock(&share->intern_lock); info.read_record= share->read_record; share->reopen++; - share->write_flag=MYF(MY_NABP | MY_WAIT_IF_FULL); if (share->options & HA_OPTION_READ_ONLY_DATA) { info.lock_type=F_RDLCK; @@ -266,7 +265,9 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags, uint i,j,len,errpos,head_length,base_pos,keys, realpath_err, key_parts,base_key_parts,unique_key_parts,fulltext_keys,uniques; uint internal_table= MY_TEST(open_flags & HA_OPEN_INTERNAL_TABLE); - myf common_flag= open_flags & HA_OPEN_TMP_TABLE ? MY_THREAD_SPECIFIC : 0; + myf common_flag= (((open_flags & HA_OPEN_TMP_TABLE) && + !(open_flags & HA_OPEN_GLOBAL_TMP_TABLE)) ? + MY_THREAD_SPECIFIC : 0); uint file_version; size_t info_length; char name_buff[FN_REFLEN], org_name[FN_REFLEN], index_name[FN_REFLEN], @@ -984,11 +985,13 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags, share->options|= HA_OPTION_READ_ONLY_DATA; share->is_log_table= FALSE; + share->write_flag=MYF(MY_NABP | MY_WAIT_IF_FULL); if (open_flags & HA_OPEN_TMP_TABLE || share->options & HA_OPTION_TMP_TABLE) { - common_flag|= MY_THREAD_SPECIFIC; share->options|= HA_OPTION_TMP_TABLE; share->temporary= share->delay_key_write= 1; + share->malloc_flag= + (open_flags & HA_OPEN_GLOBAL_TMP_TABLE) ? 0 : MY_THREAD_SPECIFIC; share->write_flag=MYF(MY_NABP); share->w_locks++; /* We don't have to update status */ share->tot_locks++; @@ -1555,6 +1558,9 @@ uint _ma_state_info_write(MARIA_SHARE *share, uint pWrite) @retval 1 Error */ +/* Stack size 26376 from clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + uint _ma_state_info_write_sub(File file, MARIA_STATE_INFO *state, uint pWrite) { uchar buff[MARIA_STATE_INFO_SIZE + MARIA_STATE_EXTRA_SIZE]; @@ -1629,6 +1635,7 @@ uint _ma_state_info_write_sub(File file, MARIA_STATE_INFO *state, uint pWrite) MYF(MY_NABP)); DBUG_RETURN(res != 0); } +PRAGMA_REENABLE_CHECK_STACK_FRAME static uchar *_ma_state_info_read(uchar *ptr, MARIA_STATE_INFO *state, myf flag) @@ -2046,9 +2053,8 @@ void _ma_set_index_pagecache_callbacks(PAGECACHE_FILE *file, int _ma_open_datafile(MARIA_HA *info, MARIA_SHARE *share) { - myf flags= (share->mode & O_NOFOLLOW) ? MY_NOSYMLINKS | MY_WME : MY_WME; - if (share->temporary) - flags|= MY_THREAD_SPECIFIC; + myf flags= ((share->mode & O_NOFOLLOW) ? MY_NOSYMLINKS | MY_WME : MY_WME) | + share->malloc_flag; DEBUG_SYNC_C("mi_open_datafile"); info->dfile.file= share->bitmap.file.file= mysql_file_open(key_file_dfile, share->data_file_name.str, diff --git a/storage/maria/ma_packrec.c b/storage/maria/ma_packrec.c index 19783423..57926ee4 100644 --- a/storage/maria/ma_packrec.c +++ b/storage/maria/ma_packrec.c @@ -1417,7 +1417,6 @@ uint _ma_pack_get_block_info(MARIA_HA *maria, MARIA_BIT_BUFF *bit_buff, uchar *header= info->header; uint head_length,UNINIT_VAR(ref_length); MARIA_SHARE *share= maria->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); if (file >= 0) { @@ -1444,7 +1443,8 @@ uint _ma_pack_get_block_info(MARIA_HA *maria, MARIA_BIT_BUFF *bit_buff, */ if (_ma_alloc_buffer(rec_buff_p, rec_buff_size_p, info->rec_len + info->blob_len + - share->base.extra_rec_buff_size, flag)) + share->base.extra_rec_buff_size, + MY_WME | share->malloc_flag)) return BLOCK_FATAL_ERROR; /* not enough memory */ bit_buff->blob_pos= *rec_buff_p + info->rec_len; bit_buff->blob_end= bit_buff->blob_pos + info->blob_len; @@ -1586,7 +1586,6 @@ _ma_mempack_get_block_info(MARIA_HA *maria, uchar *header) { MARIA_SHARE *share= maria->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); header+= read_pack_length((uint) share->pack.version, header, &info->rec_len); @@ -1596,7 +1595,8 @@ _ma_mempack_get_block_info(MARIA_HA *maria, &info->blob_len); /* _ma_alloc_rec_buff sets my_errno on error */ if (_ma_alloc_buffer(rec_buff_p, rec_buff_size_p, - info->blob_len + share->base.extra_rec_buff_size, flag)) + info->blob_len + share->base.extra_rec_buff_size, + MY_WME | share->malloc_flag)) return 0; /* not enough memory */ bit_buff->blob_pos= *rec_buff_p; bit_buff->blob_end= *rec_buff_p + info->blob_len; diff --git a/storage/maria/ma_pagecache.c b/storage/maria/ma_pagecache.c index 144b10a8..49981e79 100644 --- a/storage/maria/ma_pagecache.c +++ b/storage/maria/ma_pagecache.c @@ -687,6 +687,8 @@ static my_bool pagecache_fwrite(PAGECACHE *pagecache, /* FIXME: ENGINE=Aria occasionally writes uninitialized data */ __msan_unpoison(args.page, pagecache->block_size); #endif + /* Reset MY_WAIT_IF_FULL for temporary tables */ + flags= _ma_write_flags_callback(filedesc->callback_data, flags); res= (int)my_pwrite(filedesc->file, args.page, pagecache->block_size, ((my_off_t) pageno << pagecache->shift), flags); (*filedesc->post_write_hook)(res, &args); diff --git a/storage/maria/ma_recovery.c b/storage/maria/ma_recovery.c index 006c8bef..df9b2024 100644 --- a/storage/maria/ma_recovery.c +++ b/storage/maria/ma_recovery.c @@ -1163,11 +1163,12 @@ end: /* The record may come from REPAIR, ALTER TABLE ENABLE KEYS, OPTIMIZE. */ + prototype_redo_exec_hook(REDO_REPAIR_TABLE) { int error= 1; MARIA_HA *info; - HA_CHECK param; + HA_CHECK *param; char *name; my_bool quick_repair; DBUG_ENTER("exec_REDO_LOGREC_REDO_REPAIR_TABLE"); @@ -1199,35 +1200,39 @@ prototype_redo_exec_hook(REDO_REPAIR_TABLE) */ tprint(tracef, " repairing...\n"); - maria_chk_init(¶m); - param.isam_file_name= name= info->s->open_file_name.str; - param.testflag= uint8korr(rec->header + FILEID_STORE_SIZE); - param.tmpdir= maria_tmpdir; - param.max_trid= max_long_trid; + if (!(param= my_malloc(PSI_INSTRUMENT_ME, sizeof(*param), MYF(MY_WME)))) + DBUG_RETURN(0); + + maria_chk_init(param); + param->isam_file_name= name= info->s->open_file_name.str; + param->testflag= uint8korr(rec->header + FILEID_STORE_SIZE); + param->tmpdir= maria_tmpdir; + param->max_trid= max_long_trid; DBUG_ASSERT(maria_tmpdir); info->s->state.key_map= uint8korr(rec->header + FILEID_STORE_SIZE + 8); - quick_repair= MY_TEST(param.testflag & T_QUICK); + quick_repair= MY_TEST(param->testflag & T_QUICK); - if (param.testflag & T_REP_PARALLEL) + if (param->testflag & T_REP_PARALLEL) { - if (maria_repair_parallel(¶m, info, name, quick_repair)) + if (maria_repair_parallel(param, info, name, quick_repair)) goto end; } - else if (param.testflag & T_REP_BY_SORT) + else if (param->testflag & T_REP_BY_SORT) { - if (maria_repair_by_sort(¶m, info, name, quick_repair)) + if (maria_repair_by_sort(param, info, name, quick_repair)) goto end; } - else if (maria_repair(¶m, info, name, quick_repair)) + else if (maria_repair(param, info, name, quick_repair)) goto end; if (_ma_update_state_lsns(info->s, rec->lsn, trnman_get_min_safe_trid(), - TRUE, !(param.testflag & T_NO_CREATE_RENAME_LSN))) + TRUE, !(param->testflag & T_NO_CREATE_RENAME_LSN))) goto end; error= 0; end: + my_free(param); DBUG_RETURN(error); } @@ -2579,6 +2584,8 @@ prototype_undo_exec_hook(UNDO_BULK_INSERT) return error; } +/* Stack size 18776 in clang. Ok as this is during recover */ +PRAGMA_DISABLE_CHECK_STACK_FRAME static int run_redo_phase(LSN lsn, LSN lsn_end, enum maria_apply_log_way apply) { @@ -2822,6 +2829,7 @@ err: translog_free_record_header(&rec); DBUG_RETURN(1); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** diff --git a/storage/maria/ma_rt_test.c b/storage/maria/ma_rt_test.c index 3af7d938..17145231 100644 --- a/storage/maria/ma_rt_test.c +++ b/storage/maria/ma_rt_test.c @@ -101,7 +101,7 @@ int main(int argc, char *argv[]) if (maria_init() || (init_pagecache(maria_pagecache, maria_block_size * 16, 0, 0, maria_block_size, 0, MY_WME) == 0) || - ma_control_file_open(TRUE, TRUE, TRUE) || + ma_control_file_open_or_create() || (init_pagecache(maria_log_pagecache, TRANSLOG_PAGECACHE_SIZE, 0, 0, TRANSLOG_PAGE_SIZE, 0, MY_WME) == 0) || diff --git a/storage/maria/ma_test1.c b/storage/maria/ma_test1.c index 22f80ca2..a14679d3 100644 --- a/storage/maria/ma_test1.c +++ b/storage/maria/ma_test1.c @@ -81,7 +81,7 @@ int main(int argc,char *argv[]) if (maria_init() || (init_pagecache(maria_pagecache, maria_block_size * 16, 0, 0, maria_block_size, 0, MY_WME) == 0) || - ma_control_file_open(TRUE, TRUE, TRUE) || + ma_control_file_open_or_create() || (init_pagecache(maria_log_pagecache, TRANSLOG_PAGECACHE_SIZE, 0, 0, TRANSLOG_PAGE_SIZE, 0, MY_WME) == 0) || diff --git a/storage/maria/ma_test2.c b/storage/maria/ma_test2.c index 66284653..400e6193 100644 --- a/storage/maria/ma_test2.c +++ b/storage/maria/ma_test2.c @@ -90,7 +90,7 @@ int main(int argc, char *argv[]) if (maria_init() || (init_pagecache(maria_pagecache, pagecache_size, 0, 0, maria_block_size, 0, MY_WME) == 0) || - ma_control_file_open(TRUE, TRUE, TRUE) || + ma_control_file_open_or_create() || (init_pagecache(maria_log_pagecache, TRANSLOG_PAGECACHE_SIZE, 0, 0, TRANSLOG_PAGE_SIZE, 0, MY_WME) == 0) || diff --git a/storage/maria/maria_def.h b/storage/maria/maria_def.h index 91e1b10a..b12f21e3 100644 --- a/storage/maria/maria_def.h +++ b/storage/maria/maria_def.h @@ -754,6 +754,11 @@ typedef struct st_maria_share ulong max_pack_length; ulong state_diff_length; uint rec_reflength; /* rec_reflength in use now */ + /* + Extra flag to use for my_malloc(); set to MY_THREAD_SPECIFIC for temporary + tables whose memory allocation should be accounted to the current THD. + */ + uint malloc_flag; uint keypage_header; uint32 ftkeys; /* Number of distinct full-text keys + 1 */ @@ -1740,6 +1745,7 @@ extern my_bool ma_yield_and_check_if_killed(MARIA_HA *info, int inx); extern my_bool ma_killed_standalone(MARIA_HA *); extern uint _ma_file_callback_to_id(void *callback_data); +extern uint _ma_write_flags_callback(void *callback_data, myf flags); extern void free_maria_share(MARIA_SHARE *share); static inline void unmap_file(MARIA_HA *info __attribute__((unused))) diff --git a/storage/maria/test_ma_backup.c b/storage/maria/test_ma_backup.c index c57ec6ec..5cb2b074 100644 --- a/storage/maria/test_ma_backup.c +++ b/storage/maria/test_ma_backup.c @@ -47,7 +47,7 @@ int main(int argc __attribute__((unused)), char *argv[]) if (maria_init() || (init_pagecache(maria_pagecache, maria_block_size * 2000, 0, 0, maria_block_size, 0, MY_WME) == 0) || - ma_control_file_open(TRUE, TRUE, TRUE) || + ma_control_file_open_or_create() || (init_pagecache(maria_log_pagecache, TRANSLOG_PAGECACHE_SIZE, 0, 0, TRANSLOG_PAGE_SIZE, 0, MY_WME) == 0) || diff --git a/storage/maria/unittest/CMakeLists.txt b/storage/maria/unittest/CMakeLists.txt index a2da1507..a7b34410 100644 --- a/storage/maria/unittest/CMakeLists.txt +++ b/storage/maria/unittest/CMakeLists.txt @@ -15,7 +15,7 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib ${CMAKE_SOURCE_DIR}/unittest/mytap) -LINK_LIBRARIES(aria myisam mytap mysys dbug strings ${ZLIB_LIBRARY}) +LINK_LIBRARIES(aria myisam mytap mysys dbug strings ${ZLIB_LIBRARIES}) MY_ADD_TESTS(ma_control_file trnman) diff --git a/storage/maria/unittest/ma_control_file-t.c b/storage/maria/unittest/ma_control_file-t.c index 859d5514..fdbe86de 100644 --- a/storage/maria/unittest/ma_control_file-t.c +++ b/storage/maria/unittest/ma_control_file-t.c @@ -114,7 +114,7 @@ static CONTROL_FILE_ERROR local_ma_control_file_open(void) { CONTROL_FILE_ERROR error; error_handler_hook= my_ignore_message; - error= ma_control_file_open(TRUE, TRUE, TRUE); + error= ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags); error_handler_hook= default_error_handler_hook; return error; } diff --git a/storage/maria/unittest/ma_test_loghandler-t.c b/storage/maria/unittest/ma_test_loghandler-t.c index ccda66af..0a1d396e 100644 --- a/storage/maria/unittest/ma_test_loghandler-t.c +++ b/storage/maria/unittest/ma_test_loghandler-t.c @@ -143,6 +143,8 @@ static my_bool read_and_check_content(TRANSLOG_HEADER_BUFFER *rec, } +PRAGMA_DISABLE_CHECK_STACK_FRAME + int main(int argc __attribute__((unused)), char *argv[]) { uint32 i; @@ -197,7 +199,7 @@ int main(int argc __attribute__((unused)), char *argv[]) } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); @@ -664,5 +666,6 @@ err: my_end(0); return(MY_TEST(exit_status())); } +PRAGMA_REENABLE_CHECK_STACK_FRAME #include "../ma_check_standalone.h" diff --git a/storage/maria/unittest/ma_test_loghandler_first_lsn-t.c b/storage/maria/unittest/ma_test_loghandler_first_lsn-t.c index 21f6b7d7..5c4045cc 100644 --- a/storage/maria/unittest/ma_test_loghandler_first_lsn-t.c +++ b/storage/maria/unittest/ma_test_loghandler_first_lsn-t.c @@ -66,7 +66,7 @@ int main(int argc __attribute__((unused)), char *argv[]) } #endif - if (ma_control_file_open(TRUE, TRUE,TRUE)) + if (ma_control_file_open(TRUE, TRUE,TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff --git a/storage/maria/unittest/ma_test_loghandler_max_lsn-t.c b/storage/maria/unittest/ma_test_loghandler_max_lsn-t.c index 391d7851..eedeb9d7 100644 --- a/storage/maria/unittest/ma_test_loghandler_max_lsn-t.c +++ b/storage/maria/unittest/ma_test_loghandler_max_lsn-t.c @@ -64,7 +64,7 @@ int main(int argc __attribute__((unused)), char *argv[]) } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff --git a/storage/maria/unittest/ma_test_loghandler_multigroup-t.c b/storage/maria/unittest/ma_test_loghandler_multigroup-t.c index e8e114dd..b0e1be8f 100644 --- a/storage/maria/unittest/ma_test_loghandler_multigroup-t.c +++ b/storage/maria/unittest/ma_test_loghandler_multigroup-t.c @@ -280,7 +280,7 @@ int main(int argc __attribute__((unused)), char *argv[]) bzero(long_tr_id, 6); - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); @@ -443,7 +443,7 @@ int main(int argc __attribute__((unused)), char *argv[]) end_pagecache(&pagecache, 1); ma_control_file_end(); - if (ma_control_file_open(TRUE,TRUE,TRUE)) + if (ma_control_file_open(TRUE,TRUE,TRUE, control_file_open_flags)) { fprintf(stderr, "pass2: Can't init control file (%d)\n", errno); exit(1); diff --git a/storage/maria/unittest/ma_test_loghandler_multithread-t.c b/storage/maria/unittest/ma_test_loghandler_multithread-t.c index be6046ab..9b7e239b 100644 --- a/storage/maria/unittest/ma_test_loghandler_multithread-t.c +++ b/storage/maria/unittest/ma_test_loghandler_multithread-t.c @@ -331,7 +331,7 @@ int main(int argc __attribute__((unused)), exit(1); } - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff --git a/storage/maria/unittest/ma_test_loghandler_noflush-t.c b/storage/maria/unittest/ma_test_loghandler_noflush-t.c index 46b3a8e7..28cac2ee 100644 --- a/storage/maria/unittest/ma_test_loghandler_noflush-t.c +++ b/storage/maria/unittest/ma_test_loghandler_noflush-t.c @@ -65,7 +65,7 @@ int main(int argc __attribute__((unused)), char *argv[]) } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff --git a/storage/maria/unittest/ma_test_loghandler_nologs-t.c b/storage/maria/unittest/ma_test_loghandler_nologs-t.c index b95d8bee..a7c526b2 100644 --- a/storage/maria/unittest/ma_test_loghandler_nologs-t.c +++ b/storage/maria/unittest/ma_test_loghandler_nologs-t.c @@ -66,7 +66,7 @@ int main(int argc __attribute__((unused)), char *argv[]) } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); @@ -139,7 +139,7 @@ int main(int argc __attribute__((unused)), char *argv[]) } } - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff --git a/storage/maria/unittest/ma_test_loghandler_pagecache-t.c b/storage/maria/unittest/ma_test_loghandler_pagecache-t.c index 892a773b..4ecc8f1f 100644 --- a/storage/maria/unittest/ma_test_loghandler_pagecache-t.c +++ b/storage/maria/unittest/ma_test_loghandler_pagecache-t.c @@ -69,7 +69,7 @@ int main(int argc __attribute__((unused)), char *argv[]) } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff --git a/storage/maria/unittest/ma_test_loghandler_purge-t.c b/storage/maria/unittest/ma_test_loghandler_purge-t.c index 07b50f19..b26a2f99 100644 --- a/storage/maria/unittest/ma_test_loghandler_purge-t.c +++ b/storage/maria/unittest/ma_test_loghandler_purge-t.c @@ -67,7 +67,7 @@ int main(int argc __attribute__((unused)), char *argv[]) } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff --git a/storage/mroonga/CMakeLists.txt b/storage/mroonga/CMakeLists.txt index bea0eecc..4553fd43 100644 --- a/storage/mroonga/CMakeLists.txt +++ b/storage/mroonga/CMakeLists.txt @@ -57,6 +57,11 @@ if(MRN_BUNDLED) "${PLUGIN_MROONGA}" STREQUAL "NO") return() endif() + if(WITHOUT_DYNAMIC_PLUGINS) + if(NOT (PLUGIN_MROONGA STREQUAL STATIC)) + return() + endif() + endif() endif() set(MRN_BUNDLED_GROONGA_RELATIVE_DIR "vendor/groonga") diff --git a/storage/mroonga/ha_mroonga.cpp b/storage/mroonga/ha_mroonga.cpp index a176ccf3..d5f150de 100644 --- a/storage/mroonga/ha_mroonga.cpp +++ b/storage/mroonga/ha_mroonga.cpp @@ -4351,9 +4351,9 @@ int ha_mroonga::wrapper_open(const char *name, int mode, uint open_options) // TODO: implemented by "reindex" instead of "remove and recreate". // Because "remove and recreate" invalidates opened indexes by // other threads. - error = wrapper_disable_indexes_mroonga(HA_KEY_SWITCH_ALL); + error = wrapper_disable_indexes_mroonga(key_map(table->s->keys), false); if (!error) { - error = wrapper_enable_indexes_mroonga(HA_KEY_SWITCH_ALL); + error = wrapper_enable_indexes_mroonga(key_map(table->s->keys), false); } } } @@ -13639,197 +13639,184 @@ int ha_mroonga::generic_disable_index(int i, KEY *key_info) DBUG_RETURN(error); } -int ha_mroonga::wrapper_disable_indexes_mroonga(uint mode) +int ha_mroonga::wrapper_disable_indexes_mroonga(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); - if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE || mode == HA_KEY_SWITCH_ALL) { - uint i; - for (i = 0; i < table_share->keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (share->wrap_key_nr[i] < MAX_KEY) { - continue; - } - if (!grn_index_tables[i]) { - DBUG_PRINT("info", ("mroonga: keys are disabled already %u", i)); - DBUG_RETURN(0); - } + uint i; + for (i = 0; i < table_share->keys; i++) { + if (i == table->s->primary_key) { + continue; + } + if (share->wrap_key_nr[i] < MAX_KEY) { + continue; + } + if (!grn_index_tables[i]) { + DBUG_PRINT("info", ("mroonga: keys are disabled already %u", i)); + DBUG_RETURN(0); + } + } + KEY *key_info = table_share->key_info; + for (i = 0; i < table_share->keys; i++) { + if (!(key_info[i].flags & HA_FULLTEXT) && + !mrn_is_geo_key(&key_info[i])) { + continue; } - KEY *key_info = table_share->key_info; - for (i = 0; i < table_share->keys; i++) { - if (!(key_info[i].flags & HA_FULLTEXT) && - !mrn_is_geo_key(&key_info[i])) { - continue; - } - int sub_error = generic_disable_index(i, key_info); - if (error != 0 && sub_error != 0) { - error = sub_error; - } + int sub_error = generic_disable_index(i, key_info); + if (error != 0 && sub_error != 0) { + error = sub_error; } - } else { - error = HA_ERR_WRONG_COMMAND; } DBUG_RETURN(error); } -int ha_mroonga::wrapper_disable_indexes(uint mode) +int ha_mroonga::wrapper_disable_indexes(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); MRN_SET_WRAP_SHARE_KEY(share, table->s); MRN_SET_WRAP_TABLE_KEY(this, table); - error = wrap_handler->ha_disable_indexes(mode); + error = wrap_handler->ha_disable_indexes(map, persist); MRN_SET_BASE_SHARE_KEY(share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); if (error == HA_ERR_WRONG_COMMAND) { error = 0; } if (!error) { - error = wrapper_disable_indexes_mroonga(mode); + error = wrapper_disable_indexes_mroonga(map, persist); } DBUG_RETURN(error); } -int ha_mroonga::storage_disable_indexes(uint mode) +int ha_mroonga::storage_disable_indexes(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); - if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE || mode == HA_KEY_SWITCH_ALL) { - uint i; - for (i = 0; i < table_share->keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (!grn_index_tables[i]) { - DBUG_PRINT("info", ("mroonga: keys are disabled already %u", i)); - DBUG_RETURN(0); - } + uint i; + for (i = 0; i < table_share->keys; i++) { + if (i == table->s->primary_key) { + continue; + } + if (!grn_index_tables[i]) { + DBUG_PRINT("info", ("mroonga: keys are disabled already %u", i)); + DBUG_RETURN(0); + } + } + KEY *key_info = table_share->key_info; + for (i = 0; i < table_share->keys; i++) { + if (i == table->s->primary_key) { + continue; + } + if (map.is_set(i)) { + continue; } - KEY *key_info = table_share->key_info; - for (i = 0; i < table_share->keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE && - (key_info[i].flags & HA_NOSAME)) { - continue; - } - int sub_error = generic_disable_index(i, key_info); - if (error != 0 && sub_error != 0) { - error = sub_error; - } + int sub_error = generic_disable_index(i, key_info); + if (error != 0 && sub_error != 0) { + error = sub_error; } - } else { - DBUG_RETURN(HA_ERR_WRONG_COMMAND); } DBUG_RETURN(error); } -int ha_mroonga::disable_indexes(uint mode) +int ha_mroonga::disable_indexes(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); if (share->wrapper_mode) { - error = wrapper_disable_indexes(mode); + error = wrapper_disable_indexes(map, persist); } else { - error = storage_disable_indexes(mode); + error = storage_disable_indexes(map, persist); } DBUG_RETURN(error); } -int ha_mroonga::wrapper_enable_indexes_mroonga(uint mode) +int ha_mroonga::wrapper_enable_indexes_mroonga(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); - if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE || mode == HA_KEY_SWITCH_ALL) { - uint i, j; - for (i = 0; i < table_share->keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (share->wrap_key_nr[i] < MAX_KEY) { - continue; - } - if (!grn_index_columns[i]) { - break; - } + uint i, j; + for (i = 0; i < table_share->keys; i++) { + if (i == table->s->primary_key) { + continue; } - if (i == table_share->keys) { - DBUG_PRINT("info", ("mroonga: keys are enabled already")); - DBUG_RETURN(0); + if (share->wrap_key_nr[i] < MAX_KEY) { + continue; + } + if (!grn_index_columns[i]) { + break; + } + } + if (i == table_share->keys) { + DBUG_PRINT("info", ("mroonga: keys are enabled already")); + DBUG_RETURN(0); + } + KEY *p_key_info = &table->key_info[table_share->primary_key]; + KEY *key_info = table_share->key_info; + uint n_keys = table_share->keys; + MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_tables, n_keys); + MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_columns, n_keys); + bitmap_clear_all(table->read_set); + mrn_set_bitmap_by_key(table->read_set, p_key_info); + mrn::PathMapper mapper(share->table_name); + for (i = 0, j = 0; i < n_keys; i++) { + if (!(key_info[i].flags & HA_FULLTEXT) && + !mrn_is_geo_key(&key_info[i])) { + j++; + continue; } - KEY *p_key_info = &table->key_info[table_share->primary_key]; - KEY *key_info = table_share->key_info; - uint n_keys = table_share->keys; - MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_tables, n_keys); - MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_columns, n_keys); - bitmap_clear_all(table->read_set); - mrn_set_bitmap_by_key(table->read_set, p_key_info); - mrn::PathMapper mapper(share->table_name); - for (i = 0, j = 0; i < n_keys; i++) { - if (!(key_info[i].flags & HA_FULLTEXT) && - !mrn_is_geo_key(&key_info[i])) { - j++; - continue; - } - if ((error = mrn_add_index_param(share, &key_info[i], i))) - { + if ((error = mrn_add_index_param(share, &key_info[i], i))) + { + break; + } + index_tables[i] = NULL; + index_columns[i] = NULL; + if (!grn_index_columns[i]) { + if ( + (key_info[i].flags & HA_FULLTEXT) && + (error = wrapper_create_index_fulltext(mapper.table_name(), + i, &key_info[i], + index_tables, index_columns, + share)) + ) { + break; + } else if ( + mrn_is_geo_key(&key_info[i]) && + (error = wrapper_create_index_geo(mapper.table_name(), + i, &key_info[i], + index_tables, index_columns, + share)) + ) { break; } - index_tables[i] = NULL; - index_columns[i] = NULL; - if (!grn_index_columns[i]) { - if ( - (key_info[i].flags & HA_FULLTEXT) && - (error = wrapper_create_index_fulltext(mapper.table_name(), - i, &key_info[i], - index_tables, index_columns, - share)) - ) { - break; - } else if ( - mrn_is_geo_key(&key_info[i]) && - (error = wrapper_create_index_geo(mapper.table_name(), - i, &key_info[i], - index_tables, index_columns, - share)) - ) { - break; - } - grn_index_columns[i] = index_columns[i]; - } - mrn_set_bitmap_by_key(table->read_set, &key_info[i]); + grn_index_columns[i] = index_columns[i]; } - if (!error && i > j) - { - error = wrapper_fill_indexes(ha_thd(), table->key_info, index_columns, - n_keys); - } - bitmap_set_all(table->read_set); - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); - } else { - error = HA_ERR_WRONG_COMMAND; + mrn_set_bitmap_by_key(table->read_set, &key_info[i]); } + if (!error && i > j) + { + error = wrapper_fill_indexes(ha_thd(), table->key_info, index_columns, + n_keys); + } + bitmap_set_all(table->read_set); + MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); + MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); DBUG_RETURN(error); } -int ha_mroonga::wrapper_enable_indexes(uint mode) +int ha_mroonga::wrapper_enable_indexes(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); - int mroonga_error = wrapper_enable_indexes_mroonga(mode); + int mroonga_error = wrapper_enable_indexes_mroonga(map, persist); MRN_SET_WRAP_SHARE_KEY(share, table->s); MRN_SET_WRAP_TABLE_KEY(this, table); - error = wrap_handler->ha_enable_indexes(mode); + error = wrap_handler->ha_enable_indexes(map, persist); MRN_SET_BASE_SHARE_KEY(share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); if (error == HA_ERR_WRONG_COMMAND) { @@ -13838,95 +13825,86 @@ int ha_mroonga::wrapper_enable_indexes(uint mode) DBUG_RETURN(error); } -int ha_mroonga::storage_enable_indexes(uint mode) +int ha_mroonga::storage_enable_indexes(key_map map, bool persist) { int error = 0; uint n_keys = table_share->keys; MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_tables, n_keys); MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_columns, n_keys); bool have_multiple_column_index = false; - bool skip_unique_key = (mode == HA_KEY_SWITCH_NONUNIQ_SAVE); MRN_DBUG_ENTER_METHOD(); - if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE || mode == HA_KEY_SWITCH_ALL) { - uint i; - for (i = 0; i < table_share->keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (!grn_index_columns[i]) { - break; - } + uint i; + for (i = 0; i < n_keys; i++) { + if (i == table->s->primary_key) { + continue; } - if (i == table_share->keys) { - DBUG_PRINT("info", ("mroonga: keys are enabled already")); - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); - DBUG_RETURN(0); + if (!grn_index_columns[i]) { + break; + } + } + if (i == n_keys) { + DBUG_PRINT("info", ("mroonga: keys are enabled already")); + MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); + MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); + DBUG_RETURN(0); + } + KEY *key_info = table->key_info; + bitmap_clear_all(table->read_set); + mrn::PathMapper mapper(share->table_name); + for (; i < n_keys; i++) { + if (!map.is_set(i)) { + continue; } - KEY *key_info = table->key_info; - bitmap_clear_all(table->read_set); - mrn::PathMapper mapper(share->table_name); - for (i = 0; i < n_keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (skip_unique_key && (key_info[i].flags & HA_NOSAME)) { - continue; - } - if ((error = mrn_add_index_param(share, &key_info[i], i))) + if ((error = mrn_add_index_param(share, &key_info[i], i))) + { + break; + } + index_tables[i] = NULL; + if (!grn_index_columns[i]) { + if ((error = storage_create_index(table, mapper.table_name(), grn_table, + share, &key_info[i], index_tables, + index_columns, i))) { break; } - index_tables[i] = NULL; - if (!grn_index_columns[i]) { - if ((error = storage_create_index(table, mapper.table_name(), grn_table, - share, &key_info[i], index_tables, - index_columns, i))) - { - break; - } - if ( - KEY_N_KEY_PARTS(&(key_info[i])) != 1 && - !(key_info[i].flags & HA_FULLTEXT) - ) { - mrn_set_bitmap_by_key(table->read_set, &key_info[i]); - have_multiple_column_index = true; - } - grn_index_tables[i] = index_tables[i]; - grn_index_columns[i] = index_columns[i]; - } else { - index_columns[i] = NULL; + if ( + KEY_N_KEY_PARTS(&(key_info[i])) != 1 && + !(key_info[i].flags & HA_FULLTEXT) + ) { + mrn_set_bitmap_by_key(table->read_set, &key_info[i]); + have_multiple_column_index = true; } + grn_index_tables[i] = index_tables[i]; + grn_index_columns[i] = index_columns[i]; + } else { + index_columns[i] = NULL; } - if (!error && have_multiple_column_index) - { - error = storage_add_index_multiple_columns(key_info, n_keys, - index_tables, - index_columns, - skip_unique_key); - } - bitmap_set_all(table->read_set); - } else { - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); - DBUG_RETURN(HA_ERR_WRONG_COMMAND); } + if (!error && have_multiple_column_index) + { + bool skip_unique_key= !table->s->keys_in_use.is_clear_all(); + error = storage_add_index_multiple_columns(key_info, n_keys, + index_tables, + index_columns, + skip_unique_key); + } + bitmap_set_all(table->read_set); MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); DBUG_RETURN(error); } -int ha_mroonga::enable_indexes(uint mode) +int ha_mroonga::enable_indexes(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); share->disable_keys = false; if (share->wrapper_mode) { - error = wrapper_enable_indexes(mode); + error = wrapper_enable_indexes(map, persist); } else { - error = storage_enable_indexes(mode); + error = storage_enable_indexes(map, persist); } DBUG_RETURN(error); } diff --git a/storage/mroonga/ha_mroonga.hpp b/storage/mroonga/ha_mroonga.hpp index 66767899..6bf971aa 100644 --- a/storage/mroonga/ha_mroonga.hpp +++ b/storage/mroonga/ha_mroonga.hpp @@ -542,8 +542,8 @@ public: bool is_crashed() const mrn_override; bool auto_repair(int error) const mrn_override; bool auto_repair() const; - int disable_indexes(uint mode) mrn_override; - int enable_indexes(uint mode) mrn_override; + int disable_indexes(key_map map, bool persist) mrn_override; + int enable_indexes(key_map map, bool persist) mrn_override; int check(THD* thd, HA_CHECK_OPT* check_opt) mrn_override; int repair(THD* thd, HA_CHECK_OPT* check_opt) mrn_override; bool check_and_repair(THD *thd) mrn_override; @@ -1140,12 +1140,12 @@ private: bool wrapper_auto_repair(int error) const; bool storage_auto_repair(int error) const; int generic_disable_index(int i, KEY *key_info); - int wrapper_disable_indexes_mroonga(uint mode); - int wrapper_disable_indexes(uint mode); - int storage_disable_indexes(uint mode); - int wrapper_enable_indexes_mroonga(uint mode); - int wrapper_enable_indexes(uint mode); - int storage_enable_indexes(uint mode); + int wrapper_disable_indexes_mroonga(key_map map, bool persist); + int wrapper_disable_indexes(key_map map, bool persist); + int storage_disable_indexes(key_map map, bool persist); + int wrapper_enable_indexes_mroonga(key_map map, bool persist); + int wrapper_enable_indexes(key_map map, bool persist); + int storage_enable_indexes(key_map map, bool persist); int wrapper_check(THD* thd, HA_CHECK_OPT* check_opt); int storage_check(THD* thd, HA_CHECK_OPT* check_opt); int wrapper_fill_indexes(THD *thd, KEY *key_info, diff --git a/storage/mroonga/vendor/groonga/CMakeLists.txt b/storage/mroonga/vendor/groonga/CMakeLists.txt index 5b25ada4..cdbfb8f1 100644 --- a/storage/mroonga/vendor/groonga/CMakeLists.txt +++ b/storage/mroonga/vendor/groonga/CMakeLists.txt @@ -200,6 +200,7 @@ endif() include_directories( BEFORE + ${CMAKE_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/lib diff --git a/storage/mroonga/vendor/groonga/lib/db.c b/storage/mroonga/vendor/groonga/lib/db.c index c3bbb64f..65463bda 100644 --- a/storage/mroonga/vendor/groonga/lib/db.c +++ b/storage/mroonga/vendor/groonga/lib/db.c @@ -38,6 +38,7 @@ #include "grn_util.h" #include "grn_cache.h" #include "grn_window_functions.h" +#include #include #include @@ -1060,6 +1061,8 @@ grn_table_create_validate(grn_ctx *ctx, const char *name, unsigned int name_size return ctx->rc; } +PRAGMA_DISABLE_CHECK_STACK_FRAME + static grn_obj * grn_table_create_with_max_n_subrecs(grn_ctx *ctx, const char *name, unsigned int name_size, const char *path, @@ -1238,6 +1241,7 @@ grn_table_create_with_max_n_subrecs(grn_ctx *ctx, const char *name, } return res; } +PRAGMA_REENABLE_CHECK_STACK_FRAME grn_obj * grn_table_create(grn_ctx *ctx, const char *name, unsigned int name_size, @@ -4776,6 +4780,9 @@ _grn_table_key(grn_ctx *ctx, grn_obj *table, grn_id id, uint32_t *key_size) /* column */ + +PRAGMA_DISABLE_CHECK_STACK_FRAME + grn_obj * grn_column_create(grn_ctx *ctx, grn_obj *table, const char *name, unsigned int name_size, @@ -4978,6 +4985,7 @@ exit : if (!res && id) { grn_obj_delete_by_id(ctx, db, id, GRN_TRUE); } GRN_API_RETURN(res); } +PRAGMA_REENABLE_CHECK_STACK_FRAME grn_obj * grn_column_open(grn_ctx *ctx, grn_obj *table, @@ -8540,6 +8548,8 @@ grn_obj_spec_save(grn_ctx *ctx, grn_db_obj *obj) grn_obj_close(ctx, &v); } +PRAGMA_DISABLE_CHECK_STACK_FRAME + inline static void grn_obj_set_info_source_invalid_lexicon_error(grn_ctx *ctx, const char *message, @@ -8590,6 +8600,8 @@ grn_obj_set_info_source_invalid_lexicon_error(grn_ctx *ctx, source_name_size, source_name); } +PRAGMA_REENABLE_CHECK_STACK_FRAME + inline static grn_rc grn_obj_set_info_source_validate(grn_ctx *ctx, grn_obj *obj, grn_obj *value) { @@ -8597,7 +8609,7 @@ grn_obj_set_info_source_validate(grn_ctx *ctx, grn_obj *obj, grn_obj *value) grn_obj *lexicon = NULL; grn_id lexicon_domain_id; grn_obj *lexicon_domain = NULL; - grn_bool lexicon_domain_is_table; + grn_bool lexicon_domain_is_table __attribute__((unused)); grn_bool lexicon_have_tokenizer; grn_id *source_ids; int i, n_source_ids; @@ -9330,7 +9342,7 @@ remove_reference_tables(grn_ctx *ctx, grn_obj *table, grn_obj *db) grn_bool is_close_opened_object_mode = GRN_FALSE; grn_id table_id; char table_name[GRN_TABLE_MAX_KEY_SIZE]; - int table_name_size; + int table_name_size __attribute__((unused)); grn_table_cursor *cursor; if (grn_thread_get_limit() == 1) { @@ -10317,12 +10329,10 @@ grn_db_spec_unpack(grn_ctx *ctx, const char *error_message_tag) { grn_obj *db; - grn_db *db_raw; grn_rc rc; uint32_t spec_size; db = ctx->impl->db; - db_raw = (grn_db *)db; rc = grn_vector_decode(ctx, decoded_spec, diff --git a/storage/mroonga/vendor/groonga/lib/load.c b/storage/mroonga/vendor/groonga/lib/load.c index eb77f2b3..25d621e7 100644 --- a/storage/mroonga/vendor/groonga/lib/load.c +++ b/storage/mroonga/vendor/groonga/lib/load.c @@ -20,6 +20,9 @@ #include "grn_ctx_impl.h" #include "grn_db.h" #include "grn_util.h" +#include + +PRAGMA_DISABLE_CHECK_STACK_FRAME static void grn_loader_save_error(grn_ctx *ctx, grn_loader *loader) @@ -1228,3 +1231,5 @@ grn_load(grn_ctx *ctx, grn_content_type input_type, } GRN_API_RETURN(ctx->rc); } + +PRAGMA_REENABLE_CHECK_STACK_FRAME diff --git a/storage/mroonga/vendor/groonga/lib/operator.c b/storage/mroonga/vendor/groonga/lib/operator.c index 1e1f2cf7..940c0b14 100644 --- a/storage/mroonga/vendor/groonga/lib/operator.c +++ b/storage/mroonga/vendor/groonga/lib/operator.c @@ -20,6 +20,7 @@ #include "grn_db.h" #include "grn_str.h" #include "grn_normalizer.h" +#include #include @@ -31,6 +32,8 @@ # include #endif +PRAGMA_DISABLE_CHECK_STACK_FRAME + static const char *operator_names[] = { "push", "pop", @@ -1360,3 +1363,5 @@ grn_operator_exec_regexp(grn_ctx *ctx, grn_obj *target, grn_obj *pattern) } GRN_API_RETURN(matched); } + +PRAGMA_REENABLE_CHECK_STACK_FRAME diff --git a/storage/mroonga/vendor/groonga/lib/proc/proc_object_list.c b/storage/mroonga/vendor/groonga/lib/proc/proc_object_list.c index adb4c91b..eaf5504d 100644 --- a/storage/mroonga/vendor/groonga/lib/proc/proc_object_list.c +++ b/storage/mroonga/vendor/groonga/lib/proc/proc_object_list.c @@ -18,6 +18,7 @@ #include "../grn_proc.h" #include "../grn_db.h" +#include #include @@ -73,6 +74,8 @@ command_object_list_dump_flags(grn_ctx *ctx, grn_obj_spec *spec) GRN_OBJ_FIN(ctx, &flags); } +PRAGMA_DISABLE_CHECK_STACK_FRAME + static grn_obj * command_object_list(grn_ctx *ctx, int nargs, @@ -401,6 +404,7 @@ command_object_list(grn_ctx *ctx, return NULL; } +PRAGMA_REENABLE_CHECK_STACK_FRAME void grn_proc_init_object_list(grn_ctx *ctx) diff --git a/storage/mroonga/vendor/groonga/lib/proc/proc_schema.c b/storage/mroonga/vendor/groonga/lib/proc/proc_schema.c index 061c145a..7c632f45 100644 --- a/storage/mroonga/vendor/groonga/lib/proc/proc_schema.c +++ b/storage/mroonga/vendor/groonga/lib/proc/proc_schema.c @@ -17,9 +17,8 @@ */ #include "../grn_proc.h" - #include "../grn_db.h" - +#include #include typedef struct { @@ -572,6 +571,8 @@ command_schema_table_output_token_filters(grn_ctx *ctx, grn_obj *table) GRN_OBJ_FIN(ctx, &token_filters); } +PRAGMA_DISABLE_CHECK_STACK_FRAME + static void command_schema_table_command_collect_arguments(grn_ctx *ctx, grn_obj *table, @@ -692,6 +693,7 @@ command_schema_table_command_collect_arguments(grn_ctx *ctx, #undef ADD_OBJECT_NAME #undef ADD } +PRAGMA_REENABLE_CHECK_STACK_FRAME static void command_schema_table_output_command(grn_ctx *ctx, grn_obj *table) @@ -875,6 +877,8 @@ command_schema_output_indexes(grn_ctx *ctx, grn_obj *object) } } +PRAGMA_DISABLE_CHECK_STACK_FRAME + static void command_schema_column_command_collect_arguments(grn_ctx *ctx, grn_obj *table, @@ -973,6 +977,7 @@ command_schema_column_command_collect_arguments(grn_ctx *ctx, #undef ADD_OBJECT_NAME #undef ADD } +PRAGMA_REENABLE_CHECK_STACK_FRAME static void command_schema_column_output_command(grn_ctx *ctx, diff --git a/storage/mroonga/vendor/groonga/lib/proc/proc_select.c b/storage/mroonga/vendor/groonga/lib/proc/proc_select.c index a665b1cc..7588b18a 100644 --- a/storage/mroonga/vendor/groonga/lib/proc/proc_select.c +++ b/storage/mroonga/vendor/groonga/lib/proc/proc_select.c @@ -24,6 +24,7 @@ #include "../grn_util.h" #include "../grn_cache.h" #include "../grn_ii.h" +#include #include "../grn_ts.h" @@ -2912,7 +2913,7 @@ grn_select(grn_ctx *ctx, grn_select_data *data) uint32_t nhits; grn_obj *outbuf = ctx->impl->output.buf; grn_content_type output_type = ctx->impl->output.type; - char cache_key[GRN_CACHE_MAX_KEY_SIZE]; + char *cache_key_buffer= 0; uint32_t cache_key_size; long long int threshold, original_threshold = 0; grn_cache *cache_obj = grn_cache_current_get(ctx); @@ -2985,8 +2986,9 @@ grn_select(grn_ctx *ctx, grn_select_data *data) } GRN_HASH_EACH_END(ctx, cursor); } #undef DRILLDOWN_CACHE_SIZE - if (cache_key_size <= GRN_CACHE_MAX_KEY_SIZE) { - char *cp = cache_key; + if (cache_key_size <= GRN_CACHE_MAX_KEY_SIZE && + (cache_key_buffer= (char*) malloc(cache_key_size+1))) { + char *cp = cache_key_buffer; #define PUT_CACHE_KEY(string) \ if ((string).value) \ @@ -3066,11 +3068,12 @@ grn_select(grn_ctx *ctx, grn_select_data *data) { grn_rc rc; - rc = grn_cache_fetch(ctx, cache_obj, cache_key, cache_key_size, outbuf); + rc = grn_cache_fetch(ctx, cache_obj, cache_key_buffer, cache_key_size, outbuf); if (rc == GRN_SUCCESS) { GRN_QUERY_LOG(ctx, GRN_QUERY_LOG_CACHE, ":", "cache(%" GRN_FMT_LLD ")", (long long int)GRN_TEXT_LEN(outbuf)); + free(cache_key_buffer); return ctx->rc; } } @@ -3119,7 +3122,7 @@ grn_select(grn_ctx *ctx, grn_select_data *data) data->cache.length != 2 || data->cache.value[0] != 'n' || data->cache.value[1] != 'o')) { - grn_cache_update(ctx, cache_obj, cache_key, cache_key_size, outbuf); + grn_cache_update(ctx, cache_obj, cache_key_buffer, cache_key_size, outbuf); } goto exit; } @@ -3186,7 +3189,7 @@ grn_select(grn_ctx *ctx, grn_select_data *data) data->cache.length != 2 || data->cache.value[0] != 'n' || data->cache.value[1] != 'o')) { - grn_cache_update(ctx, cache_obj, cache_key, cache_key_size, outbuf); + grn_cache_update(ctx, cache_obj, cache_key_buffer, cache_key_size, outbuf); } if (data->taintable > 0) { grn_db_touch(ctx, DB_OBJ(data->tables.target)->db); @@ -3200,6 +3203,7 @@ exit : /* GRN_LOG(ctx, GRN_LOG_NONE, "%d", ctx->seqno); */ + free(cache_key_buffer); return ctx->rc; } @@ -3424,6 +3428,9 @@ grn_select_data_fill_drilldown_columns(grn_ctx *ctx, strlen(prefix)); } + +PRAGMA_DISABLE_CHECK_STACK_FRAME + static grn_bool grn_select_data_fill_drilldowns(grn_ctx *ctx, grn_user_data *user_data, @@ -3562,6 +3569,7 @@ grn_select_data_fill_drilldowns(grn_ctx *ctx, return succeeded; } } +PRAGMA_REENABLE_CHECK_STACK_FRAME static grn_obj * command_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) diff --git a/storage/myisam/ft_boolean_search.c b/storage/myisam/ft_boolean_search.c index f69f1869..3d95fffa 100644 --- a/storage/myisam/ft_boolean_search.c +++ b/storage/myisam/ft_boolean_search.c @@ -287,6 +287,8 @@ static int ftb_parse_query_internal(MYSQL_FTPARSER_PARAM *param, uchar *end= (uchar*) query + len; FT_WORD w; + w.pos= NULL; + w.len= 0; info.prev= ' '; info.quot= 0; while (ft_get_word(cs, start, end, &w, &info)) diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index 14311c87..deeb1f2e 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -1570,41 +1570,38 @@ int ha_myisam::preload_keys(THD* thd, HA_CHECK_OPT *check_opt) SYNOPSIS disable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ disable all non-unique keys - HA_KEY_SWITCH_ALL disable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE dis. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE dis. all keys and make persistent - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_ALL_SAVE is not implemented. + DESCRIPTION + See handler::ha_disable_indexes() RETURN 0 ok HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_myisam::disable_indexes(uint mode) +int ha_myisam::disable_indexes(key_map map, bool persist) { int error; - if (mode == HA_KEY_SWITCH_ALL) + if (!persist) { /* call a storage engine function to switch the key map */ + DBUG_ASSERT(map.is_clear_all()); error= mi_disable_indexes(file); } - else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE) + else { - mi_extra(file, HA_EXTRA_NO_KEYS, 0); + ulonglong ullmap= map.to_ulonglong(); + + /* make sure auto-inc key is enabled even if it's > 64 */ + if (map.length() > MI_KEYMAP_BITS && + table->s->next_number_index < MAX_KEY) + mi_set_key_active(ullmap, table->s->next_number_index); + + mi_extra(file, HA_EXTRA_NO_KEYS, &ullmap); info(HA_STATUS_CONST); // Read new key info error= 0; } - else - { - /* mode not implemented */ - error= HA_ERR_WRONG_COMMAND; - } return error; } @@ -1614,21 +1611,14 @@ int ha_myisam::disable_indexes(uint mode) SYNOPSIS enable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ enable all non-unique keys - HA_KEY_SWITCH_ALL enable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE en. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE en. all keys and make persistent DESCRIPTION Enable indexes, which might have been disabled by disable_index() before. - The modes without _SAVE work only if both data and indexes are empty, + If persist=false, it works only if both data and indexes are empty, since the MyISAM repair would enable them persistently. To be sure in these cases, call handler::delete_all_rows() before. - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_ALL_SAVE is not implemented. + See also handler::ha_enable_indexes() RETURN 0 ok @@ -1637,7 +1627,7 @@ int ha_myisam::disable_indexes(uint mode) HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_myisam::enable_indexes(uint mode) +int ha_myisam::enable_indexes(key_map map, bool persist) { int error; DBUG_ENTER("ha_myisam::enable_indexes"); @@ -1651,7 +1641,8 @@ int ha_myisam::enable_indexes(uint mode) DBUG_RETURN(0); } - if (mode == HA_KEY_SWITCH_ALL) + DBUG_ASSERT(map.is_prefix(table->s->keys)); + if (!persist) { error= mi_enable_indexes(file); /* @@ -1660,7 +1651,7 @@ int ha_myisam::enable_indexes(uint mode) but mode==HA_KEY_SWITCH_ALL forbids it. */ } - else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE) + else { THD *thd= table->in_use; int was_error= thd->is_error(); @@ -1720,11 +1711,6 @@ int ha_myisam::enable_indexes(uint mode) restore_vcos_after_repair(); } - else - { - /* mode not implemented */ - error= HA_ERR_WRONG_COMMAND; - } DBUG_RETURN(error); } @@ -1887,7 +1873,7 @@ int ha_myisam::end_bulk_insert() setting the indexes as active and trying to recreate them. */ - if (((first_error= enable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE)) != 0) && + if (((first_error= enable_indexes(key_map(table->s->keys), true))) && table->in_use->killed) { delete_all_rows(); diff --git a/storage/myisam/ha_myisam.h b/storage/myisam/ha_myisam.h index c4c46a63..e0121dbe 100644 --- a/storage/myisam/ha_myisam.h +++ b/storage/myisam/ha_myisam.h @@ -109,8 +109,8 @@ class ha_myisam final : public handler int external_lock(THD *thd, int lock_type); int delete_all_rows(void); int reset_auto_increment(ulonglong value); - int disable_indexes(uint mode); - int enable_indexes(uint mode); + int disable_indexes(key_map map, bool persist); + int enable_indexes(key_map map, bool persist); int indexes_are_disabled(void); void start_bulk_insert(ha_rows rows, uint flags); int end_bulk_insert(); diff --git a/storage/myisam/mi_extra.c b/storage/myisam/mi_extra.c index 66238745..68a19c7b 100644 --- a/storage/myisam/mi_extra.c +++ b/storage/myisam/mi_extra.c @@ -225,16 +225,9 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg) } if (mi_is_any_key_active(share->state.key_map)) { - MI_KEYDEF *key=share->keyinfo; - uint i; - for (i=0 ; i < share->base.keys ; i++,key++) - { - if (!(key->flag & HA_NOSAME) && info->s->base.auto_key != i+1) - { - mi_clear_key_active(share->state.key_map, i); - info->update|= HA_STATE_CHANGED; - } - } + if (share->state.key_map != *(ulonglong*)extra_arg) + info->update|= HA_STATE_CHANGED; + share->state.key_map= *(ulonglong*)extra_arg; if (!share->changed) { diff --git a/storage/perfschema/pfs_buffer_container.h b/storage/perfschema/pfs_buffer_container.h index d5745e76..b5506fe0 100644 --- a/storage/perfschema/pfs_buffer_container.h +++ b/storage/perfschema/pfs_buffer_container.h @@ -1084,8 +1084,7 @@ template class PFS_buffer_processor { public: - virtual ~PFS_buffer_processor () - {} + virtual ~PFS_buffer_processor()= default; virtual void operator()(T *element) = 0; }; diff --git a/storage/perfschema/pfs_instr_class.cc b/storage/perfschema/pfs_instr_class.cc index 2b1a80d3..fa85d861 100644 --- a/storage/perfschema/pfs_instr_class.cc +++ b/storage/perfschema/pfs_instr_class.cc @@ -55,7 +55,7 @@ Indicate if the performance schema is enabled. This flag is set at startup, and never changes. */ -my_bool pfs_enabled= TRUE; +my_bool pfs_enabled= FALSE; /** PFS_INSTRUMENT option settings array diff --git a/storage/perfschema/table_replication_applier_status.cc b/storage/perfschema/table_replication_applier_status.cc index fda3c927..94981482 100644 --- a/storage/perfschema/table_replication_applier_status.cc +++ b/storage/perfschema/table_replication_applier_status.cc @@ -166,7 +166,7 @@ void table_replication_applier_status::make_row(Master_info *mi) m_row.service_state= PS_RPL_NO; m_row.remaining_delay= 0; - if (slave_sql_running_state == Relay_log_info::state_delaying_string) + if (slave_sql_running_state == stage_sql_thd_waiting_until_delay.m_name) { time_t t= my_time(0), sql_delay_end= mi->rli.get_sql_delay_end(); m_row.remaining_delay= (uint)(t < sql_delay_end ? diff --git a/storage/perfschema/table_replication_applier_status.h b/storage/perfschema/table_replication_applier_status.h index 4da2087a..5e97dba5 100644 --- a/storage/perfschema/table_replication_applier_status.h +++ b/storage/perfschema/table_replication_applier_status.h @@ -59,7 +59,7 @@ struct st_row_applier_status { enum_rpl_yes_no service_state; uint remaining_delay; bool remaining_delay_is_set; - ulong count_transactions_retries; + ulonglong count_transactions_retries; }; /** Table PERFORMANCE_SCHEMA.replication_applier_status */ diff --git a/storage/perfschema/unittest/pfs_instr-t.cc b/storage/perfschema/unittest/pfs_instr-t.cc index 9667d7ff..55c4f619 100644 --- a/storage/perfschema/unittest/pfs_instr-t.cc +++ b/storage/perfschema/unittest/pfs_instr-t.cc @@ -86,6 +86,8 @@ void test_no_instruments() cleanup_instruments(); } +PRAGMA_DISABLE_CHECK_STACK_FRAME + void test_no_instances() { int rc; @@ -245,6 +247,7 @@ void test_no_instances() cleanup_file_hash(); cleanup_instruments(); } +PRAGMA_REENABLE_CHECK_STACK_FRAME void test_with_instances() { diff --git a/storage/perfschema/unittest/pfs_instr_class-t.cc b/storage/perfschema/unittest/pfs_instr_class-t.cc index 7651898d..76e3668d 100644 --- a/storage/perfschema/unittest/pfs_instr_class-t.cc +++ b/storage/perfschema/unittest/pfs_instr_class-t.cc @@ -743,6 +743,7 @@ void do_all_tests() int main(int argc, char **argv) { plan(209); + pfs_enabled= 1; MY_INIT(argv[0]); do_all_tests(); my_end(0); diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index 50ff1df7..2308d69f 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -202,7 +202,7 @@ ADD_CONVENIENCE_LIBRARY(rocksdb_aux_lib ADD_DEPENDENCIES(rocksdb_aux_lib GenError) # MARIAROCKS-TODO: how to properly depend on -lrt ? -TARGET_LINK_LIBRARIES(rocksdb_aux_lib rocksdblib ${ZLIB_LIBRARY}) +TARGET_LINK_LIBRARIES(rocksdb_aux_lib rocksdblib ${ZLIB_LIBRARIES}) if (UNIX AND NOT APPLE AND NOT CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") TARGET_LINK_LIBRARIES(rocksdb_aux_lib -lrt) endif() diff --git a/storage/rocksdb/build_rocksdb.cmake b/storage/rocksdb/build_rocksdb.cmake index 27a8616c..e89dbfc0 100644 --- a/storage/rocksdb/build_rocksdb.cmake +++ b/storage/rocksdb/build_rocksdb.cmake @@ -79,7 +79,7 @@ check_lib(Snappy) check_lib(ZSTD ZDICT_trainFromBuffer) add_definitions(-DZLIB) -list(APPEND THIRDPARTY_LIBS ${ZLIB_LIBRARY}) +list(APPEND THIRDPARTY_LIBS ${ZLIB_LIBRARIES}) ADD_FEATURE_INFO(ROCKSDB_ZLIB "ON" "zlib Compression in the RocksDB storage engine") if(CMAKE_SYSTEM_NAME MATCHES "Cygwin") diff --git a/storage/rocksdb/ha_rocksdb.h b/storage/rocksdb/ha_rocksdb.h index f847ee25..ea91b9b3 100644 --- a/storage/rocksdb/ha_rocksdb.h +++ b/storage/rocksdb/ha_rocksdb.h @@ -397,7 +397,7 @@ class ha_rocksdb : public my_core::handler { current lookup to be covered. If the bitmap field is null, that means this index does not cover the current lookup for any record. */ - MY_BITMAP m_lookup_bitmap = {nullptr, nullptr, 0, 0}; + MY_BITMAP m_lookup_bitmap = {nullptr, nullptr, 0, 0, 0}; int alloc_key_buffers(const TABLE *const table_arg, const Rdb_tbl_def *const tbl_def_arg, diff --git a/storage/rocksdb/mysql-test/rocksdb/r/group_min_max.result b/storage/rocksdb/mysql-test/rocksdb/r/group_min_max.result index 5a1350fe..dbf4d7d3 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/group_min_max.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/group_min_max.result @@ -3517,7 +3517,7 @@ SHOW SESSION STATUS LIKE 'Handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 3 -Handler_read_last 1 +Handler_read_last 0 Handler_read_next 0 Handler_read_prev 0 Handler_read_retry 0 diff --git a/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result b/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result index 8031d4c0..d99c9b11 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result @@ -68,7 +68,6 @@ buffer_flush_n_to_flush_by_age buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NUL buffer_flush_adaptive_avg_time buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Avg time (ms) spent for adaptive flushing recently. buffer_flush_adaptive_avg_pass buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of adaptive flushes passed during the recent Avg period. buffer_LRU_get_free_loops buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Total loops in LRU get free. -buffer_LRU_get_free_waits buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Total sleep waits in LRU get free. buffer_flush_avg_page_rate buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Average number of pages at which flushing is happening buffer_flush_lsn_avg_rate buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Average redo generation rate buffer_flush_pct_for_dirty buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Percent of IO capacity used to avoid max dirty page limit @@ -88,7 +87,6 @@ buffer_LRU_batch_num_scan buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NUL buffer_LRU_batch_scanned_per_call buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 set_member Pages scanned per LRU batch call buffer_LRU_batch_flush_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Total pages flushed as part of LRU batches buffer_LRU_batch_evict_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Total pages evicted as part of LRU batches -buffer_LRU_single_flush_failure_count Buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of times attempt to flush a single page from LRU failed buffer_LRU_get_free_search Buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of searches performed for a clean page buffer_LRU_search_scanned buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 set_owner Total pages scanned as part of LRU search buffer_LRU_search_num_scan buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 set_member Number of times LRU search is performed diff --git a/storage/rocksdb/mysql-test/rocksdb/r/partition.result b/storage/rocksdb/mysql-test/rocksdb/r/partition.result index a7f2a611..1ba966e9 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/partition.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/partition.result @@ -46,7 +46,6 @@ CREATE TABLE t1 (i INT, j INT, k INT, PRIMARY KEY (i)) ENGINE = ROCKSDB PARTITIO Table Op Msg_type Msg_text test.t1 optimize status OK Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK Table Op Msg_type Msg_text test.t1 repair status OK diff --git a/storage/rocksdb/mysql-test/rocksdb/t/disabled.def b/storage/rocksdb/mysql-test/rocksdb/t/disabled.def index 627d7da4..c16c1021 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/disabled.def +++ b/storage/rocksdb/mysql-test/rocksdb/t/disabled.def @@ -87,6 +87,10 @@ compact_deletes: MDEV-12663 : rocksdb.compact_deletes times out and causes other blind_delete_without_tx_api: MDEV-12286: rocksdb.blind_delete_without_tx_api test fails information_schema: MDEV-14372: unstable testcase +bloomfilter2: MDEV-33789: rocksdb.bloomfilter2 failed on amd64-debian-12-rocksdb +write_sync: MDEV-33866: rocksdb.write_sync fails on amd64-windows-packages +locking_issues_case5_rc: MDEV-33781: rocksdb.locking_issues_case5_rc fails on amd64-windows-packages + ## ## Tests that fail for some other reason ## diff --git a/storage/rocksdb/rdb_source_revision.h b/storage/rocksdb/rdb_source_revision.h new file mode 100644 index 00000000..d0d81aa1 --- /dev/null +++ b/storage/rocksdb/rdb_source_revision.h @@ -0,0 +1 @@ +#define ROCKSDB_GIT_HASH "bba5e7bc21093d7cfa765e1280a7c4fdcd284288" diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc index 5b85b3a2..c998fd18 100644 --- a/storage/spider/ha_spider.cc +++ b/storage/spider/ha_spider.cc @@ -269,19 +269,19 @@ int ha_spider::open( spider_bulk_malloc(spider_current_trx, 16, MYF(MY_WME | MY_ZEROFILL), &wide_handler, sizeof(SPIDER_WIDE_HANDLER), &searched_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &ft_discard_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &position_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &idx_read_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &idx_write_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &rnd_read_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &rnd_write_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &partition_handler, (uint) sizeof(SPIDER_PARTITION_HANDLER), NullS) @@ -305,9 +305,9 @@ int ha_spider::open( wide_handler->top_share = table->s; owner->wide_handler_owner = TRUE; memset(wide_handler->ft_discard_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); memset(wide_handler->searched_bitmap, 0, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); wide_handler_alloc = TRUE; if (!share && !spider_get_share(name, table, thd, this, &error_num)) @@ -347,12 +347,23 @@ int ha_spider::open( result_list.last = NULL; result_list.current = NULL; result_list.record_num = 0; - if ( - !(result_list.sqls = new spider_string[share->link_count]) || - !(result_list.insert_sqls = new spider_string[share->link_count]) || - !(result_list.update_sqls = new spider_string[share->link_count]) || - !(result_list.tmp_sqls = new spider_string[share->link_count]) - ) { + if (!(result_list.sqls = new spider_string[share->link_count])) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error_init_result_list; + } + if (!(result_list.insert_sqls = new spider_string[share->link_count])) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error_init_result_list; + } + if (!(result_list.update_sqls = new spider_string[share->link_count])) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error_init_result_list; + } + if (!(result_list.tmp_sqls = new spider_string[share->link_count])) + { error_num = HA_ERR_OUT_OF_MEM; goto error_init_result_list; } @@ -1000,9 +1011,9 @@ int ha_spider::reset() if (!is_clone) { memset(wide_handler->ft_discard_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); memset(wide_handler->searched_bitmap, 0, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); } while (wide_handler->condition) { @@ -1230,7 +1241,7 @@ int ha_spider::index_init( bitmap_set_all(table->read_set); if (is_clone) memset(wide_handler->searched_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); } } @@ -3125,7 +3136,7 @@ ha_rows ha_spider::multi_range_read_info_const( bitmap_set_all(table->read_set); if (is_clone) memset(wide_handler->searched_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); } } @@ -3178,7 +3189,7 @@ ha_rows ha_spider::multi_range_read_info( bitmap_set_all(table->read_set); if (is_clone) memset(wide_handler->searched_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); } } @@ -5437,7 +5448,7 @@ int ha_spider::rnd_init( bitmap_set_all(table->read_set); if (is_clone) memset(wide_handler->searched_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); } set_select_column_mode(); @@ -9023,27 +9034,35 @@ bool ha_spider::auto_repair() const } int ha_spider::disable_indexes( - uint mode + key_map map, bool persist ) { int error_num; backup_error_status(); DBUG_ENTER("ha_spider::disable_indexes"); DBUG_PRINT("info",("spider this=%p", this)); - if ((error_num = spider_db_disable_keys(this))) - DBUG_RETURN(check_error_mode(error_num)); - DBUG_RETURN(0); + if (persist) + { + if ((error_num = spider_db_disable_keys(this))) + DBUG_RETURN(check_error_mode(error_num)); + DBUG_RETURN(0); + } + DBUG_RETURN(HA_ERR_WRONG_COMMAND); } int ha_spider::enable_indexes( - uint mode + key_map map, bool persist ) { int error_num; backup_error_status(); DBUG_ENTER("ha_spider::enable_indexes"); DBUG_PRINT("info",("spider this=%p", this)); - if ((error_num = spider_db_enable_keys(this))) - DBUG_RETURN(check_error_mode(error_num)); - DBUG_RETURN(0); + if (persist) + { + if ((error_num = spider_db_enable_keys(this))) + DBUG_RETURN(check_error_mode(error_num)); + DBUG_RETURN(0); + } + DBUG_RETURN(HA_ERR_WRONG_COMMAND); } diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h index 4dffdf78..4c178a33 100644 --- a/storage/spider/ha_spider.h +++ b/storage/spider/ha_spider.h @@ -483,10 +483,10 @@ public: bool auto_repair() const; #endif int disable_indexes( - uint mode + key_map map, bool persist ); int enable_indexes( - uint mode + key_map map, bool persist ); int check( THD* thd, @@ -792,3 +792,26 @@ public: int lock_tables(); int dml_init(); }; + + +/* This is a hack for ASAN + * Libraries such as libxml2 and libodbc do not like being unloaded before + * exit and will show as a leak in ASAN with no stack trace (as the plugin + * has been unloaded from memory). + * + * The below is designed to trick the compiler into adding a "UNIQUE" symbol + * which can be seen using: + * readelf -s storage/spider/ha_spider.so | grep UNIQUE + * + * Having this symbol means that the plugin remains in memory after dlclose() + * has been called. Thereby letting the libraries clean up properly. + */ +#if defined(__SANITIZE_ADDRESS__) +__attribute__((__used__)) +inline int dummy(void) +{ + static int d; + d++; + return d; +} +#endif diff --git a/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result b/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result index aa734573..e3510042 100644 --- a/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result +++ b/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result @@ -8,6 +8,7 @@ child3_1 child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff --git a/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result b/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result index b793346d..361fd336 100644 --- a/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result +++ b/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result @@ -8,6 +8,7 @@ child3_1 child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff --git a/storage/spider/mysql-test/spider/bg/r/spider_fixes.result b/storage/spider/mysql-test/spider/bg/r/spider_fixes.result index 51045e0b..a751d803 100644 --- a/storage/spider/mysql-test/spider/bg/r/spider_fixes.result +++ b/storage/spider/mysql-test/spider/bg/r/spider_fixes.result @@ -8,6 +8,7 @@ child3_1 child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff --git a/storage/spider/mysql-test/spider/bg/r/spider_fixes_part.result b/storage/spider/mysql-test/spider/bg/r/spider_fixes_part.result index faf0b6ef..3ce8dfbf 100644 --- a/storage/spider/mysql-test/spider/bg/r/spider_fixes_part.result +++ b/storage/spider/mysql-test/spider/bg/r/spider_fixes_part.result @@ -8,6 +8,7 @@ child3_1 child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff --git a/storage/spider/mysql-test/spider/bg/t/slave_test_init.inc b/storage/spider/mysql-test/spider/bg/t/slave_test_init.inc index 739d8897..84de2c7d 100644 --- a/storage/spider/mysql-test/spider/bg/t/slave_test_init.inc +++ b/storage/spider/mysql-test/spider/bg/t/slave_test_init.inc @@ -19,7 +19,7 @@ if (!$SLAVE1_1_SLAVE_STATUS) MASTER_PORT = $MASTER_1_MYPORT ; } -START SLAVE; +--source include/start_slave.inc --connection master_1 call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); --connection slave1_1 diff --git a/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_default.result b/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_default.result index cb1b190f..8b193975 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_default.result +++ b/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_default.result @@ -5,6 +5,7 @@ child2_2 child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; connection master_1; set @old_binlog_format= @@binlog_format; diff --git a/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mariadb.result b/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mariadb.result index cb1b190f..8b193975 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mariadb.result +++ b/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mariadb.result @@ -5,6 +5,7 @@ child2_2 child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; connection master_1; set @old_binlog_format= @@binlog_format; diff --git a/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mysql.result b/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mysql.result index 11310212..1e5d7d31 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mysql.result +++ b/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mysql.result @@ -5,6 +5,7 @@ child2_2 child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; connection master_1; set @old_binlog_format= @@binlog_format; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_19866.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_19866.result index 4386b4cb..dbf0f54c 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/mdev_19866.result +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_19866.result @@ -72,7 +72,6 @@ SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argum argument select `pkey`,`val` from `auto_test_remote`.`tbl_a` select `pkey`,`val` from `auto_test_remote`.`tbl_a` where `pkey` = 1 -select 1 from (select 1) t0 select `pkey`,`val` from `auto_test_remote`.`tbl_a` select `pkey`,`val` from `auto_test_remote`.`tbl_a` SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' @@ -86,7 +85,6 @@ argument select `pkey`,`val` from `auto_test_remote2`.`tbl_a` select `pkey`,`val` from `auto_test_remote2`.`tbl_a` select `pkey`,`val` from `auto_test_remote2`.`tbl_a` where `pkey` = 2 -select 1 from (select 1) t0 select `pkey`,`val` from `auto_test_remote2`.`tbl_a` SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' SELECT pkey, val FROM tbl_a ORDER BY pkey; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.result index 531e48b8..60ef8e2d 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.result +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.result @@ -66,9 +66,6 @@ id greeting connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE 'select `id`,`greeting` from %'; argument -select `id`,`greeting` from `auto_test_remote`.`tbl_a` where `greeting` = 'Aloha!' and ((`greeting` = 'Aloha!')) -select `id`,`greeting` from `auto_test_remote`.`tbl_b` where `greeting` like 'Aloha%' and ((`greeting` = 'Aloha!')) -select `id`,`greeting` from `auto_test_remote`.`tbl_c` where `greeting` like 'Aloha%' and ((`greeting` = 'Aloha!')) connection child2_1; SET @@global.general_log = @general_log_backup; SET @@global.log_output = @log_output_backup; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result index 7e4fd3cd..5fd412b6 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result @@ -5,6 +5,8 @@ for master_1 for child2 for child3 set spider_same_server_link=1; +set @old_spider_same_server_link=@@global.spider_same_server_link; +set global spider_same_server_link=1; CREATE SERVER srv FOREIGN DATA WRAPPER mysql OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); # testing monitoring_* @@ -173,6 +175,7 @@ max(d) 93 drop table t1, t2; drop server srv; +set global spider_same_server_link=@old_spider_same_server_link; for master_1 for child2 for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result new file mode 100644 index 00000000..79a383fe --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result @@ -0,0 +1,24 @@ +CREATE FUNCTION spider_direct_sql RETURNS INT SONAME 'ha_spider.so'; +SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"'); +ERROR HY000: Can't initialize function 'spider_direct_sql'; Plugin 'SPIDER' is not loaded +CREATE FUNCTION spider_bg_direct_sql RETURNS INT SONAME 'ha_spider.so'; +SELECT spider_bg_direct_sql ('SELECT * FROM s','a','srv "b"'); +ERROR HY000: Can't initialize function 'spider_bg_direct_sql'; Plugin 'SPIDER' is not loaded +CREATE FUNCTION spider_copy_tables RETURNS INT SONAME 'ha_spider.so'; +SELECT spider_copy_tables ('t', '0', '0'); +ERROR HY000: Can't initialize function 'spider_copy_tables'; Plugin 'SPIDER' is not loaded +CREATE FUNCTION spider_flush_table_mon_cache RETURNS INT SONAME 'ha_spider.so'; +SELECT spider_flush_table_mon_cache (); +spider_flush_table_mon_cache () +1 +install soname 'ha_spider'; +SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"'); +ERROR HY000: The foreign server name you are trying to reference does not exist. Data source error: b +call mtr.add_suppression(".*\\[Error\\] (mysqld|mariadbd): Can't find record in 'spider_tables'"); +SELECT spider_copy_tables ('t', '0', '0'); +ERROR HY000: Can't find record in 'spider_tables' +SELECT spider_flush_table_mon_cache (); +spider_flush_table_mon_cache () +1 +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33242.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33242.result new file mode 100644 index 00000000..bbbc4499 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33242.result @@ -0,0 +1,4 @@ +set @old_old_mode=@@global.old_mode; +set global old_mode=4; +INSTALL SONAME 'ha_spider.so'; +set global old_mode=@old_old_mode; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33434.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33434.result new file mode 100644 index 00000000..2cbcff38 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33434.result @@ -0,0 +1,12 @@ +# +# MDEV-33434 MDEV-33434 UBSAN null pointer passed as argument 2, which is declared to never be null in spider_udf_direct_sql_create_conn +# +INSTALL SONAME 'ha_spider'; +SET character_set_connection=ucs2; +SELECT SPIDER_DIRECT_SQL('SELECT SLEEP(1)', '', 'srv "dummy", port "3307"'); +ERROR HY000: Unable to connect to foreign data source: localhost +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown +# +# end of test mdev_33434 +# diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33441.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33441.result new file mode 100644 index 00000000..b19194f1 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33441.result @@ -0,0 +1,7 @@ +# +# MDEV-33441 No spider variables available is Spider is loaded upon server startup +# +set spider_same_server_link=0; +# +# end of test mdev_33441 +# diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33441_fail.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33441_fail.result new file mode 100644 index 00000000..e6123ed4 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33441_fail.result @@ -0,0 +1,10 @@ +# +# MDEV-33441 No spider variables available is Spider is loaded upon server startup +# +select * from mysql.plugin; +name dl +show variables like 'spider%'; +Variable_name Value +# +# end of test mdev_33441_fail +# diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33494.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33494.result new file mode 100644 index 00000000..3db28c0f --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33494.result @@ -0,0 +1,4 @@ +set @old_sql_mode=@@global.sql_mode; +set global sql_mode=(SELECT CONCAT (@@sql_mode,',no_zero_date')); +install soname 'ha_spider'; +set global sql_mode=@old_sql_mode; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33538.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33538.result new file mode 100644 index 00000000..a5ab3c1d --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33538.result @@ -0,0 +1,12 @@ +show create table information_schema.SPIDER_ALLOC_MEM; +Table Create Table +SPIDER_ALLOC_MEM CREATE TEMPORARY TABLE `SPIDER_ALLOC_MEM` ( + `ID` int(10) unsigned NOT NULL, + `FUNC_NAME` varchar(64), + `FILE_NAME` varchar(64), + `LINE_NO` int(10) unsigned, + `TOTAL_ALLOC_MEM` bigint(20) unsigned, + `CURRENT_ALLOC_MEM` bigint(20), + `ALLOC_MEM_COUNT` bigint(20) unsigned, + `FREE_MEM_COUNT` bigint(20) unsigned +) ENGINE=MEMORY DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result new file mode 100644 index 00000000..7535da83 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result @@ -0,0 +1,10 @@ +call mtr.add_suppression("\\[ERROR\\] SPIDER plugin initialization failed"); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER' registration as a STORAGE ENGINE failed."); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER_WRAPPER_PROTOCOLS' registration as a INFORMATION SCHEMA failed."); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER_ALLOC_MEM' registration as a INFORMATION SCHEMA failed."); +create table mysql.spider_tables (c int); +# restart: --plugin-load-add=ha_spider +SELECT * FROM information_schema.SPIDER_ALLOC_MEM; +ID FUNC_NAME FILE_NAME LINE_NO TOTAL_ALLOC_MEM CURRENT_ALLOC_MEM ALLOC_MEM_COUNT FREE_MEM_COUNT +SELECT * FROM information_schema.SPIDER_WRAPPER_PROTOCOLS; +WRAPPER_NAME WRAPPER_VERSION WRAPPER_DESCRIPTION WRAPPER_MATURITY diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33584.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33584.result new file mode 100644 index 00000000..796c75cc --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33584.result @@ -0,0 +1,4 @@ +set @old_sql_mode=@@global.sql_mode; +set global sql_mode='traditional'; +install soname 'ha_spider'; +set global sql_mode=@old_sql_mode; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33679.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33679.result new file mode 100644 index 00000000..c021bc70 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33679.result @@ -0,0 +1,25 @@ +# +# MDEV-33679 spider returns parsing failure on valid left join select by translating the on expression to () +# +for master_1 +for child2 +for child3 +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE `t1` (`c` INT(10) UNSIGNED NOT NULL, `b` VARCHAR(255) NOT NULL , PRIMARY KEY (`c`) USING BTREE ) ENGINE=MYISAM; +CREATE TABLE `t2` (`a` INT(10) UNSIGNED NOT NULL, `c` INT(10) UNSIGNED NOT NULL ) ENGINE=MYISAM; +SET spider_same_server_link= on; +CREATE TABLE `t1_spider` (`c` INT(10) UNSIGNED NOT NULL, `b` VARCHAR(255) NOT NULL , PRIMARY KEY (`c`) USING BTREE ) COMMENT='wrapper "mysql",srv "srv", table "t1"' ENGINE=SPIDER; +CREATE TABLE `t2_spider` (`a` INT(10) UNSIGNED NOT NULL, `c` INT(10) UNSIGNED NOT NULL +, PRIMARY KEY (`a`) USING BTREE +) COMMENT='wrapper "mysql",srv "srv",table "t2"' ENGINE=SPIDER; +INSERT INTO t1_spider VALUES(1,'oooo'); +INSERT INTO t2_spider VALUES(1,1); +SELECT t2_spider.a,t1_spider.c FRoM t2_spider LEFT join t1_spider ON (t2_spider.c = t1_spider.c) WHERE t2_spider.a = 1; +a c +1 1 +drop table t1, t2, t1_spider, t2_spider; +drop server srv; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_33731.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_33731.result new file mode 100644 index 00000000..a63830f1 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_33731.result @@ -0,0 +1,10 @@ +for master_1 +for child2 +for child3 +CREATE TABLE t (a INT) ENGINE=Spider PARTITION BY LIST (a) PARTITIONS 2 (PARTITION p1 VALUES IN (0,1),PARTITION p2 VALUES IN (2,3)); +DELETE FROM t PARTITION (p2); +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_34003.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_34003.result new file mode 100644 index 00000000..b78f18d1 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_34003.result @@ -0,0 +1,18 @@ +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c INT KEY,c1 BLOB,c2 TEXT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (0,1,0),(1,0,0),(2,0,0); +create table t1 (c INT KEY,c1 BLOB,c2 TEXT) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +SELECT * FROM t1 WHERE c=0; +c c1 c2 +0 1 0 +drop table t1, t2; +drop server srv; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/r/plugin_load_add_all.result b/storage/spider/mysql-test/spider/bugfix/r/plugin_load_add_all.result index 04e5ed6d..4d161a2f 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/plugin_load_add_all.result +++ b/storage/spider/mysql-test/spider/bugfix/r/plugin_load_add_all.result @@ -3,5 +3,9 @@ # select * from mysql.plugin; name dl +select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = "information_schema" and TABLE_NAME like "SPIDER_%"; +TABLE_NAME +SPIDER_ALLOC_MEM +SPIDER_WRAPPER_PROTOCOLS create table t (c int) Engine=SPIDER; drop table t; diff --git a/storage/spider/mysql-test/spider/bugfix/r/slave_transaction_retry_errors_5digit.result b/storage/spider/mysql-test/spider/bugfix/r/slave_transaction_retry_errors_5digit.result index f2cab6b0..83dab07f 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/slave_transaction_retry_errors_5digit.result +++ b/storage/spider/mysql-test/spider/bugfix/r/slave_transaction_retry_errors_5digit.result @@ -5,11 +5,12 @@ child2_2 child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; SHOW VARIABLES LIKE 'slave_transaction_retry_errors'; Variable_name Value -slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1429,2013,12701,10000,20000,30000 +slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1020,1429,2013,12701,10000,20000,30000 connection slave1_1; for slave1_1 for master_1 diff --git a/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result b/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result index e84d42bb..239402a5 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result +++ b/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result @@ -5,6 +5,7 @@ child2_2 child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; set @old_spider_slave_trx_isolation= @@spider_slave_trx_isolation; set global spider_slave_trx_isolation= 1; diff --git a/storage/spider/mysql-test/spider/bugfix/r/udf_mysql_func_early_init_file.result b/storage/spider/mysql-test/spider/bugfix/r/udf_mysql_func_early_init_file.result deleted file mode 120000 index 045ddc43..00000000 --- a/storage/spider/mysql-test/spider/bugfix/r/udf_mysql_func_early_init_file.result +++ /dev/null @@ -1 +0,0 @@ -udf_mysql_func_early.result \ No newline at end of file diff --git a/storage/spider/mysql-test/spider/bugfix/r/udf_mysql_func_early_init_file.result b/storage/spider/mysql-test/spider/bugfix/r/udf_mysql_func_early_init_file.result new file mode 100644 index 00000000..b84f60a6 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/udf_mysql_func_early_init_file.result @@ -0,0 +1,43 @@ +# +# Test that udf created by inserting into mysql_func works as expected +# +CREATE SERVER s_1 FOREIGN DATA WRAPPER mysql OPTIONS ( +HOST 'localhost', +DATABASE 'auto_test_local', +USER 'root', +PASSWORD '', +SOCKET '$MASTER_1_MYSOCK' + ); +CREATE SERVER s_2_1 FOREIGN DATA WRAPPER mysql OPTIONS ( +HOST 'localhost', +DATABASE 'auto_test_remote', +USER 'root', +PASSWORD '', +SOCKET '$CHILD2_1_MYSOCK' + ); +connect master_1, localhost, root, , , $MASTER_1_MYPORT, $MASTER_1_MYSOCK; +connect child2_1, localhost, root, , , $CHILD2_1_MYPORT, $CHILD2_1_MYSOCK; +connection child2_1; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +CREATE TABLE tbl_a ( +a INT +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +insert into tbl_a values (42); +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +CREATE TABLE tbl_a ( +a INT +) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "tbl_a", srv "s_2_1"'; +create temporary table results (a int); +SELECT SPIDER_DIRECT_SQL('select * from tbl_a', 'results', 'srv "s_2_1", database "auto_test_remote"'); +SPIDER_DIRECT_SQL('select * from tbl_a', 'results', 'srv "s_2_1", database "auto_test_remote"') +1 +select * from results; +a +42 +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test index a1642f7a..9ccfc378 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test @@ -10,6 +10,9 @@ # This test covers some table params under consideration for inclusion # in the engine-defined options to be implemented in MDEV-28856. set spider_same_server_link=1; +set @old_spider_same_server_link=@@global.spider_same_server_link; +set global spider_same_server_link=1; + evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); @@ -153,6 +156,7 @@ select max(d) from t1; drop table t1, t2; drop server srv; +set global spider_same_server_link=@old_spider_same_server_link; --disable_query_log --disable_result_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test new file mode 100644 index 00000000..ebd08edc --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test @@ -0,0 +1,30 @@ +CREATE FUNCTION spider_direct_sql RETURNS INT SONAME 'ha_spider.so'; +--error ER_CANT_INITIALIZE_UDF +SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"'); + +CREATE FUNCTION spider_bg_direct_sql RETURNS INT SONAME 'ha_spider.so'; +--error ER_CANT_INITIALIZE_UDF +SELECT spider_bg_direct_sql ('SELECT * FROM s','a','srv "b"'); + +CREATE FUNCTION spider_copy_tables RETURNS INT SONAME 'ha_spider.so'; +--error ER_CANT_INITIALIZE_UDF +SELECT spider_copy_tables ('t', '0', '0'); + +# spider_flush_table_mon_cache does not require spider init to function +CREATE FUNCTION spider_flush_table_mon_cache RETURNS INT SONAME 'ha_spider.so'; +SELECT spider_flush_table_mon_cache (); + +# The function functions properly after the plugin is installed +install soname 'ha_spider'; + +--error ER_FOREIGN_SERVER_DOESNT_EXIST +SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"'); + +call mtr.add_suppression(".*\\[Error\\] (mysqld|mariadbd): Can't find record in 'spider_tables'"); +--error ER_KEY_NOT_FOUND +SELECT spider_copy_tables ('t', '0', '0'); + +SELECT spider_flush_table_mon_cache (); + +--disable_query_log +--source ../../include/clean_up_spider.inc diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33242.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33242.test new file mode 100644 index 00000000..215dab25 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33242.test @@ -0,0 +1,6 @@ +set @old_old_mode=@@global.old_mode; +set global old_mode=4; +INSTALL SONAME 'ha_spider.so'; +set global old_mode=@old_old_mode; +--disable_query_log +--source ../../include/clean_up_spider.inc diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test new file mode 100644 index 00000000..dd9f882f --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test @@ -0,0 +1,15 @@ +--echo # +--echo # MDEV-33434 MDEV-33434 UBSAN null pointer passed as argument 2, which is declared to never be null in spider_udf_direct_sql_create_conn +--echo # + +INSTALL SONAME 'ha_spider'; +SET character_set_connection=ucs2; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT SPIDER_DIRECT_SQL('SELECT SLEEP(1)', '', 'srv "dummy", port "3307"'); +--disable_query_log +--source ../../include/clean_up_spider.inc +--enable_query_log + +--echo # +--echo # end of test mdev_33434 +--echo # diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.opt b/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.opt new file mode 100644 index 00000000..924ea4e3 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.opt @@ -0,0 +1 @@ +--plugin-load-add=ha_spider diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.test new file mode 100644 index 00000000..a2e0ddaf --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.test @@ -0,0 +1,10 @@ +--echo # +--echo # MDEV-33441 No spider variables available is Spider is loaded upon server startup +--echo # + +# We test that at least one spider variable exists. +set spider_same_server_link=0; + +--echo # +--echo # end of test mdev_33441 +--echo # diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.opt b/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.opt new file mode 100644 index 00000000..28f1ce48 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.opt @@ -0,0 +1,2 @@ +--plugin-load-add=ha_spider +--debug-dbug=d,fail_spider_init_retry diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.test new file mode 100644 index 00000000..6734b477 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.test @@ -0,0 +1,10 @@ +--source include/have_debug.inc +--echo # +--echo # MDEV-33441 No spider variables available is Spider is loaded upon server startup +--echo # +# We test that when retry fails, spider variables are deleted. +select * from mysql.plugin; +show variables like 'spider%'; +--echo # +--echo # end of test mdev_33441_fail +--echo # diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33494.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33494.test new file mode 100644 index 00000000..30beca77 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33494.test @@ -0,0 +1,11 @@ +# This test tests spider init with global no_zero_date sql mode +set @old_sql_mode=@@global.sql_mode; +set global sql_mode=(SELECT CONCAT (@@sql_mode,',no_zero_date')); +install soname 'ha_spider'; +set global sql_mode=@old_sql_mode; + +--disable_query_log +--disable_result_log +--source ../../include/clean_up_spider.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.opt b/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.opt new file mode 100644 index 00000000..a90c3a39 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.opt @@ -0,0 +1,2 @@ +--plugin-load-add=ha_spider +--transaction-read-only=on diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.test new file mode 100644 index 00000000..e2d4d8b4 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.test @@ -0,0 +1,2 @@ +# we check that information_schema.SPIDER_ALLOC_MEM exists +show create table information_schema.SPIDER_ALLOC_MEM; diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33538_fail_init.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33538_fail_init.test new file mode 100644 index 00000000..fafc2fdb --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33538_fail_init.test @@ -0,0 +1,17 @@ +call mtr.add_suppression("\\[ERROR\\] SPIDER plugin initialization failed"); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER' registration as a STORAGE ENGINE failed."); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER_WRAPPER_PROTOCOLS' registration as a INFORMATION SCHEMA failed."); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER_ALLOC_MEM' registration as a INFORMATION SCHEMA failed."); +# We create a table with identical name of the spider system table, to +# fail the spider init query ([ERROR] SPIDER plugin initialization +# failed at 'alter table mysql.spider_tables add column if not exists +# link_id int not null default 0 after table_name, drop primary key, +# add primary key (db_name, table_name, link_id), algorithm=copy, +# lock=shared;' by 'Unknown column 'table_name' in 'spider_tables'') +# This will cause the init of spider_alloc_mem to fail because it +# depends on the main spider plugin. +create table mysql.spider_tables (c int); +--let $restart_parameters= --plugin-load-add=ha_spider +--source include/restart_mysqld.inc +SELECT * FROM information_schema.SPIDER_ALLOC_MEM; +SELECT * FROM information_schema.SPIDER_WRAPPER_PROTOCOLS; diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33584.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33584.test new file mode 100644 index 00000000..88644971 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33584.test @@ -0,0 +1,11 @@ +# This test tests spider init with global no_zero_date sql mode +set @old_sql_mode=@@global.sql_mode; +set global sql_mode='traditional'; +install soname 'ha_spider'; +set global sql_mode=@old_sql_mode; + +--disable_query_log +--disable_result_log +--source ../../include/clean_up_spider.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33679.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33679.test new file mode 100644 index 00000000..eee47a21 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33679.test @@ -0,0 +1,29 @@ +--echo # +--echo # MDEV-33679 spider returns parsing failure on valid left join select by translating the on expression to () +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +CREATE TABLE `t1` (`c` INT(10) UNSIGNED NOT NULL, `b` VARCHAR(255) NOT NULL , PRIMARY KEY (`c`) USING BTREE ) ENGINE=MYISAM; +CREATE TABLE `t2` (`a` INT(10) UNSIGNED NOT NULL, `c` INT(10) UNSIGNED NOT NULL ) ENGINE=MYISAM; +SET spider_same_server_link= on; +CREATE TABLE `t1_spider` (`c` INT(10) UNSIGNED NOT NULL, `b` VARCHAR(255) NOT NULL , PRIMARY KEY (`c`) USING BTREE ) COMMENT='wrapper "mysql",srv "srv", table "t1"' ENGINE=SPIDER; +CREATE TABLE `t2_spider` (`a` INT(10) UNSIGNED NOT NULL, `c` INT(10) UNSIGNED NOT NULL +, PRIMARY KEY (`a`) USING BTREE +) COMMENT='wrapper "mysql",srv "srv",table "t2"' ENGINE=SPIDER; +INSERT INTO t1_spider VALUES(1,'oooo'); +INSERT INTO t2_spider VALUES(1,1); +SELECT t2_spider.a,t1_spider.c FRoM t2_spider LEFT join t1_spider ON (t2_spider.c = t1_spider.c) WHERE t2_spider.a = 1; + +drop table t1, t2, t1_spider, t2_spider; +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33731.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33731.test new file mode 100644 index 00000000..b98c9620 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33731.test @@ -0,0 +1,16 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +CREATE TABLE t (a INT) ENGINE=Spider PARTITION BY LIST (a) PARTITIONS 2 (PARTITION p1 VALUES IN (0,1),PARTITION p2 VALUES IN (2,3)); +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +DELETE FROM t PARTITION (p2); +drop table t; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_34003.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_34003.test new file mode 100644 index 00000000..f81259b9 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_34003.test @@ -0,0 +1,20 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c INT KEY,c1 BLOB,c2 TEXT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (0,1,0),(1,0,0),(2,0,0); +create table t1 (c INT KEY,c1 BLOB,c2 TEXT) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +SELECT * FROM t1 WHERE c=0; +drop table t1, t2; +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/plugin_load_add_all.test b/storage/spider/mysql-test/spider/bugfix/t/plugin_load_add_all.test index 396145fb..35242b20 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/plugin_load_add_all.test +++ b/storage/spider/mysql-test/spider/bugfix/t/plugin_load_add_all.test @@ -3,5 +3,6 @@ --echo # # A simple test that tests plugin-load-add=ha_spider select * from mysql.plugin; +select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = "information_schema" and TABLE_NAME like "SPIDER_%"; create table t (c int) Engine=SPIDER; drop table t; diff --git a/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test b/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test index 4263560b..de75f0ee 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test +++ b/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test @@ -19,8 +19,10 @@ eval create table t0 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "$srv", eval alter table t2 ENGINE=Spider COMMENT='WRAPPER "mysql", srv "$srv",TABLE "t0"'; --error 12719 select * from t0; +--replace_result test.t1 test.t0 test.t2 test.t0 --error 12719 select * from t1; +--replace_result test.t1 test.t0 test.t2 test.t0 --error 12719 select * from t2; drop table t0, t1, t2; diff --git a/storage/spider/mysql-test/spider/feature/r/pushdown_case.result b/storage/spider/mysql-test/spider/feature/r/pushdown_case.result new file mode 100644 index 00000000..613ce377 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/r/pushdown_case.result @@ -0,0 +1,57 @@ +# +# MDEV-28993 Spider: Push down CASE statement +# +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +insert into t1 values (42), (3), (848), (100); +explain select case c when 3 then "three" when 42 then "answer" else "other" end from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select case c when 3 then "three" when 42 then "answer" else "other" end from t1; +case c when 3 then "three" when 42 then "answer" else "other" end +answer +three +other +other +explain select case c when 3 then "three" when 42 then "answer" end from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select case c when 3 then "three" when 42 then "answer" end from t1; +case c when 3 then "three" when 42 then "answer" end +answer +three +NULL +NULL +explain select case when c = 3 then "three" when c = 42 then "answer" else "other" end from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select case when c = 3 then "three" when c = 42 then "answer" else "other" end from t1; +case when c = 3 then "three" when c = 42 then "answer" else "other" end +answer +three +other +other +explain select case when c = 3 then "three" when c = 42 then "answer" end from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select case when c = 3 then "three" when c = 42 then "answer" end from t1; +case when c = 3 then "three" when c = 42 then "answer" end +answer +three +NULL +NULL +drop table t1, t2; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test pushdown_case +# diff --git a/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.result b/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.result new file mode 100644 index 00000000..3acd8912 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.result @@ -0,0 +1,111 @@ +# +# MDEV-28992 Spider: Push down TIMESTAMPDIFF function +# +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +); +CREATE TABLE t1 ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +INSERT INTO t1 (a, b, c) VALUES +(1, 'a', '2018-11-01 10:21:39'), +(2, 'b', '2015-06-30 23:59:59'), +(3, 'c', '2013-11-01 01:01:01'); +interval year +explain select a, b, timestampdiff(year, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(year, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(year, '2000-01-01 00:00:00', c) +1 a 18 +2 b 15 +3 c 13 +interval quarter +explain select a, b, timestampdiff(quarter, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(quarter, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(quarter, '2000-01-01 00:00:00', c) +1 a 75 +2 b 61 +3 c 55 +interval month +explain select a, b, timestampdiff(month, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(month, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(month, '2000-01-01 00:00:00', c) +1 a 226 +2 b 185 +3 c 166 +interval week +explain select a, b, timestampdiff(week, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(week, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(week, '2000-01-01 00:00:00', c) +1 a 982 +2 b 808 +3 c 721 +interval day +explain select a, b, timestampdiff(day, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(day, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(day, '2000-01-01 00:00:00', c) +1 a 6879 +2 b 5659 +3 c 5053 +internal hour +explain select a, b, timestampdiff(hour, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(hour, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(hour, '2000-01-01 00:00:00', c) +1 a 165106 +2 b 135839 +3 c 121273 +internal minute +explain select a, b, timestampdiff(minute, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(minute, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(minute, '2000-01-01 00:00:00', c) +1 a 9906381 +2 b 8150399 +3 c 7276381 +internal second +explain select a, b, timestampdiff(second, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(second, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(second, '2000-01-01 00:00:00', c) +1 a 594382899 +2 b 489023999 +3 c 436582861 +internal microsecond +explain select a, b, timestampdiff(microsecond, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(microsecond, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(microsecond, '2000-01-01 00:00:00', c) +1 a 594382899000000 +2 b 489023999000000 +3 c 436582861000000 +drop table t1, t2; +drop server srv; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/feature/r/slave_transaction_retry_errors.result b/storage/spider/mysql-test/spider/feature/r/slave_transaction_retry_errors.result index 0a147c03..f7d4341c 100644 --- a/storage/spider/mysql-test/spider/feature/r/slave_transaction_retry_errors.result +++ b/storage/spider/mysql-test/spider/feature/r/slave_transaction_retry_errors.result @@ -5,11 +5,12 @@ child2_2 child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; SHOW VARIABLES LIKE 'slave_transaction_retry_errors'; Variable_name Value -slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1429,2013,12701 +slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1020,1429,2013,12701 connection slave1_1; for slave1_1 for master_1 diff --git a/storage/spider/mysql-test/spider/feature/t/pushdown_case.test b/storage/spider/mysql-test/spider/feature/t/pushdown_case.test new file mode 100644 index 00000000..b86edceb --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/t/pushdown_case.test @@ -0,0 +1,50 @@ +--echo # +--echo # MDEV-28993 Spider: Push down CASE statement +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +insert into t1 values (42), (3), (848), (100); + +# everything +let $query= +select case c when 3 then "three" when 42 then "answer" else "other" end from t1; +eval explain $query; +eval $query; + +# no else +let $query= +select case c when 3 then "three" when 42 then "answer" end from t1; +eval explain $query; +eval $query; + +# no value +let $query= +select case when c = 3 then "three" when c = 42 then "answer" else "other" end from t1; +eval explain $query; +eval $query; + +# neither +let $query= +select case when c = 3 then "three" when c = 42 then "answer" end from t1; +eval explain $query; +eval $query; + +drop table t1, t2; +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test pushdown_case +--echo # diff --git a/storage/spider/mysql-test/spider/feature/t/pushdown_timestamp_diff.test b/storage/spider/mysql-test/spider/feature/t/pushdown_timestamp_diff.test new file mode 100644 index 00000000..81251860 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/t/pushdown_timestamp_diff.test @@ -0,0 +1,93 @@ +--echo # +--echo # MDEV-28992 Spider: Push down TIMESTAMPDIFF function +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +create table t2 ( + a INT, + b CHAR(1), + c DATETIME, + PRIMARY KEY(a) +); +CREATE TABLE t1 ( + a INT, + b CHAR(1), + c DATETIME, + PRIMARY KEY(a) +) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; + +INSERT INTO t1 (a, b, c) VALUES + (1, 'a', '2018-11-01 10:21:39'), + (2, 'b', '2015-06-30 23:59:59'), + (3, 'c', '2013-11-01 01:01:01'); + +--echo interval year +let $query= +select a, b, timestampdiff(year, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo interval quarter +let $query= +select a, b, timestampdiff(quarter, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo interval month +let $query= +select a, b, timestampdiff(month, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo interval week +let $query= +select a, b, timestampdiff(week, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo interval day +let $query= +select a, b, timestampdiff(day, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo internal hour +let $query= +select a, b, timestampdiff(hour, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo internal minute +let $query= +select a, b, timestampdiff(minute, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo internal second +let $query= +select a, b, timestampdiff(second, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo internal microsecond +let $query= +select a, b, timestampdiff(microsecond, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +drop table t1, t2; +drop server srv; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/mysql-test/spider/include/clean_up_spider.inc b/storage/spider/mysql-test/spider/include/clean_up_spider.inc index 1c977bfb..249606ec 100644 --- a/storage/spider/mysql-test/spider/include/clean_up_spider.inc +++ b/storage/spider/mysql-test/spider/include/clean_up_spider.inc @@ -3,7 +3,6 @@ DROP FUNCTION spider_copy_tables; DROP FUNCTION spider_ping_table; DROP FUNCTION spider_bg_direct_sql; DROP FUNCTION spider_direct_sql; ---replace_regex /\.dll/.so/ UNINSTALL SONAME IF EXISTS 'ha_spider'; DROP TABLE IF EXISTS mysql.spider_xa; DROP TABLE IF EXISTS mysql.spider_xa_member; diff --git a/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result b/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result index 850546fa..3eed8df2 100644 --- a/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result +++ b/storage/spider/mysql-test/spider/r/partition_join_pushdown_for_single_partition.result @@ -86,10 +86,8 @@ SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argum argument select `value` from `auto_test_remote2`.`tbl_a` where `value` = 5 select `value2` from `auto_test_remote2`.`tbl_b` where `value2` = 5 -select sum('5') `sum(a.value)`,count('5') `count(b.value2)` from (select 1) t0 join (select 1) t1 select `value` from `auto_test_remote2`.`tbl_a` where `value` = 5 select `value2` from `auto_test_remote2`.`tbl_b` where `value2` = 5 -select sum('5') `sum(a.value)`,count('5') `count(b.value2)` from (select 1) t0 join (select 1) t1 SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' SELECT value FROM tbl_a ORDER BY value; value diff --git a/storage/spider/mysql-test/spider/r/slave_trx_isolation.result b/storage/spider/mysql-test/spider/r/slave_trx_isolation.result index 28aaf74f..2f850b26 100644 --- a/storage/spider/mysql-test/spider/r/slave_trx_isolation.result +++ b/storage/spider/mysql-test/spider/r/slave_trx_isolation.result @@ -8,6 +8,7 @@ child3_1 child3_2 child3_3 for slave1_1 +include/start_slave.inc connection slave1_1; set @old_spider_slave_trx_isolation= @@spider_slave_trx_isolation; set global spider_slave_trx_isolation= 1; diff --git a/storage/spider/mysql-test/spider/r/spider3_fixes.result b/storage/spider/mysql-test/spider/r/spider3_fixes.result index 7a80e102..614920be 100644 --- a/storage/spider/mysql-test/spider/r/spider3_fixes.result +++ b/storage/spider/mysql-test/spider/r/spider3_fixes.result @@ -8,6 +8,7 @@ child3_1 child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff --git a/storage/spider/mysql-test/spider/r/spider3_fixes_part.result b/storage/spider/mysql-test/spider/r/spider3_fixes_part.result index 937f222f..94390ff7 100644 --- a/storage/spider/mysql-test/spider/r/spider3_fixes_part.result +++ b/storage/spider/mysql-test/spider/r/spider3_fixes_part.result @@ -8,6 +8,7 @@ child3_1 child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff --git a/storage/spider/mysql-test/spider/r/spider_fixes.result b/storage/spider/mysql-test/spider/r/spider_fixes.result index 273f37a8..9083ad70 100644 --- a/storage/spider/mysql-test/spider/r/spider_fixes.result +++ b/storage/spider/mysql-test/spider/r/spider_fixes.result @@ -8,6 +8,7 @@ child3_1 child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff --git a/storage/spider/mysql-test/spider/r/spider_fixes_part.result b/storage/spider/mysql-test/spider/r/spider_fixes_part.result index 571af94c..a59d2d2b 100644 --- a/storage/spider/mysql-test/spider/r/spider_fixes_part.result +++ b/storage/spider/mysql-test/spider/r/spider_fixes_part.result @@ -8,6 +8,7 @@ child3_1 child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; @@ -109,6 +110,7 @@ a b c 2.26 auto_increment with partition connection master_1; +include/save_master_pos.inc connection slave1_1; connection master_1; DROP TABLE IF EXISTS t1; diff --git a/storage/spider/mysql-test/spider/t/slave_test_init.inc b/storage/spider/mysql-test/spider/t/slave_test_init.inc index 739d8897..84de2c7d 100644 --- a/storage/spider/mysql-test/spider/t/slave_test_init.inc +++ b/storage/spider/mysql-test/spider/t/slave_test_init.inc @@ -19,7 +19,7 @@ if (!$SLAVE1_1_SLAVE_STATUS) MASTER_PORT = $MASTER_1_MYPORT ; } -START SLAVE; +--source include/start_slave.inc --connection master_1 call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); --connection slave1_1 diff --git a/storage/spider/mysql-test/spider/t/spider_fixes_part.opt b/storage/spider/mysql-test/spider/t/spider_fixes_part.opt new file mode 100644 index 00000000..1f24df45 --- /dev/null +++ b/storage/spider/mysql-test/spider/t/spider_fixes_part.opt @@ -0,0 +1 @@ +--log-warnings=3 diff --git a/storage/spider/mysql-test/spider/t/spider_fixes_part.test b/storage/spider/mysql-test/spider/t/spider_fixes_part.test index bff2e574..9604f83b 100644 --- a/storage/spider/mysql-test/spider/t/spider_fixes_part.test +++ b/storage/spider/mysql-test/spider/t/spider_fixes_part.test @@ -488,7 +488,23 @@ if ($HAVE_PARTITION) if ($USE_REPLICATION) { save_master_pos; + --source include/save_master_pos.inc --connection slave1_1 + --let $rc= `select master_pos_wait('$_master_file', $_master_pos, 300, '')` + if (`select $rc is NULL OR $rc < 0`) + { + --vertical_results + show slave status; + --horizontal_results + show global status; + show global variables; + --let $MYSQLD_DATADIR= `select @@datadir` + --exec $MYSQL_BINLOG -v $MYSQLD_DATADIR/mysqld-relay-bin.000001; + # Check that the relay-log file is fully on disk. + --exec ls -l $MYSQLD_DATADIR; + # After that try to restart the slave SQL thread + start slave sql_thread; + } sync_with_master; --connection master_1 --disable_query_log diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc index 92775896..68c5362d 100644 --- a/storage/spider/spd_conn.cc +++ b/storage/spider/spd_conn.cc @@ -56,7 +56,7 @@ extern struct charset_info_st *spd_charset_utf8mb3_bin; extern LEX_CSTRING spider_unique_id; pthread_mutex_t spider_conn_id_mutex; pthread_mutex_t spider_ipport_conn_mutex; -ulonglong spider_conn_id = 1; +ulonglong spider_conn_id; extern pthread_attr_t spider_pt_attr; @@ -93,7 +93,7 @@ extern sql_mode_t pushdown_sql_mode; HASH spider_open_connections; uint spider_open_connections_id; HASH spider_ipport_conns; -long spider_conn_mutex_id = 0; +long spider_conn_mutex_id; const char *spider_open_connections_func_name; const char *spider_open_connections_file_name; diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc index 70ca17f8..4b608721 100644 --- a/storage/spider/spd_copy_tables.cc +++ b/storage/spider/spd_copy_tables.cc @@ -298,7 +298,7 @@ int spider_udf_get_copy_tgt_tables( if ( (error_num = spider_get_sys_tables_connect_info( - table_tables, tmp_share, 0, mem_root)) || + table_tables, tmp_share, mem_root)) || (error_num = spider_get_sys_tables_link_status( table_tables, tmp_share, 0, mem_root)) || (error_num = spider_get_sys_tables_link_idx( @@ -968,7 +968,12 @@ long long spider_copy_tables_body( all_link_cnt = copy_tables->link_idx_count[0] + copy_tables->link_idx_count[1]; if ( - !(tmp_sql = new spider_string[all_link_cnt]) || + !(tmp_sql = new spider_string[all_link_cnt]) + ) { + my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); + goto error; + } + if ( !(spider = new ha_spider[all_link_cnt]) ) { my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); @@ -997,13 +1002,6 @@ long long spider_copy_tables_body( tmp_spider->share = table_conn->share; tmp_spider->wide_handler = wide_handler; wide_handler->trx = copy_tables->trx; -/* - if (spider_db_append_set_names(table_conn->share)) - { - my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); - goto error_append_set_names; - } -*/ tmp_spider->conns = &table_conn->conn; tmp_sql[roop_count].init_calc_mem(SPD_MID_COPY_TABLES_BODY_3); tmp_sql[roop_count].set_charset(copy_tables->access_charset); @@ -1043,13 +1041,6 @@ long long spider_copy_tables_body( tmp_spider->share = table_conn->share; tmp_spider->wide_handler = wide_handler; wide_handler->trx = copy_tables->trx; -/* - if (spider_db_append_set_names(table_conn->share)) - { - my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); - goto error_append_set_names; - } -*/ tmp_spider->conns = &table_conn->conn; tmp_sql[roop_count].init_calc_mem(SPD_MID_COPY_TABLES_BODY_5); tmp_sql[roop_count].set_charset(copy_tables->access_charset); @@ -1076,14 +1067,6 @@ long long spider_copy_tables_body( bulk_insert_rows))) goto error_db_udf_copy_tables; -/* - for (table_conn = copy_tables->table_conn[0]; - table_conn; table_conn = table_conn->next) - spider_db_free_set_names(table_conn->share); - for (table_conn = copy_tables->table_conn[1]; - table_conn; table_conn = table_conn->next) - spider_db_free_set_names(table_conn->share); -*/ if (table_list->table) { (thd->is_error() ? trans_rollback_stmt(thd) : trans_commit_stmt(thd)); @@ -1104,8 +1087,7 @@ long long spider_copy_tables_body( } delete [] spider; } - if (tmp_sql) - delete [] tmp_sql; + delete [] tmp_sql; spider_udf_free_copy_tables_alloc(copy_tables); DBUG_RETURN(1); @@ -1113,17 +1095,6 @@ long long spider_copy_tables_body( error_db_udf_copy_tables: error_create_dbton_handler: error_init_dbton_handler: -/* -error_append_set_names: -*/ -/* - for (table_conn = copy_tables->table_conn[0]; - table_conn; table_conn = table_conn->next) - spider_db_free_set_names(table_conn->share); - for (table_conn = copy_tables->table_conn[1]; - table_conn; table_conn = table_conn->next) - spider_db_free_set_names(table_conn->share); -*/ error: if (spider) { @@ -1181,6 +1152,11 @@ my_bool spider_copy_tables_init_body( char *message ) { DBUG_ENTER("spider_copy_tables_init_body"); + if (!spider_hton_ptr) + { + strcpy(message, "Plugin 'SPIDER' is not loaded"); + goto error; + } if (args->arg_count != 3 && args->arg_count != 4) { strcpy(message, "spider_copy_tables() requires 3 or 4 arguments"); diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc index 16d5b836..7c56ede2 100644 --- a/storage/spider/spd_db_conn.cc +++ b/storage/spider/spd_db_conn.cc @@ -63,7 +63,7 @@ pthread_mutex_t spider_open_conn_mutex; const char spider_dig_upper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /* UTC time zone for timestamp columns */ -Time_zone *UTC = 0; +Time_zone *UTC; int spider_db_connect( const SPIDER_SHARE *share, @@ -344,7 +344,6 @@ int spider_db_conn_queue_action( ) || ( conn->loop_check_queue.records && - conn->db_conn->set_loop_check_in_bulk_sql() && (error_num = spider_dbton[conn->dbton_id].db_util-> append_loop_check(&sql_str, conn)) ) || @@ -443,13 +442,6 @@ int spider_db_conn_queue_action( ) { DBUG_RETURN(error_num); } - if ( - conn->loop_check_queue.records && - !conn->db_conn->set_loop_check_in_bulk_sql() && - (error_num = conn->db_conn->set_loop_check((int *) conn->need_mon)) - ) { - DBUG_RETURN(error_num); - } if ( conn->queued_trx_isolation && !conn->queued_semi_trx_isolation && @@ -9138,6 +9130,9 @@ int spider_db_udf_ping_table_append_select( DBUG_RETURN(0); } +/* Stack size 33032 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int spider_db_udf_ping_table_mon_next( THD *thd, SPIDER_TABLE_MON *table_mon, @@ -9284,6 +9279,7 @@ int spider_db_udf_ping_table_mon_next( delete res; DBUG_RETURN(error_num); } +PRAGMA_REENABLE_CHECK_STACK_FRAME int spider_db_udf_copy_key_row( spider_string *str, diff --git a/storage/spider/spd_db_include.cc b/storage/spider/spd_db_include.cc index a4d7d4b4..514470a2 100644 --- a/storage/spider/spd_db_include.cc +++ b/storage/spider/spd_db_include.cc @@ -64,22 +64,6 @@ spider_db_conn::spider_db_conn( DBUG_VOID_RETURN; } -bool spider_db_conn::set_loop_check_in_bulk_sql() -{ - DBUG_ENTER("spider_db_conn::set_loop_check_in_bulk_sql"); - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_RETURN(FALSE); -} - -int spider_db_conn::set_loop_check( - int *need_mon -) { - DBUG_ENTER("spider_db_conn::set_loop_check"); - DBUG_PRINT("info",("spider this=%p", this)); - /* nothing to do */ - DBUG_RETURN(0); -} - int spider_db_conn::fin_loop_check() { st_spider_conn_loop_check *lcptr; diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h index c2cbe5f2..4e9d6b1a 100644 --- a/storage/spider/spd_db_include.h +++ b/storage/spider/spd_db_include.h @@ -79,7 +79,6 @@ typedef st_spider_result SPIDER_RESULT; #define SPIDER_SQL_HS_LTEQUAL_STR "<=" #define SPIDER_SQL_HS_LTEQUAL_LEN (sizeof(SPIDER_SQL_HS_LTEQUAL_STR) - 1) -#ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC #define SPIDER_SQL_CASE_STR "case " #define SPIDER_SQL_CASE_LEN (sizeof(SPIDER_SQL_CASE_STR) - 1) #define SPIDER_SQL_WHEN_STR " when " @@ -90,7 +89,6 @@ typedef st_spider_result SPIDER_RESULT; #define SPIDER_SQL_ELSE_LEN (sizeof(SPIDER_SQL_ELSE_STR) - 1) #define SPIDER_SQL_END_STR " end" #define SPIDER_SQL_END_LEN (sizeof(SPIDER_SQL_END_STR) - 1) -#endif #define SPIDER_SQL_USING_STR " using " #define SPIDER_SQL_USING_LEN (sizeof(SPIDER_SQL_USING_STR) - 1) @@ -1024,10 +1022,6 @@ public: Time_zone *time_zone, int *need_mon ) = 0; - virtual bool set_loop_check_in_bulk_sql(); - virtual int set_loop_check( - int *need_mon - ); virtual int fin_loop_check(); virtual int show_master_status( SPIDER_TRX *trx, diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index c2f0c6b8..450e1a02 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -1191,7 +1191,7 @@ int spider_db_mbase_result::fetch_table_cardinality( uint num_fields = this->num_fields(); if (num_fields < 12 || num_fields > 14) { - DBUG_PRINT("info",("spider num_fields < 12 || num_fields > 13")); + DBUG_PRINT("info",("spider num_fields < 12 || num_fields > 14")); DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM); } @@ -3266,110 +3266,6 @@ int spider_db_mbase::set_time_zone( DBUG_RETURN(0); } -bool spider_db_mbase::set_loop_check_in_bulk_sql() -{ - DBUG_ENTER("spider_db_mbase::set_loop_check_in_bulk_sql"); - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_RETURN(TRUE); -} - -int spider_db_mbase::set_loop_check( - int *need_mon -) { - SPIDER_CONN_LOOP_CHECK *lcptr; - char sql_buf[MAX_FIELD_WIDTH]; - spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); - DBUG_ENTER("spider_db_mbase::set_loop_check"); - DBUG_PRINT("info",("spider this=%p", this)); - sql_str.init_calc_mem(SPD_MID_DB_MBASE_SET_LOOP_CHECK_1); - while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element( - &conn->loop_check_queue, 0))) - { - sql_str.length(0); - if (sql_str.reserve(SPIDER_SQL_SET_USER_VAL_LEN + - SPIDER_SQL_LOP_CHK_PRM_PRF_LEN + lcptr->to_name.length + - SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_EQUAL_LEN + - SPIDER_SQL_VALUE_QUOTE_LEN + - lcptr->merged_value.length + SPIDER_SQL_VALUE_QUOTE_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - sql_str.q_append(SPIDER_SQL_SET_USER_VAL_STR, SPIDER_SQL_SET_USER_VAL_LEN); - sql_str.q_append(SPIDER_SQL_LOP_CHK_PRM_PRF_STR, - SPIDER_SQL_LOP_CHK_PRM_PRF_LEN); - sql_str.q_append(lcptr->to_name.str, lcptr->to_name.length); - sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); - sql_str.q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN); - sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); - sql_str.q_append(lcptr->merged_value.str, lcptr->merged_value.length); - sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); - - pthread_mutex_assert_not_owner(&conn->mta_conn_mutex); - pthread_mutex_lock(&conn->mta_conn_mutex); - SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos); - conn->need_mon = need_mon; - DBUG_ASSERT(!conn->mta_conn_mutex_lock_already); - DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later); - conn->mta_conn_mutex_lock_already = TRUE; - conn->mta_conn_mutex_unlock_later = TRUE; - if (spider_db_query( - conn, - sql_str.ptr(), - sql_str.length(), - -1, - need_mon) - ) { - DBUG_ASSERT(conn->mta_conn_mutex_lock_already); - DBUG_ASSERT(conn->mta_conn_mutex_unlock_later); - conn->mta_conn_mutex_lock_already = FALSE; - conn->mta_conn_mutex_unlock_later = FALSE; - DBUG_RETURN(spider_db_errorno(conn)); - } - DBUG_ASSERT(conn->mta_conn_mutex_lock_already); - DBUG_ASSERT(conn->mta_conn_mutex_unlock_later); - conn->mta_conn_mutex_lock_already = FALSE; - conn->mta_conn_mutex_unlock_later = FALSE; - SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); - pthread_mutex_unlock(&conn->mta_conn_mutex); - - my_hash_delete(&conn->loop_check_queue, (uchar*) lcptr); - } - DBUG_RETURN(0); -} - -int spider_db_mbase::fin_loop_check() -{ - st_spider_conn_loop_check *lcptr; - DBUG_ENTER("spider_db_mbase::fin_loop_check"); - DBUG_PRINT("info",("spider this=%p", this)); - if (conn->loop_check_queue.records) - { - uint l = 0; - while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element( - &conn->loop_check_queue, l))) - { - lcptr->flag = 0; - ++l; - } - my_hash_reset(&conn->loop_check_queue); - } - lcptr = conn->loop_check_ignored_first; - while (lcptr) - { - lcptr->flag = 0; - lcptr = lcptr->next; - } - conn->loop_check_ignored_first = NULL; - lcptr = conn->loop_check_meraged_first; - while (lcptr) - { - lcptr->flag = 0; - lcptr = lcptr->next; - } - conn->loop_check_meraged_first = NULL; - DBUG_RETURN(0); -} - int spider_db_mbase::exec_simple_sql_with_result( SPIDER_TRX *trx, SPIDER_SHARE *share, @@ -5503,14 +5399,6 @@ int spider_db_mbase_util::open_item_func( alias_length, use_fields, fields)); } -static bool item_func_is_timestampdiff( - const char *func_name, - int func_name_length -) { - return func_name_length == 13 && - !strncasecmp("timestampdiff", func_name, func_name_length); -} - static bool not_func_should_be_skipped( Item_func *item_func ){ @@ -5580,16 +5468,10 @@ int spider_db_mbase_util::check_item_func( Item_func::Functype func_type = item_func->functype(); DBUG_PRINT("info",("spider functype = %d", func_type)); - const char *func_name = (char*) item_func->func_name(); - int func_name_length = strlen(func_name); - DBUG_PRINT("info",("spider func_name = %s", func_name)); - /* The blacklist of the functions that cannot be pushed down */ switch (func_type) { case Item_func::TRIG_COND_FUNC: - case Item_func::CASE_SEARCHED_FUNC: - case Item_func::CASE_SIMPLE_FUNC: DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); case Item_func::NOT_FUNC: /* Why the following check is necessary? */ @@ -5598,13 +5480,6 @@ int spider_db_mbase_util::check_item_func( break; case Item_func::FUNC_SP: case Item_func::UDF_FUNC: - /* Notes on merging regarding MDEV-29447: please refer to the - following commits for build error or merge conflicts: - 10.6: 1ed20b993b0dd4e95450cab2e8347e5bf4617a69 - 10.9: dd316b6e20265cfd832bb5585cb4c96e716387c8 - 10.10-11: 3f67f110ba1b23a89c5ede0fbeeb203cf5e164f4 - 11.0-1: 17ba6748afa8834df5658361088e6c8e65aca16f - Please remove this comment after merging. */ use_pushdown_udf= spider_param_use_pushdown_udf( spider->wide_handler->trx->thd, spider->share->use_pushdown_udf); if (!use_pushdown_udf) @@ -5614,12 +5489,18 @@ int spider_db_mbase_util::check_item_func( if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); break; -#ifndef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC - case Item_func::UNKNOWN_FUNC: - if (item_func_is_timestampdiff(func_name, func_name_length)) - DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); - break; -#endif + case Item_func::MULT_EQUAL_FUNC: + /* If there is still Item_equal by the time of + JOIN::make_aggr_tables_info() where the spider group by handler + is created, it indicates a bug in the optimizer, because there + shouldn't be any. */ + push_warning_printf( + spider->wide_handler->trx->thd, SPIDER_WARN_LEVEL_WARN, + ER_INTERNAL_ERROR, + ER_THD(spider->wide_handler->trx->thd, ER_INTERNAL_ERROR), + "Spider group by handler: Encountered multiple equalities, likely " + "an optimizer bug"); + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); default: break; } @@ -5661,7 +5542,7 @@ int spider_db_mbase_util::print_item_func( Item *item, **item_list = item_func->arguments(); Field *field; spider_string tmp_str; - uint roop_count, item_count = item_func->argument_count(), start_item = 0; + uint i, item_count = item_func->argument_count(), start_item = 0; LEX_CSTRING org_func_name= {SPIDER_SQL_NULL_CHAR_STR, SPIDER_SQL_NULL_CHAR_LEN}; const char *func_name = SPIDER_SQL_NULL_CHAR_STR, @@ -5670,8 +5551,8 @@ int spider_db_mbase_util::print_item_func( int func_name_length = SPIDER_SQL_NULL_CHAR_LEN, separator_str_length = SPIDER_SQL_NULL_CHAR_LEN, last_str_length = SPIDER_SQL_NULL_CHAR_LEN; - int use_pushdown_udf; - bool merge_func = FALSE; + int use_pushdown_udf, case_when_start, case_when_count; + bool merge_func = FALSE, case_with_else; DBUG_ENTER("spider_db_mbase_util::print_item_func"); DBUG_ASSERT(!check_item_func(item_func, spider, alias, alias_length, use_fields, fields)); @@ -5989,12 +5870,11 @@ int spider_db_mbase_util::print_item_func( alias, alias_length, dbton_id, use_fields, fields)); } else if (!strncasecmp("timestampdiff", func_name, func_name_length)) { -#ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC Item_func_timestamp_diff *item_func_timestamp_diff = (Item_func_timestamp_diff *) item_func; const char *interval_str; uint interval_len; - switch (item_func_timestamp_diff->int_type) + switch (item_func_timestamp_diff->get_int_type()) { case INTERVAL_YEAR: interval_str = SPIDER_SQL_YEAR_STR; @@ -6045,7 +5925,7 @@ int spider_db_mbase_util::print_item_func( str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); str->q_append(interval_str, interval_len); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); - + if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); @@ -6066,9 +5946,6 @@ int spider_db_mbase_util::print_item_func( SPIDER_SQL_CLOSE_PAREN_LEN); } DBUG_RETURN(0); -#else - DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); -#endif } } else if (func_name_length == 14) { @@ -6562,7 +6439,83 @@ int spider_db_mbase_util::print_item_func( DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); case Item_func::CASE_SEARCHED_FUNC: case Item_func::CASE_SIMPLE_FUNC: - DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + /* + Arrangement of arguments: + - Item_func_case_searched: + when1 when2 ... whenk then1 then2 .. thenk [else] + - Item_func_case_simple: + value when1 when2 ... whenk then1 then2 .. thenk [else] + */ + if (item_func->functype() == Item_func::CASE_SEARCHED_FUNC) + { + case_when_start= 0; + case_when_count= item_count / 2; + case_with_else= item_count % 2; + } + else + { + case_when_start= 1; + case_when_count= (item_count - 1) / 2; + case_with_else= item_count % 2 == 0; + } + if (str) + { + if (str->reserve(SPIDER_SQL_CASE_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN); + } + if (case_when_start > 0) + { + if ((error_num = spider_db_print_item_type( + item_list[0], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + } + for (i = 0; i < (uint) case_when_count; i++) + { + if (str) + { + if (str->reserve(SPIDER_SQL_WHEN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN); + } + if ((error_num = spider_db_print_item_type( + item_list[i + case_when_start], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + if (str) + { + if (str->reserve(SPIDER_SQL_THEN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN); + } + if ((error_num = spider_db_print_item_type( + item_list[i + case_when_start + case_when_count], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + } + if (case_with_else) + { + if (str) + { + if (str->reserve(SPIDER_SQL_ELSE_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN); + } + if ((error_num = spider_db_print_item_type( + item_list[item_count - 1], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + } + if (str) + { + if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); + } + DBUG_RETURN(0); case Item_func::JSON_EXTRACT_FUNC: func_name = (char*) item_func->func_name(); func_name_length = strlen(func_name); @@ -6577,6 +6530,18 @@ int spider_db_mbase_util::print_item_func( last_str = SPIDER_SQL_CLOSE_PAREN_STR; last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; + case Item_func::MULT_EQUAL_FUNC: + /* If there is still Item_equal by the time of + JOIN::make_aggr_tables_info() where the spider group by handler + is created, it indicates a bug in the optimizer, because there + shouldn't be any. */ + push_warning_printf( + spider->wide_handler->trx->thd, + SPIDER_WARN_LEVEL_WARN, ER_INTERNAL_ERROR, + ER_THD(spider->wide_handler->trx->thd, ER_INTERNAL_ERROR), + "Spider group by handler: Encountered multiple equalities, likely " + "an optimizer bug"); + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); default: THD *thd = spider->wide_handler->trx->thd; SPIDER_SHARE *share = spider->share; @@ -6606,13 +6571,13 @@ int spider_db_mbase_util::print_item_func( Loop through the items of the current function expression to print its portion of the statement */ - for (roop_count = start_item; roop_count < item_count; roop_count++) + for (i = start_item; i < item_count; i++) { - item = item_list[roop_count]; + item = item_list[i]; if ((error_num = spider_db_print_item_type(item, field, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); - if (roop_count == 1) + if (i == 1) { /* Remaining operands need to be preceded by the separator */ func_name = separator_str; @@ -6626,7 +6591,7 @@ int spider_db_mbase_util::print_item_func( } /* Print the last operand value */ - item = item_list[roop_count]; + item = item_list[i]; if ((error_num = spider_db_print_item_type(item, field, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); @@ -7259,11 +7224,9 @@ int spider_mbase_share::init() DBUG_RETURN(HA_ERR_OUT_OF_MEM); } - if (keys > 0 && - !(key_hint = new spider_string[keys]) - ) { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } + if (keys > 0) + if (!(key_hint = new spider_string[keys])) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); for (roop_count = 0; roop_count < keys; roop_count++) { key_hint[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_INIT_2); @@ -7271,12 +7234,12 @@ int spider_mbase_share::init() } DBUG_PRINT("info",("spider key_hint=%p", key_hint)); - if ( - !(table_select = new spider_string[1]) || - (keys > 0 && - !(key_select = new spider_string[keys]) - ) || - (error_num = create_table_names_str()) || + if (!(table_select = new spider_string[1])) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + if (keys > 0) + if (!(key_select = new spider_string[keys])) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + if ((error_num = create_table_names_str()) || (table_share && ( (error_num = create_column_name_str()) || @@ -7427,11 +7390,18 @@ int spider_mbase_share::create_table_names_str() table_names_str = NULL; db_names_str = NULL; db_table_str = NULL; - if ( - !(table_names_str = new spider_string[spider_share->all_link_count]) || - !(db_names_str = new spider_string[spider_share->all_link_count]) || - !(db_table_str = new spider_string[spider_share->all_link_count]) - ) { + if (!(table_names_str = new spider_string[spider_share->all_link_count])) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + if (!(db_names_str = new spider_string[spider_share->all_link_count])) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + if (!(db_table_str = new spider_string[spider_share->all_link_count])) + { error_num = HA_ERR_OUT_OF_MEM; goto error; } @@ -7580,11 +7550,9 @@ int spider_mbase_share::create_column_name_str() Field **field; TABLE_SHARE *table_share = spider_share->table_share; DBUG_ENTER("spider_mbase_share::create_column_name_str"); - if ( - table_share->fields && - !(column_name_str = new spider_string[table_share->fields]) - ) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); + if (table_share->fields) + if (!(column_name_str = new spider_string[table_share->fields])) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); for (field = table_share->field, str = column_name_str; *field; field++, str++) { @@ -8360,7 +8328,7 @@ int spider_mbase_handler::init() &link_for_hash, sizeof(SPIDER_LINK_FOR_HASH) * share->link_count, &minimum_select_bitmap, - table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0, + table ? sizeof(uchar) * my_bitmap_buffer_size(table->read_set) : 0, NullS)) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -14829,7 +14797,7 @@ void spider_mbase_handler::minimum_select_bitmap_create() Field **field_p; DBUG_ENTER("spider_mbase_handler::minimum_select_bitmap_create"); DBUG_PRINT("info",("spider this=%p", this)); - memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set)); + memset(minimum_select_bitmap, 0, my_bitmap_buffer_size(table->read_set)); if ( spider->use_index_merge || spider->is_clone @@ -14840,7 +14808,7 @@ void spider_mbase_handler::minimum_select_bitmap_create() table_share->primary_key == MAX_KEY ) { /* need all columns */ - memset(minimum_select_bitmap, 0xFF, no_bytes_in_map(table->read_set)); + memset(minimum_select_bitmap, 0xFF, my_bitmap_buffer_size(table->read_set)); DBUG_VOID_RETURN; } else { /* need primary key columns */ diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h index 9ccc0e33..50b21117 100644 --- a/storage/spider/spd_db_mysql.h +++ b/storage/spider/spd_db_mysql.h @@ -519,11 +519,6 @@ public: Time_zone *time_zone, int *need_mon ); - bool set_loop_check_in_bulk_sql(); - int set_loop_check( - int *need_mon - ); - int fin_loop_check(); int exec_simple_sql_with_result( SPIDER_TRX *trx, SPIDER_SHARE *share, diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc index d345bb04..89c872ee 100644 --- a/storage/spider/spd_direct_sql.cc +++ b/storage/spider/spd_direct_sql.cc @@ -364,6 +364,23 @@ int spider_udf_direct_sql_create_conn_key( DBUG_RETURN(0); } +static inline void spider_maybe_memcpy_string( + char **dest, + char *src, + char *tmp, + uint *dest_len, + uint src_len) +{ + *dest_len= src_len; + if (src_len) + { + *dest= tmp; + memcpy(*dest, src, src_len); + } else + *dest= NULL; +} + + SPIDER_CONN *spider_udf_direct_sql_create_conn( const SPIDER_DIRECT_SQL *direct_sql, int *error_num @@ -433,105 +450,49 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn( conn->tgt_host = tmp_host; memcpy(conn->tgt_host, direct_sql->tgt_host, direct_sql->tgt_host_length); conn->tgt_port = direct_sql->tgt_port; - conn->tgt_socket_length = direct_sql->tgt_socket_length; - conn->tgt_socket = tmp_socket; - memcpy(conn->tgt_socket, direct_sql->tgt_socket, - direct_sql->tgt_socket_length); + spider_maybe_memcpy_string( + &conn->tgt_socket, direct_sql->tgt_socket, tmp_socket, + &conn->tgt_socket_length, direct_sql->tgt_socket_length); if (!tables_on_different_db_are_joinable) - { - conn->tgt_db_length = direct_sql->tgt_default_db_name_length; - conn->tgt_db = tmp_db; - memcpy(conn->tgt_db, direct_sql->tgt_default_db_name, - direct_sql->tgt_default_db_name_length); - } - conn->tgt_username_length = direct_sql->tgt_username_length; - conn->tgt_username = tmp_username; - memcpy(conn->tgt_username, direct_sql->tgt_username, - direct_sql->tgt_username_length); - conn->tgt_password_length = direct_sql->tgt_password_length; - conn->tgt_password = tmp_password; - memcpy(conn->tgt_password, direct_sql->tgt_password, - direct_sql->tgt_password_length); - conn->tgt_ssl_ca_length = direct_sql->tgt_ssl_ca_length; - if (conn->tgt_ssl_ca_length) - { - conn->tgt_ssl_ca = tmp_ssl_ca; - memcpy(conn->tgt_ssl_ca, direct_sql->tgt_ssl_ca, - direct_sql->tgt_ssl_ca_length); - } else - conn->tgt_ssl_ca = NULL; - conn->tgt_ssl_capath_length = direct_sql->tgt_ssl_capath_length; - if (conn->tgt_ssl_capath_length) - { - conn->tgt_ssl_capath = tmp_ssl_capath; - memcpy(conn->tgt_ssl_capath, direct_sql->tgt_ssl_capath, - direct_sql->tgt_ssl_capath_length); - } else - conn->tgt_ssl_capath = NULL; - conn->tgt_ssl_cert_length = direct_sql->tgt_ssl_cert_length; - if (conn->tgt_ssl_cert_length) - { - conn->tgt_ssl_cert = tmp_ssl_cert; - memcpy(conn->tgt_ssl_cert, direct_sql->tgt_ssl_cert, - direct_sql->tgt_ssl_cert_length); - } else - conn->tgt_ssl_cert = NULL; - conn->tgt_ssl_cipher_length = direct_sql->tgt_ssl_cipher_length; - if (conn->tgt_ssl_cipher_length) - { - conn->tgt_ssl_cipher = tmp_ssl_cipher; - memcpy(conn->tgt_ssl_cipher, direct_sql->tgt_ssl_cipher, - direct_sql->tgt_ssl_cipher_length); - } else - conn->tgt_ssl_cipher = NULL; - conn->tgt_ssl_key_length = direct_sql->tgt_ssl_key_length; - if (conn->tgt_ssl_key_length) - { - conn->tgt_ssl_key = tmp_ssl_key; - memcpy(conn->tgt_ssl_key, direct_sql->tgt_ssl_key, - direct_sql->tgt_ssl_key_length); - } else - conn->tgt_ssl_key = NULL; - conn->tgt_default_file_length = direct_sql->tgt_default_file_length; - if (conn->tgt_default_file_length) - { - conn->tgt_default_file = tmp_default_file; - memcpy(conn->tgt_default_file, direct_sql->tgt_default_file, - direct_sql->tgt_default_file_length); - } else - conn->tgt_default_file = NULL; - conn->tgt_default_group_length = direct_sql->tgt_default_group_length; - if (conn->tgt_default_group_length) - { - conn->tgt_default_group = tmp_default_group; - memcpy(conn->tgt_default_group, direct_sql->tgt_default_group, - direct_sql->tgt_default_group_length); - } else - conn->tgt_default_group = NULL; - conn->tgt_dsn_length = direct_sql->tgt_dsn_length; - if (conn->tgt_dsn_length) - { - conn->tgt_dsn = tmp_dsn; - memcpy(conn->tgt_dsn, direct_sql->tgt_dsn, - direct_sql->tgt_dsn_length); - } else - conn->tgt_dsn = NULL; - conn->tgt_filedsn_length = direct_sql->tgt_filedsn_length; - if (conn->tgt_filedsn_length) - { - conn->tgt_filedsn = tmp_filedsn; - memcpy(conn->tgt_filedsn, direct_sql->tgt_filedsn, - direct_sql->tgt_filedsn_length); - } else - conn->tgt_filedsn = NULL; - conn->tgt_driver_length = direct_sql->tgt_driver_length; - if (conn->tgt_driver_length) - { - conn->tgt_driver = tmp_driver; - memcpy(conn->tgt_driver, direct_sql->tgt_driver, - direct_sql->tgt_driver_length); - } else - conn->tgt_driver = NULL; + spider_maybe_memcpy_string( + &conn->tgt_db, direct_sql->tgt_default_db_name, tmp_db, + &conn->tgt_db_length, direct_sql->tgt_default_db_name_length); + spider_maybe_memcpy_string( + &conn->tgt_username, direct_sql->tgt_username, tmp_username, + &conn->tgt_username_length, direct_sql->tgt_username_length); + spider_maybe_memcpy_string( + &conn->tgt_password, direct_sql->tgt_password, tmp_password, + &conn->tgt_password_length, direct_sql->tgt_password_length); + spider_maybe_memcpy_string( + &conn->tgt_ssl_ca, direct_sql->tgt_ssl_ca, tmp_ssl_ca, + &conn->tgt_ssl_ca_length, direct_sql->tgt_ssl_ca_length); + spider_maybe_memcpy_string( + &conn->tgt_ssl_capath, direct_sql->tgt_ssl_capath, tmp_ssl_capath, + &conn->tgt_ssl_capath_length, direct_sql->tgt_ssl_capath_length); + spider_maybe_memcpy_string( + &conn->tgt_ssl_cert, direct_sql->tgt_ssl_cert, tmp_ssl_cert, + &conn->tgt_ssl_cert_length, direct_sql->tgt_ssl_cert_length); + spider_maybe_memcpy_string( + &conn->tgt_ssl_cipher, direct_sql->tgt_ssl_cipher, tmp_ssl_cipher, + &conn->tgt_ssl_cipher_length, direct_sql->tgt_ssl_cipher_length); + spider_maybe_memcpy_string( + &conn->tgt_ssl_key, direct_sql->tgt_ssl_key, tmp_ssl_key, + &conn->tgt_ssl_key_length, direct_sql->tgt_ssl_key_length); + spider_maybe_memcpy_string( + &conn->tgt_default_file, direct_sql->tgt_default_file, tmp_default_file, + &conn->tgt_default_file_length, direct_sql->tgt_default_file_length); + spider_maybe_memcpy_string( + &conn->tgt_default_group, direct_sql->tgt_default_group, tmp_default_group, + &conn->tgt_default_group_length, direct_sql->tgt_default_group_length); + spider_maybe_memcpy_string( + &conn->tgt_dsn, direct_sql->tgt_dsn, tmp_dsn, + &conn->tgt_dsn_length, direct_sql->tgt_dsn_length); + spider_maybe_memcpy_string( + &conn->tgt_filedsn, direct_sql->tgt_filedsn, tmp_filedsn, + &conn->tgt_filedsn_length, direct_sql->tgt_filedsn_length); + spider_maybe_memcpy_string( + &conn->tgt_driver, direct_sql->tgt_driver, tmp_driver, + &conn->tgt_driver_length, direct_sql->tgt_driver_length); conn->tgt_ssl_vsc = direct_sql->tgt_ssl_vsc; conn->dbton_id = direct_sql->dbton_id; conn->conn_need_mon = need_mon; @@ -1658,6 +1619,11 @@ my_bool spider_direct_sql_init_body( ) { SPIDER_BG_DIRECT_SQL *bg_direct_sql; DBUG_ENTER("spider_direct_sql_init_body"); + if (!spider_hton_ptr) + { + strcpy(message, "Plugin 'SPIDER' is not loaded"); + goto error; + } if (args->arg_count != 3) { strcpy(message, "spider_(bg)_direct_sql() requires 3 arguments"); diff --git a/storage/spider/spd_i_s.cc b/storage/spider/spd_i_s.cc index 7db95371..8ae88102 100644 --- a/storage/spider/spd_i_s.cc +++ b/storage/spider/spd_i_s.cc @@ -28,6 +28,7 @@ #include "spd_table.h" extern pthread_mutex_t spider_mem_calc_mutex; +extern handlerton *spider_hton_ptr; extern const char *spider_alloc_func_name[SPIDER_MEM_CALC_LIST_NUM]; extern const char *spider_alloc_file_name[SPIDER_MEM_CALC_LIST_NUM]; @@ -63,6 +64,8 @@ static int spider_i_s_alloc_mem_fill_table( uint roop_count; TABLE *table = tables->table; DBUG_ENTER("spider_i_s_alloc_mem_fill_table"); + if (!spider_hton_ptr) + DBUG_RETURN(0); for (roop_count = 0; roop_count < SPIDER_MEM_CALC_LIST_NUM; roop_count++) { table->field[0]->store(roop_count, TRUE); @@ -177,6 +180,8 @@ static int spider_i_s_wrapper_protocols_fill_table( SPIDER_DBTON *dbton; TABLE *table = tables->table; DBUG_ENTER("spider_i_s_wrapper_protocols_fill_table"); + if (!spider_hton_ptr) + DBUG_RETURN(0); for (roop_count = 0; roop_count < SPIDER_DBTON_SIZE; roop_count++) { dbton = &spider_dbton[roop_count]; diff --git a/storage/spider/spd_include.h b/storage/spider/spd_include.h index 0f61984e..3828f19b 100644 --- a/storage/spider/spd_include.h +++ b/storage/spider/spd_include.h @@ -250,7 +250,6 @@ enum spider_malloc_id { SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_3, SPD_MID_DB_MBASE_ROW_APPEND_ESCAPED_TO_STR_1, SPD_MID_DB_MBASE_ROW_CLONE_1, - SPD_MID_DB_MBASE_SET_LOOP_CHECK_1, SPD_MID_DB_MBASE_SET_SQL_MODE_1, SPD_MID_DB_MBASE_SET_TIME_ZONE_1, SPD_MID_DB_MBASE_SET_WAIT_TIMEOUT_1, @@ -1417,6 +1416,7 @@ typedef struct st_spider_table_mon st_spider_table_mon *next; } SPIDER_TABLE_MON; +/* List of `SPIDER_TABLE_MON's */ typedef struct st_spider_table_mon_list { char *key; diff --git a/storage/spider/spd_init_query.h b/storage/spider/spd_init_query.h index 35a250c7..ced68e03 100644 --- a/storage/spider/spd_init_query.h +++ b/storage/spider/spd_init_query.h @@ -20,8 +20,16 @@ */ static LEX_STRING spider_init_queries[] = { + /* Use the default SQL_MODE for this connection. */ {C_STRING_WITH_LEN( - "SET @@SQL_MODE = REPLACE(@@SQL_MODE, 'ORACLE', '');" + "SET @@SQL_MODE = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO," + "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';" + )}, + {C_STRING_WITH_LEN( + "SET @@OLD_MODE = CONCAT(@@OLD_MODE, ',UTF8_IS_UTF8MB3');" + )}, + {C_STRING_WITH_LEN( + "SET tx_read_only = off;" )}, {C_STRING_WITH_LEN( "create table if not exists mysql.spider_xa(" diff --git a/storage/spider/spd_ping_table.cc b/storage/spider/spd_ping_table.cc index 722b4cca..80b40c62 100644 --- a/storage/spider/spd_ping_table.cc +++ b/storage/spider/spd_ping_table.cc @@ -50,6 +50,8 @@ extern PSI_mutex_key spd_key_mutex_mon_list_update_status; extern PSI_mutex_key spd_key_mutex_mon_table_cache; #endif +/* Array (of size `spider_udf_table_mon_mutex_count') of hashes of +`SPIDER_TABLE_MON_LIST'. */ HASH *spider_udf_table_mon_list_hash; uint spider_udf_table_mon_list_hash_id; const char *spider_udf_table_mon_list_hash_func_name; @@ -59,23 +61,43 @@ pthread_mutex_t *spider_udf_table_mon_mutexes; pthread_cond_t *spider_udf_table_mon_conds; pthread_mutex_t spider_mon_table_cache_mutex; +/* A cache to store distinct SPIDER_MON_KEYs with db name, table name +and link id read from mysql.spider_link_mon_servers table. Initialised +and populated in spider_init_ping_table_mon_cache(), and used in +spider_ping_table_cache_compare(). The udf +spider_flush_table_mon_cache is used to flag a initialisation. */ DYNAMIC_ARRAY spider_mon_table_cache; uint spider_mon_table_cache_id; const char *spider_mon_table_cache_func_name; const char *spider_mon_table_cache_file_name; ulong spider_mon_table_cache_line_no; -volatile ulonglong spider_mon_table_cache_version = 0; -volatile ulonglong spider_mon_table_cache_version_req = 1; - +/* The mon table cache version, initialised at 0, and always no +greater than spider_mon_table_cache_version_req. When the inequality +is strict, an initialisation of spider_mon_table_cache will be +triggered. */ +volatile ulonglong spider_mon_table_cache_version; +/* The required mon table cache version, incremented by one by the +udf spider_flush_table_mon_cache */ +volatile ulonglong spider_mon_table_cache_version_req; + + /* Get or create a `SPIDER_TABLE_MON_LIST' for a key `str' */ SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list( SPIDER_TRX *trx, THD *thd, - spider_string *str, + spider_string *str, /* The key to search in + `spider_udf_table_mon_list_hash', + usually in the format of + "./$db_name/$table_name000000000$link_idx" */ uint conv_name_length, int link_idx, char *static_link_id, uint static_link_id_length, - uint32 server_id, + uint32 server_id, /* The server id of the monitor + server, used for creating a new + table mon list having a + `SPIDER_TABLE_MON' corresponding to + the server id as the `current' + field */ bool need_lock, int *error_num ) { @@ -85,6 +107,7 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list( ulonglong mon_table_cache_version; my_hash_value_type hash_value; DBUG_ENTER("spider_get_ping_table_mon_list"); + /* Reset the cache if the version does not match the requirement */ if (spider_mon_table_cache_version != spider_mon_table_cache_version_req) { SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME)); @@ -97,6 +120,9 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list( free_root(&mem_root, MYF(0)); } + /* Search for the table mon list in the hash, if one is not found or + if it is found but has the wrong cache version, create and + initialise a new one. */ mutex_hash= spider_udf_calc_hash(str->c_ptr(), spider_udf_table_mon_mutex_count); DBUG_PRINT("info",("spider hash key=%s", str->c_ptr())); @@ -113,12 +139,15 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list( table_mon_list->mon_table_cache_version != mon_table_cache_version ) { + /* If table_mon_list is found but the cache version does not + match, remove it from the hash and free it. */ if ( table_mon_list && table_mon_list->mon_table_cache_version != mon_table_cache_version ) spider_release_ping_table_mon_list_loop(mutex_hash, table_mon_list); - + /* create and initialise `table_mon_list' and insert it into the + hash */ if (!(table_mon_list = spider_get_ping_table_tgt(thd, str->c_ptr(), conv_name_length, link_idx, static_link_id, static_link_id_length, server_id, str, need_lock, error_num))) @@ -240,6 +269,14 @@ int spider_release_ping_table_mon_list( DBUG_RETURN(0); } +/* + Look for a `SPIDER_MON_KEY` in `spider_mon_table_cache' whose db and + table name and link_idx matching `name' and `link_idx' with wild + card matching. If a match is found, create `SPIDER_TABLE_MON's from + all rows in mysql.spider_link_mon_servers that match the info in the + `SPIDER_MON_KEY' and populate the `table_mon_list' with these + `SPIDER_TABLE_MON's. +*/ int spider_get_ping_table_mon( THD *thd, SPIDER_TABLE_MON_LIST *table_mon_list, @@ -316,6 +353,8 @@ int spider_get_ping_table_mon( goto error; create_table_mon: + /* Find the first row in mysql.spider_link_mon_servers matching the + db name, table name and link_idx */ if ((error_num = spider_get_sys_table_by_idx(table_link_mon, table_key, table_link_mon->s->primary_key, 3))) { @@ -323,6 +362,9 @@ create_table_mon: goto error; } + /* create one `SPIDER_TABLE_MON' per row in + mysql.spider_link_mon_servers with matching db name, table name and + link_idx, and add it to `table_mon_list'. */ do { if (!(table_mon = (SPIDER_TABLE_MON *) spider_bulk_malloc(spider_current_trx, SPD_MID_GET_PING_TABLE_MON_1, MYF(MY_WME | MY_ZEROFILL), @@ -356,7 +398,7 @@ create_table_mon: (error_num = spider_get_sys_link_mon_server_id( table_link_mon, &table_mon->server_id, mem_root)) || (error_num = spider_get_sys_link_mon_connect_info( - table_link_mon, tmp_share, 0, mem_root)) + table_link_mon, tmp_share, mem_root)) ) { table_link_mon->file->print_error(error_num, MYF(0)); spider_sys_index_end(table_link_mon); @@ -418,15 +460,21 @@ error: DBUG_RETURN(error_num); } +/* + creates and return table_mon_list associated with table with `name' + and `link_idx'th link. +*/ SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt( THD *thd, - char *name, + char *name, /* The table name, usually fully qualified */ uint name_length, int link_idx, char *static_link_id, uint static_link_id_length, - uint32 server_id, - spider_string *str, + uint32 server_id, /* The server_id will determine the + `current' field of the returned + `SPIDER_TABLE_MON_LIST'. */ + spider_string *str, /* str->c_ptr() == name */ bool need_lock, int *error_num ) { @@ -471,6 +519,7 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt( memcpy(key_str, str->ptr(), table_mon_list->key_length); tmp_share->access_charset = thd->variables.character_set_client; + /* Open mysql.spider_tables */ if ( !(table_tables = spider_open_sys_table( thd, SPIDER_SYS_TABLES_TABLE_NAME_STR, @@ -480,6 +529,8 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt( my_error(*error_num, MYF(0)); goto error; } + /* store db and table names and link idx in mysql.spider_tables for + reading */ spider_store_tables_name(table_tables, name, name_length); if (static_link_id) { @@ -503,9 +554,10 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt( goto error; } } + /* Populate tmp_share with info read from mysql.spider_tables */ if ( (*error_num = spider_get_sys_tables_connect_info( - table_tables, tmp_share, 0, &mem_root)) || + table_tables, tmp_share, &mem_root)) || (*error_num = spider_get_sys_tables_link_status( table_tables, tmp_share, 0, &mem_root)) ) { @@ -527,9 +579,8 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt( tmp_share, name, name_length )) || (*error_num = spider_create_conn_keys(tmp_share)) || -/* - (*error_num = spider_db_create_table_names_str(tmp_share)) || -*/ + /* Pinally, populate `table_mon_list' with newly created + `SPIDER_TABLE_MON's */ (*error_num = spider_get_ping_table_mon( thd, table_mon_list, name, name_length, link_idx, server_id, &mem_root, need_lock)) @@ -819,6 +870,11 @@ error_open_table_tables: DBUG_RETURN(error_num); } +/* + Initialise `spider_mon_table_cache' by scanning the + mysql.spider_link_mon_servers table, creating distinct + `SPIDER_MON_KEY's with the info and inserting them into the cache. +*/ int spider_init_ping_table_mon_cache( THD *thd, MEM_ROOT *mem_root, @@ -847,6 +903,7 @@ int spider_init_ping_table_mon_cache( /* reset */ spider_mon_table_cache.elements = 0; + /* start at the first row */ if ((error_num = spider_sys_index_first(table_link_mon, table_link_mon->s->primary_key))) { @@ -863,10 +920,16 @@ int spider_init_ping_table_mon_cache( mon_key.table_name_length = SPIDER_SYS_LINK_MON_TABLE_TABLE_NAME_SIZE + 1; mon_key.link_id_length = SPIDER_SYS_LINK_MON_TABLE_LINK_ID_SIZE + 1; do { + /* update content of `mon_key' */ if ((error_num = spider_get_sys_link_mon_key(table_link_mon, &mon_key, mem_root, &same))) goto error_get_sys_link_mon_key; + /* `mon_key' has changed content. since + mysql.spider_link_mon_servers is indexed by db_name, + table_name, link_idx, and server_id, it is possible that + different server_ids share the same mon_key which only has + db_name, table_name, link_idx */ if (!same) { mon_key.sort = spider_calc_for_sort(3, mon_key.db_name, @@ -937,6 +1000,13 @@ error_open_sys_table: DBUG_RETURN(error_num); } +/* + Read from msyql.spider_link_mon_servers table fields the db name, + table name and link_id and search for them with wild card matching + in `spider_mon_table_cache'. store the db name, table name, and + link_id of the matching `SPIDER_MON_KEY' back to the table field on + success. +*/ int spider_ping_table_cache_compare( TABLE *table, MEM_ROOT *mem_root @@ -1213,9 +1283,6 @@ long long spider_ping_table_body( DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 2")); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { -/* - pthread_mutex_lock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { @@ -1230,9 +1297,6 @@ long long spider_ping_table_body( conv_name.c_ptr(), conv_name_length, link_idx, TRUE); status_changed_to_ng = TRUE; } -/* - pthread_mutex_unlock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (status_changed_to_ng) { @@ -1286,9 +1350,6 @@ long long spider_ping_table_body( DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 3")); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { -/* - pthread_mutex_lock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { @@ -1303,9 +1364,6 @@ long long spider_ping_table_body( conv_name.c_ptr(), conv_name_length, link_idx, TRUE); status_changed_to_ng = TRUE; } -/* - pthread_mutex_unlock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (status_changed_to_ng) { @@ -1349,9 +1407,6 @@ long long spider_ping_table_body( mon_table_result->result_status == SPIDER_LINK_MON_NG && table_mon_list->mon_status != SPIDER_LINK_MON_NG ) { -/* - pthread_mutex_lock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { @@ -1366,9 +1421,6 @@ long long spider_ping_table_body( conv_name.c_ptr(), conv_name_length, link_idx, TRUE); status_changed_to_ng = TRUE; } -/* - pthread_mutex_unlock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (status_changed_to_ng) { @@ -1539,9 +1591,9 @@ int spider_ping_table_mon_from_table( SPIDER_SHARE *share, int base_link_idx, uint32 server_id, - char *conv_name, + char *conv_name, /* Usually fully qualified table name */ uint conv_name_length, - int link_idx, + int link_idx, /* The link id to ping */ char *where_clause, uint where_clause_length, long monitoring_kind, @@ -1551,9 +1603,6 @@ int spider_ping_table_mon_from_table( ) { int error_num = 0, current_mon_count, flags; uint32 first_sid; -/* - THD *thd = trx->thd; -*/ SPIDER_TABLE_MON_LIST *table_mon_list; SPIDER_TABLE_MON *table_mon; SPIDER_MON_TABLE_RESULT mon_table_result; @@ -1622,6 +1671,7 @@ int spider_ping_table_mon_from_table( if (monitoring_flag & 1) flags |= SPIDER_UDF_PING_TABLE_USE_ALL_MONITORING_NODES; + /* Get or create `table_mon_list' for `conv_name_str'. */ if (!(table_mon_list = spider_get_ping_table_mon_list(trx, thd, &conv_name_str, conv_name_length, link_idx, share->static_link_ids[link_idx], @@ -1653,6 +1703,8 @@ int spider_ping_table_mon_from_table( table_mon = table_mon_list->current; first_sid = table_mon->server_id; current_mon_count = 1; + /* Call spider_ping_table on each table_mon of `table_mon_list', + until one succeeds */ while (TRUE) { DBUG_PRINT("info",("spider thd->killed=%s", @@ -1697,16 +1749,13 @@ int spider_ping_table_mon_from_table( if (!spider_db_udf_ping_table_mon_next( thd, table_mon, mon_conn, &mon_table_result, conv_name, conv_name_length, link_idx, - where_clause, where_clause_length, -1, table_mon_list->list_size, + where_clause, where_clause_length, /*first_sid=*/-1, table_mon_list->list_size, 0, 0, 0, flags, monitoring_limit)) { if ( mon_table_result.result_status == SPIDER_LINK_MON_NG && table_mon_list->mon_status != SPIDER_LINK_MON_NG ) { -/* - pthread_mutex_lock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { @@ -1721,9 +1770,6 @@ int spider_ping_table_mon_from_table( spider_sys_log_tables_link_failed(thd, conv_name, conv_name_length, link_idx, need_lock); } -/* - pthread_mutex_unlock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); } table_mon_list->last_caller_result = mon_table_result.result_status; diff --git a/storage/spider/spd_sys_table.cc b/storage/spider/spd_sys_table.cc index 912e02a7..bd3e7a6f 100644 --- a/storage/spider/spd_sys_table.cc +++ b/storage/spider/spd_sys_table.cc @@ -574,6 +574,11 @@ int spider_check_sys_table_for_update_all_columns( HA_WHOLE_KEY, HA_READ_KEY_EXACT)); } +/* + Creates a key (`table_key') consisting of `col_count' key parts of + `idx'th index of the table, then positions an index cursor to that + key. +*/ int spider_get_sys_table_by_idx( TABLE *table, char *table_key, @@ -629,7 +634,7 @@ int spider_sys_index_next_same( int spider_sys_index_first( TABLE *table, - const int idx + const int idx /* which index to use */ ) { int error_num; DBUG_ENTER("spider_sys_index_first"); @@ -871,6 +876,10 @@ void spider_store_xa_member_info( DBUG_VOID_RETURN; } +/* + Store db and table names from `name' to `table's corresponding + fields +*/ void spider_store_tables_name( TABLE *table, const char *name, @@ -2149,14 +2158,16 @@ int spider_get_sys_tables( DBUG_RETURN(0); } +/* Read table info from mysql.spider_tables into a `SPIDER_SHARE' */ int spider_get_sys_tables_connect_info( - TABLE *table, - SPIDER_SHARE *share, - int link_idx, + TABLE *table, /* The mysql.spider_tables table */ + SPIDER_SHARE *share, /* The `SPIDER_SHARE' to + update info */ MEM_ROOT *mem_root ) { char *ptr; int error_num = 0; + const int link_idx= 0; DBUG_ENTER("spider_get_sys_tables_connect_info"); DBUG_PRINT("info",("spider link_idx:%d", link_idx)); if ((ptr = get_field(mem_root, table->field[SPIDER_TABLES_PRIORITY_POS]))) @@ -2431,9 +2442,14 @@ int spider_get_sys_tables_monitoring_binlog_pos_at_failing( DBUG_RETURN(error_num); } +/* + Read the link status from mysql.spider_tables into a `SPIDER_SHARE' + with default value 1 (`SPIDER_LINK_STATUS_OK') +*/ int spider_get_sys_tables_link_status( - TABLE *table, - SPIDER_SHARE *share, + TABLE *table, /* The mysql.spider_tables table */ + SPIDER_SHARE *share, /* The share to read link + status into */ int link_idx, MEM_ROOT *mem_root ) { @@ -2607,11 +2623,17 @@ error: DBUG_RETURN(error_num); } +/* Populate `mon_key' from the current row in `table' */ int spider_get_sys_link_mon_key( - TABLE *table, - SPIDER_MON_KEY *mon_key, + TABLE *table, /* the mysql.spider_link_mon_servers + table */ + SPIDER_MON_KEY *mon_key, /* output, to be populated in this + function */ MEM_ROOT *mem_root, - int *same + int *same /* output, true if the data from the + current row in the table agrees with + existing data in `mon_key' and false + otherwise */ ) { char *db_name, *table_name, *link_id; uint db_name_length, table_name_length, link_id_length; @@ -2627,6 +2649,7 @@ int spider_get_sys_link_mon_key( DBUG_RETURN(ER_SPIDER_SYS_TABLE_VERSION_NUM); } + /* get data for `mon_key' from the table record */ if (!(db_name= get_field(mem_root, table->field[SPIDER_LINK_MON_SERVERS_DB_NAME_POS]))) @@ -2678,9 +2701,12 @@ int spider_get_sys_link_mon_key( DBUG_RETURN(0); } +/* Get the server id from the spider_link_mon_servers table field */ int spider_get_sys_link_mon_server_id( - TABLE *table, - uint32 *server_id, + TABLE *table, /* the + mysql.spider_link_mon_servers + table */ + uint32 *server_id, /* output to server_id */ MEM_ROOT *mem_root ) { char *ptr; @@ -2694,14 +2720,17 @@ int spider_get_sys_link_mon_server_id( DBUG_RETURN(error_num); } +/* Get connect info from the spider_link_mon_servers table fields */ int spider_get_sys_link_mon_connect_info( - TABLE *table, - SPIDER_SHARE *share, - int link_idx, + TABLE *table, /* The + mysql.spider_link_mon_servers + table */ + SPIDER_SHARE *share, /* The output spider_share */ MEM_ROOT *mem_root ) { char *ptr; int error_num = 0; + const int link_idx= 0; DBUG_ENTER("spider_get_sys_link_mon_connect_info"); if ( !table->field[SPIDER_LINK_MON_SERVERS_SERVER_POS]->is_null() && @@ -2930,9 +2959,6 @@ int spider_get_link_statuses( if ( (error_num == HA_ERR_KEY_NOT_FOUND || error_num == HA_ERR_END_OF_FILE) ) { -/* - table->file->print_error(error_num, MYF(0)); -*/ DBUG_RETURN(error_num); } } else if ((error_num = diff --git a/storage/spider/spd_sys_table.h b/storage/spider/spd_sys_table.h index f1983323..ce3897c7 100644 --- a/storage/spider/spd_sys_table.h +++ b/storage/spider/spd_sys_table.h @@ -56,6 +56,7 @@ #define SPIDER_SYS_LINK_MON_TABLE_TABLE_NAME_SIZE 64 #define SPIDER_SYS_LINK_MON_TABLE_LINK_ID_SIZE 64 +/* For insertion into `spider_mon_table_cache'. */ class SPIDER_MON_KEY: public SPIDER_SORT { public: @@ -401,7 +402,6 @@ int spider_get_sys_tables( int spider_get_sys_tables_connect_info( TABLE *table, SPIDER_SHARE *share, - int link_idx, MEM_ROOT *mem_root ); @@ -478,7 +478,6 @@ int spider_get_sys_link_mon_server_id( int spider_get_sys_link_mon_connect_info( TABLE *table, SPIDER_SHARE *share, - int link_idx, MEM_ROOT *mem_root ); diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 208b804f..4b0690be 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -124,6 +124,11 @@ extern SPIDER_DBTON spider_dbton_mysql; extern SPIDER_DBTON spider_dbton_mariadb; SPIDER_THREAD *spider_table_sts_threads; SPIDER_THREAD *spider_table_crd_threads; +extern volatile ulonglong spider_mon_table_cache_version; +extern volatile ulonglong spider_mon_table_cache_version_req; +extern ulonglong spider_conn_id; +extern Time_zone *UTC; +extern ulonglong spider_thread_id; #ifdef HAVE_PSI_INTERFACE PSI_mutex_key spd_key_mutex_tbl; @@ -3468,11 +3473,13 @@ error_alloc_conn_string: DBUG_RETURN(error_num); } +/* Set default connect info of a SPIDER_SHARE if needed */ int spider_set_connect_info_default( - SPIDER_SHARE *share, - partition_element *part_elem, - partition_element *sub_elem, - TABLE_SHARE *table_share + SPIDER_SHARE *share, /* The `SPIDER_SHARE' to set + default connect info */ + partition_element *part_elem, /* partition info used as input */ + partition_element *sub_elem, /* subpartition info used as input */ + TABLE_SHARE *table_share /* table share info used as input */ ) { bool check_socket; bool check_database; @@ -3706,22 +3713,6 @@ int spider_set_connect_info_default( } } -/* - if (!share->static_link_ids[roop_count]) - { - DBUG_PRINT("info",("spider create default static_link_ids")); - share->static_link_ids_lengths[roop_count] = - SPIDER_DB_STATIC_LINK_ID_LEN; - if ( - !(share->static_link_ids[roop_count] = spider_create_string( - SPIDER_DB_STATIC_LINK_ID_STR, - share->static_link_ids_lengths[roop_count])) - ) { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - } -*/ - if (port_has_default_value) { share->tgt_ports[roop_count] = MYSQL_PORT; @@ -3811,7 +3802,11 @@ int spider_set_connect_info_default( DBUG_RETURN(0); } - +/* + This function is a no-op if all share->tgt_dbs and + share->tgt_table_names are non-null, otherwise it may assign them + with db_name and table_name +*/ int spider_set_connect_info_default_db_table( SPIDER_SHARE *share, const char *db_name, @@ -3897,6 +3892,11 @@ int spider_set_connect_info_default_db_table( DBUG_RETURN(0); } +/* + Parse `dbtable_name' into db name and table name, and call + spider_set_connect_info_default_db_table() to set the db/table name + values of `share' if needed +*/ int spider_set_connect_info_default_dbtable( SPIDER_SHARE *share, const char *dbtable_name, @@ -4256,12 +4256,12 @@ SPIDER_SHARE *spider_create_share( share->table.key_info = table_share->key_info; share->table.read_set = &table_share->all_set; - if (table_share->keys > 0 && - !(share->key_hint = new spider_string[table_share->keys]) - ) { - *error_num = HA_ERR_OUT_OF_MEM; - goto error_init_hint_string; - } + if (table_share->keys > 0) + if (!(share->key_hint = new spider_string[table_share->keys])) + { + *error_num = HA_ERR_OUT_OF_MEM; + goto error_init_hint_string; + } for (roop_count = 0; roop_count < (int) table_share->keys; roop_count++) share->key_hint[roop_count].init_calc_mem(SPD_MID_CREATE_SHARE_2); DBUG_PRINT("info",("spider share->key_hint=%p", share->key_hint)); @@ -5797,7 +5797,7 @@ int spider_open_all_tables( (error_num = spider_get_sys_tables( table_tables, &db_name, &table_name, &mem_root)) || (error_num = spider_get_sys_tables_connect_info( - table_tables, &tmp_share, 0, &mem_root)) || + table_tables, &tmp_share, &mem_root)) || (error_num = spider_set_connect_info_default( &tmp_share, NULL, @@ -6084,7 +6084,11 @@ int spider_close_connection( } spider_rollback(spider_hton_ptr, thd, TRUE); + + Dummy_error_handler deh; // suppress network errors at this stage + thd->push_internal_handler(&deh); spider_free_trx(trx, TRUE, false); + thd->pop_internal_handler(); DBUG_RETURN(0); } @@ -6255,6 +6259,7 @@ int spider_db_done( pthread_mutex_destroy(&spider_tbl_mutex); pthread_attr_destroy(&spider_pt_attr); + spider_hton_ptr= NULL; for (roop_count = 0; roop_count < SPIDER_MEM_CALC_LIST_NUM; roop_count++) { if (spider_alloc_func_name[roop_count]) @@ -6346,6 +6351,12 @@ int spider_db_init( handlerton *spider_hton = (handlerton *)p; DBUG_ENTER("spider_db_init"); + spider_mon_table_cache_version= 0; + spider_mon_table_cache_version_req= 1; + spider_conn_id= 1; + spider_conn_mutex_id= 0; + UTC = 0; + spider_thread_id = 1; const LEX_CSTRING aria_name={STRING_WITH_LEN("Aria")}; if (!plugin_is_ready(&aria_name, MYSQL_STORAGE_ENGINE_PLUGIN)) DBUG_RETURN(HA_ERR_RETRY_INIT); @@ -6579,11 +6590,6 @@ int spider_db_init( spider_udf_table_mon_list_hash[roop_count].array.size_of_element); } - if (spider_init_system_tables()) - { - goto error_system_table_creation; - } - if (!(spider_table_sts_threads = (SPIDER_THREAD *) spider_bulk_malloc(NULL, SPD_MID_DB_INIT_12, MYF(MY_WME | MY_ZEROFILL), &spider_table_sts_threads, (uint) (sizeof(SPIDER_THREAD) * @@ -6592,7 +6598,7 @@ int spider_db_init( spider_param_table_crd_thread_count()), NullS)) ) - goto error_alloc_mon_mutxes; + goto error_alloc_table_sts_crd_threads; for (roop_count = 0; roop_count < (int) spider_param_table_sts_thread_count(); @@ -6653,6 +6659,7 @@ error_init_table_sts_threads: { spider_free_sts_threads(&spider_table_sts_threads[roop_count]); } +error_alloc_table_sts_crd_threads: spider_free(NULL, spider_table_sts_threads, MYF(0)); roop_count= spider_udf_table_mon_mutex_count - 1; error_init_udf_table_mon_list_hash: @@ -6668,7 +6675,6 @@ error_init_udf_table_mon_list_hash: error_init_udf_table_mon_cond: for (; roop_count >= 0; roop_count--) pthread_cond_destroy(&spider_udf_table_mon_conds[roop_count]); -error_system_table_creation: roop_count= spider_udf_table_mon_mutex_count - 1; error_init_udf_table_mon_mutex: for (; roop_count >= 0; roop_count--) diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc index ebf9a777..b7a92286 100644 --- a/storage/spider/spd_trx.cc +++ b/storage/spider/spd_trx.cc @@ -41,7 +41,7 @@ extern struct charset_info_st *spd_charset_utf8mb3_bin; extern handlerton *spider_hton_ptr; extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE]; pthread_mutex_t spider_thread_id_mutex; -ulonglong spider_thread_id = 1; +ulonglong spider_thread_id; #ifdef HAVE_PSI_INTERFACE extern PSI_mutex_key spd_key_mutex_udf_table; diff --git a/strings/ctype-uca.c b/strings/ctype-uca.c index aa4d3662..a79a0764 100644 --- a/strings/ctype-uca.c +++ b/strings/ctype-uca.c @@ -39437,18 +39437,24 @@ my_uca1400_collation_definition_init(MY_CHARSET_LOADER *loader, *dst= nopad ? my_charset_utf8mb4_unicode_520_nopad_ci : my_charset_utf8mb4_unicode_520_ci; break; +#ifdef HAVE_CHARSET_ucs2 case MY_CS_ENCODING_UCS2: *dst= nopad ? my_charset_ucs2_unicode_520_nopad_ci : my_charset_ucs2_unicode_520_ci; break; +#endif +#ifdef HAVE_CHARSET_utf16 case MY_CS_ENCODING_UTF16: *dst= nopad ? my_charset_utf16_unicode_520_nopad_ci : my_charset_utf16_unicode_520_ci; break; +#endif +#ifdef HAVE_CHARSET_utf32 case MY_CS_ENCODING_UTF32: *dst= nopad ? my_charset_utf32_unicode_520_nopad_ci : my_charset_utf32_unicode_520_ci; break; +#endif } dst->number= id; diff --git a/support-files/mariadb.service.in b/support-files/mariadb.service.in index 1af0106e..79c8b9a8 100644 --- a/support-files/mariadb.service.in +++ b/support-files/mariadb.service.in @@ -51,7 +51,7 @@ Group=mysql # CAP_DAC_OVERRIDE To allow auth_pam_tool (which is SUID root) to read /etc/shadow when it's chmod 0 # does nothing for non-root, not needed if /etc/shadow is u+r # CAP_AUDIT_WRITE auth_pam_tool needs it on Debian for whatever reason -CapabilityBoundingSet=CAP_IPC_LOCK CAP_DAC_OVERRIDE CAP_AUDIT_WRITE +AmbientCapabilities=CAP_IPC_LOCK CAP_DAC_OVERRIDE CAP_AUDIT_WRITE # PrivateDevices=true implies NoNewPrivileges=true and # SUID auth_pam_tool suddenly doesn't do setuid anymore diff --git a/support-files/mariadb@.service.in b/support-files/mariadb@.service.in index 8cb3ab2a..31f1586f 100644 --- a/support-files/mariadb@.service.in +++ b/support-files/mariadb@.service.in @@ -181,7 +181,7 @@ PrivateNetwork=false # CAP_DAC_OVERRIDE To allow auth_pam_tool (which is SUID root) to read /etc/shadow when it's chmod 0 # does nothing for non-root, not needed if /etc/shadow is u+r # CAP_AUDIT_WRITE auth_pam_tool needs it on Debian for whatever reason -CapabilityBoundingSet=CAP_IPC_LOCK CAP_DAC_OVERRIDE CAP_AUDIT_WRITE +AmbientCapabilities=CAP_IPC_LOCK CAP_DAC_OVERRIDE CAP_AUDIT_WRITE # PrivateDevices=true implies NoNewPrivileges=true and # SUID auth_pam_tool suddenly doesn't do setuid anymore diff --git a/support-files/mini-benchmark.sh b/support-files/mini-benchmark.sh index 18de6dbe..a405b6c4 100755 --- a/support-files/mini-benchmark.sh +++ b/support-files/mini-benchmark.sh @@ -1,6 +1,6 @@ #!/bin/bash # Abort on errors -set -e +set -ex display_help() { echo "Usage: $(basename "$0") [-h] [--perf] [--perf-flamegraph]" @@ -10,13 +10,33 @@ display_help() { echo "regressions." echo echo "optional arguments:" + echo " --name STRING identifier for the benchmark, added to the " + echo " folder name and (if --log is set) the log file " + echo " --threads \"STRING\" quoted string of space-separated integers " + echo " representing the threads to run." + echo " example: --threads \"1 32 64 128\"" + echo " default: \"1 2 4 8 16\"" + echo " --duration INTEGER duration of each thread run in seconds" + echo " default: 60" + echo " --workload STRING sysbench workload to execute" + echo " default: oltp_read_write" + echo " --log logs the mini-benchmark stdout/stderr into the" + echo " benchmark folder." echo " --perf measure CPU cycles and instruction count in for " echo " sysbench runs" echo " --perf-flamegraph record performance counters in perf.data.* and" echo " generate flamegraphs automatically" + echo " --cpu-limit upper limit on the number of CPU cycles (in billions) used for the benchmark" + echo " default: 750" echo " -h, --help display this help and exit" } +# Default parameters +BENCHMARK_NAME='mini-benchmark' +THREADS='1 2 4 8 16' +DURATION=60 +WORKLOAD='oltp_read_write' + while : do case "$1" in @@ -28,6 +48,31 @@ do display_version exit 0 ;; + --name) + shift + BENCHMARK_NAME+='-' + BENCHMARK_NAME+=$1 + shift + ;; + --threads) + shift + THREADS=$1 + shift + ;; + --duration) + shift + DURATION=$1 + shift + ;; + --workload) + shift + WORKLOAD=$1 + shift + ;; + --log) + LOG=true + shift + ;; --perf) PERF=true shift @@ -36,6 +81,11 @@ do PERF_RECORD=true shift ;; + --cpu-limit) + shift + CPU_CYCLE_LIMIT=$1 + shift + ;; -*) echo "Error: Unknown option: $1" >&2 ## or call function display_help @@ -47,6 +97,13 @@ do esac done +# Save results of this run in a subdirectory so that they are not overwritten by +# the next run +TIMESTAMP="$(date -Iseconds)" +mkdir "$BENCHMARK_NAME-$TIMESTAMP" +cd "$BENCHMARK_NAME-$TIMESTAMP" || exit 1 + +( # Check that the dependencies of this script are available if [ ! -e /usr/bin/pgrep ] then @@ -62,6 +119,7 @@ fi # If there are multiple processes, assume the last one is the actual server and # any potential other ones were just part of the service wrapper chain +# shellcheck disable=SC2005 MARIADB_SERVER_PID="$(echo "$(pgrep -f mariadbd || pgrep -f mysqld)" | tail -n 1)" if [ -z "$MARIADB_SERVER_PID" ] @@ -70,6 +128,12 @@ then exit 1 fi +if [ "$PERF" == true ] && [ "$PERF_RECORD" == true ] +then + echo "ERROR: Cannot select both --perf and --perf-flamegraph options simultaneously. Please choose one or the other." + exit 1 +fi + if [ "$PERF" == true ] || [ "$PERF_RECORD" == true ] then if [ ! -e /usr/bin/perf ] @@ -102,31 +166,31 @@ then echo "Ensure the MariaDB Server debug symbols are installed" for x in $(ldd /usr/sbin/mariadbd | grep -oE " /.* ") do - rpm -q --whatprovides --qf '%{name}' $x | cut -d : -f 1 + rpm -q --whatprovides --qf '%{name}' "$x" | cut -d : -f 1 done | sort -u > mariadbd-dependencies.txt # shellcheck disable=SC2046 debuginfo-install -y mariadb-server $(cat mariadbd-dependencies.txt) - - if [ ! $(perf record echo "testing perf" > /dev/null 2>&1) ] + + if ! (perf record echo "testing perf") > /dev/null 2>&1 then echo "perf does not have permission to run on this system. Skipping." - PERF="" + PERF_COMMAND="" else echo "Using 'perf' to record performance counters in perf.data files" - PERF="perf record -g --freq=99 --output=perf.data --timestamp-filename --pid=$MARIADB_SERVER_PID --" + PERF_COMMAND="perf record -g --freq=99 --output=perf.data --timestamp-filename --pid=$MARIADB_SERVER_PID --" fi -elif [ -e /usr/bin/perf ] +elif [ "$PERF" == true ] then # If flamegraphs were not requested, log normal perf counters if possible - if [ ! $(perf stat echo "testing perf" > /dev/null 2>&1) ] + if ! (perf stat echo "testing perf") > /dev/null 2>&1 then echo "perf does not have permission to run on this system. Skipping." - PERF="" + PERF_COMMAND="" else echo "Using 'perf' to log basic performance counters for benchmark" - PERF="perf stat -p $MARIADB_SERVER_PID --" + PERF_COMMAND="perf stat -p $MARIADB_SERVER_PID --" fi fi @@ -156,28 +220,23 @@ mariadb -e " CREATE USER IF NOT EXISTS sbtest@localhost; GRANT ALL PRIVILEGES ON sbtest.* TO sbtest@localhost" -sysbench oltp_read_write prepare --tables=20 --table-size=100000 | tee sysbench-prepare.log +sysbench "$WORKLOAD" prepare --tables=20 --table-size=100000 | tee sysbench-prepare.log sync && sleep 1 # Ensure writes were propagated to disk -# Save results of this run in a subdirectory so that they are not overwritten by -# the next run -TIMESTAMP="$(date -Iseconds)" -mkdir "mini-benchmark-$TIMESTAMP" -cd "mini-benchmark-$TIMESTAMP" || exit 1 - # Run benchmark with increasing thread counts. The MariaDB Server will be using # around 300 MB of RAM and mostly reading and writing in RAM, so I/O usage is # also low. The benchmark will most likely be CPU bound to due to the load # profile, and also guaranteed to be CPU bound because of being limited to a # single CPU with 'tasksel'. -for t in 1 2 4 8 16 +for t in $THREADS do # Prepend command with perf if defined - # Output stderr to stdout as perf outpus everything in stderr - $PERF $TASKSET_SYSBENCH sysbench oltp_read_write run --threads=$t --time=60 --report-interval=10 2>&1 | tee sysbench-run-$t.log + # Output stderr to stdout as perf outputs everything in stderr + # shellcheck disable=SC2086 + $PERF_COMMAND $TASKSET_SYSBENCH sysbench "$WORKLOAD" run --threads=$t --time=$DURATION --report-interval=10 2>&1 | tee sysbench-run-$t.log done -sysbench oltp_read_write cleanup --tables=20 | tee sysbench-cleanup.log +sysbench "$WORKLOAD" cleanup --tables=20 | tee sysbench-cleanup.log # Store results from 4 thread run in a Gitlab-CI compatible metrics file grep -oE '[a-z]+:[ ]+[0-9.]+' sysbench-run-4.log | sed -r 's/\s+/ /g' | tail -n 15 > metrics.txt @@ -195,12 +254,21 @@ then echo "Total: $(grep -h -e instructions sysbench-run-*.log | sort -k 1 | awk '{s+=$1}END{print s}')" echo # Newline improves readability + if [ -z "$CPU_CYCLE_LIMIT" ] + then + # 04-04-2024: We found this to be an appropriate default limit after running a few benchmarks + # Configure the limit with --cpu-limit if needed + CPU_CYCLE_LIMIT=750 + fi + CPU_CYCLE_LIMIT_LONG="${CPU_CYCLE_LIMIT}000000000" + # Final verdict based on cpu cycle count RESULT="$(grep -h -e cycles sysbench-run-*.log | sort -k 1 | awk '{s+=$1}END{print s}')" - if [ "$RESULT" -gt 850000000000 ] + if [ "$RESULT" -gt "$CPU_CYCLE_LIMIT_LONG" ] then echo # Newline improves readability - echo "Benchmark exceeded 8.5 billion cpu cycles, performance most likely regressed!" + echo "Benchmark exceeded the allowed limit of ${CPU_CYCLE_LIMIT} billion CPU cycles" + echo "Performance most likely regressed!" exit 1 fi fi @@ -216,12 +284,12 @@ if [ "$PERF_RECORD" == true ] then for f in perf.data.* do - perf script -i $f | stackcollapse-perf.pl | flamegraph.pl --width 3000 > $f.svg + perf script -i "$f" | stackcollapse-perf.pl | flamegraph.pl --width 1800 > "$f".svg done - echo "Flamegraphs stored in folder mini-benchmark-$TIMESTAMP/" + echo "Flamegraphs stored in folder $BENCHMARK_NAME-$TIMESTAMP/" fi -# Fallback if CPU cycle count not availalbe: final verdict based on peak QPS +# Fallback if CPU cycle count not available: final verdict based on peak QPS RESULT="$(sort -k 9 -h sysbench-run-*.log | tail -n 1 | grep -oE "qps: [0-9]+" | grep -oE "[0-9]+")" case $RESULT in ''|*[!0-9]*) @@ -240,3 +308,6 @@ case $RESULT in fi ;; esac +# Record the output into the log file, if requested +) 2>&1 | ($LOG && tee "$BENCHMARK_NAME"-"$TIMESTAMP".log) +exit ${PIPESTATUS[0]} # Propagate errors in the sub-shell diff --git a/support-files/policy/apparmor/usr.sbin.mysqld b/support-files/policy/apparmor/usr.sbin.mysqld index c60ecd28..732f4b3a 100644 --- a/support-files/policy/apparmor/usr.sbin.mysqld +++ b/support-files/policy/apparmor/usr.sbin.mysqld @@ -14,6 +14,7 @@ capability chown, capability dac_override, + capability ipc_lock, capability setgid, capability setuid, capability sys_rawio, diff --git a/support-files/policy/selinux/mariadb-server.te b/support-files/policy/selinux/mariadb-server.te index 89846063..ba53c97d 100644 --- a/support-files/policy/selinux/mariadb-server.te +++ b/support-files/policy/selinux/mariadb-server.te @@ -25,7 +25,7 @@ require { class lnk_file read; class process { getattr signull }; class unix_stream_socket connectto; - class capability { sys_resource sys_nice }; + class capability { ipc_lock sys_resource sys_nice }; class tcp_socket { name_bind name_connect }; class file { execute setattr read create getattr execute_no_trans write ioctl open append unlink }; class sock_file { create unlink getattr }; @@ -87,6 +87,8 @@ allow mysqld_t bin_t:file { getattr read execute open execute_no_trans ioctl }; # MariaDB additions allow mysqld_t self:process setpgid; +allow mysqld_t self:capability { ipc_lock }; + # This rule allows port tcp/4444 allow mysqld_t kerberos_port_t:tcp_socket { name_bind name_connect }; # This rule allows port tcp/4567 (tram_port_t may not be available on diff --git a/tests/async_queries.c b/tests/async_queries.c index 8509b414..f0b4fab8 100644 --- a/tests/async_queries.c +++ b/tests/async_queries.c @@ -358,6 +358,7 @@ handle_option(const struct my_option *opt, const char *arg, return 0; } +PRAGMA_DISABLE_CHECK_STACK_FRAME int main(int argc, char *argv[]) @@ -433,3 +434,4 @@ main(int argc, char *argv[]) return 0; } +PRAGMA_REENABLE_CHECK_STACK_FRAME diff --git a/tests/mysql_client_fw.c b/tests/mysql_client_fw.c index c9e64678..f1cd6deb 100644 --- a/tests/mysql_client_fw.c +++ b/tests/mysql_client_fw.c @@ -568,6 +568,9 @@ static int my_process_result(MYSQL *mysql_arg) #define MAX_RES_FIELDS 50 #define MAX_FIELD_DATA_SIZE 255 +/* Stack usage 18888 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + static int my_process_stmt_result(MYSQL_STMT *stmt) { int field_count; @@ -656,6 +659,7 @@ static int my_process_stmt_result(MYSQL_STMT *stmt) mysql_free_result(result); return row_count; } +PRAGMA_REENABLE_CHECK_STACK_FRAME /* Prepare statement, execute, and process result set for given query */ @@ -1430,12 +1434,14 @@ int main(int argc, char **argv) tests_to_run[i]= NULL; } -#ifdef _WIN32 - /* must be the same in C/C and embedded, 1208 on 64bit, 968 on 32bit */ - compile_time_assert(sizeof(MYSQL) == 60*sizeof(void*)+728); -#else - /* must be the same in C/C and embedded, 1272 on 64bit, 964 on 32bit */ - compile_time_assert(sizeof(MYSQL) == 77*sizeof(void*)+656); +/* + this limited check is enough, if sizeof(MYSQL) changes, it changes + everywhere +*/ +#if defined __x86_64__ + compile_time_assert(sizeof(MYSQL) == 1272); +#elif defined __i386__ + compile_time_assert(sizeof(MYSQL) == 964); #endif if (mysql_server_init(embedded_server_arg_count, diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index ffc4a19e..04c439cf 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -3842,7 +3842,7 @@ static void test_bind_result_ext1() short i_data; uchar b_data; int f_data; - long bData; + int bData; char d_data[20]; double szData; MYSQL_BIND my_bind[8]; @@ -3938,7 +3938,7 @@ static void test_bind_result_ext1() fprintf(stdout, "\n data (float) : %d(%lu)", f_data, length[4]); fprintf(stdout, "\n data (double) : %s(%lu)", d_data, length[5]); - fprintf(stdout, "\n data (bin) : %ld(%lu)", bData, length[6]); + fprintf(stdout, "\n data (bin) : %d(%lu)", bData, length[6]); fprintf(stdout, "\n data (str) : %g(%lu)", szData, length[7]); } @@ -20564,7 +20564,6 @@ typedef struct { #ifndef EMBEDDED_LIBRARY static void test_proxy_header_tcp(const char *ipaddr, int port) { - int rc; MYSQL_RES *result; int family = (strchr(ipaddr,':') == NULL)?AF_INET:AF_INET6; @@ -20639,6 +20638,11 @@ static void test_proxy_header_tcp(const char *ipaddr, int port) DIE_UNLESS(strncmp(row[0], normalized_addr, addrlen) == 0); DIE_UNLESS(atoi(row[0] + addrlen+1) == port); mysql_free_result(result); + if (i == 0 && !strcmp(ipaddr,"192.0.2.1")) + { + /* do "dirty" close, to get aborted message in error log.*/ + mariadb_cancel(m); + } mysql_close(m); } sprintf(query,"DROP USER 'u'@'%s'",normalized_addr); diff --git a/tpool/tpool_generic.cc b/tpool/tpool_generic.cc index fd97b446..a4d6c405 100644 --- a/tpool/tpool_generic.cc +++ b/tpool/tpool_generic.cc @@ -628,7 +628,7 @@ void thread_pool_generic::check_idle(std::chrono::system_clock::time_point now) } /* Switch timer off after 1 minute of idle time */ - if (now - idle_since > max_idle_time) + if (now - idle_since > max_idle_time && m_active_threads.empty()) { idle_since= invalid_timestamp; switch_timer(timer_state_t::OFF); @@ -722,13 +722,17 @@ static int throttling_interval_ms(size_t n_threads,size_t concurrency) /* Create a new worker.*/ bool thread_pool_generic::add_thread() { - if (m_thread_creation_pending.test_and_set()) - return false; - size_t n_threads = thread_count(); if (n_threads >= m_max_threads) return false; + + /* + Deadlock danger exists, so monitor pool health + with maintenance timer. + */ + switch_timer(timer_state_t::ON); + if (n_threads >= m_min_threads) { auto now = std::chrono::system_clock::now(); @@ -739,12 +743,18 @@ bool thread_pool_generic::add_thread() Throttle thread creation and wakeup deadlock detection timer, if is it off. */ - switch_timer(timer_state_t::ON); - return false; } } + /* Check and set "thread creation pending" flag before creating the thread. We + reset the flag in thread_pool_generic::worker_main in new thread created. The + flag must be reset back in case we fail to create the thread. If this flag is + not reset all future attempt to create thread for this pool would not work as + we would return from here. */ + if (m_thread_creation_pending.test_and_set()) + return false; + worker_data *thread_data = m_thread_data_cache.get(); m_active_threads.push_back(thread_data); try @@ -764,6 +774,7 @@ bool thread_pool_generic::add_thread() "current number of threads in pool %zu\n", e.what(), thread_count()); warning_written = true; } + m_thread_creation_pending.clear(); return false; } return true; @@ -801,6 +812,7 @@ thread_pool_generic::thread_pool_generic(int min_threads, int max_threads) : m_tasks_dequeued(), m_wakeups(), m_spurious_wakeups(), + m_timer_state(timer_state_t::ON), m_in_shutdown(), m_timestamp(), m_long_tasks_count(), @@ -813,6 +825,7 @@ thread_pool_generic::thread_pool_generic(int min_threads, int max_threads) : m_maintenance_timer(thread_pool_generic::maintenance_func, this, nullptr) { set_concurrency(); + // start the timer m_maintenance_timer.set_time(0, (int)m_timer_interval.count()); } diff --git a/unittest/mysys/CMakeLists.txt b/unittest/mysys/CMakeLists.txt index 4b947ab7..9dd5e5db 100644 --- a/unittest/mysys/CMakeLists.txt +++ b/unittest/mysys/CMakeLists.txt @@ -19,7 +19,7 @@ MY_ADD_TESTS(bitmap base64 my_atomic my_rdtsc lf my_malloc my_getopt dynstring MY_ADD_TESTS(my_vsnprintf LINK_LIBRARIES strings mysys) MY_ADD_TESTS(aes LINK_LIBRARIES mysys mysys_ssl) ADD_DEFINITIONS(${SSL_DEFINES}) -INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR}) +INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIRS}) MY_ADD_TESTS(ma_dyncol LINK_LIBRARIES mysys) IF(WIN32) diff --git a/unittest/mysys/bitmap-t.c b/unittest/mysys/bitmap-t.c index 22466355..8e12b2b8 100644 --- a/unittest/mysys/bitmap-t.c +++ b/unittest/mysys/bitmap-t.c @@ -29,6 +29,8 @@ uint get_rand_bit(uint bitsize) { + if (bitsize == 0) + return 0; return (rand() % bitsize); } @@ -121,6 +123,8 @@ error6: return TRUE; } +PRAGMA_DISABLE_CHECK_STACK_FRAME + my_bool test_compare_operators(MY_BITMAP *map, uint bitsize) { uint i, j, test_bit1, test_bit2, test_bit3,test_bit4; @@ -226,6 +230,8 @@ error5: test_bit1); return TRUE; } +PRAGMA_REENABLE_CHECK_STACK_FRAME + my_bool test_count_bits_set(MY_BITMAP *map, uint bitsize) { @@ -266,7 +272,7 @@ my_bool test_get_first_bit(MY_BITMAP *map, uint bitsize) bitmap_clear_all(map); for (i=0; i < bitsize; i++) bitmap_set_bit(map, i); - if (bitmap_get_first(map) != MY_BIT_NONE) + if (bitmap_get_first_clear(map) != MY_BIT_NONE) goto error2; bitmap_clear_all(map); @@ -278,7 +284,7 @@ my_bool test_get_first_bit(MY_BITMAP *map, uint bitsize) goto error1; bitmap_set_all(map); bitmap_clear_bit(map, test_bit); - if (bitmap_get_first(map) != test_bit) + if (bitmap_get_first_clear(map) != test_bit) goto error2; bitmap_clear_all(map); } @@ -297,14 +303,45 @@ my_bool test_get_next_bit(MY_BITMAP *map, uint bitsize) uint no_loops= bitsize > 128 ? 128 : bitsize; for (i=0; i < no_loops; i++) { + uint count= 0, bits_set= 0; + bitmap_clear_all(map); test_bit=get_rand_bit(bitsize); for (j=0; j < test_bit; j++) bitmap_set_next(map); if (!bitmap_is_prefix(map, test_bit)) goto error1; + j= bitmap_get_first_set(map); + if (j == MY_BIT_NONE) + { + if (test_bit != 0) + goto error1; + continue; + } + count= 1; + while ((j= bitmap_get_next_set(map,j)) != MY_BIT_NONE) + count++; + if (count != test_bit) + goto error1; + + if (test_bit < 3) + continue; bitmap_clear_all(map); + for (j=1; j < test_bit; j+=2) + { + bits_set++; + bitmap_set_bit(map, j); + } + if ((j= bitmap_get_first_set(map)) == MY_BIT_NONE) + goto error1; + count= 1; + while ((j= bitmap_get_next_set(map,j)) != MY_BIT_NONE) + count++; + if (count != bits_set) + goto error1; } + return FALSE; + error1: diag("get_next error bitsize= %u, prefix_size= %u", bitsize,test_bit); return TRUE; @@ -371,7 +408,7 @@ error5: my_bool test_compare(MY_BITMAP *map, uint bitsize) { MY_BITMAP map2; - uint32 map2buf[MAX_TESTED_BITMAP_SIZE]; + my_bitmap_map map2buf[MAX_TESTED_BITMAP_SIZE]; uint i, test_bit; uint no_loops= bitsize > 128 ? 128 : bitsize; if (my_bitmap_init(&map2, map2buf, bitsize)) @@ -431,7 +468,7 @@ my_bool test_intersect(MY_BITMAP *map, uint bitsize) { uint bitsize2 = 1 + get_rand_bit(MAX_TESTED_BITMAP_SIZE - 1); MY_BITMAP map2; - uint32 map2buf[MAX_TESTED_BITMAP_SIZE]; + my_bitmap_map map2buf[MAX_TESTED_BITMAP_SIZE]; uint i, test_bit1, test_bit2, test_bit3; if (my_bitmap_init(&map2, map2buf, bitsize2)) { @@ -477,6 +514,107 @@ error: return TRUE; } +my_bool test_copy(MY_BITMAP *map, uint bitsize) +{ + my_bitmap_map buff[16], buff2[16], buff3[16]; + MY_BITMAP map2, map3; + uint rnd_bit; + + my_bitmap_init(&map2, buff, sizeof(buff)*8); + my_bitmap_init(&map3, buff2, sizeof(buff)*8); + bitmap_set_all(&map2); + bitmap_set_all(&map3); + + bitsize= MY_MIN(bitsize, map2.n_bits); + bitmap_copy(map, &map2); + if (bitmap_bits_set(map) != bitsize) + { + diag("bitmap_copy failed on bitsize %d", bitsize); + return 1; + } + bitmap_set_prefix(&map2, rnd_bit= get_rand_bit(bitsize)+1); + bitmap_export((uchar*) buff3, &map2); + bitmap_import(&map3, (uchar*) buff3); + if (!bitmap_cmp(&map2, &map3)) + { + diag("bitmap_export/bitmap_import failed on bitsize %d rnd_bit: %d", + bitsize, rnd_bit); + return 1; + } + return 0; +} + +static my_bool exec_bitmap_exists_intersection(MY_BITMAP **maps, uint bitsize, + uint start, uint end, uint bit) +{ + bitmap_clear_all(maps[0]); + bitmap_clear_all(maps[1]); + bitmap_set_bit(maps[0], bit); + bitmap_set_bit(maps[1], bit); + return bitmap_exists_intersection(maps, 2, start, end); +} + +my_bool test_bitmap_exists_intersection(MY_BITMAP *map, uint bitsize) +{ + MY_BITMAP map2; + uint start_bit, end_bit, rnd_bit; + MY_BITMAP *maps[2]; + maps[0]= map; + maps[1]= &map2; + + my_bitmap_init(&map2, 0, bitsize); + bitmap_clear_all(map); + bitmap_clear_all(&map2); + + start_bit= get_rand_bit(bitsize); + end_bit= get_rand_bit(bitsize); + if (start_bit > end_bit) + swap_variables(uint, start_bit, end_bit); + rnd_bit= start_bit+get_rand_bit(end_bit-start_bit); + + if (!exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + + start_bit= end_bit= rnd_bit= 0; + if (!exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + + start_bit= rnd_bit= 0 ; end_bit= bitsize-1; + if (!exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + + start_bit= rnd_bit= end_bit= bitsize-1; + if (!exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + + if (bitsize > 1) + { + start_bit= end_bit= 1 ; rnd_bit= 0; + if (exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + + start_bit= end_bit= bitsize-1 ; rnd_bit= bitsize-2; + if (exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + } + + my_bitmap_free(&map2); + return 0; +err: + diag("bitmap_exist_intersection failed on bitsize: %d start_bit: %d " + "end_bit: %d rnd_bit: %d", + bitsize, start_bit, end_bit, rnd_bit); + my_bitmap_free(&map2); + return 1; +} + + my_bool do_test(uint bitsize) { MY_BITMAP map; @@ -515,6 +653,12 @@ my_bool do_test(uint bitsize) bitmap_clear_all(&map); if (test_intersect(&map,bitsize)) goto error; + bitmap_clear_all(&map); + if (test_copy(&map,bitsize)) + goto error; + bitmap_clear_all(&map); + if (test_bitmap_exists_intersection(&map, bitsize)) + goto error; return FALSE; error: return TRUE; diff --git a/unittest/mysys/crc32-t.c b/unittest/mysys/crc32-t.c index 9834d217..7079aeb6 100644 --- a/unittest/mysys/crc32-t.c +++ b/unittest/mysys/crc32-t.c @@ -1,4 +1,4 @@ -/* Copyright (c) MariaDB 2020 +/* Copyright (c) MariaDB 2020, 2024 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -19,51 +19,127 @@ #include #include #include -#include /* - Check that optimized crc32 (ieee, or ethernet polynomical) returns the same - result as zlib (not so well optimized, yet, but trustworthy) + The following lookup table oriented computation of CRC-32 + is based on the Public Domain / Creative Commons CC0 Perl code from + http://billauer.co.il/blog/2011/05/perl-crc32-crc-xs-module/ */ -#define DO_TEST_CRC32(crc,str) \ - ok(crc32(crc,(const Bytef *)str,(uint)(sizeof(str)-1)) == my_checksum(crc, str, sizeof(str)-1), "crc32 '%s'",str) -/* Check that CRC32-C calculation returns correct result*/ -#define DO_TEST_CRC32C(crc,str,expected) \ - do { \ - unsigned int v = my_crc32c(crc, str, sizeof(str)-1); \ - printf("crc32(%u,'%s',%zu)=%u\n",crc,str,sizeof(str)-1,v); \ - ok(expected == my_crc32c(crc, str, sizeof(str)-1),"crc32c '%s'",str); \ - }while(0) +/** Lookup tables */ +static uint32 tab_3309[256], tab_castagnoli[256]; +/** Initialize a lookup table for a CRC-32 polynomial */ +static void init_lookup(uint32 *tab, uint32 polynomial) +{ + unsigned i; + for (i= 0; i < 256; i++) + { + uint32 x= i; + unsigned j; + for (j= 0; j < 8; j++) + if (x & 1) + x= (x >> 1) ^ polynomial; + else + x>>= 1; + tab[i]= x; + } +} + +/** Compute a CRC-32 one octet at a time based on a lookup table */ +static uint crc_(uint32 crc, const void *buf, size_t len, const uint32 *tab) +{ + const unsigned char *b= buf; + const unsigned char *const end = b + len; + crc^= 0xffffffff; + while (b != end) + crc= ((crc >> 8) & 0xffffff) ^ tab[(crc ^ *b++) & 0xff]; + crc^= 0xffffffff; + return crc; +} + +static uint crc32(uint32 crc, const void *buf, size_t len) +{ return crc_(crc, buf, len, tab_3309); } +static uint crc32c(uint32 crc, const void *buf, size_t len) +{ return crc_(crc, buf, len, tab_castagnoli); } -#define LONG_STR "1234567890234568900212345678901231213123321212123123123123123"\ - "............................................................................." \ - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ - "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" \ - "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" +static char buf[16384]; + +typedef uint (*check)(uint32, const void*, size_t); + +static size_t test_buf(check c1, check c2) +{ + size_t s; + for (s= sizeof buf; s; s--) + if (c1(0, buf, s) != c2(0, buf, s)) + break; + return s; +} + +#define DO_TEST_CRC32(crc,str,len) \ + ok(crc32(crc,str,len) == my_checksum(crc, str, len), \ + "crc32(%u,'%.*s')", crc, (int) len, str) + +/* Check that CRC-32C calculation returns correct result*/ +#define DO_TEST_CRC32C(crc,str,len) \ + ok(crc32c(crc,str,len) == my_crc32c(crc, str, len), \ + "crc32c(%u,'%.*s')", crc, (int) len, str) + +static const char STR[]= + "123456789012345678900212345678901231213123321212123123123123123" + "..........................................................................." + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" + "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"; int main(int argc __attribute__((unused)),char *argv[]) { MY_INIT(argv[0]); - plan(14); + init_lookup(tab_3309, 0xedb88320); + init_lookup(tab_castagnoli, 0x82f63b78); + + plan(36); printf("%s\n",my_crc32c_implementation()); - DO_TEST_CRC32(0,""); - DO_TEST_CRC32(1,""); - DO_TEST_CRC32(0,"12345"); - DO_TEST_CRC32(1,"12345"); - DO_TEST_CRC32(0,"1234567890123456789"); - DO_TEST_CRC32(0, LONG_STR); + DO_TEST_CRC32(0,STR,0); + DO_TEST_CRC32(1,STR,0); + DO_TEST_CRC32(0,STR,3); + DO_TEST_CRC32(0,STR,5); + DO_TEST_CRC32(1,STR,5); + DO_TEST_CRC32(0,STR,15); + DO_TEST_CRC32(0,STR,16); + DO_TEST_CRC32(0,STR,19); + DO_TEST_CRC32(0,STR,32); + DO_TEST_CRC32(0,STR,63); + DO_TEST_CRC32(0,STR,64); + DO_TEST_CRC32(0,STR,65); + DO_TEST_CRC32(0,STR,255); + DO_TEST_CRC32(0,STR,256); + DO_TEST_CRC32(0,STR,257); + DO_TEST_CRC32(0,STR,(sizeof(STR)-1)); ok(0 == my_checksum(0, NULL, 0) , "crc32 data = NULL, length = 0"); - DO_TEST_CRC32C(0,"", 0); - DO_TEST_CRC32C(1,"", 1); - DO_TEST_CRC32C(0, "12345", 416359221); - DO_TEST_CRC32C(1, "12345", 549473433); - DO_TEST_CRC32C(0, "1234567890123456789", 2366987449U); - DO_TEST_CRC32C(0, LONG_STR, 3009234172U); + DO_TEST_CRC32C(0,STR,0); + DO_TEST_CRC32C(1,STR,0); + DO_TEST_CRC32C(0,STR,3); + DO_TEST_CRC32C(0,STR,5); + DO_TEST_CRC32C(1,STR,5); + DO_TEST_CRC32C(0,STR,15); + DO_TEST_CRC32C(0,STR,16); + DO_TEST_CRC32C(0,STR,19); + DO_TEST_CRC32C(0,STR,32); + DO_TEST_CRC32C(0,STR,63); + DO_TEST_CRC32C(0,STR,64); + DO_TEST_CRC32C(0,STR,65); + DO_TEST_CRC32C(0,STR,255); + DO_TEST_CRC32C(0,STR,256); + DO_TEST_CRC32C(0,STR,257); + DO_TEST_CRC32C(0,STR,(sizeof(STR)-1)); ok(0 == my_crc32c(0, NULL, 0), "crc32c data = NULL, length = 0"); + memset(buf, 0x5a, sizeof buf); + ok(0 == test_buf(my_checksum, crc32), "crc32 with various lengths"); + ok(0 == test_buf(my_crc32c, crc32c), "crc32c with various lengths"); + my_end(0); return exit_status(); } diff --git a/unittest/mysys/my_getopt-t.c b/unittest/mysys/my_getopt-t.c index 6ffbfb20..a71c4676 100644 --- a/unittest/mysys/my_getopt-t.c +++ b/unittest/mysys/my_getopt-t.c @@ -378,10 +378,10 @@ int main(int argc __attribute__((unused)), char **argv) "res:%d, argc:%d, opt_ull:%llu", res, arg_c, opt_ull); run("--ull=-100", NULL); - ok(res==9 && arg_c==1 && opt_ull==0ULL, + ok(res==13 && arg_c==0 && opt_ull==0ULL, "res:%d, argc:%d, opt_ull:%llu", res, arg_c, opt_ull); run("--ul=-100", NULL); - ok(res==9 && arg_c==1 && opt_ul==0UL, + ok(res==13 && arg_c==0 && opt_ul==0UL, "res:%d, argc:%d, opt_ul:%lu", res, arg_c, opt_ul); my_end(0); diff --git a/unittest/sql/mf_iocache-t.cc b/unittest/sql/mf_iocache-t.cc index cc97d3b2..c72e6b7c 100644 --- a/unittest/sql/mf_iocache-t.cc +++ b/unittest/sql/mf_iocache-t.cc @@ -96,6 +96,8 @@ void sql_print_error(const char *format, ...) /*** end of encryption tweaks and stubs ****************************/ +PRAGMA_DISABLE_CHECK_STACK_FRAME + static IO_CACHE info; #define CACHE_SIZE 16384 @@ -472,3 +474,4 @@ int main(int argc __attribute__((unused)),char *argv[]) return exit_status(); } +PRAGMA_REENABLE_CHECK_STACK_FRAME diff --git a/vio/vio.c b/vio/vio.c index 7a98eb2a..bf1e79ae 100644 --- a/vio/vio.c +++ b/vio/vio.c @@ -79,6 +79,7 @@ static my_bool has_no_data(Vio *vio __attribute__((unused))) int vio_pipe_shutdown(Vio *vio, int how) { vio->shutdown_flag= how; + vio->state= VIO_STATE_SHUTDOWN; return CancelIoEx(vio->hPipe, NULL); } #endif @@ -98,6 +99,7 @@ static void vio_init(Vio *vio, enum enum_vio_type type, #endif memset(vio, 0, sizeof(*vio)); vio->type= type; + vio->state= VIO_STATE_ACTIVE; vio->mysql_socket= MYSQL_INVALID_SOCKET; mysql_socket_setfd(&vio->mysql_socket, sd); vio->localhost= flags & VIO_LOCALHOST; diff --git a/vio/viosocket.c b/vio/viosocket.c index 002ff274..ffdc76a5 100644 --- a/vio/viosocket.c +++ b/vio/viosocket.c @@ -288,12 +288,18 @@ size_t vio_write(Vio *vio, const uchar* buf, size_t size) int vio_socket_shutdown(Vio *vio, int how) { - int ret= shutdown(mysql_socket_getfd(vio->mysql_socket), how); + int ret; + DBUG_ENTER("vio_socket_shutdown"); + DBUG_PRINT("enter", ("sd: %d", (int)mysql_socket_getfd(vio->mysql_socket))); + + vio->state= VIO_STATE_SHUTDOWN; + ret= shutdown(mysql_socket_getfd(vio->mysql_socket), how); + #ifdef _WIN32 /* Cancel possible IO in progress (shutdown does not do that on Windows). */ (void) CancelIoEx((HANDLE)mysql_socket_getfd(vio->mysql_socket), NULL); #endif - return ret; + DBUG_RETURN(ret); } @@ -552,7 +558,8 @@ my_bool vio_should_retry(Vio *vio) { DBUG_ENTER("vio_should_retry"); - DBUG_PRINT("info", ("vio_errno: %d", vio_errno(vio))); + DBUG_PRINT("info", ("vio_errno: %d state: %d", + vio_errno(vio), (int) vio->state)); DBUG_RETURN(vio_errno(vio) == SOCKET_EINTR); } @@ -576,28 +583,30 @@ vio_was_timeout(Vio *vio) int vio_close(Vio *vio) { - int r=0; DBUG_ENTER("vio_close"); DBUG_PRINT("enter", ("sd: %d", (int)mysql_socket_getfd(vio->mysql_socket))); if (vio->type != VIO_CLOSED) { + MYSQL_SOCKET mysql_socket= vio->mysql_socket; DBUG_ASSERT(vio->type == VIO_TYPE_TCPIP || - vio->type == VIO_TYPE_SOCKET || - vio->type == VIO_TYPE_SSL); + vio->type == VIO_TYPE_SOCKET || + vio->type == VIO_TYPE_SSL); - DBUG_ASSERT(mysql_socket_getfd(vio->mysql_socket) >= 0); - if (mysql_socket_close(vio->mysql_socket)) - r= -1; - } - if (r) - { - DBUG_PRINT("vio_error", ("close() failed, error: %d",socket_errno)); - /* FIXME: error handling (not critical for MySQL) */ + + vio->type= VIO_CLOSED; + vio->state= VIO_STATE_CLOSED; + vio->mysql_socket= MYSQL_INVALID_SOCKET; + + DBUG_ASSERT(mysql_socket_getfd(mysql_socket) >= 0); + if (mysql_socket_close(mysql_socket)) + { + DBUG_PRINT("vio_error", ("close() failed, error: %d",socket_errno)); + /* FIXME: error handling (not critical for MySQL) */ + DBUG_RETURN(-1); + } } - vio->type= VIO_CLOSED; - vio->mysql_socket= MYSQL_INVALID_SOCKET; - DBUG_RETURN(r); + DBUG_RETURN(0); } @@ -917,8 +926,11 @@ int vio_io_wait(Vio *vio, enum enum_vio_io_event event, int timeout) my_socket sd= mysql_socket_getfd(vio->mysql_socket); MYSQL_SOCKET_WAIT_VARIABLES(locker, state) /* no ';' */ DBUG_ENTER("vio_io_wait"); - DBUG_PRINT("enter", ("timeout: %d", timeout)); + DBUG_PRINT("enter", ("sd: %d timeout: %d", + (int) mysql_socket_getfd(vio->mysql_socket), + timeout)); + DBUG_ASSERT(vio->state != VIO_STATE_CLOSED); memset(&pfd, 0, sizeof(pfd)); pfd.fd= sd; @@ -948,7 +960,7 @@ int vio_io_wait(Vio *vio, enum enum_vio_io_event event, int timeout) switch ((ret= poll(&pfd, 1, timeout))) { case -1: - DBUG_PRINT("error", ("poll returned -1")); + DBUG_PRINT("error", ("poll returned -1 errno: %d", vio_errno(vio))); /* On error, -1 is returned. */ break; case 0: @@ -979,6 +991,7 @@ int vio_io_wait(Vio *vio, enum enum_vio_io_event event, int timeout) fd_set readfds, writefds, exceptfds; MYSQL_SOCKET_WAIT_VARIABLES(locker, state) /* no ';' */ DBUG_ENTER("vio_io_wait"); + DBUG_ASSERT(vio->state != VIO_STATE_CLOSED); /* Convert the timeout, in milliseconds, to seconds and microseconds. */ if (timeout >= 0) @@ -1152,6 +1165,7 @@ my_bool vio_is_connected(Vio *vio) { uint bytes= 0; DBUG_ENTER("vio_is_connected"); + DBUG_ASSERT(vio->state != VIO_STATE_CLOSED); /* The first step of detecting an EOF condition is verifying @@ -1159,6 +1173,7 @@ my_bool vio_is_connected(Vio *vio) the EOF. An exceptional condition event and/or errors are interpreted as if there is data to read. */ + if (!vio_io_wait(vio, VIO_IO_EVENT_READ, 0)) DBUG_RETURN(TRUE); diff --git a/win/packaging/CPackWixConfig.cmake b/win/packaging/CPackWixConfig.cmake index 4ac4d384..a4b0731b 100644 --- a/win/packaging/CPackWixConfig.cmake +++ b/win/packaging/CPackWixConfig.cmake @@ -63,7 +63,7 @@ SET(CPACK_COMPONENT_GROUP_MYSQLSERVER_DESCRIPTION "Install server") #Miscellaneous (hidden) components, part of server / or client programs - FOREACH(comp connect-engine ClientPlugins gssapi-server gssapi-client aws-key-management rocksdb-engine) + FOREACH(comp connect-engine ClientPlugins gssapi-server gssapi-client aws-key-management rocksdb-engine plugin-hashicorp-key-management) STRING(TOUPPER "${comp}" comp) SET(CPACK_COMPONENT_${comp}_GROUP "MySQLServer") SET(CPACK_COMPONENT_${comp}_HIDDEN 1) diff --git a/wsrep-lib/dbsim/db_client_service.hpp b/wsrep-lib/dbsim/db_client_service.hpp index be6f9ad8..15f32ef8 100644 --- a/wsrep-lib/dbsim/db_client_service.hpp +++ b/wsrep-lib/dbsim/db_client_service.hpp @@ -82,6 +82,11 @@ namespace db return false; } + bool is_prepared_xa() override + { + return false; + } + bool is_xa_rollback() override { return false; diff --git a/wsrep-lib/include/wsrep/client_service.hpp b/wsrep-lib/include/wsrep/client_service.hpp index d47396df..e5aa6499 100644 --- a/wsrep-lib/include/wsrep/client_service.hpp +++ b/wsrep-lib/include/wsrep/client_service.hpp @@ -194,6 +194,16 @@ namespace wsrep */ virtual bool is_explicit_xa() = 0; + /** + * Returns true if the client has an ongoing XA transaction + * in prepared state. + * Notice: one could simply check if wsrep::transaction is + * in s_prepared state. However, wsrep::transaction does not + * transition to prepared state for read-only / empty + * transactions. + */ + virtual bool is_prepared_xa() = 0; + /** * Returns true if the currently executing command is * a rollback for XA. This is used to avoid setting a diff --git a/wsrep-lib/include/wsrep/reporter.hpp b/wsrep-lib/include/wsrep/reporter.hpp index 3e8c7000..05cc5230 100644 --- a/wsrep-lib/include/wsrep/reporter.hpp +++ b/wsrep-lib/include/wsrep/reporter.hpp @@ -105,21 +105,21 @@ namespace wsrep typedef struct { double tstamp; std::string msg; - } log_msg; + } log_msg_t ; - std::deque err_msg_; - std::deque warn_msg_; - std::deque events_; + std::deque err_msg_; + std::deque warn_msg_; + std::deque events_; size_t const max_msg_; static void write_log_msg(std::ostream& os, - const log_msg& msg); + const log_msg_t& msg); static void write_event(std::ostream& os, - const log_msg& msg); + const log_msg_t& msg); static void write_array(std::ostream& os, const std::string& label, - const std::deque& events, + const std::deque& events, void (*element_writer)(std::ostream& os, - const log_msg& msg)); + const log_msg_t& msg)); substates substate_map(enum server_state::state state); float progress_map(float progress) const; void write_file(double timestamp); diff --git a/wsrep-lib/src/client_state.cpp b/wsrep-lib/src/client_state.cpp index 99c4222f..48501fdd 100644 --- a/wsrep-lib/src/client_state.cpp +++ b/wsrep-lib/src/client_state.cpp @@ -68,8 +68,7 @@ void wsrep::client_state::close() keep_command_error_ = false; lock.unlock(); if (transaction_.active() && - (mode_ != m_local || - transaction_.state() != wsrep::transaction::s_prepared)) + (mode_ != m_local || !client_service_.is_prepared_xa())) { client_service_.bf_rollback(); transaction_.after_statement(); diff --git a/wsrep-lib/src/reporter.cpp b/wsrep-lib/src/reporter.cpp index 511ef819..3b21a199 100644 --- a/wsrep-lib/src/reporter.cpp +++ b/wsrep-lib/src/reporter.cpp @@ -176,7 +176,7 @@ static std::string escape_json(const std::string& str) void wsrep::reporter::write_log_msg(std::ostream& os, - const log_msg& msg) + const log_msg_t& msg) { os << "\t\t{\n"; os << "\t\t\t\"timestamp\": " << std::showpoint << std::setprecision(18) @@ -187,7 +187,7 @@ wsrep::reporter::write_log_msg(std::ostream& os, void wsrep::reporter::write_event(std::ostream& os, - const log_msg& msg) + const log_msg_t& msg) { os << "\t\t{\n"; os << "\t\t\t\"timestamp\": " << std::showpoint << std::setprecision(18) @@ -199,9 +199,9 @@ wsrep::reporter::write_event(std::ostream& os, void wsrep::reporter::write_array(std::ostream& os, const std::string& label, - const std::deque& msgs, + const std::deque& msgs, void (*element_writer)(std::ostream& os, - const log_msg& msg)) + const log_msg_t& msg)) { os << "\t\"" << label << "\": [\n"; for (size_t i(0); i < msgs.size(); ++i) @@ -351,7 +351,7 @@ wsrep::reporter::report_log_msg(log_level const lvl, const std::string& msg, double tstamp) { - std::deque& deque(lvl == error ? err_msg_ : warn_msg_); + std::deque& deque(lvl == error ? err_msg_ : warn_msg_); wsrep::unique_lock lock(mutex_); @@ -363,7 +363,7 @@ wsrep::reporter::report_log_msg(log_level const lvl, /* Log messages are not expected to be json formatted, so we escape the message strings here to keep the report file well formatted. */ - log_msg entry({tstamp, escape_json(msg)}); + log_msg_t entry({tstamp, escape_json(msg)}); deque.push_back(entry); write_file(tstamp); } diff --git a/wsrep-lib/src/transaction.cpp b/wsrep-lib/src/transaction.cpp index 451e94dd..7d9e31e6 100644 --- a/wsrep-lib/src/transaction.cpp +++ b/wsrep-lib/src/transaction.cpp @@ -1400,10 +1400,19 @@ bool wsrep::transaction::abort_or_interrupt( } return true; } - else if (client_service_.interrupted(lock)) + + if (client_service_.interrupted(lock)) { + assert(state() != s_must_abort && + state() != s_aborting && + state() != s_aborted); + + // Client was interrupted. Set the appropriate error and abort. + // For transactions in prepared state, it is OK to interrupt the + // statement, but transaction must remain in prepared state until + // commit or rollback. client_state_.override_error(wsrep::e_interrupted_error); - if (state() != s_must_abort) + if (state() != s_prepared) { state(lock, s_must_abort); } diff --git a/wsrep-lib/test/mock_client_state.hpp b/wsrep-lib/test/mock_client_state.hpp index 73b27755..89d38e32 100644 --- a/wsrep-lib/test/mock_client_state.hpp +++ b/wsrep-lib/test/mock_client_state.hpp @@ -176,6 +176,11 @@ namespace wsrep return false; } + bool is_prepared_xa() WSREP_OVERRIDE + { + return false; + } + bool is_xa_rollback() WSREP_OVERRIDE { return false; diff --git a/zlib/ChangeLog b/zlib/ChangeLog index 8707988a..b801a103 100644 --- a/zlib/ChangeLog +++ b/zlib/ChangeLog @@ -1,6 +1,16 @@ ChangeLog file for zlib +Changes in 1.3.1 (22 Jan 2024) +- Reject overflows of zip header fields in minizip +- Fix bug in inflateSync() for data held in bit buffer +- Add LIT_MEM define to use more memory for a small deflate speedup +- Fix decision on the emission of Zip64 end records in minizip +- Add bounds checking to ERR_MSG() macro, used by zError() +- Neutralize zip file traversal attacks in miniunz +- Fix a bug in ZLIB_DEBUG compiles in check_match() +- Various portability and appearance improvements + Changes in 1.3 (18 Aug 2023) - Remove K&R function definitions and zlib2ansi - Fix bug in deflateBound() for level 0 and memLevel 9 diff --git a/zlib/FAQ b/zlib/FAQ index 55f1cdc2..92f5d3e2 100644 --- a/zlib/FAQ +++ b/zlib/FAQ @@ -14,8 +14,7 @@ The latest zlib FAQ is at http://zlib.net/zlib_faq.html 2. Where can I get a Windows DLL version? The zlib sources can be compiled without change to produce a DLL. See the - file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the - precompiled DLL are found in the zlib web site at http://zlib.net/ . + file win32/DLL_FAQ.txt in the zlib distribution. 3. Where can I get a Visual Basic interface to zlib? diff --git a/zlib/README b/zlib/README index e02fc5aa..c5f91754 100644 --- a/zlib/README +++ b/zlib/README @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.3 is a general purpose data compression library. All the code is +zlib 1.3.1 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and @@ -31,7 +31,7 @@ Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at https://marknelson.us/posts/1997/01/01/zlib-engine.html . -The changes made in version 1.3 are documented in the file ChangeLog. +The changes made in version 1.3.1 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . @@ -83,7 +83,7 @@ Acknowledgments: Copyright notice: - (C) 1995-2023 Jean-loup Gailly and Mark Adler + (C) 1995-2024 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/zlib/contrib/nuget/nuget.csproj b/zlib/contrib/nuget/nuget.csproj new file mode 100644 index 00000000..68627f03 --- /dev/null +++ b/zlib/contrib/nuget/nuget.csproj @@ -0,0 +1,43 @@ + + + + net6.0 + madler.zlib.redist + $(PackageId).win + $(PackageId).linux + $(PackageId).osx + (C) 1995-2024 Jean-loup Gailly and Mark Adler + 1.3.1 + NuGet Package for consuming native builds of zlib into .NET without complexity. + + NU5128 + $(MSBuildProjectDirectory) + Jean-loup Gailly and Mark Adler + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zlib/contrib/nuget/nuget.sln b/zlib/contrib/nuget/nuget.sln new file mode 100644 index 00000000..46ee8dea --- /dev/null +++ b/zlib/contrib/nuget/nuget.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nuget", "nuget.csproj", "{B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/zlib/contrib/vstudio/vc17/miniunz.vcxproj b/zlib/contrib/vstudio/vc17/miniunz.vcxproj new file mode 100644 index 00000000..68ef1658 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/miniunz.vcxproj @@ -0,0 +1,409 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + 10.0 + + + + Application + MultiByte + v143 + + + Application + Unicode + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + true + true + false + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + false + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\MiniUnzip$(Configuration)\ + arm64\MiniUnzip$(Configuration)\Tmp\ + + + arm64\MiniUnzip$(Configuration)\ + arm64\MiniUnzip$(Configuration)\Tmp\ + + + arm\MiniUnzip$(Configuration)\ + arm\MiniUnzip$(Configuration)\Tmp\ + + + arm\MiniUnzip$(Configuration)\ + arm\MiniUnzip$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc17/minizip.vcxproj b/zlib/contrib/vstudio/vc17/minizip.vcxproj new file mode 100644 index 00000000..dd3c52e7 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/minizip.vcxproj @@ -0,0 +1,405 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + 10.0 + + + + Application + MultiByte + v143 + + + Application + Unicode + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + true + true + false + false + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\MiniZip$(Configuration)\ + arm64\MiniZip$(Configuration)\Tmp\ + + + arm64\MiniZip$(Configuration)\ + arm64\MiniZip$(Configuration)\Tmp\ + + + arm\MiniZip$(Configuration)\ + arm\MiniZip$(Configuration)\Tmp\ + + + arm\MiniZip$(Configuration)\ + arm\MiniZip$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc17/testzlib.vcxproj b/zlib/contrib/vstudio/vc17/testzlib.vcxproj new file mode 100644 index 00000000..4cc99b3f --- /dev/null +++ b/zlib/contrib/vstudio/vc17/testzlib.vcxproj @@ -0,0 +1,473 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + ARM + + + ReleaseWithoutAsm + ARM64 + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + 10.0 + + + + Application + MultiByte + true + v143 + + + Application + MultiByte + true + v143 + + + Application + Unicode + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + v143 + + + Application + v143 + + + Application + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\TestZlib$(Configuration)\ + arm64\TestZlib$(Configuration)\Tmp\ + + + arm64\TestZlib$(Configuration)\ + arm64\TestZlib$(Configuration)\Tmp\ + + + arm64\TestZlib$(Configuration)\ + arm64\TestZlib$(Configuration)\Tmp\ + + + arm\TestZlib$(Configuration)\ + arm\TestZlib$(Configuration)\Tmp\ + + + arm\TestZlib$(Configuration)\ + arm\TestZlib$(Configuration)\Tmp\ + + + arm\TestZlib$(Configuration)\ + arm\TestZlib$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + false + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj b/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj new file mode 100644 index 00000000..73bba55d --- /dev/null +++ b/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj @@ -0,0 +1,409 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + 10.0 + + + + Application + MultiByte + v143 + + + Application + Unicode + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + true + true + false + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + false + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\TestZlibDll$(Configuration)\ + arm64\TestZlibDll$(Configuration)\Tmp\ + + + arm64\TestZlibDll$(Configuration)\ + arm64\TestZlibDll$(Configuration)\Tmp\ + + + arm\TestZlibDll$(Configuration)\ + arm\TestZlibDll$(Configuration)\Tmp\ + + + arm\TestZlibDll$(Configuration)\ + arm\TestZlibDll$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc17/zlib.rc b/zlib/contrib/vstudio/vc17/zlib.rc new file mode 100644 index 00000000..a55f341c --- /dev/null +++ b/zlib/contrib/vstudio/vc17/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 3, 1, 0 + PRODUCTVERSION 1, 3, 1, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.3.1\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/zlib/contrib/vstudio/vc17/zlibstat.vcxproj b/zlib/contrib/vstudio/vc17/zlibstat.vcxproj new file mode 100644 index 00000000..b946ac2a --- /dev/null +++ b/zlib/contrib/vstudio/vc17/zlibstat.vcxproj @@ -0,0 +1,602 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + ARM + + + ReleaseWithoutAsm + ARM64 + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + 10.0 + + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + Unicode + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\ZlibStat$(Configuration)\ + arm64\ZlibStat$(Configuration)\Tmp\ + + + arm64\ZlibStat$(Configuration)\ + arm64\ZlibStat$(Configuration)\Tmp\ + + + arm64\ZlibStat$(Configuration)\ + arm64\ZlibStat$(Configuration)\Tmp\ + + + arm\ZlibStat$(Configuration)\ + arm\ZlibStat$(Configuration)\Tmp\ + + + arm\ZlibStat$(Configuration)\ + arm\ZlibStat$(Configuration)\Tmp\ + + + arm\ZlibStat$(Configuration)\ + arm\ZlibStat$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc17/zlibvc.def b/zlib/contrib/vstudio/vc17/zlibvc.def new file mode 100644 index 00000000..53947cc3 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/zlibvc.def @@ -0,0 +1,158 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.3.1 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/zlib/contrib/vstudio/vc17/zlibvc.sln b/zlib/contrib/vstudio/vc17/zlibvc.sln new file mode 100644 index 00000000..67896b74 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/zlibvc.sln @@ -0,0 +1,179 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33015.44 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|ARM = ReleaseWithoutAsm|ARM + ReleaseWithoutAsm|ARM64 = ReleaseWithoutAsm|ARM64 + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.ActiveCfg = Debug|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.Build.0 = Debug|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM64.Build.0 = Debug|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.ActiveCfg = Release|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.Build.0 = Release|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM64.ActiveCfg = Release|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM64.Build.0 = Release|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM.ActiveCfg = Debug|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM.Build.0 = Debug|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM64.Build.0 = Debug|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM.ActiveCfg = Release|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM.Build.0 = Release|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM64.ActiveCfg = Release|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM64.Build.0 = Release|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.ActiveCfg = Debug|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.Build.0 = Debug|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.Build.0 = Debug|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.ActiveCfg = Release|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.Build.0 = Release|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.ActiveCfg = Release|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.Build.0 = Release|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM.ActiveCfg = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM.Build.0 = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM64.Build.0 = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.ActiveCfg = Debug|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.Build.0 = Debug|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.Build.0 = Debug|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.ActiveCfg = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.Build.0 = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.ActiveCfg = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.Build.0 = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM.ActiveCfg = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM.Build.0 = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM64.Build.0 = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EAA58685-56D9-43F2-8703-FD2CB020745E} + EndGlobalSection +EndGlobal diff --git a/zlib/contrib/vstudio/vc17/zlibvc.vcxproj b/zlib/contrib/vstudio/vc17/zlibvc.vcxproj new file mode 100644 index 00000000..10a7a901 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/zlibvc.vcxproj @@ -0,0 +1,875 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + ARM + + + ReleaseWithoutAsm + ARM64 + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + 10.0 + + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + v143 + Unicode + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + true + true + false + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + false + false + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + false + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + arm64\ZlibDll$(Configuration)\ + arm64\ZlibDll$(Configuration)\Tmp\ + + + arm\ZlibDll$(Configuration)\ + arm\ZlibDll$(Configuration)\Tmp\ + + + arm64\ZlibDll$(Configuration)\ + arm64\ZlibDll$(Configuration)\Tmp\ + + + arm64\ZlibDll$(Configuration)\ + arm64\ZlibDll$(Configuration)\Tmp\ + + + arm\ZlibDll$(Configuration)\ + arm\ZlibDll$(Configuration)\Tmp\ + + + arm\ZlibDll$(Configuration)\ + arm\ZlibDll$(Configuration)\Tmp\ + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + false + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN32;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + + + + + + + + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zlib/deflate.c b/zlib/deflate.c index bd011751..012ea814 100644 --- a/zlib/deflate.c +++ b/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.3 Copyright 1995-2023 Jean-loup Gailly and Mark Adler "; + " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -493,7 +493,7 @@ int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, * symbols from which it is being constructed. */ - s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); + s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, LIT_BUFS); s->pending_buf_size = (ulg)s->lit_bufsize * 4; if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || @@ -503,8 +503,14 @@ int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, deflateEnd (strm); return Z_MEM_ERROR; } +#ifdef LIT_MEM + s->d_buf = (ushf *)(s->pending_buf + (s->lit_bufsize << 1)); + s->l_buf = s->pending_buf + (s->lit_bufsize << 2); + s->sym_end = s->lit_bufsize - 1; +#else s->sym_buf = s->pending_buf + s->lit_bufsize; s->sym_end = (s->lit_bufsize - 1) * 3; +#endif /* We avoid equality with lit_bufsize*3 because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. @@ -720,9 +726,15 @@ int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) { if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; +#ifdef LIT_MEM + if (bits < 0 || bits > 16 || + (uchf *)s->d_buf < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; +#else if (bits < 0 || bits > 16 || s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; +#endif do { put = Buf_size - s->bi_valid; if (put > bits) @@ -1294,7 +1306,7 @@ int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) { ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, LIT_BUFS); if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { @@ -1305,10 +1317,15 @@ int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) { zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + zmemcpy(ds->pending_buf, ss->pending_buf, ds->lit_bufsize * LIT_BUFS); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); +#ifdef LIT_MEM + ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1)); + ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2); +#else ds->sym_buf = ds->pending_buf + ds->lit_bufsize; +#endif ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; @@ -1539,13 +1556,21 @@ local uInt longest_match(deflate_state *s, IPos cur_match) { */ local void check_match(deflate_state *s, IPos start, IPos match, int length) { /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); + Bytef *back = s->window + (int)match, *here = s->window + start; + IPos len = length; + if (match == (IPos)-1) { + /* match starts one byte before the current window -- just compare the + subsequent length-1 bytes */ + back++; + here++; + len--; + } + if (zmemcmp(back, here, len) != EQUAL) { + fprintf(stderr, " start %u, match %d, length %d\n", + start, (int)match, length); do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); + fprintf(stderr, "(%02x %02x)", *back++, *here++); + } while (--len != 0); z_error("invalid match"); } if (z_verbose > 1) { diff --git a/zlib/deflate.h b/zlib/deflate.h index 86967914..300c6ada 100644 --- a/zlib/deflate.h +++ b/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2018 Jean-loup Gailly + * Copyright (C) 1995-2024 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -23,6 +23,10 @@ # define GZIP #endif +/* define LIT_MEM to slightly increase the speed of deflate (order 1% to 2%) at + the cost of a larger memory footprint */ +/* #define LIT_MEM */ + /* =========================================================================== * Internal compression state. */ @@ -217,7 +221,14 @@ typedef struct internal_state { /* Depth of each subtree used as tie breaker for trees of equal frequency */ +#ifdef LIT_MEM +# define LIT_BUFS 5 + ushf *d_buf; /* buffer for distances */ + uchf *l_buf; /* buffer for literals/lengths */ +#else +# define LIT_BUFS 4 uchf *sym_buf; /* buffer for distances and literals/lengths */ +#endif uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for @@ -239,7 +250,7 @@ typedef struct internal_state { * - I can't count above 4 */ - uInt sym_next; /* running index in sym_buf */ + uInt sym_next; /* running index in symbol buffer */ uInt sym_end; /* symbol table full when sym_next reaches this */ ulg opt_len; /* bit length of current block with optimal trees */ @@ -318,6 +329,25 @@ void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, extern const uch ZLIB_INTERNAL _dist_code[]; #endif +#ifdef LIT_MEM +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->sym_next] = 0; \ + s->l_buf[s->sym_next++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->sym_next] = dist; \ + s->l_buf[s->sym_next++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +#else # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->sym_buf[s->sym_next++] = 0; \ @@ -337,6 +367,7 @@ void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->sym_next == s->sym_end); \ } +#endif #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ diff --git a/zlib/gzguts.h b/zlib/gzguts.h index f9375047..eba72085 100644 --- a/zlib/gzguts.h +++ b/zlib/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004-2019 Mark Adler + * Copyright (C) 2004-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -210,9 +210,5 @@ char ZLIB_INTERNAL *gz_strwinerror(DWORD error); /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t value -- needed when comparing unsigned to z_off64_t, which is signed (possible z_off64_t types off_t, off64_t, and long are all signed) */ -#ifdef INT_MAX -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) -#else unsigned ZLIB_INTERNAL gz_intmax(void); -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) -#endif +#define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) diff --git a/zlib/gzlib.c b/zlib/gzlib.c index 29fc4486..983153cc 100644 --- a/zlib/gzlib.c +++ b/zlib/gzlib.c @@ -1,5 +1,5 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004-2019 Mark Adler + * Copyright (C) 2004-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -563,20 +563,20 @@ void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) { #endif } -#ifndef INT_MAX /* portably return maximum value for an int (when limits.h presumed not available) -- we need to do this to cover cases where 2's complement not used, since C standard permits 1's complement and sign-bit representations, otherwise we could just use ((unsigned)-1) >> 1 */ unsigned ZLIB_INTERNAL gz_intmax(void) { - unsigned p, q; - - p = 1; +#ifdef INT_MAX + return INT_MAX; +#else + unsigned p = 1, q; do { q = p; p <<= 1; p++; } while (p > q); return q >> 1; -} #endif +} diff --git a/zlib/inflate.c b/zlib/inflate.c index b0757a9b..94ecff01 100644 --- a/zlib/inflate.c +++ b/zlib/inflate.c @@ -1387,7 +1387,7 @@ int ZEXPORT inflateSync(z_streamp strm) { /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; - state->hold <<= state->bits & 7; + state->hold >>= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { diff --git a/zlib/inftrees.c b/zlib/inftrees.c index 8a208c2d..98cfe164 100644 --- a/zlib/inftrees.c +++ b/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2023 Mark Adler + * Copyright (C) 1995-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.3 Copyright 1995-2023 Mark Adler "; + " inflate 1.3.1 Copyright 1995-2024 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -57,7 +57,7 @@ int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 198, 203}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 77}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, diff --git a/zlib/inftrees.h b/zlib/inftrees.h index a10712d8..396f74b5 100644 --- a/zlib/inftrees.h +++ b/zlib/inftrees.h @@ -41,8 +41,8 @@ typedef struct { examples/enough.c found in the zlib distribution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the + returns 852, and "enough 30 6 15" for distance codes returns 592. The + initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ diff --git a/zlib/qnx/package.qpg b/zlib/qnx/package.qpg index d882af2b..4877e0ef 100644 --- a/zlib/qnx/package.qpg +++ b/zlib/qnx/package.qpg @@ -25,10 +25,10 @@ - - - - + + + + @@ -63,7 +63,7 @@ - 1.3.0 + 1.3.1 Medium Stable diff --git a/zlib/treebuild.xml b/zlib/treebuild.xml index 1d1b0077..930b00be 100644 --- a/zlib/treebuild.xml +++ b/zlib/treebuild.xml @@ -1,6 +1,6 @@ - - + + zip compression library diff --git a/zlib/trees.c b/zlib/trees.c index 8dbdc40b..6a523ef3 100644 --- a/zlib/trees.c +++ b/zlib/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2021 Jean-loup Gailly + * Copyright (C) 1995-2024 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -899,14 +899,19 @@ local void compress_block(deflate_state *s, const ct_data *ltree, const ct_data *dtree) { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ - unsigned sx = 0; /* running index in sym_buf */ + unsigned sx = 0; /* running index in symbol buffers */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->sym_next != 0) do { +#ifdef LIT_MEM + dist = s->d_buf[sx]; + lc = s->l_buf[sx++]; +#else dist = s->sym_buf[sx++] & 0xff; dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; lc = s->sym_buf[sx++]; +#endif if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); @@ -931,8 +936,12 @@ local void compress_block(deflate_state *s, const ct_data *ltree, } } /* literal or match pair ? */ - /* Check that the overlay between pending_buf and sym_buf is ok: */ + /* Check for no overlay of pending_buf on needed symbols */ +#ifdef LIT_MEM + Assert(s->pending < 2 * (s->lit_bufsize + sx), "pendingBuf overflow"); +#else Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); +#endif } while (sx < s->sym_next); @@ -1082,9 +1091,14 @@ void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, * the current block must be flushed. */ int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) { +#ifdef LIT_MEM + s->d_buf[s->sym_next] = (ush)dist; + s->l_buf[s->sym_next++] = (uch)lc; +#else s->sym_buf[s->sym_next++] = (uch)dist; s->sym_buf[s->sym_next++] = (uch)(dist >> 8); s->sym_buf[s->sym_next++] = (uch)lc; +#endif if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; diff --git a/zlib/win32/DLL_FAQ.txt b/zlib/win32/DLL_FAQ.txt index 12c00901..d8cf5f31 100644 --- a/zlib/win32/DLL_FAQ.txt +++ b/zlib/win32/DLL_FAQ.txt @@ -3,7 +3,7 @@ This document describes the design, the rationale, and the usage -of the official DLL build of zlib, named ZLIB1.DLL. If you have +of the common DLL build of zlib, named ZLIB1.DLL. If you have general questions about zlib, you should see the file "FAQ" found in the zlib distribution, or at the following location: http://www.gzip.org/zlib/zlib_faq.html @@ -11,13 +11,9 @@ in the zlib distribution, or at the following location: 1. What is ZLIB1.DLL, and how can I get it? - - ZLIB1.DLL is the official build of zlib as a DLL. + - ZLIB1.DLL is the common build of zlib as a DLL. (Please remark the character '1' in the name.) - Pointers to a precompiled ZLIB1.DLL can be found in the zlib - web site at: - http://www.zlib.net/ - Applications that link to ZLIB1.DLL can rely on the following specification: @@ -379,18 +375,6 @@ in the zlib distribution, or at the following location: code. But you can make your own private DLL build, under a different file name, as suggested in the previous answer. - -17. I made my own ZLIB1.DLL build. Can I test it for compliance? - - - We prefer that you download the official DLL from the zlib - web site. If you need something peculiar from this DLL, you - can send your suggestion to the zlib mailing list. - - However, in case you do rebuild the DLL yourself, you can run - it with the test programs found in the DLL distribution. - Running these test programs is not a guarantee of compliance, - but a failure can imply a detected problem. - ** This document is written and maintained by diff --git a/zlib/win32/README-WIN32.txt b/zlib/win32/README-WIN32.txt index 384c988f..14e6398e 100644 --- a/zlib/win32/README-WIN32.txt +++ b/zlib/win32/README-WIN32.txt @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.3.0 is a general purpose data compression library. All the code is +zlib 1.3.1 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) @@ -16,13 +16,13 @@ is http://zlib.net/ . Before reporting a problem, please check this site to verify that you have the latest version of zlib; otherwise get the latest version and check whether the problem still exists or not. -PLEASE read DLL_FAQ.txt, and the the zlib FAQ http://zlib.net/zlib_faq.html -before asking for help. +PLEASE read DLL_FAQ.txt, and the zlib FAQ http://zlib.net/zlib_faq.html before +asking for help. Manifest: -The package zlib-1.3.0-win32-x86.zip will contain the following files: +The package zlib-1.3.1-win32-x86.zip will contain the following files: README-WIN32.txt This document ChangeLog Changes since previous zlib packages diff --git a/zlib/zconf.h.cmakein b/zlib/zconf.h.cmakein index 310c4392..0abe3bc9 100644 --- a/zlib/zconf.h.cmakein +++ b/zlib/zconf.h.cmakein @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -302,14 +302,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have diff --git a/zlib/zconf.h.in b/zlib/zconf.h.in index fb76ffe3..62adc8d8 100644 --- a/zlib/zconf.h.in +++ b/zlib/zconf.h.in @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -300,14 +300,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have diff --git a/zlib/zlib.3 b/zlib/zlib.3 index 4dd28967..c716020e 100644 --- a/zlib/zlib.3 +++ b/zlib/zlib.3 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "18 Aug 2023" +.TH ZLIB 3 "22 Jan 2024" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -105,9 +105,9 @@ before asking for help. Send questions and/or comments to zlib@gzip.org, or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). .SH AUTHORS AND LICENSE -Version 1.3 +Version 1.3.1 .LP -Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler +Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler .LP This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/zlib/zlib.h b/zlib/zlib.h index da09785e..32dc34b6 100644 --- a/zlib/zlib.h +++ b/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.3, August 18th, 2023 + version 1.3.1, January 22nd, 2024 - Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.3" -#define ZLIB_VERNUM 0x1300 +#define ZLIB_VERSION "1.3.1" +#define ZLIB_VERNUM 0x1310 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 3 -#define ZLIB_VER_REVISION 0 +#define ZLIB_VER_REVISION 1 #define ZLIB_VER_SUBREVISION 0 /* @@ -936,10 +936,10 @@ ZEXTERN int ZEXPORT inflateSync(z_streamp strm); inflateSync returns Z_OK if a possible full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. + In the success case, the application may save the current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy(z_streamp dest, @@ -1758,14 +1758,14 @@ ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2); seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. + len2. len2 must be non-negative. */ /* ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2); Return the operator corresponding to length len2, to be used with - crc32_combine_op(). + crc32_combine_op(). len2 must be non-negative. */ ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op); diff --git a/zlib/zutil.h b/zlib/zutil.h index 902a304c..48dd7feb 100644 --- a/zlib/zutil.h +++ b/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -56,7 +56,7 @@ typedef unsigned long ulg; extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] +#define ERR_MSG(err) z_errmsg[(err) < -6 || (err) > 2 ? 9 : 2 - (err)] #define ERR_RETURN(strm,err) \ return (strm->msg = ERR_MSG(err), (err)) @@ -137,17 +137,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # endif #endif -#if defined(MACOS) || defined(TARGET_OS_MAC) +#if defined(MACOS) # define OS_CODE 7 -# ifndef Z_SOLO -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -# endif #endif #ifdef __acorn @@ -170,18 +161,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define OS_CODE 19 #endif -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - #if defined(__BORLANDC__) && !defined(MSDOS) #pragma warn -8004 #pragma warn -8008 -- cgit v1.2.3