diff --git a/.flake8 b/.flake8 index a570f5e020..74f239821f 100644 --- a/.flake8 +++ b/.flake8 @@ -32,4 +32,4 @@ ignore = # line break occurred before a binary operator - let black worry about that W503 # line break occurred after a binary operator - let black worry about that - W504 + W504 \ No newline at end of file diff --git a/.github/workflows/build-mapscript-php.yml b/.github/workflows/build-mapscript-php.yml index 3ce61bcbfa..7c93fc8770 100644 --- a/.github/workflows/build-mapscript-php.yml +++ b/.github/workflows/build-mapscript-php.yml @@ -30,7 +30,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Python uses: actions/setup-python@v5 diff --git a/.github/workflows/build-mapscript-python.yml b/.github/workflows/build-mapscript-python.yml index d14bd36c01..d164973725 100644 --- a/.github/workflows/build-mapscript-python.yml +++ b/.github/workflows/build-mapscript-python.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up Python uses: actions/setup-python@v5 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4511b81bfe..5e27badfb5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Checkout repository contents - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Build run: | diff --git a/.github/workflows/build_alpine.yml b/.github/workflows/build_alpine.yml index e1f6861d7e..3fe2b2262a 100644 --- a/.github/workflows/build_alpine.yml +++ b/.github/workflows/build_alpine.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout repository contents - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Build run: | diff --git a/.github/workflows/check-crlf.yml b/.github/workflows/check-crlf.yml index 1df7d3136b..9bd0b81fc0 100644 --- a/.github/workflows/check-crlf.yml +++ b/.github/workflows/check-crlf.yml @@ -19,9 +19,9 @@ jobs: steps: - name: Checkout repository contents - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Use action to check for CRLF endings - uses: erclu/check-crlf@v1.2.0 + uses: erclu/check-crlf@master with: # ignore directories containing *.pdf and *.tab exclude: msautotest/misc/data/ /msautotest/renderers/expected/ diff --git a/.github/workflows/code_checks.yml b/.github/workflows/code_checks.yml index d3a61b0807..cf95b1280e 100644 --- a/.github/workflows/code_checks.yml +++ b/.github/workflows/code_checks.yml @@ -14,8 +14,8 @@ jobs: linting: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + - uses: actions/setup-python@v6 with: python-version: '3.12' - uses: pre-commit/action@v3.0.1 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1467a258e2..b0c519edd7 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -37,7 +37,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml index 00f0f6b823..1f023a11c4 100644 --- a/.github/workflows/conda.yml +++ b/.github/workflows/conda.yml @@ -15,7 +15,7 @@ jobs: os: [macos-latest, windows-latest, ubuntu-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ilammy/msvc-dev-cmd@v1 if: matrix.os == 'windows-latest' - name: Support longpaths diff --git a/.github/workflows/coverity-scan.yml b/.github/workflows/coverity-scan.yml index 4ea9667da7..9b4edea437 100644 --- a/.github/workflows/coverity-scan.yml +++ b/.github/workflows/coverity-scan.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-20.04 if: github.repository == 'MapServer/MapServer' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install Libraries run: | diff --git a/.github/workflows/cppcheck.yml b/.github/workflows/cppcheck.yml index 4e2970b091..e6b19101ef 100644 --- a/.github/workflows/cppcheck.yml +++ b/.github/workflows/cppcheck.yml @@ -16,7 +16,7 @@ jobs: if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')" steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Requirements run: | diff --git a/.github/workflows/start.sh b/.github/workflows/start.sh index 19998de616..3dd3d98158 100755 --- a/.github/workflows/start.sh +++ b/.github/workflows/start.sh @@ -9,7 +9,7 @@ export PYTHON_VERSION=system LANG=en_US.UTF-8 export LANG DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ - sudo locales tzdata software-properties-common python3-dev python3-pip python3-setuptools git curl \ + sudo locales tzdata software-properties-common python3-dev python3-venv python3-pip python3-setuptools git curl \ apt-transport-https ca-certificates gnupg software-properties-common wget #install PHP 8.1 DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:ondrej/php -y @@ -41,8 +41,8 @@ ci/ubuntu/setup.sh ci/ubuntu/build.sh # Validate openapi document -pip install check-jsonschema -wget https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/schemas/v3.0/schema.yaml -O openapi_schema.yaml +pip install check-jsonschema --break-system-packages +wget https://raw.githubusercontent.com/OAI/OpenAPI-Specification/refs/heads/main/_archive_/schemas/v3.0/schema.yaml -O openapi_schema.yaml echo "Run check-jsonschema --schemafile openapi_schema.yaml msautotest/api/expected/ogcapi_api.json" check-jsonschema --schemafile openapi_schema.yaml msautotest/api/expected/ogcapi_api.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6465ead931..819ddec657 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: - id: isort args: ["--profile", "black"] - repo: https://github.com/pycqa/flake8 - rev: 7.1.1 + rev: 7.2.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-clang-format diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000000..f677f2b085 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,64 @@ +cff-version: 1.2.0 +title: MapServer +message: If you use this software, please cite it using the metadata from this file. +version: 8.4.1 +date-released: 2025-09-19 +abstract: MapServer is an Open Source platform for publishing spatial data and interactive mapping applications to the web. +type: software +authors: + - family-names: McKenna + given-names: Jeff + affiliation: GatewayGeo + orcid: https://orcid.org/0000-0003-3900-1863 + - family-names: Lime + given-names: Steve + affiliation: MNIT DNR + - family-names: Bonfort + given-names: Thomas + affiliation: Airbus + - family-names: Boué + given-names: Jérome + - family-names: Butler + given-names: Howard + affiliation: Hobu Inc + orcid: https://orcid.org/0000-0002-5340-1380 + - family-names: Girvin + given-names: Seth + affiliation: Geographika + - family-names: Kralidis + given-names: Tom + - family-names: Meissl + given-names: Stephan + affiliation: EOX + orcid: https://orcid.org/0000-0002-1407-8859 + - family-names: Morissette + given-names: Daniel + affiliation: Mapgears + - family-names: Nacionales + given-names: Perry + affiliation: University of Minnesota + - family-names: Rahkonen + given-names: Jukka + affiliation: National Land Survey of Finland + - family-names: Rouault + given-names: Even + affiliation: Spatialys + orcid: https://orcid.org/0000-0002-5068-0476 + - family-names: Smith + given-names: Mike + affiliation: US Army Corps of Engineers + - family-names: Szekeres + given-names: Tamas +repository-code: https://github.com/MapServer/MapServer +license: MIT +doi: 10.5281/zenodo.6994443 +keywords: + - web + - geospatial + - software + - ogc + - standards + - gdal + - open source + - free software + - MIT diff --git a/CMakeLists.txt b/CMakeLists.txt index 655eee5c87..f324dbd224 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,14 +16,14 @@ include(CheckIncludeFile) include(CheckCSourceCompiles) set (MapServer_VERSION_MAJOR 8) -set (MapServer_VERSION_MINOR 3) -set (MapServer_VERSION_REVISION 0) +set (MapServer_VERSION_MINOR 4) +set (MapServer_VERSION_REVISION 1) set (MapServer_VERSION_SUFFIX "") # Set C++ version # Make CMAKE_CXX_STANDARD available as cache option overridable by user -set(CMAKE_CXX_STANDARD 11 - CACHE STRING "C++ standard version to use (default is 11)") +set(CMAKE_CXX_STANDARD 17 + CACHE STRING "C++ standard version to use (default is 17)") message(STATUS "Requiring C++${CMAKE_CXX_STANDARD}") set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) @@ -31,8 +31,8 @@ message(STATUS "Requiring C++${CMAKE_CXX_STANDARD} - done") # Set C version # Make CMAKE_C_STANDARD available as cache option overridable by user -set(CMAKE_C_STANDARD 11 - CACHE STRING "C standard version to use (default is 11)") +set(CMAKE_C_STANDARD 17 + CACHE STRING "C standard version to use (default is 17)") message(STATUS "Requiring C${CMAKE_C_STANDARD}") set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) diff --git a/HISTORY.md b/HISTORY.md index 5a163b493e..8b836f3f37 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -13,6 +13,48 @@ https://mapserver.org/development/changelog/ The online Migration Guide can be found at https://mapserver.org/MIGRATION_GUIDE.html +8.4.1 release (2025-09-19) +-------------------------- + +- security: add missing column name escaping for WFS filters through OGR (#7349) + +- fix opacity for gradient legend symbol (#7255) + +see detailed changelog for other fixes + +8.4.0 release (2025-01-15) +-------------------------- + +- add CITATION.cff, useful for Zenodo/DOI (#7209) +(see major changes below) + +8.4.0-rc1 release (2025-01-08) +------------------------------ + +- include stdbool.h in mapserver.h (#7205) + +8.4.0-beta2 release (2024-12-14) +-------------------------------- + +- add explicit error message when proj.db cannot be found (#7203) + +8.4.0-beta1 release (2024-12-13) +-------------------------------- + +- add PCRE2 support (#7073) + +- add CONNECTIONTYPE RASTERLABEL (#7135) + +- set MS_LEGEND_KEYSIZE_MAX to 1000 (#7154) + +- add 4 new COMPOSITE.COMPOP blending operations (#7065) + +- allow encryption key files to use paths relative to a mapfile (#7181) + +- allow use_default_extent_for_getfeature to be used for OGC Features API and PostGIS (#7197) + +see detailed changelog for other fixes + 8.2.2 release (2024-09-02) -------------------------- diff --git a/INSTALL.CMAKE b/INSTALL.CMAKE index 2b3fbda00e..08b28fac46 100644 --- a/INSTALL.CMAKE +++ b/INSTALL.CMAKE @@ -125,7 +125,7 @@ Refer to the CMakeLists.txt file for up-to-date options. - option(WITH_KML "Enable native KML output support (requires libxml2 support)" OFF) - option(WITH_SOS "Enable SOS Server support (requires PROJ and libxml2 support)" OFF) - option(WITH_WMS "Enable WMS Server support (requires proj support)" ON) - - option(WITH_FRIBIDI "Choose if FriBidi glyph reordering should be enabled (useful for left-to-right languages)(requires harfbuzz)" ON) + - option(WITH_FRIBIDI "Choose if FriBidi glyph reordering should be enabled (useful for right-to-left languages)(requires harfbuzz)" ON) - option(WITH_HARFBUZZ "Choose if Harfbuzz complex script glyph shaping support should be built in (requires fribidi)" ON) - option(WITH_ICONV "Choose if Iconv Internationalization support should be built in" ON) - option(WITH_CAIRO "Choose if CAIRO rendering support should be built in (required for SVG and PDF output)" ON) diff --git a/LICENSE.md b/LICENSE.md index 5ad42611da..fa495ab2b8 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -4,7 +4,7 @@ MapServer Licensing MapServer General ----------------- -Copyright (c) 2008-2024 Open Source Geospatial Foundation. +Copyright (c) 2008-2025 Open Source Geospatial Foundation. Copyright (c) 1996-2008 Regents of the University of Minnesota. Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/SECURITY.md b/SECURITY.md index 43e72602a5..008f2a9c44 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,8 +2,10 @@ ## Reporting a Vulnerability in MapServer -Security/vulnerability reports should not be submitted through GitHub tickets or the public mailing lists, but instead please send your report -to the email address: **mapserver-security nospam @ osgeo.org** (remove the blanks and ‘nospam’). +Security/vulnerability reports should not be submitted through GitHub tickets or the public mailing lists, +but instead please provide details to the Project Steering Committee via the GitHub [Report a vulnerability](https://github.com/MapServer/MapServer/security/advisories/new) +option link at the top of this page, or send your report to the email address: +**mapserver-security nospam @ osgeo.org** (remove the blanks and ‘nospam’). Please follow the general guidelines for bug submissions, when describing the vulnerability (see https://mapserver.org/development/bugs.html). @@ -13,17 +15,18 @@ submissions, when describing the vulnerability (see https://mapserver.org/develo The MapServer PSC (Project Steering Committee) will release patches for security vulnerabilities for the last release branch of the **two most recent release series** (such as 8.x, 7.x, 6.x, etc..., where "x" is the most recent release in the series, such as: 7.6.6 being supported, but -not 7.6.5). For example, once 8.4 is released, support for 8.2 will be dropped. +not 7.6.5). For example, once 8.6 is released, support for 8.4 will be dropped. Patches will only be provided **for a period of three years** from the release date of the current series. -For example, as 8.2 has been released, now 8.2.x, and 7.6.x will be supported/patched, and 7.6.x will +For example, as 8.4 has been released, now 8.4.x, and 7.6.x will be supported/patched, and 7.6.x will only be supported for three years from the date of the 8.0 series release (until 2025-09-12). Currently, the following versions are supported: | Version | Supported | Support Until | | ------- | ------------------ |-------------- | -| 8.2.x | :white_check_mark: | | +| 8.4.x | :white_check_mark: | | +| 8.2.x | :x: | | | 8.0.x | :x: | | | 7.6.x | :white_check_mark: | 2025-09-12 | | 7.4.x | :x: | | @@ -32,6 +35,7 @@ Currently, the following versions are supported: | 6.4.x | :x: | | | < 6.4 | :x: | | +- _MapServer 8.4.0 was released on 2025-01-15_ - _MapServer 8.2.0 was released on 2024-07-08_ - _MapServer 8.0.0 was released on 2022-09-12_ - _MapServer 7.0.0 was released on 2015-07-24_ diff --git a/appveyor.yml b/appveyor.yml index ccf6e4db0a..a2ccf10e93 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -91,6 +91,7 @@ build_script: # set the MapScript custom environment variable for python 3.8+ - set MAPSERVER_DLL_PATH=%BUILD_FOLDER%/build/Release;%SDK_BIN% - set PROJ_DATA=%SDK_BIN%/proj9/SHARE + - set CURL_CA_BUNDLE=%SDK_BIN%/curl-ca-bundle.crt # ensure the GIF driver is available for tests - set GDAL_DRIVER_PATH=%SDK_BIN%/gdal/plugins # check the mapserver exe can run @@ -100,8 +101,9 @@ build_script: before_test: - set PATH=%SDK_BIN%/gdal/apps;%PATH%; - cd %BUILD_FOLDER%/msautotest + - set PIP_NO_PYTHON_VERSION_WARNING=1 - "./mssql/create_mssql_db.bat" - - "%Python_ROOT_DIR%/python -m pip install -U -r requirements.txt" + - "%Python_ROOT_DIR%/python -m pip install --no-warn-script-location -U -r requirements.txt" - "%Python_ROOT_DIR%/python -m pip install --no-index --find-links=file://%BUILD_FOLDER%/build/src/mapscript/python/Release/dist mapscript" test_script: diff --git a/ci/ubuntu/setup.sh b/ci/ubuntu/setup.sh index c4011e40a6..e7ca557a0b 100755 --- a/ci/ubuntu/setup.sh +++ b/ci/ubuntu/setup.sh @@ -33,7 +33,7 @@ cmake --version # upgrade to recent SWIG git clone https://github.com/swig/swig.git swig-git-master cd swig-git-master -wget https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.gz +wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.44/pcre2-10.44.tar.gz ./Tools/pcre-build.sh ./autogen.sh ./configure --prefix=/usr diff --git a/cmake/FindCairo.cmake b/cmake/FindCairo.cmake index 33dfc1c2cc..b28d3b187b 100644 --- a/cmake/FindCairo.cmake +++ b/cmake/FindCairo.cmake @@ -38,14 +38,11 @@ FIND_PATH(CAIRO_INCLUDE_DIR PATH_SUFFIXES cairo ) -IF(APPLE) - #On Mountain Lion we need this for the XQuartz supplied version of cairo - PKG_CHECK_MODULES(PC_FONTCONFIG fontconfig) # FIXME: After we require CMake 2.8.2 we can pass QUIET to this call. - FIND_PATH(FC_INCLUDE_DIR - NAMES fontconfig/fontconfig.h - HINTS ${PC_FONTCONFIG_INCLUDEDIR} - ) -ENDIF(APPLE) +PKG_CHECK_MODULES(PC_FONTCONFIG fontconfig) # FIXME: After we require CMake 2.8.2 we can pass QUIET to this call. +FIND_PATH(FC_INCLUDE_DIR + NAMES fontconfig/fontconfig.h + HINTS ${PC_FONTCONFIG_INCLUDEDIR} +) FIND_LIBRARY(CAIRO_LIBRARY NAMES cairo diff --git a/etc/mapserver-sample.conf b/etc/mapserver-sample.conf index 331e7a2725..ebf6dc1fd7 100644 --- a/etc/mapserver-sample.conf +++ b/etc/mapserver-sample.conf @@ -12,7 +12,7 @@ CONFIG # # MS_MAP_NO_PATH "1" MS_MAP_PATTERN "^/opt/mapserver" ## required when referencing mapfiles by path - # MS_MAP_BAD_PATTERN "[/\\]{2}|[/\\]?\\.+[/\\]|," + # MS_MAP_BAD_PATTERN "[/\\\\]{2}|[/\\\\]?\\.+[/\\\\]|," # # Global Log/Debug Setup @@ -37,7 +37,7 @@ CONFIG # # Proj Library # - # PROJ_LIB "/usr/local/share/proj" + # PROJ_DATA "/usr/local/share/proj" # # Request Control diff --git a/fuzzers/build.sh b/fuzzers/build.sh index 52eb32d5e6..164ee98dfa 100755 --- a/fuzzers/build.sh +++ b/fuzzers/build.sh @@ -80,7 +80,7 @@ for fuzzer in mapfuzzer shapefuzzer configfuzzer; do $CXX $CXXFLAGS $LIB_FUZZING_ENGINE ${fuzzer}.o -o ${fuzzer} \ -L. -lmapserver_static -lgdal \ -Wl,-Bstatic -lpng -ljpeg -lfreetype -lproj -lxml2 -lz -lsqlite3 -llzma \ - -Wl,-Bdynamic -lpthread -ldl -lc++ + -Wl,-Bdynamic -lpthread -ldl -lc++ -lclang_rt.builtins cp ${fuzzer} $OUT/ done diff --git a/msautotest/api/7305_multipolygon.map b/msautotest/api/7305_multipolygon.map new file mode 100644 index 0000000000..0e6b58c146 --- /dev/null +++ b/msautotest/api/7305_multipolygon.map @@ -0,0 +1,46 @@ +# RUN_PARMS: ogcapi_collections_multipolygon_items.json [MAPSERV] "PATH_INFO=/[MAPFILE]/ogcapi/collections/multipolygon_layer/items" "QUERY_STRING=f=json" > [RESULT_DEMIME] +# RUN_PARMS: ogcapi_collections_multipolygon_items.html [MAPSERV] "PATH_INFO=/[MAPFILE]/ogcapi/collections/multipolygon_layer/items" "QUERY_STRING=f=html" > [RESULT_DEMIME] + +MAP + EXTENT -23422614 -11650014 23758273 18540865 + SIZE 800 800 + + PROJECTION + "+init=epsg:4326" + END + UNITS METERS + + WEB + METADATA + "oga_html_template_directory" "../../share/ogcapi/templates/html-plain" + "oga_title" "Pull Request #7305" + "oga_description" "This is a test OGC API server description for pull request #7305." + "oga_onlineresource" "http://localhost/cgi-bin/mapserv/7305/ogcapi" + "oga_server_description" "Server description" + "oga_enable_request" "OGCAPI" + "oga_geometry_precision" "4" + "oga_compliance_mode" "true" + END + END + + LAYER + NAME "multipolygon_layer" + DATA "data/7305-multipolygon" + TYPE POLYGON + STATUS OFF + METADATA + "oga_keywords" "multipolygon" + "oga_description" "Layer with multipolygon with holes" + "oga_title" "Multipolygon layer" + "oga_featureid" "ogc_fid" + END + VALIDATION + "ogc_fid" "^3$" # only one acceptable value + END + PROJECTION + "+init=epsg:4326" + END + TEMPLATE VOID + END +END + \ No newline at end of file diff --git a/msautotest/api/data/7305-multipolygon.dbf b/msautotest/api/data/7305-multipolygon.dbf new file mode 100644 index 0000000000..555e8ebb42 Binary files /dev/null and b/msautotest/api/data/7305-multipolygon.dbf differ diff --git a/msautotest/api/data/7305-multipolygon.prj b/msautotest/api/data/7305-multipolygon.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/api/data/7305-multipolygon.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/api/data/7305-multipolygon.shp b/msautotest/api/data/7305-multipolygon.shp new file mode 100644 index 0000000000..22e8af72bd Binary files /dev/null and b/msautotest/api/data/7305-multipolygon.shp differ diff --git a/msautotest/api/data/7305-multipolygon.shx b/msautotest/api/data/7305-multipolygon.shx new file mode 100644 index 0000000000..e348e6119f Binary files /dev/null and b/msautotest/api/data/7305-multipolygon.shx differ diff --git a/msautotest/api/expected/ogcapi_api.json b/msautotest/api/expected/ogcapi_api.json index b12f7242d8..fe0cc1914f 100644 --- a/msautotest/api/expected/ogcapi_api.json +++ b/msautotest/api/expected/ogcapi_api.json @@ -1 +1 @@ -{"components":{"parameters":{"f":{"description":"The optional f parameter indicates the output format which the server shall provide as part of the response document. The default format is GeoJSON.","explode":false,"in":"query","name":"f","required":false,"schema":{"default":"json","enum":["json","html"],"type":"string"},"style":"form"},"offset":{"description":"The optional offset parameter indicates the index within the result set from which the server shall begin presenting results in the response document. The first element has an index of 0 (default).","explode":false,"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"},"style":"form"}},"responses":{"200":{"description":"successful operation"},"default":{"content":{"application/json":{"schema":{"$ref":"https://raw.githubusercontent.com/opengeospatial/ogcapi-processes/master/core/openapi/schemas/exception.yaml"}}},"description":"unexpected error"}}},"info":{"contact":{"email":"email@example.com","name":"Contact person","url":"http://example.com/contact"},"description":"This is a test OGC API server description set via oga_description.","termsOfService":"Terms of Service","title":"OGC API Test","version":"1.0.0","x-keywords":"keyword1,keyword2"},"openapi":"3.0.2","paths":{"/":{"get":{"description":"Landing page","operationId":"getLandingPage","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/LandingPage"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Landing page","tags":["server"]}},"/api":{"get":{"description":"API documentation","operationId":"getOpenapi","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"#/components/responses/200"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"default":{"$ref":"#/components/responses/default"}},"summary":"API documentation","tags":["server"]}},"/collections":{"get":{"description":"Collections","operationId":"getCollections","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collections"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Collections","tags":["server"]}},"/collections/mn_counties":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"describemn_countiesCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries metadata","tags":["mn_counties"]}},"/collections/mn_counties/items":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries items","tags":["mn_counties"]}},"/collections/mn_counties/items/{featureId}":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries item by id","tags":["mn_counties"]}},"/collections/mn_major_rivers":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"describemn_major_riversCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines metadata","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines items","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items/{featureId}":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines item by id","tags":["mn_major_rivers"]}},"/collections/mn_population_centers":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"describemn_population_centersCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers metadata","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers items","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items/{featureId}":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers item by id","tags":["mn_population_centers"]}},"/conformance":{"get":{"description":"API conformance definition","operationId":"getConformanceDeclaration","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ConformanceDeclaration"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"API conformance definition","tags":["server"]}}},"servers":[{"description":"Server description","url":"http://localhost/cgi-bin/mapserv/OGCAPI_TEST/ogcapi"}],"tags":[]} +{"components":{"parameters":{"f":{"description":"The optional f parameter indicates the output format which the server shall provide as part of the response document. The default format is GeoJSON.","explode":false,"in":"query","name":"f","required":false,"schema":{"default":"json","enum":["json","html"],"type":"string"},"style":"form"},"offset":{"description":"The optional offset parameter indicates the index within the result set from which the server shall begin presenting results in the response document. The first element has an index of 0 (default).","explode":false,"in":"query","name":"offset","required":false,"schema":{"default":0,"minimum":0,"type":"integer"},"style":"form"}},"responses":{"200":{"description":"successful operation"},"default":{"content":{"application/json":{"schema":{"$ref":"https://schemas.opengis.net/ogcapi/common/part1/1.0/openapi/schemas/exception.yaml"}}},"description":"unexpected error"}}},"info":{"contact":{"email":"email@example.com","name":"Contact person","url":"http://example.com/contact"},"description":"This is a test OGC API server description set via oga_description.","termsOfService":"Terms of Service","title":"OGC API Test","version":"1.0.0","x-keywords":"keyword1,keyword2"},"openapi":"3.0.2","paths":{"/":{"get":{"description":"Landing page","operationId":"getLandingPage","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/LandingPage"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Landing page","tags":["server"]}},"/api":{"get":{"description":"API documentation","operationId":"getOpenapi","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"#/components/responses/200"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"default":{"$ref":"#/components/responses/default"}},"summary":"API documentation","tags":["server"]}},"/collections":{"get":{"description":"Collections","operationId":"getCollections","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collections"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Collections","tags":["server"]}},"/collections/mn_counties":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"describemn_countiesCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries metadata","tags":["mn_counties"]}},"/collections/mn_counties/items":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries items","tags":["mn_counties"]}},"/collections/mn_counties/items/{featureId}":{"get":{"description":"This is the standard Minnesota State County Boundary dataset.","operationId":"getmn_countiesFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get State of Minnesota County Boundaries item by id","tags":["mn_counties"]}},"/collections/mn_major_rivers":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"describemn_major_riversCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines metadata","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines items","tags":["mn_major_rivers"]}},"/collections/mn_major_rivers/items/{featureId}":{"get":{"description":"This dataset represents stream centerlines for major rivers in Minnesota.","operationId":"getmn_major_riversFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Major River Centerlines item by id","tags":["mn_major_rivers"]}},"/collections/mn_population_centers":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"describemn_population_centersCollection","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Collection"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers metadata","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeatures","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/bbox"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/datetime"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/bbox-crs"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part2/1.0/openapi/ogcapi-features-2.yaml#/components/parameters/crs"},{"$ref":"#/components/parameters/offset"},{"description":"The optional limit parameter limits the number of items that are presented in the response document.","explode":false,"in":"query","name":"limit","required":false,"schema":{"default":9,"maximum":15,"minimum":1,"type":"integer"},"style":"form"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Features"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers items","tags":["mn_population_centers"]}},"/collections/mn_population_centers/items/{featureId}":{"get":{"description":"This dataset contains cities, townships, reservations, county seats and unorganized Territories in Minnesota, represented with point geometry for cartographic purposes.","operationId":"getmn_population_centersFeature","parameters":[{"$ref":"#/components/parameters/f"},{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/parameters/featureId"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/Feature"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"404":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/NotFound"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"Get Minnesota Population Centers item by id","tags":["mn_population_centers"]}},"/conformance":{"get":{"description":"API conformance definition","operationId":"getConformanceDeclaration","parameters":[{"$ref":"#/components/parameters/f"}],"responses":{"200":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ConformanceDeclaration"},"400":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/InvalidParameter"},"500":{"$ref":"http://schemas.opengis.net/ogcapi/features/part1/1.0/openapi/ogcapi-features-1.yaml#/components/responses/ServerError"}},"summary":"API conformance definition","tags":["server"]}}},"servers":[{"description":"Server description","url":"http://localhost/cgi-bin/mapserv/OGCAPI_TEST/ogcapi"}],"tags":[]} diff --git a/msautotest/api/expected/ogcapi_collections_multipolygon_items.html b/msautotest/api/expected/ogcapi_collections_multipolygon_items.html new file mode 100644 index 0000000000..e12729b4a8 --- /dev/null +++ b/msautotest/api/expected/ogcapi_collections_multipolygon_items.html @@ -0,0 +1,39 @@ + + + + Pull Request #7305 + + + + + +

Pull Request #7305 - Collection Items: Multipolygon layer

+ +

+ Number of matching items: 1
+ Number of returned items: 1
+

+ + + + + + + + + + + + + + + + +
ID
3.000000000000000
+ + + + + + + diff --git a/msautotest/api/expected/ogcapi_collections_multipolygon_items.json b/msautotest/api/expected/ogcapi_collections_multipolygon_items.json new file mode 100644 index 0000000000..8fdc2ef557 --- /dev/null +++ b/msautotest/api/expected/ogcapi_collections_multipolygon_items.json @@ -0,0 +1 @@ +{"features":[{"geometry":{"coordinates":[[[[8.9216,45.5746],[8.8919,45.6027],[8.936,45.607],[8.9413,45.599],[8.9413,45.599],[8.9329,45.5924],[8.9216,45.5746],[8.9216,45.5746]],[[8.9112,45.6001],[8.9178,45.5871],[8.9308,45.5933],[8.9256,45.6004],[8.9112,45.6001]],[[8.9234,45.5865],[8.92,45.5851],[8.9208,45.5803],[8.9263,45.5832],[8.9234,45.5865]]],[[[8.9341,45.5868],[8.9337,45.5819],[8.9409,45.5836],[8.9387,45.5894],[8.9341,45.5868]]]],"type":"MultiPolygon"},"id":"3.000000000000000","properties":{},"type":"Feature"}],"links":[{"href":"http://localhost/cgi-bin/mapserv/7305/ogcapi/collections/multipolygon_layer/items?f=json&limit=10&offset=0","rel":"self","title":"Items for this collection as GeoJSON","type":"application/geo+json"},{"href":"http://localhost/cgi-bin/mapserv/7305/ogcapi/collections/multipolygon_layer/items?f=html&limit=10&offset=0","rel":"alternate","title":"Items for this collection as HTML","type":"text/html"}],"numberMatched":1,"numberReturned":1,"type":"FeatureCollection"} diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.cpg b/msautotest/gdal/data/tile_index_paths_special_chars.cpg new file mode 100644 index 0000000000..cd89cb9758 --- /dev/null +++ b/msautotest/gdal/data/tile_index_paths_special_chars.cpg @@ -0,0 +1 @@ +ISO-8859-1 \ No newline at end of file diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.dbf b/msautotest/gdal/data/tile_index_paths_special_chars.dbf new file mode 100644 index 0000000000..3e2b1ae75d Binary files /dev/null and b/msautotest/gdal/data/tile_index_paths_special_chars.dbf differ diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.prj b/msautotest/gdal/data/tile_index_paths_special_chars.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/gdal/data/tile_index_paths_special_chars.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.shp b/msautotest/gdal/data/tile_index_paths_special_chars.shp new file mode 100644 index 0000000000..446004ecdc Binary files /dev/null and b/msautotest/gdal/data/tile_index_paths_special_chars.shp differ diff --git a/msautotest/gdal/data/tile_index_paths_special_chars.shx b/msautotest/gdal/data/tile_index_paths_special_chars.shx new file mode 100644 index 0000000000..3812591d93 Binary files /dev/null and b/msautotest/gdal/data/tile_index_paths_special_chars.shx differ diff --git "a/msautotest/gdal/data/utm_4326_spec_char_\303\270\303\246\303\266\303\274\303\247.tif" "b/msautotest/gdal/data/utm_4326_spec_char_\303\270\303\246\303\266\303\274\303\247.tif" new file mode 100644 index 0000000000..48faeb6a1f Binary files /dev/null and "b/msautotest/gdal/data/utm_4326_spec_char_\303\270\303\246\303\266\303\274\303\247.tif" differ diff --git a/msautotest/gdal/expected/tileindex_special_chars.png b/msautotest/gdal/expected/tileindex_special_chars.png new file mode 100644 index 0000000000..1f7d3c2be1 Binary files /dev/null and b/msautotest/gdal/expected/tileindex_special_chars.png differ diff --git a/msautotest/gdal/tileindex_special_characters.map b/msautotest/gdal/tileindex_special_characters.map new file mode 100644 index 0000000000..f40f97707a --- /dev/null +++ b/msautotest/gdal/tileindex_special_characters.map @@ -0,0 +1,35 @@ +# +# REQUIRES: INPUT=SHAPE OUTPUT=PNG +# +# RUN_PARMS: tileindex_special_chars.png [MAP2IMG] -m [MAPFILE] -l special_character_path -o [RESULT] +# +# Test tileindex with special characters in location value + +MAP + +NAME TEST +STATUS ON +SIZE 100 100 +EXTENT -117.6409662 33.8479548 -117.6080786 33.8754608 +IMAGECOLOR 0 0 0 + +PROJECTION + "+init=epsg:4326" +END + +IMAGETYPE png + +LAYER + NAME special_character_path + TYPE raster + STATUS default + TEMPLATE "fake.html" + TILEINDEX "./data/tile_index_paths_special_chars.shp" + TILEITEM "location" + TILESRS "src_srs" + PROJECTION + "+proj=latlong +datum=WGS84" + END +END + +END # of map file diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.cpg b/msautotest/misc/data/shp_encoding/encoding_1250.cpg new file mode 100644 index 0000000000..746faa2a85 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1250.cpg @@ -0,0 +1 @@ +1250 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.dbf b/msautotest/misc/data/shp_encoding/encoding_1250.dbf new file mode 100644 index 0000000000..ce313b02de Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1250.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.prj b/msautotest/misc/data/shp_encoding/encoding_1250.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1250.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.shp b/msautotest/misc/data/shp_encoding/encoding_1250.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1250.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1250.shx b/msautotest/misc/data/shp_encoding/encoding_1250.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1250.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.cpg b/msautotest/misc/data/shp_encoding/encoding_1251.cpg new file mode 100644 index 0000000000..f0acbc2e3f --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1251.cpg @@ -0,0 +1 @@ +1251 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.dbf b/msautotest/misc/data/shp_encoding/encoding_1251.dbf new file mode 100644 index 0000000000..911b826cd0 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1251.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.prj b/msautotest/misc/data/shp_encoding/encoding_1251.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1251.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.shp b/msautotest/misc/data/shp_encoding/encoding_1251.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1251.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1251.shx b/msautotest/misc/data/shp_encoding/encoding_1251.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1251.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.cpg b/msautotest/misc/data/shp_encoding/encoding_1253.cpg new file mode 100644 index 0000000000..b0a0271f9c --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1253.cpg @@ -0,0 +1 @@ +1253 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.dbf b/msautotest/misc/data/shp_encoding/encoding_1253.dbf new file mode 100644 index 0000000000..58c1e1e45b Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1253.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.prj b/msautotest/misc/data/shp_encoding/encoding_1253.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1253.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.shp b/msautotest/misc/data/shp_encoding/encoding_1253.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1253.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1253.shx b/msautotest/misc/data/shp_encoding/encoding_1253.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1253.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.cpg b/msautotest/misc/data/shp_encoding/encoding_1254.cpg new file mode 100644 index 0000000000..c789257680 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1254.cpg @@ -0,0 +1 @@ +1254 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.dbf b/msautotest/misc/data/shp_encoding/encoding_1254.dbf new file mode 100644 index 0000000000..d1fce52db5 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1254.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.prj b/msautotest/misc/data/shp_encoding/encoding_1254.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_1254.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.shp b/msautotest/misc/data/shp_encoding/encoding_1254.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1254.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_1254.shx b/msautotest/misc/data/shp_encoding/encoding_1254.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_1254.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_437.cpg b/msautotest/misc/data/shp_encoding/encoding_437.cpg new file mode 100644 index 0000000000..3fa694f245 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_437.cpg @@ -0,0 +1 @@ +437 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_437.dbf b/msautotest/misc/data/shp_encoding/encoding_437.dbf new file mode 100644 index 0000000000..570d91df95 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_437.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_437.prj b/msautotest/misc/data/shp_encoding/encoding_437.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_437.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_437.shp b/msautotest/misc/data/shp_encoding/encoding_437.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_437.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_437.shx b/msautotest/misc/data/shp_encoding/encoding_437.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_437.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.cpg b/msautotest/misc/data/shp_encoding/encoding_88591.cpg new file mode 100644 index 0000000000..0968566aaf --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88591.cpg @@ -0,0 +1 @@ +88591 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.dbf b/msautotest/misc/data/shp_encoding/encoding_88591.dbf new file mode 100644 index 0000000000..1beb2035e6 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88591.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.prj b/msautotest/misc/data/shp_encoding/encoding_88591.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88591.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.shp b/msautotest/misc/data/shp_encoding/encoding_88591.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88591.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88591.shx b/msautotest/misc/data/shp_encoding/encoding_88591.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88591.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.cpg b/msautotest/misc/data/shp_encoding/encoding_885910.cpg new file mode 100644 index 0000000000..9378e6a30d --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885910.cpg @@ -0,0 +1 @@ +885910 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.dbf b/msautotest/misc/data/shp_encoding/encoding_885910.dbf new file mode 100644 index 0000000000..8c1fde3277 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885910.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.prj b/msautotest/misc/data/shp_encoding/encoding_885910.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885910.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.shp b/msautotest/misc/data/shp_encoding/encoding_885910.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885910.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885910.shx b/msautotest/misc/data/shp_encoding/encoding_885910.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885910.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.cpg b/msautotest/misc/data/shp_encoding/encoding_885911.cpg new file mode 100644 index 0000000000..8915cc18e4 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885911.cpg @@ -0,0 +1 @@ +885911 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.dbf b/msautotest/misc/data/shp_encoding/encoding_885911.dbf new file mode 100644 index 0000000000..759c303989 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885911.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.prj b/msautotest/misc/data/shp_encoding/encoding_885911.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885911.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.shp b/msautotest/misc/data/shp_encoding/encoding_885911.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885911.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885911.shx b/msautotest/misc/data/shp_encoding/encoding_885911.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885911.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.cpg b/msautotest/misc/data/shp_encoding/encoding_885913.cpg new file mode 100644 index 0000000000..0d8ed6ba29 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885913.cpg @@ -0,0 +1 @@ +885913 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.dbf b/msautotest/misc/data/shp_encoding/encoding_885913.dbf new file mode 100644 index 0000000000..08d8ebb089 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885913.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.prj b/msautotest/misc/data/shp_encoding/encoding_885913.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885913.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.shp b/msautotest/misc/data/shp_encoding/encoding_885913.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885913.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885913.shx b/msautotest/misc/data/shp_encoding/encoding_885913.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885913.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.cpg b/msautotest/misc/data/shp_encoding/encoding_885915.cpg new file mode 100644 index 0000000000..ccdb223253 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885915.cpg @@ -0,0 +1 @@ +885915 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.dbf b/msautotest/misc/data/shp_encoding/encoding_885915.dbf new file mode 100644 index 0000000000..3372c76dda Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885915.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.prj b/msautotest/misc/data/shp_encoding/encoding_885915.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_885915.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.shp b/msautotest/misc/data/shp_encoding/encoding_885915.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885915.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_885915.shx b/msautotest/misc/data/shp_encoding/encoding_885915.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_885915.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.cpg b/msautotest/misc/data/shp_encoding/encoding_88592.cpg new file mode 100644 index 0000000000..bda94ad63f --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88592.cpg @@ -0,0 +1 @@ +88592 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.dbf b/msautotest/misc/data/shp_encoding/encoding_88592.dbf new file mode 100644 index 0000000000..daeba2a73f Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88592.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.prj b/msautotest/misc/data/shp_encoding/encoding_88592.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88592.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.shp b/msautotest/misc/data/shp_encoding/encoding_88592.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88592.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88592.shx b/msautotest/misc/data/shp_encoding/encoding_88592.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88592.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.cpg b/msautotest/misc/data/shp_encoding/encoding_88593.cpg new file mode 100644 index 0000000000..c5d61bb5db --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88593.cpg @@ -0,0 +1 @@ +88593 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.dbf b/msautotest/misc/data/shp_encoding/encoding_88593.dbf new file mode 100644 index 0000000000..34ae9522ff Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88593.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.prj b/msautotest/misc/data/shp_encoding/encoding_88593.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88593.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.shp b/msautotest/misc/data/shp_encoding/encoding_88593.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88593.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88593.shx b/msautotest/misc/data/shp_encoding/encoding_88593.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88593.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.cpg b/msautotest/misc/data/shp_encoding/encoding_88594.cpg new file mode 100644 index 0000000000..355a1b7313 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88594.cpg @@ -0,0 +1 @@ +88594 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.dbf b/msautotest/misc/data/shp_encoding/encoding_88594.dbf new file mode 100644 index 0000000000..a4d4d8410f Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88594.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.prj b/msautotest/misc/data/shp_encoding/encoding_88594.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88594.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.shp b/msautotest/misc/data/shp_encoding/encoding_88594.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88594.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88594.shx b/msautotest/misc/data/shp_encoding/encoding_88594.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88594.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.cpg b/msautotest/misc/data/shp_encoding/encoding_88595.cpg new file mode 100644 index 0000000000..505ed08eb8 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88595.cpg @@ -0,0 +1 @@ +88595 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.dbf b/msautotest/misc/data/shp_encoding/encoding_88595.dbf new file mode 100644 index 0000000000..803ebe61f9 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88595.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.prj b/msautotest/misc/data/shp_encoding/encoding_88595.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88595.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.shp b/msautotest/misc/data/shp_encoding/encoding_88595.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88595.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88595.shx b/msautotest/misc/data/shp_encoding/encoding_88595.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88595.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.cpg b/msautotest/misc/data/shp_encoding/encoding_88596.cpg new file mode 100644 index 0000000000..4ee2725f57 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88596.cpg @@ -0,0 +1 @@ +88596 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.dbf b/msautotest/misc/data/shp_encoding/encoding_88596.dbf new file mode 100644 index 0000000000..d4ffa1c4fb Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88596.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.prj b/msautotest/misc/data/shp_encoding/encoding_88596.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88596.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.shp b/msautotest/misc/data/shp_encoding/encoding_88596.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88596.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88596.shx b/msautotest/misc/data/shp_encoding/encoding_88596.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88596.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.cpg b/msautotest/misc/data/shp_encoding/encoding_88597.cpg new file mode 100644 index 0000000000..ca3fcf9135 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88597.cpg @@ -0,0 +1 @@ +88597 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.dbf b/msautotest/misc/data/shp_encoding/encoding_88597.dbf new file mode 100644 index 0000000000..165da9f5f2 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88597.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.prj b/msautotest/misc/data/shp_encoding/encoding_88597.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88597.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.shp b/msautotest/misc/data/shp_encoding/encoding_88597.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88597.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88597.shx b/msautotest/misc/data/shp_encoding/encoding_88597.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88597.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.cpg b/msautotest/misc/data/shp_encoding/encoding_88598.cpg new file mode 100644 index 0000000000..231eb307c1 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88598.cpg @@ -0,0 +1 @@ +88598 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.dbf b/msautotest/misc/data/shp_encoding/encoding_88598.dbf new file mode 100644 index 0000000000..fd4d9360f5 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88598.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.prj b/msautotest/misc/data/shp_encoding/encoding_88598.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88598.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.shp b/msautotest/misc/data/shp_encoding/encoding_88598.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88598.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88598.shx b/msautotest/misc/data/shp_encoding/encoding_88598.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88598.shx differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.cpg b/msautotest/misc/data/shp_encoding/encoding_88599.cpg new file mode 100644 index 0000000000..85bd649b33 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88599.cpg @@ -0,0 +1 @@ +88599 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.dbf b/msautotest/misc/data/shp_encoding/encoding_88599.dbf new file mode 100644 index 0000000000..cfa42521cc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88599.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.prj b/msautotest/misc/data/shp_encoding/encoding_88599.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encoding_88599.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.shp b/msautotest/misc/data/shp_encoding/encoding_88599.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88599.shp differ diff --git a/msautotest/misc/data/shp_encoding/encoding_88599.shx b/msautotest/misc/data/shp_encoding/encoding_88599.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encoding_88599.shx differ diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.cpg b/msautotest/misc/data/shp_encoding/encodings_utf-8.cpg new file mode 100644 index 0000000000..3ad133c048 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encodings_utf-8.cpg @@ -0,0 +1 @@ +UTF-8 \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.dbf b/msautotest/misc/data/shp_encoding/encodings_utf-8.dbf new file mode 100644 index 0000000000..cc401e2433 Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encodings_utf-8.dbf differ diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.prj b/msautotest/misc/data/shp_encoding/encodings_utf-8.prj new file mode 100644 index 0000000000..f45cbadf00 --- /dev/null +++ b/msautotest/misc/data/shp_encoding/encodings_utf-8.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.shp b/msautotest/misc/data/shp_encoding/encodings_utf-8.shp new file mode 100644 index 0000000000..eeb7144dbc Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encodings_utf-8.shp differ diff --git a/msautotest/misc/data/shp_encoding/encodings_utf-8.shx b/msautotest/misc/data/shp_encoding/encodings_utf-8.shx new file mode 100644 index 0000000000..d4436d5bef Binary files /dev/null and b/msautotest/misc/data/shp_encoding/encodings_utf-8.shx differ diff --git a/msautotest/misc/encoding_from_cpg.map b/msautotest/misc/encoding_from_cpg.map new file mode 100644 index 0000000000..7ba954461f --- /dev/null +++ b/msautotest/misc/encoding_from_cpg.map @@ -0,0 +1,478 @@ +# Test reading encodings from cpg. +# http://www.madore.org/~david/computers/unicode/cstab.HTML +# +# RUN_PARMS: shp_encodings.png [MAP2IMG] -m [MAPFILE] -o [RESULT] +# +# Recipe to generate the files from the 'encodings_utf-8.shp': +# +# encodings=(88591 88592 88593 88594 88595 88596 88597 88598 88599 885910 885911 885913 885915 437 1250 1251 1253 1254) +# +# for ENC in "${encodings[@]}"; do +# ogr2ogr -f "ESRI Shapefile" "encoding_${ENC}.shp" "encodings_utf-8.shp" -lco ENCODING="$ENC" +# done +# +map + name "test encoding" + size 300 300 + extent -30 -30 40 40 + web + metadata + "ows_enable_request" "*" + "ows_srs" "epsg:4326" + "ows_onlineresource" "http://foo" + end + end + projection + "+init=epsg:4326" + end + + imagetype png + + symbol + type ellipse + name "circle" + points 1 1 end + filled true + end + + LAYER + NAME "latin-1" + DATA "data/shp_encoding/encoding_88591.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "latin-2" + DATA "data/shp_encoding/encoding_88592.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "Ą˘Ł¤ĽŚ§¨ŠŞŤŹŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-3" + DATA "data/shp_encoding/encoding_88593.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ÄĊĈÇÈÉÊËÌÍÎÏÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâäċĉçèéêëìíîïñòóôġö÷ĝùúûüŭŝ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-4" + DATA "data/shp_encoding/encoding_88594.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖרŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-5" + DATA "data/shp_encoding/encoding_88595.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-6" + DATA "data/shp_encoding/encoding_88596.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ءآأؤإئابةتثجحخدذرزسشصضطظعغـفقكلمنهوى" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-7" + DATA "data/shp_encoding/encoding_88597.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-8" + DATA "data/shp_encoding/encoding_88598.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "אבגדהוזחטיךכלםמןנסעףפץצקרשת" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-9" + DATA "data/shp_encoding/encoding_88599.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-10" + DATA "data/shp_encoding/encoding_885910.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ĄĒĢĪĨͧĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + + LAYER + NAME "latin-11" + DATA "data/shp_encoding/encoding_885911.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัำิีึืฺุู" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "latin-13" + DATA "data/shp_encoding/encoding_885913.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "latin-15" + DATA "data/shp_encoding/encoding_885915.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "ANSI 1250" + DATA "data/shp_encoding/encoding_1250.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüý" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + LAYER + NAME "ANSI 1251" + DATA "data/shp_encoding/encoding_1251.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзиклмнопрстуфхцчшщъыьэюя" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "ANSI 1253" + DATA "data/shp_encoding/encoding_1253.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "ANSI 1254" + DATA "data/shp_encoding/encoding_1254.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖØÙÚÛÜİŞß" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + + LAYER + NAME "OEM Codepage 437" + DATA "data/shp_encoding/encoding_437.shp" + TYPE point + CLASSITEM "data" + LABELITEM "encoding" + STATUS on + CLASS + EXPRESSION "ÉæÆôöòûùÿÖÜ¢£¥₧ƒ" + STYLE + SYMBOL "circle" + SIZE 8 + COLOR 255 0 0 + END # STYLE + LABEL + SIZE 6 + COLOR 0 0 0 + POSITION AUTO + PARTIALS TRUE + MAXLENGTH 10 + END # LABEL + END # CLASS + END # LAYER + +END # MAP diff --git a/msautotest/misc/expected/scaletoken_filterexpression_192k.png b/msautotest/misc/expected/scaletoken_filterexpression_192k.png new file mode 100644 index 0000000000..5ec2916013 Binary files /dev/null and b/msautotest/misc/expected/scaletoken_filterexpression_192k.png differ diff --git a/msautotest/misc/expected/scaletoken_filterexpression_424k.png b/msautotest/misc/expected/scaletoken_filterexpression_424k.png new file mode 100644 index 0000000000..72dbbe9bf2 Binary files /dev/null and b/msautotest/misc/expected/scaletoken_filterexpression_424k.png differ diff --git a/msautotest/misc/expected/shp_encodings.png b/msautotest/misc/expected/shp_encodings.png new file mode 100644 index 0000000000..364283169f Binary files /dev/null and b/msautotest/misc/expected/shp_encodings.png differ diff --git a/msautotest/misc/scaletoken.map b/msautotest/misc/scaletoken.map index d98c2c6f15..380a9780f1 100644 --- a/msautotest/misc/scaletoken.map +++ b/msautotest/misc/scaletoken.map @@ -8,6 +8,8 @@ # RUN_PARMS: scaletoken_filter_655k.png [MAP2IMG] -l layer2 -m [MAPFILE] -o [RESULT] -e 474315 4762880 485645 4765610 # RUN_PARMS: scaletoken_filteritem_192k.png [MAP2IMG] -l layer3 -m [MAPFILE] -o [RESULT] -e 478315 4762880 481645 4765610 # RUN_PARMS: scaletoken_filteritem_424k.png [MAP2IMG] -l layer3 -m [MAPFILE] -o [RESULT] -e 476315 4762880 483645 4765610 +# RUN_PARMS: scaletoken_filterexpression_192k.png [MAP2IMG] -l layer4 -m [MAPFILE] -o [RESULT] -e 478315 4762880 481645 4765610 +# RUN_PARMS: scaletoken_filterexpression_424k.png [MAP2IMG] -l layer4 -m [MAPFILE] -o [RESULT] -e 476315 4762880 483645 4765610 # MAP NAME 'scaletoken' @@ -83,5 +85,24 @@ MAP STYLE COLOR 51 51 51 END END END + LAYER + NAME 'layer4' + STATUS ON + DEBUG 1 + DATA "data/shppoly/poly.shp" + SCALETOKEN + NAME "%filter%" + VALUES + "0" "158" + "200000" "166" + END + END + # FILTER using an expression + FILTER ([EAS_ID] = %filter% ) + TYPE POLYGON + CLASS + STYLE COLOR 51 51 51 END + END + END END diff --git a/msautotest/mspython/test_wms_client.py b/msautotest/mspython/test_wms_client.py new file mode 100644 index 0000000000..caf9f9c16b --- /dev/null +++ b/msautotest/mspython/test_wms_client.py @@ -0,0 +1,55 @@ +import os + +import pytest + +mapscript_available = False +try: + import mapscript + + mapscript_available = True +except ImportError: + pass + +pytestmark = [ + pytest.mark.skipif(not mapscript_available, reason="mapscript not available"), + pytest.mark.skipif( + "SUPPORTS=WMS_CLIENT" not in mapscript.msGetVersion(), + reason="WMS Client is not enabled", + ), +] + + +def get_relpath_to_this(filename): + return os.path.join(os.path.dirname(__file__), filename) + + +############################################################################### +# Test that WMS client GetMap request does not modify layer extent or projection + + +def test_wms_client_does_not_modify_layer(): + map = mapscript.mapObj(get_relpath_to_this("wms_client.map")) + + layerObj = map.getLayer(0) + assert layerObj.getExtent().minx == -180 + assert layerObj.getExtent().miny == -90 + assert layerObj.getExtent().maxx == 180 + assert layerObj.getExtent().maxy == 90 + assert layerObj.getProjection() == "+init=epsg:4326" + + # Do a GetMap request in EPSG:32633 + request = mapscript.OWSRequest() + mapscript.msIO_installStdoutToBuffer() + request.loadParamsFromURL( + "&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616" + ) + status = map.OWSDispatch(request) + + assert status == 0 + + # Assert that layer extent and projection is not modified + assert layerObj.getExtent().minx == -180 + assert layerObj.getExtent().miny == -90 + assert layerObj.getExtent().maxx == 180 + assert layerObj.getExtent().maxy == 90 + assert layerObj.getProjection() == "+init=epsg:4326" diff --git a/msautotest/mspython/wms_client.map b/msautotest/mspython/wms_client.map new file mode 100644 index 0000000000..37c86ae36a --- /dev/null +++ b/msautotest/mspython/wms_client.map @@ -0,0 +1,51 @@ + + +MAP + NAME WMS_CLIENT_TEST_130 + STATUS ON + SIZE 400 300 + EXTENT -180 -90 180 90 + UNITS DD + PROJECTION + "init=epsg:4326" + END + IMAGECOLOR 255 255 255 + #SYMBOLSET etc/symbols.sym + #FONTSET etc/fonts.txt + + RESOLUTION 96 + IMAGETYPE png24 + + WEB + IMAGEPATH "/tmp/ms_tmp/" + IMAGEURL "/ms_tmp/" + METADATA + "ows_updatesequence" "123" + "wms_title" "Test WMS 1.3.0 client" + "wms_srs" "EPSG:4326" + "ows_enable_request" "*" + "wms_getmap_formatlist" "image/png,image/png; mode=24bit" + "ows_onlineresource" "http://localhost/wmsclient?" + END + END + + LAYER + NAME client + TYPE RASTER + STATUS ON + CONNECTION "https://demo.mapserver.org/cgi-bin/wms?" + CONNECTIONTYPE WMS + TEMPLATE "dummy" + EXTENT -180 -90 180 90 + METADATA + "wms_srs" "EPSG:4326 EPSG:32633" + "wms_name" "cities" + "wms_server_version" "1.3.0" + "wms_format" "image/png" + "wms_enable_request" "*" + END + PROJECTION + "init=epsg:4326" + END + END +END diff --git a/msautotest/pymod/msautotest_viewer.py b/msautotest/pymod/msautotest_viewer.py index 77c1e2806c..87cf00fed0 100755 --- a/msautotest/pymod/msautotest_viewer.py +++ b/msautotest/pymod/msautotest_viewer.py @@ -21,7 +21,6 @@ def main(): function_name = "main: " - global config, logging_flag if not os.path.isdir(os.path.dirname(python_logging_file)): print("Content-type: text/html") @@ -444,7 +443,6 @@ def main(): ## browser def tiff2png(tiff_file): function_name = "tiff2png: " - global python_logging_file, logging_flag, config ## Checking if path is found if not os.path.isdir(os.path.dirname(python_logging_file)): @@ -603,7 +601,6 @@ def tiff2png(tiff_file): ## Remove temporary PNG images file def rmTmpPngImages(): - global config function_name = "rmTmpPngImages: " tmp_path = config.get("Applications", "TmpDir") diff --git a/msautotest/pymod/mstestlib.py b/msautotest/pymod/mstestlib.py index bf8b8f50b0..ea8b0ecc0e 100644 --- a/msautotest/pymod/mstestlib.py +++ b/msautotest/pymod/mstestlib.py @@ -486,13 +486,18 @@ def get_gdal_version(): except Exception: gdal_version = os.popen("gdalinfo --version").read() - # Parse something like "GDAL x.y.zdev, released..." to extract "x.y.z" + # Parse GDAL version formats to extract "x.y.z" e.g. + # 'GDAL x.y.zdev' + # 'GDAL 3.11.3 "Eganville", released 2025/07/12' + # 'GDAL 3.11.3 Eganville' + # 'GDAL 3.x.y, released' if gdal_version.startswith("GDAL "): gdal_version = gdal_version[len("GDAL ") :] - pos = gdal_version.find("dev") - if pos >= 0: - return gdal_version[0:pos] - pos = gdal_version.find(",") + dev_pos = gdal_version.find("dev") + comma_pos = gdal_version.find(",") + space_pos = gdal_version.find(" ") + positions = [p for p in (dev_pos, comma_pos, space_pos) if p != -1] + pos = min(positions) if positions else -1 if pos >= 0: return gdal_version[0:pos] return None diff --git a/msautotest/query/context.map b/msautotest/query/context.map index 3cc1c8a988..ae67ba9982 100644 --- a/msautotest/query/context.map +++ b/msautotest/query/context.map @@ -6,6 +6,8 @@ # RUN_PARMS: context_test001.png [MAP2IMG] -m [MAPFILE] -l "bdry_counpy2" -o [RESULT] # RUN_PARMS: context_test002.png [MAP2IMG] -m [MAPFILE] -l "bdry_counpy2 indx_q100kpy4" -o [RESULT] # RUN_PARMS: context_test003.png [MAP2IMG] -m [MAPFILE] -l "indx_q100kpy4" -o [RESULT] +# RUN_PARMS: context_test004.png [MAP2IMG] -m [MAPFILE] -l "req_fail" -o [RESULT] +# RUN_PARMS: context_test005.png [MAP2IMG] -m [MAPFILE] -l "lreq_fail" -o [RESULT] # MAP NAME 'context' @@ -25,4 +27,16 @@ MAP REQUIRES '![bdry_counpy2]' INCLUDE 'include/indx_q100kpy4_shapefile.map' END + + LAYER + NAME 'req_fail' + REQUIRES '[non_existant]' + INCLUDE 'include/bdry_counpy2_shapefile.map' + END + + LAYER + NAME 'lreq_fail' + LABELREQUIRES '[non_existant]' + INCLUDE 'include/bdry_counpy2_shapefile.map' + END END diff --git a/msautotest/query/expected/context_test004.png b/msautotest/query/expected/context_test004.png new file mode 100644 index 0000000000..0f51863b07 Binary files /dev/null and b/msautotest/query/expected/context_test004.png differ diff --git a/msautotest/query/expected/context_test005.png b/msautotest/query/expected/context_test005.png new file mode 100644 index 0000000000..cf36e3b14c Binary files /dev/null and b/msautotest/query/expected/context_test005.png differ diff --git a/msautotest/requirements.txt b/msautotest/requirements.txt index b9e37ff1fe..eaa83d0dee 100644 --- a/msautotest/requirements.txt +++ b/msautotest/requirements.txt @@ -1,10 +1,4 @@ -# Python 2.7 constraints -# more-itertools 6.0 no longer supporting Python 2.7 -more-itertools < 6.0.0; python_version < '3.0' -# pytest 5.0 no longer supporting Python 2.7 -pytest>=3.6.0,<5.0.0; python_version < '3.0' - -pytest>=3.6.0; python_version >= '3.0' +pytest pytest-sugar pytest-env lxml diff --git a/msautotest/wxs/data/weird_column_names.csv b/msautotest/wxs/data/weird_column_names.csv new file mode 100644 index 0000000000..edfcac5d1a --- /dev/null +++ b/msautotest/wxs/data/weird_column_names.csv @@ -0,0 +1,3 @@ +"]","a""b",WKT +1,foo,"POINT (1000000 4000000)" +2,bar,"POINT (1000000 4000000)" diff --git a/msautotest/wxs/data/weird_column_names.csvt b/msautotest/wxs/data/weird_column_names.csvt new file mode 100644 index 0000000000..0322d0cf5b --- /dev/null +++ b/msautotest/wxs/data/weird_column_names.csvt @@ -0,0 +1 @@ +Integer,String,WKT diff --git a/msautotest/wxs/data/weird_column_names.db b/msautotest/wxs/data/weird_column_names.db new file mode 100644 index 0000000000..e700280462 Binary files /dev/null and b/msautotest/wxs/data/weird_column_names.db differ diff --git a/msautotest/wxs/expected/wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml b/msautotest/wxs/expected/wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml new file mode 100644 index 0000000000..eb76eeeb0d --- /dev/null +++ b/msautotest/wxs/expected/wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml @@ -0,0 +1,12 @@ +Content-Type: text/xml; subtype="gml/3.2.1"; charset=UTF-8 + + + + + diff --git a/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml b/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml index 23f115a9cf..35c7fe0834 100644 --- a/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml +++ b/msautotest/wxs/expected/wfs_ogr_drv_nocreatedatasource_caps.xml @@ -3,6 +3,6 @@ Content-Type: text/html MapServer Message -loadOutputFormat(): General error message. OUTPUTFORMAT (nocreatedatasource) clause references driver (OGR/SDTS), but this driver isn't configured. -msInitDefaultOGROutputFormat(): General error message. OGR `SDTS' driver does not support output. +loadOutputFormat(): General error message. OUTPUTFORMAT (nocreatedatasource) clause references driver (OGR/SXF), but this driver isn't configured. +msInitDefaultOGROutputFormat(): General error message. OGR `SXF' driver does not support output. \ No newline at end of file diff --git a/msautotest/wxs/expected/wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml b/msautotest/wxs/expected/wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml new file mode 100644 index 0000000000..4907bb2c37 --- /dev/null +++ b/msautotest/wxs/expected/wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml @@ -0,0 +1,8 @@ +Content-Type: text/xml; charset=UTF-8 + + + + +msWFSGetFeature(): WFS server error. Invalid or Unsupported FILTER in GetFeature : <Filter><PropertyIsEqualTo matchCase=false><PropertyName> + + diff --git a/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_numeric.xml b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_numeric.xml new file mode 100644 index 0000000000..a5fdf00f11 --- /dev/null +++ b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_numeric.xml @@ -0,0 +1,37 @@ +Content-Type: text/xml; charset=UTF-8 + + + + + + 1000000.000000,4000000.000000 1000000.000000,4000000.000000 + + + + + + + + 1000000.000000,4000000.000000 1000000.000000,4000000.000000 + + + + + 1000000.000000,4000000.000000 + + + + 1 + + foo + + + + diff --git a/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_string.xml b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_string.xml new file mode 100644 index 0000000000..a5fdf00f11 --- /dev/null +++ b/msautotest/wxs/expected/wfs_ogr_weird_column_names_binary_op_string.xml @@ -0,0 +1,37 @@ +Content-Type: text/xml; charset=UTF-8 + + + + + + 1000000.000000,4000000.000000 1000000.000000,4000000.000000 + + + + + + + + 1000000.000000,4000000.000000 1000000.000000,4000000.000000 + + + + + 1000000.000000,4000000.000000 + + + + 1 + + foo + + + + diff --git a/msautotest/wxs/expected/wms_client_style_remote_exception.png b/msautotest/wxs/expected/wms_client_style_remote_exception.png new file mode 100644 index 0000000000..fb1d11d86f Binary files /dev/null and b/msautotest/wxs/expected/wms_client_style_remote_exception.png differ diff --git a/msautotest/wxs/expected/wms_client_undefined_style_exception.xml b/msautotest/wxs/expected/wms_client_undefined_style_exception.xml new file mode 100644 index 0000000000..4a94e01b15 --- /dev/null +++ b/msautotest/wxs/expected/wms_client_undefined_style_exception.xml @@ -0,0 +1,6 @@ + + + +msWMSLoadGetMapParams(): WMS server error. Style (undefined_style) not defined on layer. + + diff --git a/msautotest/wxs/expected/wms_custom_projection_not_specified.xml b/msautotest/wxs/expected/wms_custom_projection_not_specified.xml index 9ba9744f9e..c542496cb3 100644 --- a/msautotest/wxs/expected/wms_custom_projection_not_specified.xml +++ b/msautotest/wxs/expected/wms_custom_projection_not_specified.xml @@ -2,6 +2,6 @@ msWMSLoadGetMapParams(): WMS server error. Invalid CRS given : CRS must be valid for all requested layers. -msProcessProjection(): Projection library error. proj error "Invalid value for an argument" for "init=esri:54009" +msProcessProjection(): Projection library error. PROJ error "Invalid value for an argument" when instantiating "init=esri:54009" diff --git a/msautotest/wxs/expected/wms_gradient_legend.png b/msautotest/wxs/expected/wms_gradient_legend.png new file mode 100644 index 0000000000..11944bc9d6 Binary files /dev/null and b/msautotest/wxs/expected/wms_gradient_legend.png differ diff --git a/msautotest/wxs/wfs_200_cite_postgis.map b/msautotest/wxs/wfs_200_cite_postgis.map index af180e424e..ce1469a1c6 100644 --- a/msautotest/wxs/wfs_200_cite_postgis.map +++ b/msautotest/wxs/wfs_200_cite_postgis.map @@ -16,6 +16,7 @@ # RUN_PARMS: wfs_200_cite_postgis_propertyisnil_nillable_property.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&resultType=hits&typenames=province&filter=NomFrancais" > [RESULT_DEVERSION] # RUN_PARMS: wfs_200_cite_postgis_not_propertyisnil_nillable_property.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&resultType=hits&typenames=province&filter=NomFrancais" > [RESULT_DEVERSION] # RUN_PARMS: wfs_200_cite_postgis_filter_resourceid_stringvalue.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&typenames=province&Filter=" > [RESULT_DEVERSION] +# RUN_PARMS: wfs_200_cite_postgis_filter_or_resourceid_stringvalue.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&typenames=province&Filter=" > [RESULT_DEVERSION] # RUN_PARMS: wfs_200_cite_postgis_filter_like.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&service=WFS&version=2.0.0&request=GetFeature&typenames=province&Filter=island_e*" > [RESULT_DEVERSION] MAP diff --git a/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map b/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map index 3b1f9b8758..08035e3531 100644 --- a/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map +++ b/msautotest/wxs/wfs_ogr_drv_nocreatedatasource.map @@ -12,7 +12,7 @@ MAP OUTPUTFORMAT NAME "nocreatedatasource" - DRIVER "OGR/SDTS" + DRIVER "OGR/SXF" MIMETYPE "text/nocreatedatasource" END diff --git a/msautotest/wxs/wfs_ogr_native_sql.map b/msautotest/wxs/wfs_ogr_native_sql.map index 2245e23ec7..0c349be172 100644 --- a/msautotest/wxs/wfs_ogr_native_sql.map +++ b/msautotest/wxs/wfs_ogr_native_sql.map @@ -21,6 +21,8 @@ # RUN_PARMS: wfs_ogr_native_sql_05.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT] # RUN_PARMS: wfs_ogr_native_sql_06.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT] +# RUN_PARMS: wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=" OR 1=1 OR 1="fanano" > [RESULT] + # RUN_PARMS: wfs_ogr_native_sql_06_disable_default_extent_for_getfeature.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns_disable_default_extent_for_getfeature&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT] # RUN_PARMS: wfs_ogr_native_sql_07.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT] @@ -98,6 +100,9 @@ # RUN_PARMS: wfs_ogr_native_sql_42.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAME=towns_disable_default_extent_for_getfeature&OUTPUTFORMAT=GML2&COUNT=1" > [RESULT_DEVERSION] # RUN_PARMS: wfs_ogr_native_sql_43.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAME=towns_disable_default_extent_for_getfeature&OUTPUTFORMAT=GML2&COUNT=1&SRSNAME=EPSG:4326" > [RESULT_DEVERSION] +# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_numeric.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=]1" > [RESULT] +# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_string.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=a%26quot;bfoo" > [RESULT] + MAP NAME WFS_OGR_NATIVE_SQL_TEST @@ -358,4 +363,26 @@ LAYER TEMPLATE "wfs_ogr_native_sql.map" END # Layer +LAYER + + NAME weird_column_names + CONNECTIONTYPE OGR + CONNECTION "./data/weird_column_names.db" + PROCESSING "NATIVE_SQL=YES" + METADATA + "ows_title" "weird_column_names" + "wfs_featureid" "ID" + "gml_include_items" "all" + "gml_types" "auto" + "wfs_getfeature_formatlist" "ogrgml" + END + TYPE POINT + STATUS ON + PROJECTION + "init=epsg:32632" + END + + TEMPLATE "wfs_ogr_native_sql.map" +END # Layer + END # Map File diff --git a/msautotest/wxs/wfs_ogr_no_native_sql.map b/msautotest/wxs/wfs_ogr_no_native_sql.map index 8a8686304b..7a3d4f95e2 100644 --- a/msautotest/wxs/wfs_ogr_no_native_sql.map +++ b/msautotest/wxs/wfs_ogr_no_native_sql.map @@ -17,6 +17,9 @@ # # RUN_PARMS: wfs_ogr_native_sql_05.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT] # RUN_PARMS: wfs_ogr_native_sql_06.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT] + +# RUN_PARMS: wfs_ogr_native_sql_is_equal_to_invalid_property_name.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=" OR 1=1 OR 1="fanano" > [RESULT] + # RUN_PARMS: wfs_ogr_native_sql_07.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=namefanano" > [RESULT] # RUN_PARMS: wfs_ogr_native_sql_08.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=nameFanano" > [RESULT] # @@ -62,6 +65,9 @@ # RUN_PARMS: wfs_ogr_native_sql_31.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=20000Geometry653627 4881103 653174 4890443 663148 4887813 663330 4879471 653627 4881103" > [RESULT] # RUN_PARMS: wfs_ogr_native_sql_32.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=towns&OUTPUTFORMAT=GML2&FILTER=1000Geometry653627 4881103 653174 4890443 663148 4887813 663330 4879471 653627 4881103" > [RESULT] +# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_numeric.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=]1" > [RESULT] +# RUN_PARMS: wfs_ogr_weird_column_names_binary_op_string.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=weird_column_names&OUTPUTFORMAT=GML2&FILTER=a%26quot;bfoo" > [RESULT] + MAP NAME WFS_OGR_NATIVE_SQL_TEST @@ -119,4 +125,26 @@ LAYER TEMPLATE "wfs_ogr_native_sql.map" END # Layer +LAYER + + NAME weird_column_names + CONNECTIONTYPE OGR + CONNECTION "./data/weird_column_names.db" + PROCESSING "NATIVE_SQL=NO" + METADATA + "ows_title" "weird_column_names" + "wfs_featureid" "ID" + "gml_include_items" "all" + "gml_types" "auto" + "wfs_getfeature_formatlist" "ogrgml" + END + TYPE POINT + STATUS ON + PROJECTION + "init=epsg:32632" + END + + TEMPLATE "wfs_ogr_native_sql.map" +END # Layer + END # Map File diff --git a/msautotest/wxs/wms_client_111.map b/msautotest/wxs/wms_client_111.map index 07ff8a7992..1e166fe0ff 100644 --- a/msautotest/wxs/wms_client_111.map +++ b/msautotest/wxs/wms_client_111.map @@ -5,11 +5,15 @@ # # # GetMap +# RUN_PARMS: wms_client_111.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] # RUN_PARMS: wms_client_111.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME] # # GetFeatureInfo +# RUN_PARMS: wms_client_111.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] # RUN_PARMS: wms_client_111.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] +# # GetLegendGraphic +# RUN_PARMS: wms_client_111_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png&TRANSPARENT=FALSE&SLD_VERSION=1.1.0" > [RESULT_DEMIME] # RUN_PARMS: wms_client_111_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png" > [RESULT_DEMIME] diff --git a/msautotest/wxs/wms_client_111_axis_fail.map b/msautotest/wxs/wms_client_111_axis_fail.map index cf28943428..2cffb085b0 100644 --- a/msautotest/wxs/wms_client_111_axis_fail.map +++ b/msautotest/wxs/wms_client_111_axis_fail.map @@ -5,9 +5,11 @@ # # # GetMap +# RUN_PARMS: wms_client_111_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] # RUN_PARMS: wms_client_111_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME] # # GetFeatureInfo +# RUN_PARMS: wms_client_111_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] # RUN_PARMS: wms_client_111_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] diff --git a/msautotest/wxs/wms_client_130.map b/msautotest/wxs/wms_client_130.map index 1238c33c12..1a86eb32e0 100644 --- a/msautotest/wxs/wms_client_130.map +++ b/msautotest/wxs/wms_client_130.map @@ -5,13 +5,24 @@ # # # GetMap +# RUN_PARMS: wms_client_130.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] # RUN_PARMS: wms_client_130.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME] +# +# RUN_PARMS: wms_client_crs_32633.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616" > [RESULT_DEMIME] # RUN_PARMS: wms_client_crs_32633.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:32633&BBOX=920482.6044580448652,7662266.090040001087,1317920.914512843126,8079762.906353433616" > [RESULT_DEMIME] # +# Request with STYLES. Note that the remote server does not publish any styles. +# RUN_PARMS: wms_client_undefined_style_exception.xml [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=wms_style&STYLES=undefined_style&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] +# Tests that the request is valid, but resulting image contains error as 'named_style' is not defined in remote server. +# RUN_PARMS: wms_client_style_remote_exception.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=wms_style&STYLES=named_style&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] +# # GetFeatureInfo +# RUN_PARMS: wms_client_130.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] # RUN_PARMS: wms_client_130.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] +# # GetLegendGraphic # RUN_PARMS: wms_client_130_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png&TRANSPARENT=FALSE&SLD_VERSION=1.1.0" > [RESULT_DEMIME] +# RUN_PARMS: wms_client_130_legendgraphic.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetLegendGraphic&LAYER=client&FORMAT=image/png&TRANSPARENT=FALSE&SLD_VERSION=1.1.0" > [RESULT_DEMIME] MAP @@ -59,4 +70,22 @@ MAP "wms_enable_request" "*" END END + + LAYER + NAME wms_style + TYPE RASTER + STATUS ON + CONNECTION "https://demo.mapserver.org/cgi-bin/wms?" + CONNECTIONTYPE WMS + TEMPLATE "dummy" + EXTENT -180 -90 180 90 + METADATA + "wms_srs" "EPSG:4326 EPSG:32633" + "wms_name" "cities" + "wms_server_version" "1.3.0" + "wms_format" "image/png" + "wms_enable_request" "*" + "wms_style" "named_style" + END + END END diff --git a/msautotest/wxs/wms_client_130_axis_fail.map b/msautotest/wxs/wms_client_130_axis_fail.map index 8b20f21d2d..e46295c643 100644 --- a/msautotest/wxs/wms_client_130_axis_fail.map +++ b/msautotest/wxs/wms_client_130_axis_fail.map @@ -5,9 +5,11 @@ # # # GetMap +# RUN_PARMS: wms_client_130_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180" > [RESULT_DEMIME] # RUN_PARMS: wms_client_130_axis_fail.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90" > [RESULT_DEMIME] -# + # GetFeatureInfo +# RUN_PARMS: wms_client_130_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&CRS=EPSG:4326&BBOX=-90,-180,90,180&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] # RUN_PARMS: wms_client_130_axis_fail.html [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=client&STYLES=&WIDTH=300&HEIGHT=200&FORMAT=image/png&SRS=EPSG:4326&BBOX=-180,-90,180,90&QUERY_LAYERS=client&I=100&J=150&INFO_FORMAT=text/html&FEATURE_COUNT=5" > [RESULT] diff --git a/msautotest/wxs/wms_legend.map b/msautotest/wxs/wms_legend.map index 777a7caefa..144b194553 100644 --- a/msautotest/wxs/wms_legend.map +++ b/msautotest/wxs/wms_legend.map @@ -21,6 +21,7 @@ # RUN_PARMS: mode_maplegend_74.png [MAPSERV] QUERY_STRING='map=[MAPFILE]&mode=maplegend&mapext=2291338+-73348+2301636+-64058&layer=layer1' > [RESULT_DEMIME] # RUN_PARMS: wms_legend_notext.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.0&REQUEST=GetLegendGraphic&LAYER=layer3&FORMAT=image/png" > [RESULT_DEMIME] # RUN_PARMS: wms_keyimage_legend.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.1.0&REQUEST=GetLegendGraphic&LAYER=layer4&FORMAT=image/png&TRANSPARENT=FALSE&EXCEPTIONS=INIMAGE" > [RESULT_DEMIME] +# RUN_PARMS: wms_gradient_legend.png [MAPSERV] QUERY_STRING="map=[MAPFILE]&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=gradient&SLD_VERSION=1.1.0&FORMAT=image/png&TRANSPARENT=FALSE&EXCEPTIONS=INIMAGE" > [RESULT_DEMIME] MAP @@ -228,4 +229,27 @@ LAYER END #Class END # Layer +LAYER + NAME "gradient" + DATA multiband.tif + METADATA + "wms_title" "gradient_opacity" + END + TYPE RASTER + STATUS ON + + CLASSITEM "GRADIENT" + CLASS + NAME "-250 m to -50 m" + GROUP "Blue" + EXPRESSION ([pixel] >= -250 AND [pixel] < -50) + STYLE + OPACITY 70 + RANGEITEM "pixel" + COLORRANGE 128 172 239 7 6 111 + DATARANGE -250.000000 -50.000000 + END # STYLE + TITLE "-250 m to -50 m" + END # CLASS +END # Layer END # Map File diff --git a/msautotest/wxs/wms_raster.map b/msautotest/wxs/wms_raster.map index dfa30ecbbe..9fd8383a42 100644 --- a/msautotest/wxs/wms_raster.map +++ b/msautotest/wxs/wms_raster.map @@ -31,7 +31,7 @@ IMAGECOLOR 255 255 255 SHAPEPATH ./data SYMBOLSET etc/symbols.sym FONTSET etc/fonts.txt - +DEBUG 1 # # Start of web interface definition diff --git a/scripts/vagrant/packages.sh b/scripts/vagrant/packages.sh index 75afb4c432..39b6c92271 100755 --- a/scripts/vagrant/packages.sh +++ b/scripts/vagrant/packages.sh @@ -12,7 +12,7 @@ apt-get -y upgrade # install packages we need apt-get install -q -y git build-essential pkg-config cmake libgeos-dev rake \ - libpq-dev python3-dev python3-pip libproj-dev libxml2-dev postgis php-dev \ + libpq-dev python3-dev python3-pip python3-venv libproj-dev libxml2-dev postgis php-dev \ postgresql-server-dev-12 postgresql-12-postgis-3 postgresql-12-postgis-3-scripts vim bison flex swig \ librsvg2-dev libpng-dev libjpeg-dev libgif-dev \ libfreetype6-dev libfcgi-dev libcurl4-gnutls-dev libcairo2-dev \ diff --git a/src/mapagg.cpp b/src/mapagg.cpp index 693dca8f93..bf06194002 100644 --- a/src/mapagg.cpp +++ b/src/mapagg.cpp @@ -692,8 +692,12 @@ int agg2RenderPixmapSymbol(imageObj *img, double x, double y, symbolObj *symbol, } else { // just copy the image at the correct location (we place the pixmap on // the nearest integer pixel to avoid blurring) + unsigned alpha = mapserver::cover_full; + if (style && style->color) { + alpha = style->color->alpha; + } r->m_renderer_base.blend_from(pf, 0, MS_NINT(x - pixmap->width / 2.), - MS_NINT(y - pixmap->height / 2.)); + MS_NINT(y - pixmap->height / 2.), alpha); } return MS_SUCCESS; } diff --git a/src/mapdrawgdal.c b/src/mapdrawgdal.c index e9e5c259b0..6288378285 100644 --- a/src/mapdrawgdal.c +++ b/src/mapdrawgdal.c @@ -1191,7 +1191,7 @@ static int ApplyLUT(int iColorIndex, const char *lut_def, const void *pInBuffer, if (lut_def == NULL) { if (pInBuffer != pabyOutBuffer) { - GDALCopyWords((void *)pInBuffer, eDT, GDALGetDataTypeSize(eDT) / 8, + GDALCopyWords(pInBuffer, eDT, GDALGetDataTypeSizeBytes(eDT), pabyOutBuffer, GDT_Byte, 1, nPixelCount); } return 0; @@ -1332,7 +1332,7 @@ static int LoadGDALImages(GDALDatasetH hDS, int band_numbers[4], int band_count, result_code = ApplyLUT(iColorIndex + 1, papszLUTs[iColorIndex], (GByte *)pBuffer + dst_xsize * dst_ysize * iColorIndex * - (GDALGetDataTypeSize(eDT) / 8), + GDALGetDataTypeSizeBytes(eDT), eDT, pabyWholeBuffer + dst_xsize * dst_ysize * iColorIndex, dst_xsize * dst_ysize); } @@ -1824,7 +1824,7 @@ msDrawRasterLayerGDAL_RawMode(mapObj *map, layerObj *layer, imageObj *image, /* Allocate buffer, and read data into it. */ /* -------------------------------------------------------------------- */ pBuffer = malloc(((size_t)dst_xsize) * dst_ysize * image->format->bands * - (GDALGetDataTypeSize(eDataType) / 8)); + GDALGetDataTypeSizeBytes(eDataType)); if (pBuffer == NULL) { msSetError(MS_MEMERR, "Allocating work image of size %dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize); diff --git a/src/maphttp.c b/src/maphttp.c index ea736d18c4..7c85e7334b 100644 --- a/src/maphttp.c +++ b/src/maphttp.c @@ -127,6 +127,7 @@ void msHTTPInitRequestObj(httpRequestObj *pasReqInfo, int numRequests) { pasReqInfo[i].pszPostRequest = NULL; pasReqInfo[i].pszPostContentType = NULL; pasReqInfo[i].pszOutputFile = NULL; + pasReqInfo[i].pszEPSG = NULL; pasReqInfo[i].nLayerId = 0; pasReqInfo[i].nTimeout = 0; pasReqInfo[i].nMaxBytes = 0; @@ -174,6 +175,10 @@ void msHTTPFreeRequestObj(httpRequestObj *pasReqInfo, int numRequests) { free(pasReqInfo[i].pszOutputFile); pasReqInfo[i].pszOutputFile = NULL; + if (pasReqInfo[i].pszEPSG) + free(pasReqInfo[i].pszEPSG); + pasReqInfo[i].pszEPSG = NULL; + if (pasReqInfo[i].pszContentType) free(pasReqInfo[i].pszContentType); pasReqInfo[i].pszContentType = NULL; diff --git a/src/maphttp.h b/src/maphttp.h index 13292a7d4c..b44b7b5eac 100644 --- a/src/maphttp.h +++ b/src/maphttp.h @@ -47,6 +47,7 @@ typedef struct http_request_info { int nLayerId; char *pszGetUrl; char *pszOutputFile; + char *pszEPSG; int nTimeout; int nMaxBytes; rectObj bbox; diff --git a/src/maplayer.c b/src/maplayer.c index 8501f02641..1f6b04fb6f 100644 --- a/src/maplayer.c +++ b/src/maplayer.c @@ -105,7 +105,15 @@ int msLayerRestoreFromScaletokens(layerObj *layer) { layer->tileitem = layer->orig_st->tileitem; } if (layer->orig_st->filter) { - msLoadExpressionString(&(layer->filter), layer->orig_st->filter); + if (layer->filter.type == MS_EXPRESSION) { + const size_t tmpval_size = strlen(layer->filter.string) + 3; + char *tmpval = (char *)msSmallMalloc(tmpval_size); + snprintf(tmpval, tmpval_size, "(%s)", layer->filter.string); + msLoadExpressionString(&(layer->filter), tmpval); + msFree(tmpval); + } else { + msLoadExpressionString(&(layer->filter), layer->orig_st->filter); + } msFree(layer->orig_st->filter); } if (layer->orig_st->filteritem) { @@ -196,7 +204,6 @@ int msLayerApplyScaletokens(layerObj *layer, double scale) { msReplaceSubstring(layer->filteritem, st->name, ste->value); } if (layer->filter.string && strstr(layer->filter.string, st->name)) { - char *tmpval; if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->filter (%s) for " "scale=%f\n", @@ -204,11 +211,23 @@ int msLayerApplyScaletokens(layerObj *layer, double scale) { } check_st_alloc(layer); layer->orig_st->filter = msStrdup(layer->filter.string); - tmpval = msStrdup(layer->filter.string); + + char *tmpval = NULL; + if (layer->filter.type == MS_EXPRESSION) { + const size_t tmpval_size = strlen(layer->filter.string) + 3; + tmpval = (char *)msSmallMalloc(tmpval_size); + snprintf(tmpval, tmpval_size, "(%s)", layer->filter.string); + } else { + tmpval = msStrdup(layer->filter.string); + } + tmpval = msReplaceSubstring(tmpval, st->name, ste->value); - if (msLoadExpressionString(&(layer->filter), tmpval) == -1) + + if (msLoadExpressionString(&(layer->filter), tmpval) == -1) { + msFree(tmpval); return (MS_FAILURE); /* msLoadExpressionString() cleans up previously allocated expression */ + } msFree(tmpval); } diff --git a/src/maplegend.c b/src/maplegend.c index e1b49085ff..b8227c32d4 100644 --- a/src/maplegend.c +++ b/src/maplegend.c @@ -66,10 +66,15 @@ static int msDrawGradientSymbol(rendererVTableObj *renderer, b[4 * (j * rb->width + i)] = style->color.blue; g[4 * (j * rb->width + i)] = style->color.green; r[4 * (j * rb->width + i)] = style->color.red; - a[4 * (j * rb->width + i)] = style->color.alpha; + if (strncasecmp(image_draw->format->driver, "AGG/", 4) == 0) { + a[4 * (j * rb->width + i)] = 255; // Apply alpha later + } else { + a[4 * (j * rb->width + i)] = style->color.alpha; + } } } INIT_SYMBOL_STYLE(symbolStyle); + symbolStyle.color = &style->color; ret = renderer->renderPixmapSymbol(image_draw, x_center, y_center, &symbol, &symbolStyle); msFreeSymbol(&symbol); diff --git a/src/maplexer.c b/src/maplexer.c index 9fbc84a63a..d3813c561b 100644 --- a/src/maplexer.c +++ b/src/maplexer.c @@ -1,6 +1,6 @@ -#line 2 "src/maplexer.c" +#line 1 "src/maplexer.c" -#line 4 "src/maplexer.c" +#line 3 "src/maplexer.c" #define YY_INT_ALIGNED short int @@ -620,7 +620,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[1737] = +static const flex_int16_t yy_accept[1745] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 346, 343, 1, 341, 334, 2, 343, 343, @@ -672,147 +672,148 @@ static const flex_int16_t yy_accept[1737] = 340, 340, 340, 340, 340, 340, 340, 305, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 234, 318, 340, 236, 319, - 340, 68, 0, 0, 0, 0, 0, 328, 328, 0, - 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, + 340, 68, 0, 0, 0, 0, 0, 0, 0, 328, + 328, 0, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 340, 9, 340, 340, 327, 330, 330, 2, 2, - 0, 327, 340, 340, 340, 340, 340, 239, 340, 340, - 340, 340, 340, 340, 340, 243, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 83, 340, 340, 340, + 0, 0, 329, 2, 340, 9, 340, 340, 327, 330, + 330, 2, 2, 0, 327, 340, 340, 340, 340, 340, + 239, 340, 340, 340, 340, 340, 340, 340, 243, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 83, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 258, 340, 340, 340, 340, 98, 340, 340, 340, 102, - 340, 340, 340, 105, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 121, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 269, 340, 270, 340, 145, + 340, 340, 340, 258, 340, 340, 340, 340, 98, 340, + 340, 340, 102, 340, 340, 340, 105, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 121, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 269, 340, + 270, 340, 145, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 175, 340, - 279, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 175, 340, 279, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 207, - 340, 340, 340, 340, 340, 340, 340, 218, 340, 307, - 340, 340, 340, 340, 309, 228, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 237, 325, 0, 328, 25, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 207, 340, 340, 340, 340, 340, 340, 340, + 218, 340, 307, 340, 340, 340, 340, 309, 228, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 237, 325, + 325, 0, 328, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, - 0, 0, 0, 0, 326, 340, 10, 340, 2, 61, - 340, 63, 340, 340, 240, 340, 340, 241, 340, 340, - 340, 340, 340, 340, 246, 340, 72, 340, 76, 340, - 340, 340, 340, 340, 340, 84, 340, 340, 340, 340, - 256, 86, 340, 89, 340, 340, 257, 340, 340, 340, - 340, 340, 340, 340, 100, 340, 340, 260, 340, 340, - 108, 261, 340, 340, 110, 340, 340, 118, 340, 340, - - 186, 340, 340, 340, 340, 340, 125, 267, 340, 135, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 0, 0, 56, 0, 0, 0, 0, 0, 326, 0, + 340, 10, 340, 2, 61, 340, 63, 340, 340, 240, + 340, 340, 241, 340, 340, 340, 340, 340, 340, 246, + 340, 72, 340, 76, 340, 340, 340, 340, 340, 340, + 84, 340, 340, 340, 340, 256, 86, 340, 89, 340, + 340, 257, 340, 340, 340, 340, 340, 340, 340, 100, + 340, 340, 260, 340, 340, 108, 261, 340, 340, 110, + + 340, 340, 118, 340, 340, 186, 340, 340, 340, 340, + 340, 125, 267, 340, 135, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 276, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 277, 340, 252, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 276, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 277, + 340, 252, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 291, 340, 340, + 340, 340, 340, 340, 340, 340, 295, 340, 340, 340, + 340, 340, 340, 340, 340, 298, 299, 200, 340, 340, + 340, 340, 340, 340, 303, 340, 340, 210, 340, 216, + + 340, 340, 340, 340, 222, 340, 340, 340, 340, 314, + 229, 340, 340, 340, 340, 340, 340, 235, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 0, 0, 43, 0, 0, 0, 31, 42, + 0, 29, 0, 0, 0, 0, 30, 0, 0, 0, + 0, 0, 0, 340, 340, 340, 340, 340, 340, 340, + 340, 242, 340, 70, 245, 340, 247, 340, 340, 340, + 340, 340, 79, 340, 80, 340, 340, 340, 340, 340, + 85, 340, 340, 340, 340, 91, 340, 94, 95, 340, + 259, 340, 97, 340, 340, 340, 340, 109, 264, 340, + + 340, 340, 340, 340, 265, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 134, 136, + 137, 340, 340, 143, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 273, 340, 274, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 291, 340, 340, 340, 340, 340, 340, 340, - 340, 295, 340, 340, 340, 340, 340, 340, 340, 340, - 298, 299, 200, 340, 340, 340, 340, 340, 340, 303, - 340, 340, 210, 340, 216, 340, 340, 340, 340, 222, - - 340, 340, 340, 340, 314, 229, 340, 340, 340, 340, - 340, 340, 235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 57, 0, 0, 0, 0, 43, - 0, 0, 0, 31, 42, 0, 29, 0, 0, 0, - 0, 30, 0, 0, 0, 0, 340, 340, 340, 340, - 340, 340, 340, 340, 242, 340, 70, 245, 340, 247, - 340, 340, 340, 340, 340, 79, 340, 80, 340, 340, - 340, 340, 340, 85, 340, 340, 340, 340, 91, 340, - 94, 95, 340, 259, 340, 97, 340, 340, 340, 340, - 109, 264, 340, 340, 340, 340, 340, 265, 340, 340, - + 340, 340, 340, 340, 280, 176, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 290, 289, 294, 185, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 134, 136, 137, 340, 340, 143, 340, 340, 340, + 340, 296, 340, 195, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 301, 302, 340, 304, 209, 340, + + 212, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 233, 317, 53, 34, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, + 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, + 50, 0, 0, 0, 326, 8, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 75, 340, 340, + 340, 340, 316, 340, 253, 340, 255, 340, 340, 340, + 93, 340, 340, 99, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 117, 340, 340, 340, 340, 123, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 139, 340, + + 340, 146, 340, 340, 340, 340, 340, 340, 340, 340, + 155, 340, 340, 340, 340, 340, 161, 340, 340, 340, + 340, 340, 340, 171, 340, 340, 340, 340, 340, 177, + 340, 178, 340, 340, 340, 340, 184, 340, 340, 292, + 340, 293, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 273, 340, 274, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 280, 176, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 290, 289, - 294, 185, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 296, 340, 195, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 301, 302, 340, - 304, 209, 340, 212, 340, 340, 340, 340, 340, 340, - - 340, 340, 340, 340, 340, 340, 340, 340, 233, 317, - 53, 34, 0, 0, 0, 0, 0, 0, 0, 0, - 52, 0, 0, 0, 0, 0, 0, 26, 0, 0, - 0, 0, 0, 50, 0, 0, 0, 8, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 75, - 340, 340, 340, 340, 316, 340, 253, 340, 255, 340, - 340, 340, 93, 340, 340, 99, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 117, 340, 340, 340, 340, - 123, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 139, 340, 340, 146, 340, 340, 340, 340, 340, 340, - - 340, 340, 155, 340, 340, 340, 340, 340, 161, 340, - 340, 340, 340, 340, 340, 171, 340, 340, 340, 340, - 340, 177, 340, 178, 340, 340, 340, 340, 184, 340, - 340, 292, 340, 293, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 221, 340, 340, 340, 340, 340, 230, 231, 340, 340, + 0, 28, 0, 49, 41, 0, 0, 54, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 0, 47, 0, + + 0, 321, 11, 340, 340, 340, 340, 340, 67, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 340, 87, + 340, 340, 340, 340, 340, 340, 340, 106, 340, 340, + 340, 340, 116, 340, 340, 340, 122, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 140, 340, 340, 340, + 340, 340, 340, 340, 340, 151, 340, 340, 158, 159, + 160, 340, 340, 340, 340, 340, 168, 340, 340, 174, + 278, 340, 340, 340, 340, 340, 340, 340, 183, 340, + 340, 187, 340, 340, 189, 340, 340, 340, 193, 340, + 340, 340, 340, 340, 197, 340, 202, 340, 340, 300, + + 340, 340, 340, 340, 340, 340, 340, 217, 115, 340, + 220, 340, 340, 340, 308, 310, 315, 340, 0, 51, + 0, 46, 33, 55, 0, 0, 0, 48, 36, 0, + 27, 0, 0, 340, 340, 64, 340, 66, 340, 71, + 340, 73, 340, 340, 78, 340, 59, 340, 340, 92, + 340, 340, 340, 340, 107, 340, 113, 114, 112, 340, + 120, 340, 340, 340, 340, 340, 128, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 154, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 221, 340, 340, 340, 340, 340, 230, 231, - 340, 340, 0, 28, 0, 49, 41, 0, 0, 54, - 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, - 47, 0, 0, 321, 11, 340, 340, 340, 340, 340, - - 67, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 87, 340, 340, 340, 340, 340, 340, 340, 106, - 340, 340, 340, 340, 116, 340, 340, 340, 122, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 140, 340, - 340, 340, 340, 340, 340, 340, 340, 151, 340, 340, - 158, 159, 160, 340, 340, 340, 340, 340, 168, 340, - 340, 174, 278, 340, 340, 340, 340, 340, 340, 340, - 183, 340, 340, 187, 340, 340, 189, 340, 340, 340, - 193, 340, 340, 340, 340, 340, 197, 340, 202, 340, - 340, 300, 340, 340, 340, 340, 340, 340, 340, 217, - - 115, 340, 220, 340, 340, 340, 308, 310, 315, 340, - 0, 51, 0, 46, 33, 55, 0, 0, 0, 48, - 36, 0, 27, 0, 0, 340, 340, 64, 340, 66, - 340, 71, 340, 73, 340, 340, 78, 340, 59, 340, - 340, 92, 340, 340, 340, 340, 107, 340, 113, 114, - 112, 340, 120, 340, 340, 340, 340, 340, 128, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 154, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 340, 340, 60, 340, 194, - - 340, 340, 340, 340, 340, 340, 340, 206, 208, 211, - 340, 215, 219, 224, 227, 340, 340, 0, 0, 0, - 0, 0, 0, 39, 0, 0, 340, 238, 340, 340, - 74, 58, 77, 81, 340, 90, 96, 283, 340, 340, - 111, 119, 340, 124, 266, 126, 340, 340, 340, 340, - 340, 340, 144, 147, 340, 340, 340, 340, 340, 340, - 340, 340, 162, 340, 340, 340, 340, 340, 340, 340, - 340, 340, 285, 340, 340, 340, 340, 340, 340, 251, - 340, 190, 191, 340, 340, 196, 340, 198, 201, 203, - 340, 205, 340, 340, 340, 232, 40, 35, 38, 45, - - 44, 37, 0, 0, 62, 340, 340, 340, 340, 340, - 340, 340, 340, 127, 340, 340, 340, 340, 340, 148, - 149, 153, 150, 340, 340, 340, 157, 163, 340, 170, - 167, 340, 340, 173, 340, 286, 340, 340, 340, 340, - 288, 306, 340, 192, 297, 340, 204, 213, 340, 226, - 0, 0, 340, 69, 340, 340, 340, 101, 340, 340, - 340, 340, 340, 138, 340, 340, 340, 156, 340, 340, - 172, 340, 340, 180, 181, 182, 340, 340, 340, 340, - 0, 0, 340, 340, 340, 199, 104, 262, 129, 131, - 133, 340, 340, 152, 340, 169, 275, 287, 340, 340, - - 340, 340, 0, 0, 340, 340, 82, 340, 340, 340, - 340, 166, 188, 164, 340, 225, 0, 322, 65, 340, - 340, 340, 141, 165, 340, 323, 340, 340, 340, 214, - 179, 340, 340, 130, 132, 0 + + 340, 340, 340, 340, 340, 60, 340, 194, 340, 340, + 340, 340, 340, 340, 340, 206, 208, 211, 340, 215, + 219, 224, 227, 340, 340, 0, 0, 0, 0, 0, + 0, 39, 0, 0, 340, 238, 340, 340, 74, 58, + 77, 81, 340, 90, 96, 283, 340, 340, 111, 119, + 340, 124, 266, 126, 340, 340, 340, 340, 340, 340, + 144, 147, 340, 340, 340, 340, 340, 340, 340, 340, + 162, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 285, 340, 340, 340, 340, 340, 340, 251, 340, 190, + 191, 340, 340, 196, 340, 198, 201, 203, 340, 205, + + 340, 340, 340, 232, 40, 35, 38, 45, 44, 37, + 0, 0, 62, 340, 340, 340, 340, 340, 340, 340, + 340, 127, 340, 340, 340, 340, 340, 148, 149, 153, + 150, 340, 340, 340, 157, 163, 340, 170, 167, 340, + 340, 173, 340, 286, 340, 340, 340, 340, 288, 306, + 340, 192, 297, 340, 204, 213, 340, 226, 0, 0, + 340, 69, 340, 340, 340, 101, 340, 340, 340, 340, + 340, 138, 340, 340, 340, 156, 340, 340, 172, 340, + 340, 180, 181, 182, 340, 340, 340, 340, 0, 0, + 340, 340, 340, 199, 104, 262, 129, 131, 133, 340, + + 340, 152, 340, 169, 275, 287, 340, 340, 340, 340, + 0, 0, 340, 340, 82, 340, 340, 340, 340, 166, + 188, 164, 340, 225, 0, 322, 65, 340, 340, 340, + 141, 165, 340, 323, 340, 340, 340, 214, 179, 340, + 340, 130, 132, 0 } ; static const YY_CHAR yy_ec[256] = @@ -849,32 +850,32 @@ static const YY_CHAR yy_ec[256] = static const YY_CHAR yy_meta[87] = { 0, - 1, 1, 2, 1, 1, 3, 1, 1, 4, 1, - 1, 5, 1, 6, 6, 6, 6, 6, 1, 6, - 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 1, 7, 1, - 6, 1, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, + 1, 1, 2, 1, 1, 3, 1, 1, 3, 1, + 1, 4, 1, 5, 5, 5, 5, 5, 1, 5, + 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 1, 3, 1, + 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1 } ; -static const flex_int16_t yy_base[1761] = +static const flex_int16_t yy_base[1770] = { 0, 0, 0, 86, 0, 171, 172, 173, 177, 181, 182, - 226, 0, 1082, 3985, 185, 3985, 3985, 0, 1013, 173, + 226, 0, 1383, 3953, 185, 3953, 3953, 0, 1350, 173, 296, 353, 310, 304, 353, 416, 359, 354, 421, 436, 356, 467, 156, 290, 474, 473, 354, 483, 532, 275, - 533, 579, 585, 540, 374, 631, 0, 961, 907, 810, - 3985, 193, 3985, 194, 820, 732, 751, 700, 184, 314, - 611, 183, 188, 725, 424, 479, 521, 615, 280, 644, + 533, 579, 585, 540, 374, 631, 0, 1247, 1195, 1189, + 3953, 193, 3953, 194, 1191, 1149, 1186, 1139, 184, 314, + 611, 183, 188, 1068, 424, 479, 521, 615, 280, 644, 575, 284, 299, 628, 624, 636, 306, 637, 355, 343, - 367, 678, 157, 653, 687, 3985, 3985, 208, 687, 678, - 0, 411, 418, 475, 0, 3985, 666, 661, 473, 477, + 367, 678, 157, 1002, 1012, 3953, 3953, 208, 1005, 979, + 0, 411, 418, 475, 0, 3953, 877, 824, 473, 477, - 492, 484, 209, 0, 638, 616, 690, 704, 0, 706, - 201, 603, 3985, 763, 849, 720, 203, 531, 759, 525, + 492, 484, 209, 0, 769, 748, 690, 704, 0, 706, + 201, 732, 3953, 763, 849, 720, 203, 531, 759, 525, 649, 524, 645, 551, 686, 0, 685, 703, 687, 756, 755, 0, 686, 690, 0, 727, 725, 758, 769, 771, 754, 760, 766, 781, 769, 782, 836, 769, 771, 774, @@ -886,16 +887,16 @@ static const flex_int16_t yy_base[1761] = 989, 1003, 1014, 1025, 1011, 1039, 1025, 0, 0, 1033, 0, 1037, 1026, 1034, 1044, 1047, 1031, 1047, 1035, 1037, - 1056, 534, 3985, 499, 493, 486, 3985, 487, 3985, 466, - 1087, 1099, 1093, 316, 1103, 451, 3985, 3985, 3985, 3985, + 1056, 695, 3953, 652, 618, 603, 3953, 522, 3953, 573, + 1087, 1099, 1093, 316, 1103, 451, 3953, 3953, 3953, 3953, 1059, 1061, 1060, 1095, 1088, 1092, 1088, 1093, 1103, 1101, - 1090, 1100, 1095, 1099, 1101, 3985, 1110, 1095, 1104, 1097, - 3985, 1101, 3985, 1105, 1121, 1106, 1115, 1116, 1144, 1126, - 1138, 1140, 420, 1163, 1168, 1159, 3985, 415, 274, 3985, - 3985, 455, 3985, 444, 0, 3985, 3985, 3985, 0, 3985, + 1090, 1100, 1095, 1099, 1101, 3953, 1110, 1095, 1104, 1097, + 3953, 1101, 3953, 1105, 1121, 1106, 1115, 1116, 1144, 1126, + 1138, 1140, 632, 1163, 1168, 1159, 585, 575, 274, 3953, + 3953, 613, 3953, 575, 0, 3953, 3953, 3953, 0, 3953, 1221, 1154, 1210, 1156, 1163, 1184, 722, 189, 207, 326, - 434, 1177, 1307, 1178, 627, 1393, 1479, 1226, 1178, 559, + 564, 1177, 1307, 1178, 627, 1393, 1479, 1226, 1178, 559, 724, 1186, 1208, 1213, 1211, 1218, 1213, 1218, 1226, 1228, 1230, 1222, 1213, 1231, 1218, 1219, 1222, 1238, 1223, 1224, 1229, 1230, 1294, 0, 1277, 1280, 1305, 1288, 1302, 1307, @@ -906,355 +907,357 @@ static const flex_int16_t yy_base[1761] = 1410, 1395, 1411, 1444, 0, 1450, 1461, 1544, 1464, 1473, 1476, 1477, 1598, 1478, 1464, 1468, 1481, 1467, 1484, 1477, - 1472, 0, 430, 1490, 1491, 1483, 1476, 1477, 1495, 1518, + 1472, 0, 560, 1490, 1491, 1483, 1476, 1477, 1495, 1518, 1494, 1488, 1533, 1540, 1520, 1575, 1534, 1548, 1537, 1556, 1561, 1571, 1570, 1572, 1581, 1589, 1594, 1598, 1606, 1609, 1596, 1607, 1610, 1607, 1619, 1602, 1611, 0, 1624, 1617, 1616, 1614, 1632, 1615, 1635, 1650, 1644, 1658, 1656, 1657, 1649, 1663, 1665, 1661, 1653, 0, 0, 1654, 0, 0, - 1659, 3985, 358, 522, 354, 573, 735, 799, 1680, 1687, - 849, 871, 1680, 1672, 1682, 1671, 1681, 1676, 1680, 1683, - 1701, 1698, 1689, 1709, 1692, 1695, 1702, 1712, 1700, 1716, - 1718, 1723, 1719, 1723, 3985, 1724, 1713, 1718, 1718, 1720, - - 1716, 1734, 1738, 1739, 1739, 1729, 1740, 1752, 583, 1033, - 1752, 1758, 0, 1751, 1764, 1010, 3985, 0, 1763, 1764, - 1180, 1186, 1762, 1762, 1774, 1762, 1782, 327, 1778, 1767, - 1776, 1767, 1789, 1772, 1788, 0, 1789, 1795, 1785, 1779, - 1779, 1782, 1803, 1796, 1801, 1796, 1794, 1816, 1805, 1827, - 1828, 1818, 1831, 1813, 1835, 1823, 1839, 1831, 1842, 1827, - 0, 1845, 1846, 1845, 1838, 1836, 1851, 1853, 1858, 0, - 1840, 1841, 1853, 1848, 1852, 1863, 1868, 1854, 1872, 1875, - 1864, 1864, 1885, 1877, 1877, 0, 1892, 1887, 1894, 1888, - 1894, 1902, 1894, 1894, 1908, 0, 1900, 1912, 1912, 0, - - 1900, 1905, 1912, 1918, 1919, 1915, 1925, 1911, 1947, 1930, - 1927, 1918, 1938, 1929, 1938, 1938, 1941, 1947, 1954, 1960, - 1964, 1957, 1971, 1967, 1966, 1958, 1968, 1967, 0, 1973, - 0, 1982, 1986, 1964, 1976, 1974, 1988, 1977, 1992, 1999, - 2004, 2000, 2017, 2010, 2000, 2003, 2017, 2005, 2024, 2009, - 2025, 2028, 2009, 2032, 2033, 2021, 2026, 2022, 2043, 2036, - 2034, 2027, 2044, 2048, 2051, 2042, 2054, 2048, 2051, 2045, - 2059, 2056, 2059, 2076, 2067, 2078, 2077, 0, 2077, 0, - 2082, 2074, 2076, 2084, 2079, 0, 2086, 2082, 2102, 2084, - 2087, 2103, 2103, 2094, 2102, 0, 3985, 1257, 1307, 3985, - - 2101, 2111, 2114, 2112, 2121, 2106, 2119, 2128, 2121, 2134, - 2131, 2139, 2125, 2128, 2131, 2148, 2136, 2137, 2138, 2138, - 2142, 2143, 2150, 2159, 2153, 2146, 2150, 2161, 3985, 2152, - 2162, 2176, 1360, 2174, 3985, 2169, 0, 2172, 0, 0, - 2165, 0, 2183, 2175, 0, 2177, 2189, 0, 2203, 2190, - 2202, 2192, 2193, 2210, 0, 2211, 2210, 2215, 2204, 2214, - 2208, 2218, 2225, 2209, 2230, 0, 2220, 2214, 2216, 2217, - 0, 0, 2230, 0, 2221, 2226, 0, 2225, 2245, 2234, - 2252, 2237, 2261, 2250, 0, 2249, 2254, 0, 2270, 2255, - 0, 0, 2260, 2274, 2292, 2265, 2281, 0, 2285, 2265, - - 0, 2277, 2289, 2266, 2292, 2289, 2324, 0, 2284, 0, - 2283, 2303, 2313, 2304, 2304, 2325, 2307, 2315, 2334, 2325, - 2321, 2332, 2342, 2347, 2323, 2349, 2339, 2350, 2342, 2355, - 2338, 0, 2335, 2360, 2343, 2350, 2369, 2359, 2355, 2375, - 2355, 2382, 2376, 2386, 0, 2376, 0, 2390, 2383, 2376, - 2377, 2384, 2382, 2398, 2390, 2388, 2408, 2392, 2397, 2394, - 2398, 2402, 2398, 2403, 2404, 2413, 2420, 2424, 2422, 2413, - 2433, 2445, 2428, 2425, 2441, 2438, 2445, 2435, 2439, 2438, - 0, 0, 2471, 2441, 2441, 2449, 2461, 2465, 2457, 0, - 2467, 2457, 2469, 2467, 0, 2479, 2480, 2473, 2466, 0, - - 2493, 2492, 2492, 2475, 0, 0, 2485, 2508, 2494, 2515, - 2498, 2501, 0, 2516, 2503, 2505, 2520, 2518, 2523, 2526, - 2515, 2525, 2526, 2518, 3985, 2535, 2535, 2540, 2541, 3985, - 2524, 2543, 2541, 3985, 3985, 2552, 3985, 2546, 2548, 2551, - 2556, 3985, 2548, 1446, 2567, 2570, 2560, 2562, 2562, 2559, - 2572, 2567, 2563, 2573, 0, 2582, 0, 0, 2569, 0, - 2572, 2574, 2577, 2596, 2588, 0, 2593, 0, 2583, 2586, - 2591, 2588, 2596, 0, 2610, 2603, 2599, 2613, 0, 2618, - 0, 2615, 2612, 0, 2609, 0, 2615, 2631, 2616, 2633, - 0, 0, 2625, 2626, 2642, 2619, 2627, 0, 2642, 2638, - - 2650, 2648, 2649, 2652, 2656, 2642, 2663, 2650, 2646, 2676, - 2662, 0, 0, 2664, 2657, 2670, 2661, 2665, 2667, 2669, - 2671, 2669, 2689, 2692, 2682, 2690, 2698, 2701, 2690, 2687, - 0, 2689, 0, 2696, 2694, 2695, 2698, 2699, 2698, 2719, - 2714, 2722, 2724, 2713, 2712, 2723, 2738, 0, 0, 2736, - 327, 2717, 2727, 2742, 2742, 2739, 2739, 2734, 0, 0, - 0, 0, 2750, 2747, 2747, 2745, 2760, 2765, 2748, 2750, - 2751, 2759, 2774, 2756, 2768, 2767, 0, 2761, 2782, 2783, - 2769, 2789, 2786, 2779, 2792, 2805, 2800, 0, 0, 2794, - 0, 0, 2784, 2790, 2790, 2793, 2811, 2811, 2799, 2809, - - 2811, 2826, 2817, 2814, 2830, 2820, 2831, 2817, 0, 0, - 3985, 3985, 2826, 2817, 2829, 2826, 2823, 2845, 2837, 2838, - 3985, 2852, 2832, 2847, 2847, 2860, 2848, 3985, 2854, 2865, - 2853, 2861, 2858, 3985, 2875, 2881, 288, 0, 2861, 2870, - 2879, 2888, 2870, 2887, 2874, 2880, 2893, 2884, 2895, 0, - 2891, 2887, 2892, 2904, 0, 2907, 0, 2903, 0, 2911, - 2912, 2910, 0, 2907, 2926, 0, 2916, 2919, 2922, 2919, - 2925, 2935, 2920, 2925, 2930, 0, 2940, 2936, 2945, 2946, - 0, 2944, 2949, 2952, 2939, 2955, 2937, 2948, 2950, 2954, - 0, 2960, 2966, 0, 2967, 2976, 2959, 2974, 2969, 2969, - - 2978, 2989, 0, 2986, 2984, 2989, 2998, 2996, 0, 2993, - 3002, 2983, 3000, 2992, 3007, 0, 3004, 3003, 3008, 3012, - 3007, 0, 3009, 0, 3007, 3026, 3016, 3017, 0, 3036, - 3032, 0, 3025, 0, 3023, 3040, 3026, 3043, 3047, 3039, - 3042, 3054, 3060, 3060, 3059, 3056, 3047, 3062, 3054, 3060, - 3064, 3073, 3063, 3070, 3061, 3064, 3080, 3088, 3081, 3090, - 3094, 3087, 0, 3098, 3086, 3089, 3106, 3108, 0, 0, - 3096, 3109, 3110, 3985, 3101, 3985, 3985, 3107, 3103, 3985, - 3109, 3106, 3118, 3985, 3125, 3124, 3115, 3111, 3128, 3132, - 3985, 3142, 3131, 3985, 0, 3132, 3131, 3129, 3139, 3142, - - 0, 3143, 3144, 3142, 3153, 3162, 3168, 3170, 3161, 3175, - 3160, 0, 3167, 3169, 3180, 3166, 3168, 3170, 3185, 0, - 3176, 3190, 3188, 3193, 0, 3198, 3182, 3188, 0, 3189, - 3187, 3200, 3196, 3197, 3196, 3198, 3202, 3206, 3212, 3202, - 3205, 3221, 3219, 3234, 3220, 3235, 3243, 3241, 3225, 3248, - 0, 0, 0, 3224, 3237, 3234, 3249, 3235, 3254, 3238, - 3260, 0, 0, 3250, 3263, 3251, 3266, 3255, 3262, 3254, - 0, 3270, 3260, 0, 3268, 3274, 0, 3273, 3275, 3280, - 0, 3284, 3297, 3295, 3284, 3286, 0, 3291, 0, 3292, - 3304, 0, 3299, 3286, 3305, 3295, 3302, 3318, 3300, 0, - - 0, 3298, 0, 3318, 3312, 3321, 0, 0, 0, 3312, - 3315, 3985, 3329, 3985, 3985, 3985, 3307, 3314, 3323, 3985, - 3325, 3346, 3985, 3337, 3340, 3334, 3341, 0, 3355, 0, - 3348, 0, 3346, 0, 3362, 3350, 0, 3357, 0, 3353, - 3360, 0, 3362, 3370, 3368, 3375, 0, 3364, 0, 0, - 0, 3368, 0, 3366, 3380, 3369, 3384, 3390, 0, 3391, - 3392, 3387, 3384, 3399, 3396, 3398, 3406, 3405, 3391, 3413, - 0, 3401, 3416, 3414, 3404, 3424, 3427, 3428, 3415, 3435, - 3432, 3429, 3419, 3434, 3430, 3441, 3427, 3437, 3446, 3438, - 3448, 3451, 3445, 3455, 3452, 3448, 3462, 0, 3460, 0, - - 3456, 3452, 3459, 3463, 3465, 3468, 3480, 0, 0, 0, - 3474, 0, 0, 3470, 0, 3478, 3481, 3492, 3493, 3494, - 3481, 3481, 3485, 3985, 3496, 3490, 3486, 0, 3508, 3511, - 0, 0, 0, 3498, 3506, 0, 0, 0, 3505, 3506, - 0, 0, 3515, 0, 0, 0, 3507, 3532, 3533, 3517, - 3537, 3517, 0, 0, 3540, 3528, 3540, 3538, 3552, 3540, - 3552, 3552, 0, 3554, 3541, 3553, 3550, 3549, 3563, 3563, - 3558, 3546, 0, 3564, 3559, 3555, 3576, 3561, 3562, 0, - 3582, 0, 0, 3566, 3577, 0, 3594, 0, 0, 0, - 3578, 0, 3592, 3586, 3583, 0, 3985, 3985, 3985, 3985, - - 3985, 3985, 3590, 3601, 0, 3592, 3592, 3599, 3591, 3603, - 3607, 3604, 3603, 0, 3612, 3613, 3624, 3612, 3614, 0, - 0, 0, 0, 3621, 3621, 3632, 0, 0, 3630, 0, - 0, 3627, 3639, 0, 3640, 0, 3647, 3632, 3643, 3637, - 0, 0, 3655, 0, 0, 3645, 0, 3657, 3653, 0, - 3656, 3643, 3659, 0, 3654, 3661, 3664, 0, 3667, 3658, - 3679, 3681, 3668, 0, 3682, 3687, 3682, 0, 3671, 3685, - 0, 3680, 3689, 0, 0, 0, 3695, 3701, 3701, 3687, - 3684, 3707, 3701, 3710, 3715, 0, 0, 0, 3717, 3719, - 0, 3698, 3715, 0, 3726, 0, 0, 0, 3728, 3734, - - 3726, 3723, 3739, 285, 3727, 3731, 0, 3743, 3744, 3748, - 3751, 0, 0, 0, 3742, 0, 273, 3985, 0, 3745, - 3746, 3747, 0, 0, 3750, 3985, 3746, 3751, 3752, 0, - 0, 3756, 3759, 0, 0, 3985, 3824, 3831, 3838, 3845, - 3852, 309, 3859, 3866, 3873, 3880, 3887, 3894, 3901, 3908, - 3914, 3921, 3928, 3935, 3942, 3949, 3956, 3963, 3970, 3977 + 1659, 3953, 627, 564, 643, 1688, 528, 1689, 735, 799, + 1683, 1715, 849, 871, 1682, 1669, 1679, 1671, 1681, 1676, + 1680, 1683, 1703, 1700, 1700, 1720, 1704, 1705, 1713, 1723, + 1709, 1726, 1727, 1733, 1728, 1731, 3953, 1732, 1720, 1725, + + 1726, 1728, 1724, 1742, 1741, 1742, 1740, 1729, 1755, 1760, + 1033, 1148, 464, 1741, 1750, 0, 1745, 1765, 1010, 3953, + 0, 1773, 1774, 1186, 1257, 1771, 1771, 1783, 1770, 1790, + 452, 1786, 1775, 1784, 1775, 1797, 1780, 1795, 0, 1796, + 1803, 1793, 1787, 1787, 1790, 1803, 1801, 1806, 1797, 1797, + 1813, 1805, 1828, 1829, 1828, 1841, 1822, 1844, 1832, 1847, + 1839, 1850, 1835, 0, 1853, 1854, 1853, 1846, 1843, 1858, + 1861, 1866, 0, 1848, 1849, 1861, 1852, 1856, 1865, 1869, + 1857, 1875, 1877, 1864, 1864, 1886, 1878, 1887, 0, 1902, + 1896, 1901, 1899, 1902, 1910, 1903, 1902, 1916, 0, 1908, + + 1920, 1919, 0, 1907, 1913, 1920, 1926, 1927, 1919, 1929, + 1913, 1964, 1934, 1935, 1926, 1946, 1939, 1939, 1948, 1951, + 1956, 1963, 1969, 1971, 1963, 1988, 1974, 1971, 1964, 1974, + 1972, 0, 1977, 0, 1986, 1985, 1972, 1984, 1983, 1987, + 1980, 1997, 2007, 2014, 2008, 2028, 2021, 2011, 2015, 2027, + 2015, 2029, 2020, 2034, 2037, 2019, 2040, 2041, 2029, 2033, + 2029, 2051, 2044, 2042, 2035, 2052, 2052, 2055, 2044, 2058, + 2056, 2059, 2053, 2069, 2064, 2070, 2087, 2078, 2090, 2084, + 0, 2088, 0, 2093, 2083, 2084, 2090, 2086, 0, 2094, + 2090, 2109, 2091, 2095, 2111, 2111, 2102, 2110, 0, 461, + + 452, 1307, 1393, 3953, 2105, 2115, 2116, 2116, 2129, 2114, + 2127, 2138, 2129, 2145, 2142, 2150, 2137, 2138, 2141, 2157, + 2144, 2145, 2146, 2146, 2150, 2151, 2158, 2167, 2160, 2153, + 2158, 2169, 3953, 2160, 2170, 2182, 1446, 2166, 401, 1540, + 2172, 0, 2178, 0, 0, 2174, 0, 2197, 2193, 0, + 2188, 2206, 0, 2215, 2201, 2214, 2202, 2203, 2219, 0, + 2219, 2218, 2221, 2210, 2221, 2215, 2225, 2230, 2214, 2237, + 0, 2227, 2221, 2223, 2223, 0, 0, 2234, 0, 2225, + 2248, 0, 2227, 2245, 2236, 2255, 2254, 2273, 2261, 0, + 2261, 2264, 0, 2280, 2264, 0, 0, 2268, 2282, 2303, + + 2270, 2286, 0, 2293, 2273, 0, 2284, 2296, 2274, 2300, + 2297, 2333, 0, 2289, 0, 2286, 2303, 2321, 2314, 2312, + 2337, 2317, 2324, 2343, 2330, 2328, 2335, 2347, 2355, 2331, + 2356, 2346, 2358, 2350, 2363, 2346, 0, 2341, 2365, 2345, + 2359, 2380, 2369, 2365, 2385, 2365, 2390, 2385, 2397, 0, + 2386, 0, 2400, 2392, 2385, 2386, 2392, 2388, 2405, 2397, + 2393, 2413, 2400, 2405, 2401, 2405, 2410, 2406, 2411, 2412, + 2419, 2422, 2429, 2434, 2427, 2444, 2447, 2439, 2436, 2458, + 2450, 2456, 2446, 2449, 2447, 0, 0, 2468, 2449, 2450, + 2459, 2471, 2475, 2467, 0, 2477, 2464, 2477, 2475, 0, + + 2488, 2489, 2488, 2474, 0, 2492, 2499, 2502, 2485, 0, + 0, 2496, 2517, 2505, 2525, 2508, 2510, 0, 2525, 2512, + 2513, 2526, 2525, 2530, 2531, 2520, 2533, 2534, 2525, 3953, + 2542, 2543, 2548, 2549, 3953, 2532, 2549, 2546, 3953, 3953, + 2554, 3953, 2555, 2559, 2561, 2566, 3953, 2558, 1544, 2575, + 2579, 2558, 398, 2581, 2576, 2575, 2572, 2584, 2579, 2576, + 2585, 0, 2593, 0, 0, 2580, 0, 2587, 2586, 2589, + 2609, 2599, 0, 2603, 0, 2593, 2596, 2602, 2597, 2603, + 0, 2615, 2612, 2610, 2623, 0, 2628, 0, 2625, 2620, + 0, 2619, 0, 2625, 2645, 2629, 2647, 0, 0, 2638, + + 2639, 2654, 2631, 2640, 0, 2654, 2649, 2661, 2663, 2661, + 2664, 2669, 2653, 2673, 2660, 2656, 2679, 2673, 0, 0, + 2673, 2666, 2682, 2675, 2676, 2677, 2677, 2681, 2679, 2703, + 2705, 2696, 2703, 2711, 2713, 2702, 2700, 0, 2701, 0, + 2707, 2705, 2710, 2710, 2711, 2711, 2730, 2724, 2732, 2734, + 2724, 2721, 2730, 2743, 0, 0, 2745, 430, 2728, 2737, + 2752, 2752, 2747, 2749, 2744, 0, 0, 0, 0, 2764, + 2760, 2761, 2758, 2773, 2777, 2760, 2763, 2763, 2770, 2785, + 2771, 2780, 2779, 0, 2774, 2793, 2793, 2779, 2799, 2797, + 2788, 2799, 2817, 2805, 0, 0, 2803, 0, 0, 2795, + + 2799, 2799, 2801, 2821, 2821, 2813, 2824, 2824, 2839, 2829, + 2826, 2843, 2832, 2842, 2828, 0, 0, 3953, 3953, 2841, + 2829, 2841, 2839, 2834, 2855, 2847, 2848, 3953, 2863, 2841, + 2854, 2852, 2869, 2859, 3953, 2864, 2875, 2863, 2869, 2868, + 3953, 2891, 2893, 358, 352, 0, 2869, 2885, 2892, 2901, + 2882, 2899, 2887, 2892, 2904, 2895, 2910, 0, 2902, 2897, + 2901, 2914, 0, 2917, 0, 2914, 0, 2920, 2919, 2915, + 0, 2916, 2937, 0, 2926, 2929, 2932, 2929, 2937, 2946, + 2931, 2937, 2944, 0, 2953, 2950, 2958, 2959, 0, 2956, + 2961, 2965, 2951, 2966, 2948, 2963, 2961, 2964, 0, 2969, + + 2976, 0, 2977, 2987, 2968, 2981, 2974, 2978, 2989, 2999, + 0, 2996, 2994, 2999, 3010, 3007, 0, 3004, 3014, 2997, + 3013, 3006, 3020, 0, 3017, 3015, 3020, 3025, 3019, 0, + 3026, 0, 3017, 3031, 3025, 3026, 0, 3046, 3042, 0, + 3036, 0, 3032, 3047, 3035, 3054, 3057, 3049, 3052, 3064, + 3072, 3071, 3070, 3068, 3061, 3075, 3068, 3073, 3077, 3085, + 3075, 3083, 3073, 3075, 3091, 3098, 3097, 3099, 3104, 3097, + 0, 3109, 3095, 3096, 3111, 3117, 0, 0, 3107, 3119, + 3120, 3953, 3111, 3953, 3953, 3117, 3115, 3953, 3120, 3117, + 3130, 3953, 3139, 3137, 3129, 3124, 3141, 3144, 3953, 3147, + + 3142, 295, 0, 3146, 3142, 3139, 3149, 3151, 0, 3147, + 3151, 3151, 3161, 3168, 3173, 3179, 3172, 3185, 3170, 0, + 3177, 3179, 3192, 3177, 3179, 3182, 3197, 0, 3189, 3202, + 3200, 3205, 0, 3210, 3193, 3199, 0, 3200, 3198, 3209, + 3206, 3207, 3206, 3207, 3206, 3213, 3221, 3210, 3211, 3226, + 3228, 3245, 3230, 3245, 3253, 3251, 3237, 3259, 0, 0, + 0, 3235, 3249, 3246, 3262, 3247, 3266, 3250, 3272, 0, + 0, 3261, 3274, 3262, 3277, 3264, 3272, 3264, 0, 3280, + 3269, 0, 3272, 3281, 0, 3282, 3283, 3286, 0, 3289, + 3306, 3306, 3294, 3296, 0, 3301, 0, 3302, 3316, 0, + + 3310, 3297, 3317, 3307, 3315, 3330, 3312, 0, 0, 3310, + 0, 3330, 3323, 3332, 0, 0, 0, 3323, 3326, 3953, + 3338, 3953, 3953, 3953, 3317, 3324, 3333, 3953, 3334, 3350, + 3953, 3348, 3349, 3341, 3344, 0, 3360, 0, 3357, 0, + 3357, 0, 3371, 3361, 0, 3369, 0, 3364, 3371, 0, + 3374, 3382, 3381, 3387, 0, 3376, 0, 0, 0, 3380, + 0, 3378, 3391, 3380, 3395, 3401, 0, 3400, 3402, 3397, + 3395, 3408, 3406, 3407, 3410, 3412, 3400, 3421, 0, 3407, + 3421, 3423, 3415, 3433, 3438, 3440, 3426, 3446, 3444, 3441, + 3432, 3446, 3442, 3453, 3439, 3448, 3457, 3449, 3459, 3460, + + 3455, 3465, 3463, 3457, 3472, 0, 3469, 0, 3460, 3459, + 3468, 3471, 3471, 3473, 3489, 0, 0, 0, 3485, 0, + 0, 3479, 0, 3489, 3493, 3503, 3504, 3506, 3493, 3494, + 3497, 3953, 3506, 3501, 3501, 0, 3519, 3522, 0, 0, + 0, 3509, 3517, 0, 0, 0, 3512, 3517, 0, 0, + 3524, 0, 0, 0, 3516, 3536, 3540, 3526, 3545, 3523, + 0, 0, 3545, 3537, 3551, 3549, 3561, 3551, 3562, 3564, + 0, 3565, 3552, 3565, 3562, 3562, 3575, 3575, 3570, 3558, + 0, 3575, 3570, 3566, 3587, 3570, 3571, 0, 3593, 0, + 0, 3575, 3586, 0, 3598, 0, 0, 0, 3585, 0, + + 3601, 3594, 3589, 0, 3953, 3953, 3953, 3953, 3953, 3953, + 3599, 3603, 0, 3606, 3603, 3608, 3602, 3616, 3619, 3617, + 3616, 0, 3626, 3629, 3637, 3624, 3626, 0, 0, 0, + 0, 3632, 3632, 3643, 0, 0, 3641, 0, 0, 3636, + 3648, 0, 3651, 0, 3656, 3641, 3652, 3641, 0, 0, + 3660, 0, 0, 3651, 0, 3664, 3661, 0, 3671, 3645, + 3671, 0, 3665, 3670, 3675, 0, 3680, 3670, 3692, 3693, + 3684, 0, 3695, 3698, 3693, 0, 3681, 3695, 0, 3690, + 3698, 0, 0, 0, 3704, 3710, 3710, 3698, 3693, 3716, + 3708, 3716, 3722, 0, 0, 0, 3726, 3727, 0, 3706, + + 3721, 0, 3737, 0, 0, 0, 3742, 3743, 3737, 3734, + 3752, 291, 3737, 3744, 0, 3755, 3760, 3761, 3762, 0, + 0, 0, 3753, 0, 288, 285, 0, 3755, 3756, 3757, + 0, 0, 3759, 273, 3755, 3760, 3761, 0, 0, 3764, + 3767, 0, 0, 3953, 3832, 3837, 3842, 3847, 3852, 310, + 3857, 3862, 3867, 3872, 3877, 3882, 3887, 3892, 3897, 3902, + 3907, 3912, 3917, 3922, 3927, 3932, 3937, 3942, 3947 } ; -static const flex_int16_t yy_def[1761] = +static const flex_int16_t yy_def[1770] = { 0, - 1736, 1, 1736, 3, 1737, 1737, 1738, 1738, 1739, 1739, - 1736, 11, 1736, 1736, 1736, 1736, 1736, 1740, 1741, 1736, - 1742, 1743, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1744, 1745, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1746, 1747, 1736, 1736, 1736, 1736, 1736, 1748, 1749, - 1750, 1736, 1736, 1736, 1751, 1736, 1736, 1742, 1742, 1742, - - 1742, 1742, 1736, 1740, 1741, 1741, 1736, 1736, 1742, 1742, - 1742, 1752, 1736, 1753, 1754, 1736, 1736, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1744, 1736, 1745, 1745, 1736, 1736, 1755, 1736, 1756, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1746, 1746, 1746, 1746, 1736, 1747, 1757, 1736, - 1736, 1748, 1736, 1749, 1750, 1736, 1736, 1736, 1751, 1736, - 1758, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1742, 1742, - - 1752, 1736, 1753, 1742, 1759, 1754, 1758, 1736, 1736, 1736, - 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1736, 1755, 1755, 1756, 1756, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - - 1736, 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1757, 1757, - 307, 1742, 1742, 1742, 1742, 1736, 1736, 1742, 1760, 307, - 1736, 1736, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, - - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1746, 1746, 1746, 1736, 1742, 1742, 1742, 1760, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1746, 1746, 1746, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1746, 1746, 1746, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1746, 1746, 1736, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1736, 1736, 1736, 1736, - - 1736, 1736, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, - - 1742, 1742, 1746, 1746, 1742, 1742, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1742, 1746, 1736, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 1736, 1742, 1742, 1742, 1742, - 1742, 1742, 1742, 1742, 1742, 0, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736 + 1744, 1, 1744, 3, 1745, 1745, 1746, 1746, 1747, 1747, + 1744, 11, 1744, 1744, 1744, 1744, 1744, 1748, 1749, 1744, + 1750, 1751, 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1752, 1753, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1754, 1755, 1744, 1744, 1744, 1744, 1744, 1756, 1757, + 1758, 1744, 1744, 1744, 1759, 1744, 1744, 1750, 1750, 1750, + + 1750, 1750, 1744, 1748, 1749, 1749, 1744, 1744, 1750, 1750, + 1750, 1760, 1744, 1761, 1762, 1744, 1744, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1752, 1744, 1753, 1753, 1744, 1744, 1763, 1744, 1764, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1754, 1754, 1754, 1754, 1744, 1755, 1765, 1744, + 1744, 1756, 1744, 1757, 1758, 1744, 1744, 1744, 1759, 1744, + 1766, 1750, 1750, 1750, 1750, 1744, 1744, 1744, 1750, 1750, + + 1760, 1744, 1761, 1750, 1767, 1762, 1766, 1744, 1744, 1744, + 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1744, 1763, 1744, 1763, 1764, 1744, 1764, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1754, 1754, 1754, + 1765, 1765, 1744, 307, 1750, 1750, 1750, 1750, 1744, 1744, + 1750, 1768, 307, 1744, 1744, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, + + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1754, 1754, 1754, 1744, 1769, + 1750, 1750, 1750, 1768, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1754, 1754, + 1754, 1769, 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1754, 1754, 1754, 1744, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1754, + + 1754, 1744, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1744, 1744, 1744, 1744, 1744, 1744, + 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1754, 1754, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1754, 1754, + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + + 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1754, 1754, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1750, 1754, 1744, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 1744, 1750, 1750, 1750, 1750, 1750, 1750, + 1750, 1750, 1750, 0, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744 } ; -static const flex_int16_t yy_nxt[4072] = +static const flex_int16_t yy_nxt[4040] = { 0, 14, 15, 16, 15, 14, 17, 18, 14, 17, 19, 14, 14, 14, 20, 21, 22, 23, 23, 14, 14, @@ -1278,7 +1281,7 @@ static const flex_int16_t yy_nxt[4072] = 90, 93, 92, 96, 96, 93, 103, 107, 103, 108, 108, 160, 97, 97, 103, 103, 103, 103, 231, 238, - 232, 232, 237, 227, 279, 516, 516, 239, 280, 103, + 232, 232, 237, 227, 279, 519, 519, 239, 280, 103, 103, 103, 103, 298, 299, 310, 310, 300, 300, 311, 311, 94, 160, 300, 300, 94, 14, 15, 16, 15, 14, 17, 18, 14, 17, 14, 14, 14, 14, 14, @@ -1291,69 +1294,69 @@ static const flex_int16_t yy_nxt[4072] = 47, 47, 47, 47, 14, 14, 14, 14, 14, 14, 14, 14, 110, 110, 109, 161, 188, 251, 257, 162, - 258, 111, 1726, 510, 116, 280, 108, 108, 467, 467, - 233, 233, 468, 468, 1718, 117, 118, 1294, 119, 234, - 1223, 266, 300, 300, 745, 120, 161, 188, 251, 257, + 258, 111, 273, 512, 116, 513, 108, 108, 469, 469, + 233, 233, 470, 470, 273, 117, 118, 1734, 119, 234, + 1726, 266, 300, 300, 273, 120, 161, 188, 251, 257, 162, 258, 111, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 112, 117, 118, 115, 119, 234, 112, 266, 112, 121, 174, 120, 153, 122, 271, 134, 154, 123, 135, 136, 155, 138, 139, 140, 175, 269, 124, 141, 270, 125, 214, 272, 137, 142, 215, - 112, 112, 112, 466, 112, 121, 174, 464, 153, 122, + 112, 112, 112, 740, 112, 121, 174, 1302, 153, 122, 271, 134, 154, 123, 135, 136, 155, 138, 139, 140, 175, 269, 124, 141, 270, 125, 214, 272, 137, 142, 215, 112, 112, 112, 112, 112, 112, 112, 112, 126, - 286, 127, 143, 634, 128, 129, 144, 287, 130, 302, - 145, 131, 283, 146, 132, 133, 147, 149, 241, 148, - 283, 150, 242, 471, 471, 151, 280, 472, 472, 277, + 286, 127, 143, 1231, 128, 129, 144, 287, 130, 740, + 145, 131, 740, 146, 132, 133, 147, 149, 241, 148, + 466, 150, 242, 473, 473, 151, 463, 474, 474, 750, 126, 286, 127, 143, 152, 128, 129, 144, 287, 130, 288, 145, 131, 288, 146, 132, 133, 147, 149, 241, 148, 156, 150, 242, 169, 163, 151, 164, 170, 165, 157, 158, 171, 166, 243, 152, 167, 159, 292, 176, - 177, 293, 168, 294, 172, 466, 295, 178, 173, 179, - 244, 180, 156, 288, 181, 169, 163, 697, 164, 170, - 165, 157, 158, 171, 166, 243, 464, 167, 159, 292, + 177, 293, 168, 294, 172, 740, 295, 178, 173, 179, + 244, 180, 156, 288, 181, 169, 163, 464, 164, 170, + 165, 157, 158, 171, 166, 243, 466, 167, 159, 292, 176, 177, 293, 168, 294, 172, 245, 295, 178, 173, 179, 244, 180, 182, 189, 181, 246, 183, 190, 247, - 312, 184, 191, 208, 185, 317, 320, 186, 192, 462, - 187, 464, 209, 225, 210, 311, 311, 245, 211, 225, - 212, 697, 213, 223, 182, 189, 323, 246, 183, 190, + 312, 184, 191, 208, 185, 317, 320, 186, 192, 463, + 187, 465, 209, 637, 210, 311, 311, 245, 211, 302, + 212, 467, 213, 283, 182, 189, 323, 246, 183, 190, 247, 312, 184, 191, 208, 185, 317, 320, 186, 192, 255, 187, 193, 209, 194, 210, 202, 195, 196, 211, - 203, 212, 197, 213, 204, 256, 198, 323, 302, 199, - 205, 200, 466, 206, 201, 235, 106, 232, 232, 301, - 207, 255, 510, 193, 280, 194, 236, 202, 195, 196, - 248, 203, 519, 197, 249, 204, 256, 198, 106, 227, + 203, 212, 197, 213, 204, 256, 198, 323, 283, 199, + 205, 200, 468, 206, 201, 235, 280, 232, 232, 301, + 207, 255, 464, 193, 273, 194, 236, 202, 195, 196, + 248, 203, 522, 197, 249, 204, 256, 198, 700, 227, 199, 205, 200, 259, 206, 201, 216, 217, 250, 262, 218, 207, 219, 260, 220, 252, 267, 236, 261, 221, - 268, 248, 318, 253, 263, 249, 291, 264, 265, 321, - 227, 290, 254, 319, 259, 322, 283, 216, 217, 250, - 262, 218, 283, 219, 260, 220, 252, 267, 281, 261, + 268, 248, 318, 253, 263, 249, 465, 264, 265, 321, + 227, 277, 254, 319, 259, 322, 462, 216, 217, 250, + 262, 218, 465, 219, 260, 220, 252, 267, 225, 261, 221, 268, 274, 318, 253, 263, 296, 296, 264, 265, 321, 275, 324, 254, 319, 297, 322, 276, 116, 326, 108, 108, 110, 110, 327, 328, 325, 277, 334, 117, - 335, 111, 263, 274, 298, 298, 308, 308, 516, 516, - 311, 311, 275, 324, 240, 309, 297, 230, 276, 336, - 326, 468, 468, 337, 338, 327, 328, 325, 229, 334, + 335, 111, 225, 274, 298, 298, 308, 308, 519, 519, + 311, 311, 275, 324, 223, 309, 297, 302, 276, 336, + 326, 470, 470, 337, 338, 327, 328, 325, 106, 334, 117, 335, 111, 301, 301, 301, 301, 301, 301, 301, - 301, 301, 301, 301, 301, 301, 309, 329, 304, 228, + 301, 301, 301, 301, 301, 301, 309, 329, 304, 106, 336, 301, 313, 301, 337, 338, 314, 331, 332, 333, 339, 340, 344, 315, 342, 343, 345, 330, 347, 316, 346, 350, 348, 351, 356, 341, 349, 357, 329, 358, - 301, 301, 301, 313, 301, 468, 468, 314, 331, 332, + 301, 301, 301, 313, 301, 470, 470, 314, 331, 332, 333, 339, 340, 344, 315, 342, 343, 345, 330, 347, - 316, 346, 350, 348, 351, 356, 341, 349, 357, 227, + 316, 346, 350, 348, 351, 356, 341, 349, 357, 291, 358, 301, 301, 301, 301, 301, 301, 301, 301, 305, 305, 301, 305, 305, 305, 305, 305, 305, 305, 305, - 305, 305, 359, 363, 307, 472, 472, 305, 352, 305, + 305, 305, 359, 363, 307, 474, 474, 305, 352, 305, 353, 354, 360, 364, 355, 365, 366, 367, 368, 369, - 361, 372, 373, 374, 370, 376, 362, 472, 472, 384, - 375, 395, 226, 359, 363, 371, 305, 305, 305, 352, + 361, 372, 373, 374, 370, 376, 362, 474, 474, 384, + 375, 395, 290, 359, 363, 371, 305, 305, 305, 352, 305, 353, 354, 360, 364, 355, 365, 366, 367, 368, 369, 361, 372, 373, 374, 370, 376, 362, 381, 377, @@ -1363,350 +1366,346 @@ static const flex_int16_t yy_nxt[4072] = 377, 398, 400, 394, 382, 383, 389, 401, 402, 403, 404, 405, 406, 407, 409, 408, 378, 385, 379, 386, 387, 396, 390, 380, 397, 388, 391, 392, 393, 399, - 410, 411, 398, 400, 394, 417, 426, 225, 401, 402, + 410, 411, 398, 400, 394, 417, 426, 283, 401, 402, 403, 404, 405, 406, 407, 409, 408, 412, 415, 427, 413, 418, 428, 429, 416, 430, 419, 414, 420, 421, - 223, 410, 411, 434, 422, 435, 417, 426, 423, 424, - 438, 425, 439, 106, 436, 440, 516, 516, 412, 415, + 283, 410, 411, 434, 422, 435, 417, 426, 423, 424, + 438, 425, 439, 281, 436, 440, 519, 519, 412, 415, 427, 413, 418, 428, 429, 416, 430, 419, 414, 420, 421, 431, 432, 446, 434, 422, 435, 441, 437, 423, 424, 438, 425, 439, 433, 436, 440, 443, 442, 444, 447, 450, 451, 452, 453, 445, 454, 455, 448, 456, 457, 458, 431, 432, 446, 459, 460, 461, 441, 437, - 449, 1736, 510, 229, 735, 433, 473, 1736, 443, 442, + 449, 263, 512, 229, 513, 433, 475, 240, 443, 442, 444, 447, 450, 451, 452, 453, 445, 454, 455, 448, - 456, 457, 458, 233, 233, 474, 459, 460, 461, 233, - 233, 449, 234, 235, 229, 232, 232, 473, 234, 469, - 469, 475, 476, 479, 236, 477, 478, 480, 470, 481, - 483, 484, 485, 486, 487, 488, 474, 492, 493, 489, - 494, 495, 482, 234, 490, 496, 497, 498, 499, 234, - 491, 500, 475, 476, 479, 236, 477, 478, 480, 470, - 481, 483, 484, 485, 486, 487, 488, 503, 492, 493, - 489, 494, 495, 482, 504, 490, 496, 497, 498, 499, - 505, 491, 500, 501, 506, 502, 1736, 508, 512, 507, - 521, 521, 514, 1736, 522, 522, 522, 522, 503, 1736, - - 296, 296, 522, 522, 515, 504, 517, 518, 277, 297, - 1736, 505, 277, 523, 501, 506, 502, 277, 508, 512, - 507, 104, 104, 514, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 343, 515, 524, 517, 518, 104, - 297, 104, 308, 308, 523, 525, 526, 527, 528, 529, - 530, 309, 513, 531, 532, 533, 534, 535, 536, 537, - 538, 539, 540, 541, 542, 343, 543, 524, 104, 104, - 104, 1736, 104, 699, 699, 1736, 525, 526, 527, 528, - 529, 530, 309, 513, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 1736, 543, 547, 104, + 456, 457, 458, 233, 233, 476, 459, 460, 461, 233, + 233, 449, 234, 235, 229, 232, 232, 475, 234, 471, + 471, 477, 478, 481, 236, 479, 480, 482, 472, 483, + 485, 486, 487, 488, 489, 490, 476, 494, 495, 491, + 496, 497, 484, 234, 492, 498, 499, 500, 501, 234, + 493, 502, 477, 478, 481, 236, 479, 480, 482, 472, + 483, 485, 486, 487, 488, 489, 490, 505, 494, 495, + 491, 496, 497, 484, 506, 492, 498, 499, 500, 501, + 507, 493, 502, 503, 508, 504, 230, 510, 515, 509, + 524, 524, 517, 229, 525, 525, 228, 512, 505, 739, + + 296, 296, 525, 525, 518, 506, 520, 521, 277, 297, + 227, 507, 277, 526, 503, 508, 504, 277, 510, 515, + 509, 104, 104, 517, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 343, 518, 527, 520, 521, 104, + 297, 104, 308, 308, 526, 528, 529, 530, 531, 532, + 533, 309, 516, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 343, 546, 527, 104, 104, + 104, 226, 104, 525, 525, 225, 528, 529, 530, 531, + 532, 533, 309, 516, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 223, 546, 550, 104, 104, 104, 104, 104, 104, 104, 104, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, - 544, 548, 304, 699, 699, 301, 549, 301, 545, 547, - 551, 552, 553, 554, 546, 555, 556, 557, 558, 559, - 560, 561, 562, 550, 564, 565, 566, 567, 570, 571, - 563, 544, 548, 572, 301, 301, 301, 549, 301, 545, - 1736, 551, 552, 553, 554, 546, 555, 556, 557, 558, - 559, 560, 561, 562, 550, 564, 565, 566, 567, 570, - 571, 563, 1736, 573, 572, 301, 301, 301, 301, 301, + 547, 551, 304, 703, 703, 301, 552, 301, 548, 550, + 554, 555, 556, 557, 549, 558, 559, 560, 561, 562, + 563, 564, 565, 553, 567, 568, 569, 570, 573, 574, + 566, 547, 551, 575, 301, 301, 301, 552, 301, 548, + 106, 554, 555, 556, 557, 549, 558, 559, 560, 561, + 562, 563, 564, 565, 553, 567, 568, 569, 570, 573, + 574, 566, 1744, 576, 575, 301, 301, 301, 301, 301, 301, 301, 301, 305, 305, 301, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 568, 574, 307, 277, - 945, 305, 575, 305, 573, 576, 569, 577, 578, 579, - 580, 582, 583, 584, 581, 585, 586, 587, 590, 588, - 591, 592, 593, 594, 595, 596, 597, 568, 574, 589, - 305, 305, 305, 575, 305, 1736, 576, 569, 577, 578, - 579, 580, 582, 583, 584, 581, 585, 586, 587, 590, - 588, 591, 592, 593, 594, 595, 596, 597, 1736, 598, - 589, 305, 305, 305, 305, 305, 305, 305, 305, 104, - 104, 599, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 600, 612, 613, 277, 1135, 104, 614, 104, - - 598, 615, 616, 626, 627, 628, 629, 630, 520, 631, - 632, 633, 599, 635, 636, 637, 639, 640, 641, 638, - 1736, 644, 645, 600, 612, 613, 104, 104, 104, 614, - 104, 1736, 615, 616, 626, 627, 628, 629, 630, 520, - 631, 632, 633, 642, 635, 636, 637, 639, 640, 641, - 638, 643, 644, 645, 646, 650, 1736, 104, 104, 104, - 104, 104, 104, 104, 104, 601, 602, 1736, 603, 648, - 604, 605, 653, 606, 642, 654, 607, 655, 647, 608, - 649, 656, 643, 609, 610, 646, 650, 611, 1736, 1736, - 657, 1736, 658, 1736, 1736, 659, 601, 602, 651, 603, - - 648, 604, 605, 653, 606, 652, 654, 607, 655, 647, - 608, 649, 656, 660, 609, 610, 661, 662, 611, 617, - 618, 657, 619, 658, 620, 621, 659, 622, 663, 651, - 664, 665, 668, 666, 669, 670, 652, 623, 624, 671, - 672, 625, 673, 674, 660, 667, 675, 661, 662, 676, - 617, 618, 677, 619, 678, 620, 621, 679, 622, 663, - 680, 664, 665, 668, 666, 669, 670, 681, 623, 624, - 671, 672, 625, 673, 674, 682, 667, 675, 683, 684, - 676, 685, 686, 677, 687, 678, 691, 689, 679, 688, - 692, 680, 690, 694, 695, 696, 469, 469, 681, 698, - - 698, 700, 693, 699, 699, 470, 682, 701, 702, 683, - 684, 703, 685, 686, 704, 687, 705, 691, 689, 706, - 688, 692, 707, 690, 694, 695, 696, 708, 709, 710, - 711, 712, 700, 693, 713, 714, 470, 715, 701, 702, - 716, 717, 703, 718, 719, 704, 720, 705, 721, 722, - 706, 723, 724, 707, 725, 726, 727, 728, 708, 709, - 710, 711, 712, 729, 730, 713, 714, 731, 715, 732, - 1736, 716, 717, 734, 718, 719, 733, 720, 277, 721, - 722, 511, 723, 724, 736, 725, 726, 727, 728, 277, - 737, 738, 739, 511, 729, 730, 740, 741, 731, 742, - - 732, 277, 743, 744, 734, 746, 747, 733, 748, 749, - 750, 751, 511, 752, 753, 736, 754, 756, 757, 758, - 759, 737, 738, 739, 511, 762, 763, 740, 741, 760, - 742, 764, 765, 743, 744, 755, 746, 747, 761, 748, - 749, 750, 751, 766, 752, 753, 767, 754, 756, 757, - 758, 759, 768, 769, 770, 771, 762, 763, 772, 773, - 760, 774, 764, 765, 775, 776, 755, 777, 778, 761, - 779, 780, 781, 782, 766, 783, 784, 767, 785, 786, - 787, 788, 789, 768, 769, 770, 771, 790, 791, 772, - 773, 792, 774, 793, 794, 775, 776, 795, 777, 778, - - 796, 779, 780, 781, 782, 797, 783, 784, 798, 785, - 786, 787, 788, 789, 799, 800, 801, 802, 790, 791, - 803, 806, 792, 804, 793, 794, 807, 808, 795, 809, - 805, 796, 810, 811, 812, 813, 797, 815, 816, 798, - 817, 818, 814, 819, 820, 799, 800, 801, 802, 821, - 822, 803, 806, 823, 804, 827, 828, 807, 808, 829, - 809, 805, 830, 810, 811, 812, 813, 831, 815, 816, - 824, 817, 818, 814, 819, 820, 825, 832, 833, 834, - 821, 822, 835, 836, 823, 837, 827, 828, 826, 838, - 829, 839, 843, 830, 840, 844, 845, 846, 831, 847, - - 841, 824, 848, 849, 852, 853, 854, 825, 832, 833, - 834, 850, 842, 835, 836, 851, 837, 855, 856, 826, - 838, 857, 839, 843, 858, 840, 844, 845, 846, 859, - 847, 841, 860, 848, 849, 852, 853, 854, 861, 862, - 863, 864, 850, 842, 865, 866, 851, 869, 855, 856, - 870, 867, 857, 871, 872, 858, 868, 873, 874, 875, - 859, 876, 877, 860, 878, 879, 880, 881, 882, 861, - 862, 863, 864, 883, 884, 865, 866, 885, 869, 886, - 887, 870, 867, 888, 871, 872, 889, 868, 873, 874, - 875, 890, 876, 877, 891, 878, 879, 880, 881, 882, - - 892, 893, 894, 895, 883, 884, 898, 900, 885, 896, - 886, 887, 901, 897, 888, 902, 899, 889, 903, 904, - 905, 906, 890, 907, 908, 891, 909, 910, 911, 912, - 913, 892, 893, 894, 895, 914, 915, 898, 900, 916, - 896, 917, 918, 901, 897, 919, 902, 899, 920, 903, - 904, 905, 906, 921, 907, 908, 922, 909, 910, 911, - 912, 913, 923, 924, 925, 926, 914, 915, 927, 928, - 916, 929, 917, 918, 930, 931, 919, 932, 933, 920, - 934, 935, 936, 937, 921, 938, 939, 922, 940, 941, - 942, 943, 1736, 923, 924, 925, 926, 944, 947, 927, - - 928, 948, 929, 949, 950, 930, 931, 951, 932, 933, - 946, 934, 935, 936, 937, 952, 938, 939, 953, 940, - 941, 942, 943, 277, 954, 277, 955, 956, 944, 947, - 957, 958, 948, 959, 949, 950, 960, 961, 951, 962, - 963, 946, 964, 965, 966, 968, 952, 967, 969, 953, - 970, 971, 972, 973, 974, 954, 975, 955, 956, 976, - 977, 957, 958, 980, 959, 978, 979, 960, 961, 981, - 962, 963, 982, 964, 965, 966, 968, 983, 967, 969, - 984, 970, 971, 972, 973, 974, 985, 975, 986, 987, - 976, 977, 988, 989, 980, 990, 978, 979, 991, 992, - - 981, 1736, 1736, 982, 998, 999, 1000, 1001, 983, 1002, - 1003, 984, 1004, 1005, 1006, 993, 1736, 985, 1012, 986, - 987, 1013, 1736, 988, 989, 994, 990, 1014, 995, 991, - 992, 1736, 996, 997, 1015, 998, 999, 1000, 1001, 1016, - 1002, 1003, 1017, 1004, 1005, 1006, 993, 1007, 1018, 1012, - 1008, 1019, 1013, 1009, 1020, 1021, 994, 1010, 1014, 995, - 1022, 1023, 1011, 996, 997, 1015, 1024, 1025, 1026, 1027, - 1016, 1028, 1029, 1017, 1030, 1031, 1032, 1033, 1007, 1018, - 1034, 1008, 1019, 1035, 1009, 1020, 1021, 1036, 1010, 1037, - 1038, 1022, 1023, 1011, 1039, 1040, 1041, 1024, 1025, 1026, - - 1027, 1042, 1028, 1029, 1043, 1030, 1031, 1032, 1033, 1044, - 1045, 1034, 1046, 1047, 1035, 1048, 1049, 1050, 1036, 1051, - 1037, 1038, 1052, 1053, 1054, 1039, 1040, 1041, 1055, 1056, - 1057, 1058, 1042, 1059, 1060, 1043, 1061, 1062, 1063, 1064, - 1044, 1045, 1065, 1046, 1047, 1068, 1048, 1049, 1050, 1066, - 1051, 1069, 1070, 1052, 1053, 1054, 1071, 1074, 1067, 1055, - 1056, 1057, 1058, 1075, 1059, 1060, 1076, 1061, 1062, 1063, - 1064, 1072, 1077, 1065, 1078, 1079, 1068, 1080, 1073, 1081, - 1066, 1085, 1069, 1070, 1086, 1087, 1088, 1071, 1074, 1067, - 1089, 1090, 1091, 1082, 1075, 1083, 1092, 1076, 1093, 1094, - - 1095, 1096, 1072, 1077, 1099, 1078, 1079, 1097, 1080, 1073, - 1081, 1084, 1085, 1098, 1100, 1086, 1087, 1088, 1101, 1103, - 1104, 1089, 1090, 1091, 1082, 1105, 1083, 1092, 1102, 1093, - 1094, 1095, 1096, 1106, 1107, 1099, 1108, 1109, 1097, 1110, - 1111, 1112, 1084, 1113, 1098, 1100, 1114, 1115, 1116, 1101, - 1103, 1104, 1117, 1118, 1119, 1120, 1105, 1121, 1122, 1102, - 1123, 1124, 1125, 1126, 1106, 1107, 1127, 1108, 1109, 1128, - 1110, 1111, 1112, 1129, 1113, 1130, 1131, 1114, 1115, 1116, - 1132, 1133, 1134, 1117, 1118, 1119, 1120, 1138, 1121, 1122, - 1136, 1123, 1124, 1125, 1126, 1137, 1139, 1127, 1140, 1141, - - 1128, 1142, 1143, 1144, 1129, 1145, 1130, 1131, 1146, 1147, - 1148, 1132, 1133, 1134, 1149, 1150, 277, 1151, 1138, 277, - 1152, 1136, 1153, 1154, 1155, 1156, 1137, 1139, 1157, 1140, - 1141, 1158, 1142, 1143, 1144, 1159, 1145, 1160, 1161, 1146, - 1147, 1148, 1162, 1163, 1164, 1149, 1150, 1165, 1151, 1166, - 1167, 1152, 1168, 1153, 1154, 1155, 1156, 1169, 1170, 1157, - 1171, 1172, 1158, 1173, 1174, 1175, 1159, 1176, 1160, 1161, - 1177, 1178, 1179, 1162, 1163, 1164, 1180, 1181, 1165, 1182, - 1166, 1167, 1183, 1168, 1184, 1185, 1186, 1189, 1169, 1170, - 1190, 1171, 1172, 1191, 1173, 1174, 1175, 1187, 1176, 1192, - - 1193, 1177, 1178, 1179, 1194, 1188, 1195, 1180, 1181, 1196, - 1182, 1197, 1198, 1183, 1199, 1184, 1185, 1186, 1189, 1200, - 1201, 1190, 1202, 1203, 1191, 1204, 1205, 1206, 1187, 1207, - 1192, 1193, 1208, 1209, 1210, 1194, 1188, 1195, 1211, 1212, - 1196, 1213, 1197, 1198, 1214, 1199, 1215, 1216, 1217, 1218, - 1200, 1201, 1219, 1202, 1203, 1220, 1204, 1205, 1206, 1221, - 1207, 1222, 1224, 1208, 1209, 1210, 1225, 1226, 1227, 1211, - 1212, 1228, 1213, 1229, 1230, 1214, 1231, 1215, 1216, 1217, - 1218, 1232, 1233, 1219, 1234, 1235, 1220, 1236, 1237, 1238, - 1221, 1239, 1222, 1224, 1240, 1241, 1242, 1225, 1226, 1227, - - 1243, 1244, 1228, 1245, 1229, 1230, 1246, 1231, 1247, 1248, - 1249, 1250, 1232, 1233, 1251, 1234, 1235, 1252, 1236, 1237, - 1238, 1255, 1239, 1256, 1257, 1240, 1241, 1242, 1253, 1258, - 1259, 1243, 1244, 1260, 1245, 1261, 1262, 1246, 1263, 1247, - 1248, 1249, 1250, 1264, 1254, 1251, 1265, 1266, 1252, 1267, - 1268, 1269, 1255, 1270, 1256, 1257, 1271, 1272, 1273, 1253, - 1258, 1259, 1274, 1275, 1260, 1276, 1261, 1262, 1277, 1263, - 1278, 1279, 1280, 1281, 1264, 1254, 1282, 1265, 1266, 1283, - 1267, 1268, 1269, 1284, 1270, 1285, 1286, 1271, 1272, 1273, - 1287, 1288, 1289, 1274, 1275, 1290, 1276, 1291, 1292, 1277, - - 1295, 1278, 1279, 1280, 1281, 1296, 1293, 1282, 1297, 1298, - 1283, 1299, 1300, 1301, 1284, 1302, 1285, 1286, 1303, 1304, - 1305, 1287, 1288, 1289, 277, 1306, 1290, 1307, 1291, 1292, - 277, 1295, 1308, 1309, 1310, 1311, 1296, 1293, 1312, 1297, - 1298, 1313, 1299, 1300, 1301, 1314, 1302, 1315, 1316, 1303, - 1304, 1305, 1317, 1318, 1319, 1320, 1306, 1321, 1307, 1322, - 1323, 1324, 1325, 1308, 1309, 1310, 1311, 1326, 1327, 1312, - 1328, 1329, 1313, 1330, 1331, 1332, 1314, 1333, 1315, 1316, - 1334, 1335, 1336, 1317, 1318, 1319, 1320, 1337, 1321, 1338, - 1322, 1323, 1324, 1325, 1339, 1340, 1341, 1342, 1326, 1327, - - 1343, 1328, 1329, 1344, 1330, 1331, 1332, 1345, 1333, 1346, - 1347, 1334, 1335, 1336, 1348, 1349, 1350, 1351, 1337, 1352, - 1338, 1353, 1354, 1355, 1356, 1339, 1340, 1341, 1342, 1357, - 1358, 1343, 1359, 1360, 1344, 1361, 1362, 1363, 1345, 1364, - 1346, 1347, 1365, 1367, 1366, 1348, 1349, 1350, 1351, 1368, - 1352, 1370, 1353, 1354, 1355, 1356, 1371, 1372, 1373, 1374, - 1357, 1358, 1375, 1359, 1360, 1376, 1361, 1362, 1363, 1369, - 1364, 1377, 1378, 1365, 1367, 1366, 1379, 1380, 1381, 1382, - 1368, 1383, 1370, 1384, 1385, 1386, 1387, 1371, 1372, 1373, - 1374, 1388, 1389, 1375, 1390, 1391, 1376, 1392, 1393, 1394, - - 1369, 1395, 1377, 1378, 1396, 1397, 1400, 1379, 1380, 1381, - 1382, 1398, 1383, 1399, 1384, 1385, 1386, 1387, 1401, 1402, - 1403, 1404, 1388, 1389, 1405, 1390, 1391, 1406, 1392, 1393, - 1394, 1407, 1395, 1408, 1409, 1396, 1397, 1400, 1410, 1411, - 1412, 1413, 1398, 1414, 1399, 1415, 1416, 1417, 1418, 1401, - 1402, 1403, 1404, 1419, 1420, 1405, 1421, 1422, 1406, 1423, - 1736, 1426, 1407, 1425, 1408, 1409, 1427, 1424, 1428, 1410, - 1411, 1412, 1413, 1429, 1414, 1430, 1415, 1416, 1417, 1418, - 277, 1431, 1432, 1433, 1419, 1420, 1434, 1421, 1422, 1435, - 1423, 277, 1426, 1436, 1425, 1437, 1438, 1427, 1424, 1428, - - 1439, 1440, 1441, 1442, 1429, 1443, 1430, 1444, 1445, 1446, - 1447, 1448, 1431, 1432, 1433, 1449, 1450, 1434, 1451, 1452, - 1435, 1453, 1454, 1455, 1436, 1456, 1437, 1438, 1457, 1458, - 1459, 1439, 1440, 1441, 1442, 1460, 1443, 1461, 1444, 1445, - 1446, 1447, 1448, 1462, 1463, 1464, 1449, 1450, 1465, 1451, - 1452, 1466, 1453, 1454, 1455, 1467, 1456, 1468, 1469, 1457, - 1458, 1459, 1470, 1471, 1472, 1473, 1460, 1474, 1461, 1475, - 1476, 1477, 1478, 1479, 1462, 1463, 1464, 1480, 1481, 1465, - 1482, 1483, 1466, 1484, 1485, 1486, 1467, 1487, 1468, 1469, - 1488, 1489, 1490, 1470, 1471, 1472, 1473, 1491, 1474, 1492, - - 1475, 1476, 1477, 1478, 1479, 1493, 1494, 1495, 1480, 1481, - 1496, 1482, 1483, 1497, 1484, 1485, 1486, 1498, 1487, 1499, - 1500, 1488, 1489, 1490, 1501, 1502, 1503, 1504, 1491, 1505, - 1492, 1506, 1507, 1508, 1509, 1510, 1493, 1494, 1495, 1511, - 1512, 1496, 1513, 1514, 1497, 1515, 1516, 1517, 1498, 1518, - 1499, 1500, 1519, 1520, 1521, 1501, 1502, 1503, 1504, 1522, - 1505, 1523, 1506, 1507, 1508, 1509, 1510, 1524, 1527, 1525, - 1511, 1512, 1526, 1513, 1514, 1528, 1515, 1516, 1517, 1529, - 1518, 1530, 1531, 1519, 1520, 1521, 277, 1532, 1533, 277, - 1522, 1534, 1523, 1535, 1536, 1537, 1538, 1539, 1524, 1527, - - 1525, 1540, 1541, 1526, 1542, 1543, 1528, 1544, 1545, 1546, - 1529, 1547, 1530, 1531, 1548, 1549, 1550, 1551, 1532, 1533, - 1552, 1553, 1534, 1554, 1535, 1536, 1537, 1538, 1539, 1555, - 1556, 1557, 1540, 1541, 1558, 1542, 1543, 1559, 1544, 1545, - 1546, 1560, 1547, 1561, 1562, 1548, 1549, 1550, 1551, 1563, - 1564, 1552, 1553, 1565, 1554, 1566, 1567, 1568, 1569, 1570, - 1555, 1556, 1557, 1571, 1572, 1558, 1573, 1574, 1559, 1575, - 1576, 1577, 1560, 1578, 1561, 1562, 1579, 1580, 1581, 1582, - 1563, 1564, 1583, 1584, 1565, 1585, 1566, 1567, 1568, 1569, - 1570, 1586, 1587, 1588, 1571, 1572, 1589, 1573, 1574, 1590, - - 1575, 1576, 1577, 1591, 1578, 1592, 1593, 1579, 1580, 1581, - 1582, 1594, 1595, 1583, 1584, 1596, 1585, 1597, 1598, 1599, - 1600, 1601, 1586, 1587, 1588, 1602, 1605, 1589, 1603, 1604, - 1590, 1606, 1607, 1608, 1591, 1610, 1592, 1593, 1609, 277, - 1611, 1612, 1594, 1595, 1613, 277, 1596, 1614, 1597, 1598, - 1599, 1600, 1601, 1615, 1616, 1617, 1602, 1605, 1618, 1603, - 1604, 1619, 1606, 1607, 1608, 1620, 1610, 1621, 1622, 1609, - 1623, 1611, 1612, 1624, 1625, 1613, 1626, 1627, 1614, 1628, - 1629, 1630, 1631, 1632, 1615, 1616, 1617, 1633, 1634, 1618, - 1635, 1636, 1619, 1637, 1638, 1639, 1620, 1640, 1621, 1622, - - 1641, 1623, 1642, 1643, 1624, 1625, 1644, 1626, 1627, 1645, - 1628, 1629, 1630, 1631, 1632, 1646, 1647, 1648, 1633, 1634, - 1649, 1635, 1636, 1650, 1637, 1638, 1639, 1653, 1640, 1651, - 1652, 1641, 1654, 1642, 1643, 1655, 1656, 1644, 1657, 277, - 1645, 1658, 1659, 1660, 1661, 1662, 1646, 1647, 1648, 1663, - 277, 1649, 1664, 1665, 1650, 1666, 1667, 1668, 1653, 1669, - 1651, 1652, 1670, 1654, 1671, 1672, 1655, 1656, 1673, 1657, - 1674, 1675, 1658, 1659, 1660, 1661, 1662, 1676, 1677, 1678, - 1663, 1679, 1680, 1664, 1665, 1681, 1666, 1667, 1668, 1682, - 1669, 1683, 277, 1670, 1684, 1671, 1672, 1685, 1686, 1673, - - 1687, 1674, 1675, 1688, 1689, 277, 1690, 1691, 1676, 1677, - 1678, 1692, 1679, 1680, 1693, 1694, 1681, 1695, 1696, 1697, - 1682, 1698, 1683, 1699, 1700, 1684, 1701, 1702, 1685, 1686, - 1703, 1687, 1704, 277, 1688, 1689, 1705, 1690, 1691, 1706, - 1707, 1708, 1692, 1709, 1710, 1693, 1694, 1711, 1695, 1696, - 1697, 1712, 1698, 1713, 1699, 1700, 277, 1701, 1702, 1714, - 1715, 1703, 1716, 1704, 1717, 1719, 1720, 1705, 1721, 1722, - 1706, 1707, 1708, 1723, 1709, 1710, 1724, 1725, 1711, 1727, - 1728, 1729, 1712, 1730, 1713, 1731, 1732, 1733, 277, 1734, - 1714, 1715, 1735, 1716, 1736, 1717, 1719, 1720, 1736, 1721, - - 1722, 1736, 1736, 1736, 1723, 1736, 1736, 1724, 1725, 1736, - 1727, 1728, 1729, 1736, 1730, 1736, 1731, 1732, 1733, 1736, - 1734, 1736, 1736, 1735, 87, 87, 87, 87, 87, 87, - 87, 91, 91, 91, 91, 91, 91, 91, 95, 95, - 95, 95, 95, 95, 95, 104, 1736, 104, 104, 104, - 104, 104, 105, 1736, 105, 105, 105, 105, 105, 114, - 114, 114, 114, 114, 114, 114, 222, 222, 222, 222, - 222, 222, 222, 224, 1736, 224, 224, 224, 224, 224, - 273, 273, 273, 273, 273, 273, 273, 278, 278, 278, - 278, 278, 278, 278, 282, 282, 282, 282, 282, 282, - - 282, 284, 284, 284, 284, 284, 284, 284, 285, 285, - 1736, 1736, 285, 285, 289, 1736, 289, 289, 1736, 289, - 289, 301, 301, 301, 301, 301, 301, 301, 303, 303, - 303, 303, 303, 303, 303, 306, 306, 306, 306, 306, - 306, 306, 463, 463, 1736, 463, 463, 463, 463, 465, - 465, 465, 1736, 465, 465, 465, 509, 509, 509, 509, - 509, 509, 509, 511, 1736, 511, 511, 511, 511, 511, - 305, 305, 305, 305, 305, 305, 305, 104, 1736, 104, - 104, 104, 104, 104, 13, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736 + 305, 305, 305, 305, 305, 305, 571, 577, 307, 703, + 703, 305, 578, 305, 576, 579, 572, 580, 581, 582, + 583, 585, 586, 587, 584, 588, 589, 590, 593, 591, + 594, 595, 596, 597, 598, 599, 600, 571, 577, 592, + 305, 305, 305, 578, 305, 1744, 579, 572, 580, 581, + 582, 583, 585, 586, 587, 584, 588, 589, 590, 593, + 591, 594, 595, 596, 597, 598, 599, 600, 1744, 601, + 592, 305, 305, 305, 305, 305, 305, 305, 305, 104, + 104, 602, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 603, 615, 616, 277, 950, 104, 617, 104, + + 601, 618, 619, 629, 630, 631, 632, 633, 523, 634, + 635, 636, 602, 638, 639, 640, 642, 643, 644, 641, + 1744, 647, 648, 603, 615, 616, 104, 104, 104, 617, + 104, 1744, 618, 619, 629, 630, 631, 632, 633, 523, + 634, 635, 636, 645, 638, 639, 640, 642, 643, 644, + 641, 646, 647, 648, 649, 653, 1744, 104, 104, 104, + 104, 104, 104, 104, 104, 604, 605, 1744, 606, 651, + 607, 608, 656, 609, 645, 657, 610, 658, 650, 611, + 652, 659, 646, 612, 613, 649, 653, 614, 1744, 952, + 660, 953, 661, 277, 1142, 662, 604, 605, 654, 606, + + 651, 607, 608, 656, 609, 655, 657, 610, 658, 650, + 611, 652, 659, 663, 612, 613, 664, 665, 614, 620, + 621, 660, 622, 661, 623, 624, 662, 625, 666, 654, + 667, 668, 671, 669, 672, 673, 655, 626, 627, 674, + 675, 628, 676, 677, 663, 670, 678, 664, 665, 679, + 620, 621, 680, 622, 681, 623, 624, 682, 625, 666, + 683, 667, 668, 671, 669, 672, 673, 684, 626, 627, + 674, 675, 628, 676, 677, 685, 670, 678, 686, 687, + 679, 688, 689, 680, 690, 681, 694, 692, 682, 691, + 695, 683, 693, 697, 698, 699, 467, 701, 684, 471, + + 471, 1744, 696, 704, 705, 706, 685, 1744, 472, 686, + 687, 707, 688, 689, 708, 690, 709, 694, 692, 710, + 691, 695, 711, 693, 697, 698, 699, 702, 702, 712, + 713, 703, 703, 696, 704, 705, 706, 468, 468, 472, + 714, 715, 707, 716, 717, 708, 718, 709, 719, 720, + 710, 721, 722, 711, 723, 724, 725, 726, 727, 728, + 712, 713, 729, 730, 731, 732, 733, 734, 735, 736, + 514, 714, 715, 1744, 716, 717, 741, 718, 277, 719, + 720, 738, 721, 722, 742, 723, 724, 725, 726, 727, + 728, 737, 743, 729, 730, 731, 732, 733, 734, 735, + + 736, 514, 744, 514, 277, 745, 746, 741, 747, 277, + 748, 749, 738, 751, 752, 742, 753, 754, 755, 756, + 757, 758, 737, 743, 759, 761, 762, 763, 764, 765, + 767, 768, 769, 744, 514, 770, 745, 746, 766, 747, + 771, 748, 749, 760, 751, 752, 772, 753, 754, 755, + 756, 757, 758, 773, 774, 759, 761, 762, 763, 764, + 765, 767, 768, 769, 775, 776, 770, 777, 778, 766, + 779, 771, 780, 781, 760, 782, 783, 772, 784, 785, + 786, 787, 788, 789, 773, 774, 790, 791, 792, 793, + 794, 795, 796, 797, 798, 775, 776, 799, 777, 778, + + 800, 779, 801, 780, 781, 802, 782, 783, 803, 784, + 785, 786, 787, 788, 789, 804, 805, 790, 791, 792, + 793, 794, 795, 796, 797, 798, 806, 807, 799, 808, + 809, 800, 811, 801, 812, 813, 802, 810, 814, 803, + 815, 816, 817, 818, 820, 821, 804, 805, 822, 823, + 819, 824, 825, 826, 827, 828, 1744, 806, 807, 832, + 808, 809, 1744, 811, 833, 812, 813, 834, 810, 814, + 835, 815, 816, 817, 818, 820, 821, 836, 837, 822, + 823, 819, 824, 825, 826, 827, 828, 829, 838, 839, + 832, 840, 841, 830, 842, 833, 843, 844, 834, 848, + + 849, 835, 850, 851, 852, 831, 853, 854, 836, 837, + 855, 845, 857, 858, 856, 859, 860, 846, 829, 838, + 839, 861, 840, 841, 830, 842, 862, 843, 844, 847, + 848, 849, 863, 850, 851, 852, 831, 853, 854, 864, + 865, 855, 845, 857, 858, 856, 859, 860, 846, 866, + 867, 868, 861, 869, 870, 871, 872, 862, 874, 875, + 847, 873, 876, 863, 877, 878, 879, 880, 881, 882, + 864, 865, 883, 884, 885, 886, 887, 888, 889, 890, + 866, 867, 868, 891, 869, 870, 871, 872, 892, 874, + 875, 893, 873, 876, 894, 877, 878, 879, 880, 881, + + 882, 895, 896, 883, 884, 885, 886, 887, 888, 889, + 890, 897, 898, 899, 891, 900, 901, 903, 905, 892, + 902, 906, 893, 907, 908, 894, 909, 904, 910, 911, + 912, 913, 895, 896, 914, 915, 916, 917, 918, 919, + 920, 921, 897, 898, 899, 922, 900, 901, 903, 905, + 923, 902, 906, 924, 907, 908, 925, 909, 904, 910, + 911, 912, 913, 926, 927, 914, 915, 916, 917, 918, + 919, 920, 921, 928, 929, 930, 922, 931, 932, 933, + 934, 923, 935, 936, 924, 937, 938, 925, 939, 940, + 941, 942, 943, 944, 926, 927, 945, 946, 947, 948, + + 1744, 954, 951, 949, 928, 929, 930, 955, 931, 932, + 933, 934, 956, 935, 936, 277, 937, 938, 957, 939, + 940, 941, 942, 943, 944, 958, 959, 945, 946, 947, + 948, 277, 954, 951, 949, 960, 961, 962, 955, 963, + 964, 965, 966, 956, 967, 968, 970, 969, 971, 957, + 972, 973, 975, 976, 974, 977, 958, 959, 978, 979, + 980, 981, 982, 983, 984, 987, 960, 961, 962, 988, + 963, 964, 965, 966, 989, 967, 968, 970, 969, 971, + 990, 972, 973, 975, 976, 974, 977, 985, 986, 978, + 979, 980, 981, 982, 983, 984, 987, 991, 992, 993, + + 988, 994, 995, 996, 997, 989, 998, 999, 1744, 1005, + 1006, 990, 1744, 1744, 1007, 1008, 1009, 1010, 985, 986, + 1011, 1012, 1013, 1019, 1020, 1744, 1000, 1021, 991, 992, + 993, 1744, 994, 995, 996, 997, 1001, 998, 999, 1002, + 1005, 1006, 1022, 1003, 1004, 1007, 1008, 1009, 1010, 1023, + 1024, 1011, 1012, 1013, 1019, 1020, 1014, 1000, 1021, 1015, + 1025, 1026, 1016, 1027, 1028, 1029, 1017, 1001, 1030, 1031, + 1002, 1018, 1032, 1022, 1003, 1004, 1033, 1034, 1035, 1036, + 1023, 1024, 1037, 1038, 1039, 1040, 1041, 1014, 1042, 1043, + 1015, 1025, 1026, 1016, 1027, 1028, 1029, 1017, 1044, 1030, + + 1031, 1045, 1018, 1032, 1046, 1047, 1048, 1033, 1034, 1035, + 1036, 1049, 1050, 1037, 1038, 1039, 1040, 1041, 1051, 1042, + 1043, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1044, + 1060, 1061, 1045, 1062, 1063, 1046, 1047, 1048, 1064, 1065, + 1066, 1067, 1049, 1050, 1068, 1069, 1070, 1071, 1072, 1051, + 1075, 1073, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1074, 1060, 1061, 1076, 1062, 1063, 1077, 1078, 1081, 1064, + 1065, 1066, 1067, 1079, 1082, 1068, 1069, 1070, 1071, 1072, + 1080, 1075, 1073, 1083, 1084, 1085, 1086, 1087, 1088, 1092, + 1089, 1074, 1090, 1093, 1076, 1094, 1095, 1077, 1078, 1081, + + 1096, 1097, 1098, 1099, 1079, 1082, 1100, 1101, 1091, 1102, + 1103, 1080, 1106, 1107, 1083, 1084, 1085, 1086, 1087, 1088, + 1092, 1089, 1104, 1090, 1093, 1108, 1094, 1095, 1105, 1110, + 1111, 1096, 1097, 1098, 1099, 1109, 1112, 1100, 1101, 1091, + 1102, 1103, 1113, 1106, 1107, 1114, 1115, 1116, 1117, 1118, + 1119, 1120, 1121, 1104, 1122, 1123, 1108, 1124, 1125, 1105, + 1110, 1111, 1126, 1127, 1128, 1129, 1109, 1112, 1130, 1131, + 1132, 1133, 1134, 1113, 1135, 1136, 1114, 1115, 1116, 1117, + 1118, 1119, 1120, 1121, 1137, 1122, 1123, 1138, 1124, 1125, + 1139, 1140, 1141, 1126, 1127, 1128, 1129, 1744, 1143, 1130, + + 1131, 1132, 1133, 1134, 1144, 1135, 1136, 952, 1146, 1145, + 1147, 1148, 1149, 1150, 1151, 1137, 1152, 1153, 1138, 1154, + 1155, 1139, 1140, 1141, 277, 1156, 1157, 1158, 277, 1143, + 1159, 1160, 1161, 1162, 1163, 1144, 1164, 1165, 1166, 1146, + 1167, 1147, 1148, 1149, 1150, 1151, 1168, 1152, 1153, 1169, + 1154, 1155, 1170, 1171, 1172, 1173, 1156, 1157, 1158, 1174, + 1175, 1159, 1160, 1161, 1162, 1163, 1176, 1164, 1165, 1166, + 1177, 1167, 1178, 1179, 1180, 1181, 1182, 1168, 1183, 1184, + 1169, 1185, 1186, 1170, 1171, 1172, 1173, 1187, 1188, 1189, + 1174, 1175, 1190, 1191, 1192, 1193, 1194, 1176, 1197, 1198, + + 1195, 1177, 1199, 1178, 1179, 1180, 1181, 1182, 1196, 1183, + 1184, 1200, 1185, 1186, 1201, 1202, 1203, 1204, 1187, 1188, + 1189, 1205, 1206, 1190, 1191, 1192, 1193, 1194, 1207, 1197, + 1198, 1195, 1208, 1199, 1209, 1210, 1211, 1212, 1213, 1196, + 1214, 1215, 1200, 1216, 1217, 1201, 1202, 1203, 1204, 1218, + 1219, 1220, 1205, 1206, 1221, 1222, 1223, 1224, 1225, 1207, + 1226, 1227, 1228, 1208, 1229, 1209, 1210, 1211, 1212, 1213, + 1230, 1214, 1215, 1232, 1216, 1217, 1233, 1234, 1235, 1236, + 1218, 1219, 1220, 1237, 1238, 1221, 1222, 1223, 1224, 1225, + 1239, 1226, 1227, 1228, 1240, 1229, 1241, 1242, 1243, 1244, + + 1245, 1230, 1246, 1247, 1232, 1248, 1249, 1233, 1234, 1235, + 1236, 1250, 1251, 1252, 1237, 1238, 1253, 1254, 1255, 1256, + 1257, 1239, 1258, 1259, 1260, 1240, 1263, 1241, 1242, 1243, + 1244, 1245, 1264, 1246, 1247, 1265, 1248, 1249, 1266, 1267, + 1261, 1268, 1250, 1251, 1252, 1269, 1270, 1253, 1254, 1255, + 1256, 1257, 1271, 1258, 1259, 1260, 1262, 1263, 1272, 1273, + 1274, 1275, 1276, 1264, 1277, 1278, 1265, 1279, 1280, 1266, + 1267, 1261, 1268, 1281, 1282, 1283, 1269, 1270, 1284, 1285, + 1286, 1287, 1288, 1271, 1289, 1290, 1291, 1262, 1292, 1272, + 1273, 1274, 1275, 1276, 1293, 1277, 1278, 1294, 1279, 1280, + + 1295, 1296, 1297, 1298, 1281, 1282, 1283, 1299, 1303, 1284, + 1285, 1286, 1287, 1288, 1300, 1289, 1290, 1291, 1301, 1292, + 1304, 1305, 1306, 1307, 1308, 1293, 1309, 1310, 1294, 1311, + 1312, 1295, 1296, 1297, 1298, 1313, 1314, 1315, 1299, 1303, + 277, 1316, 277, 1317, 1318, 1300, 1319, 1320, 1321, 1301, + 1322, 1304, 1305, 1306, 1307, 1308, 1323, 1309, 1310, 1324, + 1311, 1312, 1325, 1326, 1327, 1328, 1313, 1314, 1315, 1329, + 1330, 1331, 1316, 1332, 1317, 1318, 1333, 1319, 1320, 1321, + 1334, 1322, 1335, 1336, 1337, 1338, 1339, 1323, 1340, 1341, + 1324, 1342, 1343, 1325, 1326, 1327, 1328, 1344, 1345, 1346, + + 1329, 1330, 1331, 1347, 1332, 1348, 1349, 1333, 1350, 1351, + 1352, 1334, 1353, 1335, 1336, 1337, 1338, 1339, 1354, 1340, + 1341, 1355, 1342, 1343, 1356, 1357, 1358, 1359, 1344, 1345, + 1346, 1360, 1361, 1362, 1347, 1363, 1348, 1349, 1364, 1350, + 1351, 1352, 1365, 1353, 1366, 1367, 1368, 1369, 1370, 1354, + 1371, 1372, 1355, 1375, 1376, 1356, 1357, 1358, 1359, 1373, + 1378, 1374, 1360, 1361, 1362, 1379, 1363, 1380, 1381, 1364, + 1382, 1383, 1384, 1365, 1377, 1366, 1367, 1368, 1369, 1370, + 1385, 1371, 1372, 1386, 1375, 1376, 1387, 1388, 1389, 1390, + 1373, 1378, 1374, 1391, 1392, 1393, 1379, 1394, 1380, 1381, + + 1395, 1382, 1383, 1384, 1396, 1377, 1397, 1398, 1399, 1400, + 1401, 1385, 1402, 1403, 1386, 1404, 1405, 1387, 1388, 1389, + 1390, 1406, 1408, 1407, 1391, 1392, 1393, 1409, 1394, 1410, + 1411, 1395, 1412, 1413, 1414, 1396, 1415, 1397, 1398, 1399, + 1400, 1401, 1416, 1402, 1403, 1417, 1404, 1405, 1418, 1419, + 1420, 1421, 1406, 1408, 1407, 1422, 1423, 1424, 1409, 1425, + 1410, 1411, 1426, 1412, 1413, 1414, 1427, 1415, 1428, 1429, + 1430, 1431, 1432, 1416, 1433, 1434, 1417, 1435, 1436, 1418, + 1419, 1420, 1421, 1437, 1438, 1439, 1422, 1423, 1424, 1440, + 1425, 277, 1441, 1426, 1442, 1443, 277, 1427, 1444, 1428, + + 1429, 1430, 1431, 1432, 1445, 1433, 1434, 1446, 1435, 1436, + 1447, 1448, 1449, 1450, 1437, 1438, 1439, 1451, 1452, 1453, + 1440, 1454, 1455, 1441, 1456, 1442, 1443, 1457, 1458, 1444, + 1459, 1460, 1461, 1462, 1463, 1445, 1464, 1465, 1446, 1466, + 1467, 1447, 1448, 1449, 1450, 1468, 1469, 1470, 1451, 1452, + 1453, 1471, 1454, 1455, 1472, 1456, 1473, 1474, 1457, 1458, + 1475, 1459, 1460, 1461, 1462, 1463, 1476, 1464, 1465, 1477, + 1466, 1467, 1478, 1479, 1480, 1481, 1468, 1469, 1470, 1482, + 1483, 1484, 1471, 1485, 1486, 1472, 1487, 1473, 1474, 1488, + 1489, 1475, 1490, 1491, 1492, 1493, 1494, 1476, 1495, 1496, + + 1477, 1497, 1498, 1478, 1479, 1480, 1481, 1499, 1500, 1501, + 1482, 1483, 1484, 1502, 1485, 1486, 1503, 1487, 1504, 1505, + 1488, 1489, 1506, 1490, 1491, 1492, 1493, 1494, 1507, 1495, + 1496, 1508, 1497, 1498, 1509, 1510, 1511, 1512, 1499, 1500, + 1501, 1513, 1514, 1515, 1502, 1516, 1517, 1503, 1518, 1504, + 1505, 1519, 1520, 1506, 1521, 1522, 1523, 1524, 1525, 1507, + 1526, 1527, 1508, 1528, 1529, 1509, 1510, 1511, 1512, 1530, + 1531, 1532, 1513, 1514, 1515, 1535, 1516, 1517, 1536, 1518, + 1533, 1534, 1519, 1520, 1537, 1521, 1522, 1523, 1524, 1525, + 1538, 1526, 1527, 1539, 1528, 1529, 1540, 277, 277, 1541, + + 1530, 1531, 1532, 1542, 1543, 1544, 1535, 1545, 1546, 1536, + 1547, 1533, 1534, 1548, 1549, 1537, 1550, 1551, 1552, 1553, + 1554, 1538, 1555, 1556, 1539, 1557, 1558, 1540, 1559, 1560, + 1541, 1561, 1562, 1563, 1542, 1543, 1544, 1564, 1545, 1546, + 1565, 1547, 1566, 1567, 1548, 1549, 1568, 1550, 1551, 1552, + 1553, 1554, 1569, 1555, 1556, 1570, 1557, 1558, 1571, 1559, + 1560, 1572, 1561, 1562, 1563, 1573, 1574, 1575, 1564, 1576, + 1577, 1565, 1578, 1566, 1567, 1579, 1580, 1568, 1581, 1582, + 1583, 1584, 1585, 1569, 1586, 1587, 1570, 1588, 1589, 1571, + 1590, 1591, 1572, 1592, 1593, 1594, 1573, 1574, 1575, 1595, + + 1576, 1577, 1596, 1578, 1597, 1598, 1579, 1580, 1599, 1581, + 1582, 1583, 1584, 1585, 1600, 1586, 1587, 1601, 1588, 1589, + 1602, 1590, 1591, 1603, 1592, 1593, 1594, 1604, 1605, 1606, + 1595, 1607, 1608, 1596, 1609, 1597, 1598, 1610, 1611, 1599, + 1612, 1613, 1614, 1615, 1616, 1600, 1618, 1619, 1601, 1617, + 277, 1602, 1620, 1621, 1603, 277, 1622, 1623, 1604, 1605, + 1606, 1624, 1607, 1608, 1625, 1609, 1626, 1627, 1610, 1611, + 1628, 1612, 1613, 1614, 1615, 1616, 1629, 1618, 1619, 1630, + 1617, 1631, 1632, 1620, 1621, 1633, 1634, 1622, 1623, 1635, + 1636, 1637, 1624, 1638, 1639, 1625, 1640, 1626, 1627, 1641, + + 1642, 1628, 1643, 1644, 1645, 1646, 1647, 1629, 1648, 1649, + 1630, 1650, 1631, 1632, 1651, 1652, 1633, 1634, 1653, 1654, + 1635, 1636, 1637, 1655, 1638, 1639, 1656, 1640, 1657, 1658, + 1641, 1642, 1660, 1643, 1644, 1645, 1646, 1647, 1659, 1648, + 1649, 1661, 1650, 1662, 1663, 1651, 1652, 1664, 277, 1653, + 1654, 1665, 277, 1666, 1655, 1667, 1668, 1656, 1669, 1657, + 1658, 1670, 1671, 1660, 1672, 1673, 1674, 1675, 1676, 1659, + 1677, 1678, 1661, 1679, 1662, 1663, 1680, 1681, 1664, 1682, + 1683, 1684, 1665, 1685, 1666, 1686, 1667, 1668, 1687, 1669, + 1688, 1690, 1670, 1671, 277, 1672, 1673, 1674, 1675, 1676, + + 1689, 1677, 1678, 1691, 1679, 1692, 1693, 1680, 1681, 1694, + 1682, 1683, 1684, 1695, 1685, 1696, 1686, 1697, 1698, 1687, + 277, 1688, 1690, 1699, 1700, 1701, 1702, 1703, 1704, 1705, + 1706, 1689, 1707, 1708, 1691, 1709, 1692, 1693, 1710, 1711, + 1694, 1712, 277, 1713, 1695, 1714, 1696, 1715, 1697, 1698, + 1716, 1717, 1718, 1719, 1699, 1700, 1701, 1702, 1703, 1704, + 1705, 1706, 1720, 1707, 1708, 277, 1709, 1721, 1722, 1710, + 1711, 1723, 1712, 1724, 1713, 1727, 1714, 1725, 1715, 1728, + 1729, 1716, 1717, 1718, 1719, 1730, 1731, 1732, 1733, 1735, + 1736, 1737, 1738, 1720, 1739, 1740, 1741, 1742, 1721, 1722, + + 1743, 277, 1723, 1744, 1724, 1744, 1727, 1744, 1725, 1744, + 1728, 1729, 1744, 1744, 1744, 1744, 1730, 1731, 1732, 1733, + 1735, 1736, 1737, 1738, 1744, 1739, 1740, 1741, 1742, 1744, + 1744, 1743, 87, 87, 87, 87, 87, 91, 91, 91, + 91, 91, 95, 95, 95, 95, 95, 104, 1744, 104, + 104, 104, 105, 1744, 105, 105, 105, 114, 114, 114, + 114, 114, 222, 222, 222, 222, 222, 224, 1744, 224, + 224, 224, 273, 273, 273, 273, 273, 278, 278, 278, + 278, 278, 282, 282, 282, 282, 282, 284, 284, 284, + 284, 284, 285, 285, 1744, 285, 285, 289, 1744, 289, + + 1744, 289, 301, 301, 301, 301, 301, 303, 303, 303, + 303, 303, 306, 306, 306, 306, 306, 463, 463, 463, + 463, 463, 466, 466, 466, 466, 466, 511, 511, 511, + 511, 511, 514, 1744, 514, 514, 514, 305, 305, 305, + 305, 305, 104, 1744, 104, 104, 104, 740, 740, 740, + 740, 740, 13, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744 } ; -static const flex_int16_t yy_chk[4072] = +static const flex_int16_t yy_chk[4040] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1742,70 +1741,70 @@ static const flex_int16_t yy_chk[4072] = 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 21, 21, 1742, 34, 40, 69, 72, 34, - 73, 21, 1717, 279, 23, 279, 23, 23, 234, 234, - 60, 60, 234, 234, 1704, 23, 24, 1137, 24, 60, - 1051, 77, 300, 300, 528, 24, 34, 40, 69, 72, + 11, 11, 21, 21, 1750, 34, 40, 69, 72, 34, + 73, 21, 1734, 279, 23, 279, 23, 23, 234, 234, + 60, 60, 234, 234, 1726, 23, 24, 1725, 24, 60, + 1712, 77, 300, 300, 1302, 24, 34, 40, 69, 72, 34, 73, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 24, 22, 24, 60, 22, 77, 22, 25, 37, 24, 31, 25, 80, 27, 31, 25, 27, 27, 31, 28, 28, 28, 37, 79, 25, 28, 79, 25, 45, 81, 27, 28, 45, - 22, 22, 22, 465, 22, 25, 37, 463, 31, 25, + 22, 22, 22, 1145, 22, 25, 37, 1144, 31, 25, 80, 27, 31, 25, 27, 27, 31, 28, 28, 28, 37, 79, 25, 28, 79, 25, 45, 81, 27, 28, 45, 22, 22, 22, 22, 22, 22, 22, 22, 26, - 92, 26, 29, 403, 26, 26, 29, 93, 26, 301, - 29, 26, 284, 29, 26, 26, 29, 30, 65, 29, - 282, 30, 65, 236, 236, 30, 278, 236, 236, 273, + 92, 26, 29, 1058, 26, 26, 29, 93, 26, 953, + 29, 26, 739, 29, 26, 26, 29, 30, 65, 29, + 701, 30, 65, 236, 236, 30, 700, 236, 236, 531, 26, 92, 26, 29, 30, 26, 26, 29, 93, 26, 94, 29, 26, 94, 29, 26, 26, 29, 30, 65, 29, 32, 30, 65, 36, 35, 30, 35, 36, 35, 32, 32, 36, 35, 66, 30, 35, 32, 99, 38, - 38, 100, 35, 101, 36, 230, 102, 38, 36, 38, - 66, 38, 32, 94, 38, 36, 35, 464, 35, 36, - 35, 32, 32, 36, 35, 66, 228, 35, 32, 99, + 38, 100, 35, 101, 36, 513, 102, 38, 36, 38, + 66, 38, 32, 94, 38, 36, 35, 228, 35, 36, + 35, 32, 32, 36, 35, 66, 467, 35, 32, 99, 38, 38, 100, 35, 101, 36, 67, 102, 38, 36, 38, 66, 38, 39, 41, 38, 67, 39, 41, 67, - 118, 39, 41, 44, 39, 120, 122, 39, 41, 226, - 39, 464, 44, 225, 44, 310, 310, 67, 44, 224, - 44, 466, 44, 222, 39, 41, 124, 67, 39, 41, + 118, 39, 41, 44, 39, 120, 122, 39, 41, 464, + 39, 228, 44, 403, 44, 310, 310, 67, 44, 301, + 44, 230, 44, 284, 39, 41, 124, 67, 39, 41, 67, 118, 39, 41, 44, 39, 120, 122, 39, 41, 71, 39, 42, 44, 42, 44, 43, 42, 42, 44, - 43, 44, 42, 44, 43, 71, 42, 124, 112, 42, - 43, 42, 466, 43, 42, 61, 106, 61, 61, 305, - 43, 71, 509, 42, 509, 42, 61, 43, 42, 42, - 68, 43, 305, 42, 68, 43, 71, 42, 105, 75, + 43, 44, 42, 44, 43, 71, 42, 124, 282, 42, + 43, 42, 230, 43, 42, 61, 278, 61, 61, 305, + 43, 71, 463, 42, 277, 42, 61, 43, 42, 42, + 68, 43, 305, 42, 68, 43, 71, 42, 465, 75, 42, 43, 42, 74, 43, 42, 46, 46, 68, 75, 46, 43, 46, 74, 46, 70, 78, 61, 74, 46, - 78, 68, 121, 70, 76, 68, 98, 76, 76, 123, - 75, 97, 70, 121, 74, 123, 90, 46, 46, 68, - 75, 46, 89, 46, 74, 46, 70, 78, 85, 74, + 78, 68, 121, 70, 76, 68, 463, 76, 76, 123, + 75, 273, 70, 121, 74, 123, 226, 46, 46, 68, + 75, 46, 465, 46, 74, 46, 70, 78, 225, 74, 46, 78, 82, 121, 70, 76, 107, 107, 76, 76, 123, 82, 125, 70, 121, 107, 123, 82, 108, 127, 108, 108, 110, 110, 128, 129, 125, 82, 133, 108, - 134, 110, 84, 82, 297, 297, 116, 116, 297, 297, - 311, 311, 82, 125, 64, 116, 107, 58, 82, 136, - 127, 467, 467, 136, 137, 128, 129, 125, 57, 133, + 134, 110, 224, 82, 297, 297, 116, 116, 297, 297, + 311, 311, 82, 125, 222, 116, 107, 112, 82, 136, + 127, 469, 469, 136, 137, 128, 129, 125, 106, 133, 108, 134, 110, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 116, 130, 114, 56, + 114, 114, 114, 114, 114, 114, 116, 130, 114, 105, 136, 114, 119, 114, 136, 137, 119, 131, 131, 131, 138, 139, 141, 119, 140, 140, 142, 130, 143, 119, 142, 145, 144, 146, 148, 139, 144, 149, 130, 150, - 114, 114, 114, 119, 114, 468, 468, 119, 131, 131, + 114, 114, 114, 119, 114, 470, 470, 119, 131, 131, 131, 138, 139, 141, 119, 140, 140, 142, 130, 143, - 119, 142, 145, 144, 146, 148, 139, 144, 149, 55, + 119, 142, 145, 144, 146, 148, 139, 144, 149, 98, 150, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, - 115, 115, 151, 153, 115, 471, 471, 115, 147, 115, + 115, 115, 151, 153, 115, 473, 473, 115, 147, 115, 147, 147, 152, 154, 147, 155, 156, 157, 158, 158, - 152, 159, 160, 161, 158, 162, 152, 472, 472, 166, - 161, 172, 50, 151, 153, 158, 115, 115, 115, 147, + 152, 159, 160, 161, 158, 162, 152, 474, 474, 166, + 161, 172, 97, 151, 153, 158, 115, 115, 115, 147, 115, 147, 147, 152, 154, 147, 155, 156, 157, 158, 158, 152, 159, 160, 161, 158, 162, 152, 165, 163, @@ -1815,18 +1814,18 @@ static const flex_int16_t yy_chk[4072] = 163, 174, 175, 171, 165, 165, 170, 176, 177, 178, 179, 180, 181, 182, 183, 182, 163, 169, 163, 169, 169, 173, 170, 163, 174, 169, 171, 171, 171, 175, - 184, 185, 174, 175, 171, 188, 191, 49, 176, 177, + 184, 185, 174, 175, 171, 188, 191, 90, 176, 177, 178, 179, 180, 181, 182, 183, 182, 186, 187, 192, 186, 189, 193, 194, 187, 195, 189, 186, 190, 190, - 48, 184, 185, 197, 190, 198, 188, 191, 190, 190, - 200, 190, 201, 19, 199, 202, 516, 516, 186, 187, + 89, 184, 185, 197, 190, 198, 188, 191, 190, 190, + 200, 190, 201, 85, 199, 202, 519, 519, 186, 187, 192, 186, 189, 193, 194, 187, 195, 189, 186, 190, 190, 196, 196, 205, 197, 190, 198, 203, 199, 190, 190, 200, 190, 201, 196, 199, 202, 204, 203, 204, 206, 207, 210, 212, 213, 204, 214, 215, 206, 216, 217, 218, 196, 196, 205, 219, 220, 221, 203, 199, - 206, 13, 510, 241, 510, 196, 242, 0, 204, 203, + 206, 84, 511, 241, 511, 196, 242, 64, 204, 203, 204, 206, 207, 210, 212, 213, 204, 214, 215, 206, 216, 217, 218, 231, 231, 243, 219, 220, 221, 233, @@ -1837,33 +1836,33 @@ static const flex_int16_t yy_chk[4072] = 257, 268, 244, 245, 247, 232, 246, 246, 248, 235, 249, 250, 251, 252, 253, 254, 255, 270, 258, 259, 257, 260, 262, 249, 271, 257, 264, 265, 266, 267, - 272, 257, 268, 269, 274, 269, 0, 276, 292, 275, - 309, 309, 294, 0, 309, 309, 521, 521, 270, 0, + 272, 257, 268, 269, 274, 269, 58, 276, 292, 275, + 309, 309, 294, 57, 309, 309, 56, 512, 270, 512, - 296, 296, 522, 522, 295, 271, 302, 304, 276, 296, - 0, 272, 274, 312, 269, 274, 269, 275, 276, 292, + 296, 296, 524, 524, 295, 271, 302, 304, 276, 296, + 55, 272, 274, 312, 269, 274, 269, 275, 276, 292, 275, 291, 291, 294, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 293, 295, 313, 302, 304, 291, 296, 291, 308, 308, 312, 314, 315, 316, 317, 318, 319, 308, 293, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 293, 332, 313, 291, 291, - 291, 0, 291, 698, 698, 0, 314, 315, 316, 317, + 291, 50, 291, 525, 525, 49, 314, 315, 316, 317, 318, 319, 308, 293, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 0, 332, 335, 291, + 326, 327, 328, 329, 330, 331, 48, 332, 335, 291, 291, 291, 291, 291, 291, 291, 291, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, - 333, 336, 303, 699, 699, 303, 337, 303, 333, 335, + 333, 336, 303, 702, 702, 303, 337, 303, 333, 335, 338, 339, 340, 341, 333, 342, 344, 345, 346, 347, 348, 349, 350, 337, 351, 352, 353, 354, 356, 358, 350, 333, 336, 359, 303, 303, 303, 337, 303, 333, - 0, 338, 339, 340, 341, 333, 342, 344, 345, 346, + 19, 338, 339, 340, 341, 333, 342, 344, 345, 346, 347, 348, 349, 350, 337, 351, 352, 353, 354, 356, - 358, 350, 0, 360, 359, 303, 303, 303, 303, 303, + 358, 350, 13, 360, 359, 303, 303, 303, 303, 303, 303, 303, 303, 306, 306, 306, 306, 306, 306, 306, - 306, 306, 306, 306, 306, 306, 355, 361, 306, 733, - 733, 306, 362, 306, 360, 363, 355, 364, 365, 367, + 306, 306, 306, 306, 306, 306, 355, 361, 306, 703, + 703, 306, 362, 306, 360, 363, 355, 364, 365, 367, 368, 369, 370, 371, 368, 372, 373, 374, 376, 375, 377, 378, 379, 380, 381, 382, 383, 355, 361, 375, 306, 306, 306, 362, 306, 0, 363, 355, 364, 365, @@ -1871,7 +1870,7 @@ static const flex_int16_t yy_chk[4072] = 375, 377, 378, 379, 380, 381, 382, 383, 0, 384, 375, 306, 306, 306, 306, 306, 306, 306, 306, 307, 307, 386, 307, 307, 307, 307, 307, 307, 307, 307, - 307, 307, 387, 389, 390, 944, 944, 307, 390, 307, + 307, 307, 387, 389, 390, 737, 737, 307, 390, 307, 384, 391, 392, 394, 395, 396, 397, 398, 307, 399, 400, 401, 386, 404, 405, 406, 407, 408, 409, 406, @@ -1881,8 +1880,8 @@ static const flex_int16_t yy_chk[4072] = 406, 410, 411, 412, 413, 415, 0, 307, 307, 307, 307, 307, 307, 307, 307, 388, 388, 0, 388, 414, 388, 388, 417, 388, 410, 418, 388, 419, 413, 388, - 414, 420, 410, 388, 388, 413, 415, 388, 0, 0, - 421, 0, 422, 0, 0, 423, 388, 388, 416, 388, + 414, 420, 410, 388, 388, 413, 415, 388, 0, 740, + 421, 740, 422, 949, 949, 423, 388, 388, 416, 388, 414, 388, 388, 417, 388, 416, 418, 388, 419, 413, 388, 414, 420, 424, 388, 388, 425, 426, 388, 393, @@ -1893,269 +1892,265 @@ static const flex_int16_t yy_chk[4072] = 444, 428, 429, 431, 430, 432, 433, 445, 393, 393, 434, 435, 393, 436, 437, 446, 430, 439, 447, 448, 440, 449, 450, 441, 451, 442, 453, 452, 443, 451, - 454, 444, 452, 455, 458, 461, 469, 469, 445, 470, - - 470, 473, 454, 470, 470, 469, 446, 474, 475, 447, - 448, 476, 449, 450, 477, 451, 478, 453, 452, 479, - 451, 454, 480, 452, 455, 458, 461, 481, 482, 483, - 484, 485, 473, 454, 486, 487, 469, 488, 474, 475, - 489, 490, 476, 491, 492, 477, 493, 478, 494, 496, - 479, 497, 498, 480, 499, 500, 501, 502, 481, 482, - 483, 484, 485, 503, 504, 486, 487, 505, 488, 506, - 0, 489, 490, 508, 491, 492, 507, 493, 506, 494, - 496, 511, 497, 498, 512, 499, 500, 501, 502, 507, - 514, 515, 519, 520, 503, 504, 523, 524, 505, 525, - - 506, 508, 526, 527, 508, 529, 530, 507, 531, 532, - 533, 534, 511, 535, 537, 512, 538, 539, 540, 541, - 542, 514, 515, 519, 520, 544, 545, 523, 524, 543, - 525, 546, 547, 526, 527, 538, 529, 530, 543, 531, - 532, 533, 534, 548, 535, 537, 549, 538, 539, 540, - 541, 542, 550, 551, 552, 553, 544, 545, 554, 555, - 543, 556, 546, 547, 557, 558, 538, 559, 560, 543, - 562, 563, 564, 565, 548, 566, 567, 549, 568, 569, - 571, 572, 573, 550, 551, 552, 553, 574, 575, 554, - 555, 576, 556, 577, 578, 557, 558, 579, 559, 560, - - 580, 562, 563, 564, 565, 581, 566, 567, 582, 568, - 569, 571, 572, 573, 583, 584, 585, 587, 574, 575, - 588, 590, 576, 589, 577, 578, 591, 592, 579, 593, - 589, 580, 594, 595, 597, 598, 581, 599, 601, 582, - 602, 603, 598, 604, 605, 583, 584, 585, 587, 606, - 607, 588, 590, 608, 589, 610, 611, 591, 592, 612, - 593, 589, 613, 594, 595, 597, 598, 614, 599, 601, - 609, 602, 603, 598, 604, 605, 609, 615, 616, 617, - 606, 607, 618, 619, 608, 620, 610, 611, 609, 621, - 612, 622, 624, 613, 623, 625, 626, 627, 614, 628, - - 623, 609, 630, 632, 634, 635, 636, 609, 615, 616, - 617, 633, 623, 618, 619, 633, 620, 637, 638, 609, - 621, 639, 622, 624, 640, 623, 625, 626, 627, 641, - 628, 623, 642, 630, 632, 634, 635, 636, 643, 644, - 645, 646, 633, 623, 647, 648, 633, 650, 637, 638, - 651, 649, 639, 652, 653, 640, 649, 654, 655, 656, - 641, 657, 658, 642, 659, 660, 661, 662, 663, 643, - 644, 645, 646, 664, 665, 647, 648, 666, 650, 667, - 668, 651, 649, 669, 652, 653, 670, 649, 654, 655, - 656, 671, 657, 658, 672, 659, 660, 661, 662, 663, - - 673, 674, 675, 676, 664, 665, 679, 681, 666, 677, - 667, 668, 682, 677, 669, 683, 679, 670, 684, 685, - 687, 688, 671, 689, 690, 672, 691, 692, 693, 694, - 695, 673, 674, 675, 676, 701, 702, 679, 681, 703, - 677, 704, 705, 682, 677, 706, 683, 679, 707, 684, - 685, 687, 688, 708, 689, 690, 709, 691, 692, 693, - 694, 695, 710, 711, 712, 713, 701, 702, 714, 715, - 703, 716, 704, 705, 717, 718, 706, 719, 720, 707, - 721, 722, 723, 724, 708, 725, 726, 709, 727, 728, - 730, 731, 0, 710, 711, 712, 713, 732, 736, 714, - - 715, 738, 716, 741, 743, 717, 718, 744, 719, 720, - 734, 721, 722, 723, 724, 746, 725, 726, 747, 727, - 728, 730, 731, 734, 749, 732, 750, 751, 732, 736, - 752, 753, 738, 754, 741, 743, 756, 757, 744, 757, - 758, 734, 759, 760, 761, 762, 746, 761, 763, 747, - 764, 765, 767, 768, 769, 749, 770, 750, 751, 773, - 775, 752, 753, 778, 754, 776, 776, 756, 757, 779, - 757, 758, 780, 759, 760, 761, 762, 781, 761, 763, - 782, 764, 765, 767, 768, 769, 783, 770, 784, 786, - 773, 775, 787, 789, 778, 790, 776, 776, 793, 794, - - 779, 0, 0, 780, 796, 797, 799, 800, 781, 802, - 803, 782, 804, 805, 806, 795, 0, 783, 809, 784, - 786, 811, 0, 787, 789, 795, 790, 812, 795, 793, - 794, 0, 795, 795, 813, 796, 797, 799, 800, 814, - 802, 803, 815, 804, 805, 806, 795, 807, 816, 809, - 807, 817, 811, 807, 818, 819, 795, 807, 812, 795, - 820, 821, 807, 795, 795, 813, 822, 823, 824, 825, - 814, 826, 827, 815, 828, 829, 830, 831, 807, 816, - 833, 807, 817, 834, 807, 818, 819, 835, 807, 836, - 837, 820, 821, 807, 838, 839, 840, 822, 823, 824, - - 825, 841, 826, 827, 842, 828, 829, 830, 831, 843, - 844, 833, 846, 848, 834, 849, 850, 851, 835, 852, - 836, 837, 853, 854, 855, 838, 839, 840, 856, 857, - 858, 859, 841, 860, 861, 842, 862, 863, 864, 865, - 843, 844, 866, 846, 848, 868, 849, 850, 851, 867, - 852, 869, 870, 853, 854, 855, 871, 873, 867, 856, - 857, 858, 859, 874, 860, 861, 875, 862, 863, 864, - 865, 872, 876, 866, 877, 878, 868, 879, 872, 880, - 867, 884, 869, 870, 885, 886, 887, 871, 873, 867, - 888, 889, 891, 883, 874, 883, 892, 875, 893, 894, - - 896, 897, 872, 876, 899, 877, 878, 898, 879, 872, - 880, 883, 884, 898, 901, 885, 886, 887, 902, 903, - 904, 888, 889, 891, 883, 907, 883, 892, 902, 893, - 894, 896, 897, 908, 909, 899, 910, 911, 898, 912, - 914, 915, 883, 916, 898, 901, 917, 918, 919, 902, - 903, 904, 920, 921, 922, 923, 907, 924, 926, 902, - 927, 928, 929, 931, 908, 909, 932, 910, 911, 933, - 912, 914, 915, 936, 916, 938, 939, 917, 918, 919, - 940, 941, 943, 920, 921, 922, 923, 947, 924, 926, - 945, 927, 928, 929, 931, 946, 948, 932, 949, 950, - - 933, 951, 952, 953, 936, 954, 938, 939, 956, 959, - 961, 940, 941, 943, 962, 963, 945, 964, 947, 946, - 965, 945, 967, 969, 970, 971, 946, 948, 972, 949, - 950, 973, 951, 952, 953, 975, 954, 976, 977, 956, - 959, 961, 978, 980, 982, 962, 963, 983, 964, 985, - 987, 965, 988, 967, 969, 970, 971, 989, 990, 972, - 993, 994, 973, 995, 996, 997, 975, 999, 976, 977, - 1000, 1001, 1002, 978, 980, 982, 1003, 1004, 983, 1005, - 985, 987, 1006, 988, 1007, 1008, 1009, 1011, 989, 990, - 1014, 993, 994, 1015, 995, 996, 997, 1010, 999, 1016, - - 1017, 1000, 1001, 1002, 1018, 1010, 1019, 1003, 1004, 1020, - 1005, 1021, 1022, 1006, 1023, 1007, 1008, 1009, 1011, 1024, - 1025, 1014, 1026, 1027, 1015, 1028, 1029, 1030, 1010, 1032, - 1016, 1017, 1034, 1035, 1036, 1018, 1010, 1019, 1037, 1038, - 1020, 1039, 1021, 1022, 1040, 1023, 1041, 1042, 1043, 1044, - 1024, 1025, 1045, 1026, 1027, 1046, 1028, 1029, 1030, 1047, - 1032, 1050, 1052, 1034, 1035, 1036, 1053, 1054, 1055, 1037, - 1038, 1056, 1039, 1057, 1058, 1040, 1063, 1041, 1042, 1043, - 1044, 1064, 1065, 1045, 1066, 1067, 1046, 1068, 1069, 1070, - 1047, 1071, 1050, 1052, 1072, 1073, 1074, 1053, 1054, 1055, - - 1075, 1076, 1056, 1078, 1057, 1058, 1079, 1063, 1080, 1081, - 1082, 1083, 1064, 1065, 1084, 1066, 1067, 1085, 1068, 1069, - 1070, 1087, 1071, 1090, 1093, 1072, 1073, 1074, 1086, 1094, - 1095, 1075, 1076, 1096, 1078, 1097, 1098, 1079, 1099, 1080, - 1081, 1082, 1083, 1100, 1086, 1084, 1101, 1102, 1085, 1103, - 1104, 1105, 1087, 1106, 1090, 1093, 1107, 1108, 1113, 1086, - 1094, 1095, 1114, 1115, 1096, 1116, 1097, 1098, 1117, 1099, - 1118, 1119, 1120, 1122, 1100, 1086, 1123, 1101, 1102, 1124, - 1103, 1104, 1105, 1125, 1106, 1126, 1127, 1107, 1108, 1113, - 1129, 1130, 1131, 1114, 1115, 1132, 1116, 1133, 1135, 1117, - - 1139, 1118, 1119, 1120, 1122, 1140, 1136, 1123, 1141, 1142, - 1124, 1143, 1144, 1145, 1125, 1146, 1126, 1127, 1147, 1148, - 1149, 1129, 1130, 1131, 1135, 1151, 1132, 1152, 1133, 1135, - 1136, 1139, 1153, 1154, 1156, 1158, 1140, 1136, 1160, 1141, - 1142, 1161, 1143, 1144, 1145, 1162, 1146, 1164, 1165, 1147, - 1148, 1149, 1167, 1168, 1169, 1170, 1151, 1171, 1152, 1172, - 1173, 1174, 1175, 1153, 1154, 1156, 1158, 1177, 1178, 1160, - 1179, 1180, 1161, 1182, 1183, 1184, 1162, 1185, 1164, 1165, - 1186, 1187, 1188, 1167, 1168, 1169, 1170, 1189, 1171, 1190, - 1172, 1173, 1174, 1175, 1192, 1193, 1195, 1196, 1177, 1178, - - 1197, 1179, 1180, 1198, 1182, 1183, 1184, 1199, 1185, 1200, - 1201, 1186, 1187, 1188, 1202, 1204, 1205, 1206, 1189, 1207, - 1190, 1208, 1210, 1211, 1212, 1192, 1193, 1195, 1196, 1213, - 1214, 1197, 1215, 1217, 1198, 1218, 1219, 1220, 1199, 1221, - 1200, 1201, 1223, 1225, 1223, 1202, 1204, 1205, 1206, 1226, - 1207, 1227, 1208, 1210, 1211, 1212, 1228, 1230, 1231, 1233, - 1213, 1214, 1235, 1215, 1217, 1236, 1218, 1219, 1220, 1226, - 1221, 1237, 1238, 1223, 1225, 1223, 1239, 1240, 1241, 1242, - 1226, 1243, 1227, 1244, 1245, 1246, 1247, 1228, 1230, 1231, - 1233, 1248, 1249, 1235, 1250, 1251, 1236, 1252, 1253, 1254, - - 1226, 1255, 1237, 1238, 1256, 1257, 1259, 1239, 1240, 1241, - 1242, 1258, 1243, 1258, 1244, 1245, 1246, 1247, 1260, 1261, - 1262, 1264, 1248, 1249, 1265, 1250, 1251, 1266, 1252, 1253, - 1254, 1267, 1255, 1268, 1271, 1256, 1257, 1259, 1272, 1273, - 1275, 1278, 1258, 1279, 1258, 1281, 1282, 1283, 1285, 1260, - 1261, 1262, 1264, 1286, 1287, 1265, 1288, 1289, 1266, 1290, - 0, 1296, 1267, 1293, 1268, 1271, 1297, 1292, 1298, 1272, - 1273, 1275, 1278, 1299, 1279, 1300, 1281, 1282, 1283, 1285, - 1293, 1302, 1303, 1304, 1286, 1287, 1305, 1288, 1289, 1306, - 1290, 1292, 1296, 1307, 1293, 1308, 1309, 1297, 1292, 1298, - - 1310, 1311, 1313, 1314, 1299, 1315, 1300, 1316, 1317, 1318, - 1319, 1321, 1302, 1303, 1304, 1322, 1323, 1305, 1324, 1326, - 1306, 1327, 1328, 1330, 1307, 1331, 1308, 1309, 1332, 1333, - 1334, 1310, 1311, 1313, 1314, 1335, 1315, 1336, 1316, 1317, - 1318, 1319, 1321, 1337, 1338, 1339, 1322, 1323, 1340, 1324, - 1326, 1341, 1327, 1328, 1330, 1342, 1331, 1343, 1344, 1332, - 1333, 1334, 1345, 1346, 1347, 1348, 1335, 1349, 1336, 1350, - 1354, 1355, 1356, 1357, 1337, 1338, 1339, 1358, 1359, 1340, - 1360, 1361, 1341, 1364, 1365, 1366, 1342, 1367, 1343, 1344, - 1368, 1369, 1370, 1345, 1346, 1347, 1348, 1372, 1349, 1373, - - 1350, 1354, 1355, 1356, 1357, 1375, 1376, 1378, 1358, 1359, - 1379, 1360, 1361, 1380, 1364, 1365, 1366, 1382, 1367, 1383, - 1384, 1368, 1369, 1370, 1385, 1386, 1388, 1390, 1372, 1391, - 1373, 1393, 1394, 1395, 1396, 1397, 1375, 1376, 1378, 1398, - 1399, 1379, 1402, 1404, 1380, 1405, 1406, 1410, 1382, 1411, - 1383, 1384, 1413, 1417, 1418, 1385, 1386, 1388, 1390, 1419, - 1391, 1421, 1393, 1394, 1395, 1396, 1397, 1422, 1426, 1424, - 1398, 1399, 1425, 1402, 1404, 1427, 1405, 1406, 1410, 1429, - 1411, 1431, 1433, 1413, 1417, 1418, 1424, 1435, 1436, 1425, - 1419, 1438, 1421, 1440, 1441, 1443, 1444, 1445, 1422, 1426, - - 1424, 1446, 1448, 1425, 1452, 1454, 1427, 1455, 1456, 1457, - 1429, 1458, 1431, 1433, 1460, 1461, 1462, 1463, 1435, 1436, - 1464, 1465, 1438, 1466, 1440, 1441, 1443, 1444, 1445, 1467, - 1468, 1469, 1446, 1448, 1470, 1452, 1454, 1472, 1455, 1456, - 1457, 1473, 1458, 1474, 1475, 1460, 1461, 1462, 1463, 1476, - 1477, 1464, 1465, 1478, 1466, 1479, 1480, 1481, 1482, 1483, - 1467, 1468, 1469, 1484, 1485, 1470, 1486, 1487, 1472, 1488, - 1489, 1490, 1473, 1491, 1474, 1475, 1492, 1493, 1494, 1495, - 1476, 1477, 1496, 1497, 1478, 1499, 1479, 1480, 1481, 1482, - 1483, 1501, 1502, 1503, 1484, 1485, 1504, 1486, 1487, 1505, - - 1488, 1489, 1490, 1506, 1491, 1507, 1511, 1492, 1493, 1494, - 1495, 1514, 1516, 1496, 1497, 1517, 1499, 1518, 1519, 1520, - 1521, 1522, 1501, 1502, 1503, 1523, 1527, 1504, 1525, 1526, - 1505, 1529, 1530, 1534, 1506, 1535, 1507, 1511, 1534, 1526, - 1539, 1540, 1514, 1516, 1543, 1525, 1517, 1547, 1518, 1519, - 1520, 1521, 1522, 1548, 1549, 1550, 1523, 1527, 1551, 1525, - 1526, 1552, 1529, 1530, 1534, 1555, 1535, 1556, 1557, 1534, - 1558, 1539, 1540, 1559, 1560, 1543, 1561, 1562, 1547, 1564, - 1565, 1566, 1567, 1568, 1548, 1549, 1550, 1569, 1570, 1551, - 1571, 1572, 1552, 1574, 1575, 1576, 1555, 1577, 1556, 1557, - - 1578, 1558, 1579, 1581, 1559, 1560, 1584, 1561, 1562, 1585, - 1564, 1565, 1566, 1567, 1568, 1587, 1591, 1593, 1569, 1570, - 1594, 1571, 1572, 1595, 1574, 1575, 1576, 1606, 1577, 1603, - 1604, 1578, 1607, 1579, 1581, 1608, 1609, 1584, 1610, 1603, - 1585, 1611, 1612, 1613, 1615, 1616, 1587, 1591, 1593, 1617, - 1604, 1594, 1618, 1619, 1595, 1624, 1625, 1626, 1606, 1629, - 1603, 1604, 1632, 1607, 1633, 1635, 1608, 1609, 1637, 1610, - 1638, 1639, 1611, 1612, 1613, 1615, 1616, 1640, 1643, 1646, - 1617, 1648, 1649, 1618, 1619, 1651, 1624, 1625, 1626, 1652, - 1629, 1653, 1652, 1632, 1655, 1633, 1635, 1656, 1657, 1637, - - 1659, 1638, 1639, 1660, 1661, 1651, 1662, 1663, 1640, 1643, - 1646, 1665, 1648, 1649, 1666, 1667, 1651, 1669, 1670, 1672, - 1652, 1673, 1653, 1677, 1678, 1655, 1679, 1680, 1656, 1657, - 1681, 1659, 1682, 1681, 1660, 1661, 1683, 1662, 1663, 1684, - 1685, 1689, 1665, 1690, 1692, 1666, 1667, 1693, 1669, 1670, - 1672, 1695, 1673, 1699, 1677, 1678, 1682, 1679, 1680, 1700, - 1701, 1681, 1702, 1682, 1703, 1705, 1706, 1683, 1708, 1709, - 1684, 1685, 1689, 1710, 1690, 1692, 1711, 1715, 1693, 1720, - 1721, 1722, 1695, 1725, 1699, 1727, 1728, 1729, 1703, 1732, - 1700, 1701, 1733, 1702, 0, 1703, 1705, 1706, 0, 1708, - - 1709, 0, 0, 0, 1710, 0, 0, 1711, 1715, 0, - 1720, 1721, 1722, 0, 1725, 0, 1727, 1728, 1729, 0, - 1732, 0, 0, 1733, 1737, 1737, 1737, 1737, 1737, 1737, - 1737, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1739, 1739, - 1739, 1739, 1739, 1739, 1739, 1740, 0, 1740, 1740, 1740, - 1740, 1740, 1741, 0, 1741, 1741, 1741, 1741, 1741, 1743, - 1743, 1743, 1743, 1743, 1743, 1743, 1744, 1744, 1744, 1744, - 1744, 1744, 1744, 1745, 0, 1745, 1745, 1745, 1745, 1745, - 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1747, 1747, 1747, - 1747, 1747, 1747, 1747, 1748, 1748, 1748, 1748, 1748, 1748, - - 1748, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1750, 1750, - 0, 0, 1750, 1750, 1751, 0, 1751, 1751, 0, 1751, - 1751, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1753, 1753, - 1753, 1753, 1753, 1753, 1753, 1754, 1754, 1754, 1754, 1754, - 1754, 1754, 1755, 1755, 0, 1755, 1755, 1755, 1755, 1756, - 1756, 1756, 0, 1756, 1756, 1756, 1757, 1757, 1757, 1757, - 1757, 1757, 1757, 1758, 0, 1758, 1758, 1758, 1758, 1758, - 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1760, 0, 1760, - 1760, 1760, 1760, 1760, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, - 1736 + 454, 444, 452, 455, 458, 461, 466, 468, 445, 471, + + 471, 0, 454, 475, 476, 477, 446, 0, 471, 447, + 448, 478, 449, 450, 479, 451, 480, 453, 452, 481, + 451, 454, 482, 452, 455, 458, 461, 472, 472, 483, + 484, 472, 472, 454, 475, 476, 477, 466, 468, 471, + 485, 486, 478, 487, 488, 479, 489, 480, 490, 491, + 481, 492, 493, 482, 494, 495, 496, 498, 499, 500, + 483, 484, 501, 502, 503, 504, 505, 506, 507, 508, + 514, 485, 486, 0, 487, 488, 515, 489, 508, 490, + 491, 510, 492, 493, 517, 494, 495, 496, 498, 499, + 500, 509, 518, 501, 502, 503, 504, 505, 506, 507, + + 508, 514, 522, 523, 509, 526, 527, 515, 528, 510, + 529, 530, 510, 532, 533, 517, 534, 535, 536, 537, + 538, 540, 509, 518, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 522, 523, 550, 526, 527, 546, 528, + 551, 529, 530, 541, 532, 533, 552, 534, 535, 536, + 537, 538, 540, 553, 554, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 555, 556, 550, 557, 558, 546, + 559, 551, 560, 561, 541, 562, 563, 552, 565, 566, + 567, 568, 569, 570, 553, 554, 571, 572, 574, 575, + 576, 577, 578, 579, 580, 555, 556, 581, 557, 558, + + 582, 559, 583, 560, 561, 584, 562, 563, 585, 565, + 566, 567, 568, 569, 570, 586, 587, 571, 572, 574, + 575, 576, 577, 578, 579, 580, 588, 590, 581, 591, + 592, 582, 593, 583, 594, 595, 584, 592, 596, 585, + 597, 598, 600, 601, 602, 604, 586, 587, 605, 606, + 601, 607, 608, 609, 610, 611, 0, 588, 590, 613, + 591, 592, 0, 593, 614, 594, 595, 615, 592, 596, + 616, 597, 598, 600, 601, 602, 604, 617, 618, 605, + 606, 601, 607, 608, 609, 610, 611, 612, 619, 620, + 613, 621, 622, 612, 623, 614, 624, 625, 615, 627, + + 628, 616, 629, 630, 631, 612, 633, 635, 617, 618, + 636, 626, 637, 638, 636, 639, 640, 626, 612, 619, + 620, 641, 621, 622, 612, 623, 642, 624, 625, 626, + 627, 628, 643, 629, 630, 631, 612, 633, 635, 644, + 645, 636, 626, 637, 638, 636, 639, 640, 626, 646, + 647, 648, 641, 649, 650, 651, 652, 642, 653, 654, + 626, 652, 655, 643, 656, 657, 658, 659, 660, 661, + 644, 645, 662, 663, 664, 665, 666, 667, 668, 669, + 646, 647, 648, 670, 649, 650, 651, 652, 671, 653, + 654, 672, 652, 655, 673, 656, 657, 658, 659, 660, + + 661, 674, 675, 662, 663, 664, 665, 666, 667, 668, + 669, 676, 677, 678, 670, 679, 680, 682, 684, 671, + 680, 685, 672, 686, 687, 673, 688, 682, 690, 691, + 692, 693, 674, 675, 694, 695, 696, 697, 698, 705, + 706, 707, 676, 677, 678, 708, 679, 680, 682, 684, + 709, 680, 685, 710, 686, 687, 711, 688, 682, 690, + 691, 692, 693, 712, 713, 694, 695, 696, 697, 698, + 705, 706, 707, 714, 715, 716, 708, 717, 718, 719, + 720, 709, 721, 722, 710, 723, 724, 711, 725, 726, + 727, 728, 729, 730, 712, 713, 731, 732, 734, 735, + + 0, 741, 738, 736, 714, 715, 716, 743, 717, 718, + 719, 720, 746, 721, 722, 738, 723, 724, 748, 725, + 726, 727, 728, 729, 730, 749, 751, 731, 732, 734, + 735, 736, 741, 738, 736, 752, 754, 755, 743, 756, + 757, 758, 759, 746, 761, 762, 763, 762, 764, 748, + 765, 766, 767, 768, 766, 769, 749, 751, 770, 772, + 773, 774, 775, 778, 780, 783, 752, 754, 755, 784, + 756, 757, 758, 759, 785, 761, 762, 763, 762, 764, + 786, 765, 766, 767, 768, 766, 769, 781, 781, 770, + 772, 773, 774, 775, 778, 780, 783, 787, 788, 789, + + 784, 791, 792, 794, 795, 785, 798, 799, 0, 801, + 802, 786, 0, 0, 804, 805, 807, 808, 781, 781, + 809, 810, 811, 814, 816, 0, 800, 817, 787, 788, + 789, 0, 791, 792, 794, 795, 800, 798, 799, 800, + 801, 802, 818, 800, 800, 804, 805, 807, 808, 819, + 820, 809, 810, 811, 814, 816, 812, 800, 817, 812, + 821, 822, 812, 823, 824, 825, 812, 800, 826, 827, + 800, 812, 828, 818, 800, 800, 829, 830, 831, 832, + 819, 820, 833, 834, 835, 836, 838, 812, 839, 840, + 812, 821, 822, 812, 823, 824, 825, 812, 841, 826, + + 827, 842, 812, 828, 843, 844, 845, 829, 830, 831, + 832, 846, 847, 833, 834, 835, 836, 838, 848, 839, + 840, 849, 851, 853, 854, 855, 856, 857, 858, 841, + 859, 860, 842, 861, 862, 843, 844, 845, 863, 864, + 865, 866, 846, 847, 867, 868, 869, 870, 871, 848, + 873, 872, 849, 851, 853, 854, 855, 856, 857, 858, + 872, 859, 860, 874, 861, 862, 875, 876, 878, 863, + 864, 865, 866, 877, 879, 867, 868, 869, 870, 871, + 877, 873, 872, 880, 881, 882, 883, 884, 885, 889, + 888, 872, 888, 890, 874, 891, 892, 875, 876, 878, + + 893, 894, 896, 897, 877, 879, 898, 899, 888, 901, + 902, 877, 904, 906, 880, 881, 882, 883, 884, 885, + 889, 888, 903, 888, 890, 907, 891, 892, 903, 908, + 909, 893, 894, 896, 897, 907, 912, 898, 899, 888, + 901, 902, 913, 904, 906, 914, 915, 916, 917, 919, + 920, 921, 922, 903, 923, 924, 907, 925, 926, 903, + 908, 909, 927, 928, 929, 931, 907, 912, 932, 933, + 934, 936, 937, 913, 938, 941, 914, 915, 916, 917, + 919, 920, 921, 922, 943, 923, 924, 944, 925, 926, + 945, 946, 948, 927, 928, 929, 931, 0, 950, 932, + + 933, 934, 936, 937, 951, 938, 941, 952, 954, 952, + 955, 956, 957, 958, 959, 943, 960, 961, 944, 963, + 966, 945, 946, 948, 950, 968, 969, 970, 951, 950, + 971, 972, 974, 976, 977, 951, 978, 979, 980, 954, + 982, 955, 956, 957, 958, 959, 983, 960, 961, 984, + 963, 966, 985, 987, 989, 990, 968, 969, 970, 992, + 994, 971, 972, 974, 976, 977, 995, 978, 979, 980, + 996, 982, 997, 1000, 1001, 1002, 1003, 983, 1004, 1006, + 984, 1007, 1008, 985, 987, 989, 990, 1009, 1010, 1011, + 992, 994, 1012, 1013, 1014, 1015, 1016, 995, 1018, 1021, + + 1017, 996, 1022, 997, 1000, 1001, 1002, 1003, 1017, 1004, + 1006, 1023, 1007, 1008, 1024, 1025, 1026, 1027, 1009, 1010, + 1011, 1028, 1029, 1012, 1013, 1014, 1015, 1016, 1030, 1018, + 1021, 1017, 1031, 1022, 1032, 1033, 1034, 1035, 1036, 1017, + 1037, 1039, 1023, 1041, 1042, 1024, 1025, 1026, 1027, 1043, + 1044, 1045, 1028, 1029, 1046, 1047, 1048, 1049, 1050, 1030, + 1051, 1052, 1053, 1031, 1054, 1032, 1033, 1034, 1035, 1036, + 1057, 1037, 1039, 1059, 1041, 1042, 1060, 1061, 1062, 1063, + 1043, 1044, 1045, 1064, 1065, 1046, 1047, 1048, 1049, 1050, + 1070, 1051, 1052, 1053, 1071, 1054, 1072, 1073, 1074, 1075, + + 1076, 1057, 1077, 1078, 1059, 1079, 1080, 1060, 1061, 1062, + 1063, 1081, 1082, 1083, 1064, 1065, 1085, 1086, 1087, 1088, + 1089, 1070, 1090, 1091, 1092, 1071, 1094, 1072, 1073, 1074, + 1075, 1076, 1097, 1077, 1078, 1100, 1079, 1080, 1101, 1102, + 1093, 1103, 1081, 1082, 1083, 1104, 1105, 1085, 1086, 1087, + 1088, 1089, 1106, 1090, 1091, 1092, 1093, 1094, 1107, 1108, + 1109, 1110, 1111, 1097, 1112, 1113, 1100, 1114, 1115, 1101, + 1102, 1093, 1103, 1120, 1121, 1122, 1104, 1105, 1123, 1124, + 1125, 1126, 1127, 1106, 1129, 1130, 1131, 1093, 1132, 1107, + 1108, 1109, 1110, 1111, 1133, 1112, 1113, 1134, 1114, 1115, + + 1136, 1137, 1138, 1139, 1120, 1121, 1122, 1140, 1147, 1123, + 1124, 1125, 1126, 1127, 1142, 1129, 1130, 1131, 1143, 1132, + 1148, 1149, 1150, 1151, 1152, 1133, 1153, 1154, 1134, 1155, + 1156, 1136, 1137, 1138, 1139, 1157, 1159, 1160, 1140, 1147, + 1142, 1161, 1143, 1162, 1164, 1142, 1166, 1168, 1169, 1143, + 1170, 1148, 1149, 1150, 1151, 1152, 1172, 1153, 1154, 1173, + 1155, 1156, 1175, 1176, 1177, 1178, 1157, 1159, 1160, 1179, + 1180, 1181, 1161, 1182, 1162, 1164, 1183, 1166, 1168, 1169, + 1185, 1170, 1186, 1187, 1188, 1190, 1191, 1172, 1192, 1193, + 1173, 1194, 1195, 1175, 1176, 1177, 1178, 1196, 1197, 1198, + + 1179, 1180, 1181, 1200, 1182, 1201, 1203, 1183, 1204, 1205, + 1206, 1185, 1207, 1186, 1187, 1188, 1190, 1191, 1208, 1192, + 1193, 1209, 1194, 1195, 1210, 1212, 1213, 1214, 1196, 1197, + 1198, 1215, 1216, 1218, 1200, 1219, 1201, 1203, 1220, 1204, + 1205, 1206, 1221, 1207, 1222, 1223, 1225, 1226, 1227, 1208, + 1228, 1229, 1209, 1233, 1234, 1210, 1212, 1213, 1214, 1231, + 1235, 1231, 1215, 1216, 1218, 1236, 1219, 1238, 1239, 1220, + 1241, 1243, 1244, 1221, 1234, 1222, 1223, 1225, 1226, 1227, + 1245, 1228, 1229, 1246, 1233, 1234, 1247, 1248, 1249, 1250, + 1231, 1235, 1231, 1251, 1252, 1253, 1236, 1254, 1238, 1239, + + 1255, 1241, 1243, 1244, 1256, 1234, 1257, 1258, 1259, 1260, + 1261, 1245, 1262, 1263, 1246, 1264, 1265, 1247, 1248, 1249, + 1250, 1266, 1267, 1266, 1251, 1252, 1253, 1268, 1254, 1269, + 1270, 1255, 1272, 1273, 1274, 1256, 1275, 1257, 1258, 1259, + 1260, 1261, 1276, 1262, 1263, 1279, 1264, 1265, 1280, 1281, + 1283, 1286, 1266, 1267, 1266, 1287, 1289, 1290, 1268, 1291, + 1269, 1270, 1293, 1272, 1273, 1274, 1294, 1275, 1295, 1296, + 1297, 1298, 1300, 1276, 1301, 1304, 1279, 1305, 1306, 1280, + 1281, 1283, 1286, 1307, 1308, 1310, 1287, 1289, 1290, 1311, + 1291, 1301, 1312, 1293, 1313, 1314, 1300, 1294, 1315, 1295, + + 1296, 1297, 1298, 1300, 1316, 1301, 1304, 1317, 1305, 1306, + 1318, 1319, 1321, 1322, 1307, 1308, 1310, 1323, 1324, 1325, + 1311, 1326, 1327, 1312, 1329, 1313, 1314, 1330, 1331, 1315, + 1332, 1334, 1335, 1336, 1338, 1316, 1339, 1340, 1317, 1341, + 1342, 1318, 1319, 1321, 1322, 1343, 1344, 1345, 1323, 1324, + 1325, 1346, 1326, 1327, 1347, 1329, 1348, 1349, 1330, 1331, + 1350, 1332, 1334, 1335, 1336, 1338, 1351, 1339, 1340, 1352, + 1341, 1342, 1353, 1354, 1355, 1356, 1343, 1344, 1345, 1357, + 1358, 1362, 1346, 1363, 1364, 1347, 1365, 1348, 1349, 1366, + 1367, 1350, 1368, 1369, 1372, 1373, 1374, 1351, 1375, 1376, + + 1352, 1377, 1378, 1353, 1354, 1355, 1356, 1380, 1381, 1383, + 1357, 1358, 1362, 1384, 1363, 1364, 1386, 1365, 1387, 1388, + 1366, 1367, 1390, 1368, 1369, 1372, 1373, 1374, 1391, 1375, + 1376, 1392, 1377, 1378, 1393, 1394, 1396, 1398, 1380, 1381, + 1383, 1399, 1401, 1402, 1384, 1403, 1404, 1386, 1405, 1387, + 1388, 1406, 1407, 1390, 1410, 1412, 1413, 1414, 1418, 1391, + 1419, 1421, 1392, 1425, 1426, 1393, 1394, 1396, 1398, 1427, + 1429, 1430, 1399, 1401, 1402, 1434, 1403, 1404, 1435, 1405, + 1432, 1433, 1406, 1407, 1437, 1410, 1412, 1413, 1414, 1418, + 1439, 1419, 1421, 1441, 1425, 1426, 1443, 1432, 1433, 1444, + + 1427, 1429, 1430, 1446, 1448, 1449, 1434, 1451, 1452, 1435, + 1453, 1432, 1433, 1454, 1456, 1437, 1460, 1462, 1463, 1464, + 1465, 1439, 1466, 1468, 1441, 1469, 1470, 1443, 1471, 1472, + 1444, 1473, 1474, 1475, 1446, 1448, 1449, 1476, 1451, 1452, + 1477, 1453, 1478, 1480, 1454, 1456, 1481, 1460, 1462, 1463, + 1464, 1465, 1482, 1466, 1468, 1483, 1469, 1470, 1484, 1471, + 1472, 1485, 1473, 1474, 1475, 1486, 1487, 1488, 1476, 1489, + 1490, 1477, 1491, 1478, 1480, 1492, 1493, 1481, 1494, 1495, + 1496, 1497, 1498, 1482, 1499, 1500, 1483, 1501, 1502, 1484, + 1503, 1504, 1485, 1505, 1507, 1509, 1486, 1487, 1488, 1510, + + 1489, 1490, 1511, 1491, 1512, 1513, 1492, 1493, 1514, 1494, + 1495, 1496, 1497, 1498, 1515, 1499, 1500, 1519, 1501, 1502, + 1522, 1503, 1504, 1524, 1505, 1507, 1509, 1525, 1526, 1527, + 1510, 1528, 1529, 1511, 1530, 1512, 1513, 1531, 1533, 1514, + 1534, 1535, 1537, 1538, 1542, 1515, 1543, 1547, 1519, 1542, + 1534, 1522, 1548, 1551, 1524, 1533, 1555, 1556, 1525, 1526, + 1527, 1557, 1528, 1529, 1558, 1530, 1559, 1560, 1531, 1533, + 1563, 1534, 1535, 1537, 1538, 1542, 1564, 1543, 1547, 1565, + 1542, 1566, 1567, 1548, 1551, 1568, 1569, 1555, 1556, 1570, + 1572, 1573, 1557, 1574, 1575, 1558, 1576, 1559, 1560, 1577, + + 1578, 1563, 1579, 1580, 1582, 1583, 1584, 1564, 1585, 1586, + 1565, 1587, 1566, 1567, 1589, 1592, 1568, 1569, 1593, 1595, + 1570, 1572, 1573, 1599, 1574, 1575, 1601, 1576, 1602, 1603, + 1577, 1578, 1612, 1579, 1580, 1582, 1583, 1584, 1611, 1585, + 1586, 1614, 1587, 1615, 1616, 1589, 1592, 1617, 1611, 1593, + 1595, 1618, 1612, 1619, 1599, 1620, 1621, 1601, 1623, 1602, + 1603, 1624, 1625, 1612, 1626, 1627, 1632, 1633, 1634, 1611, + 1637, 1640, 1614, 1641, 1615, 1616, 1643, 1645, 1617, 1646, + 1647, 1648, 1618, 1651, 1619, 1654, 1620, 1621, 1656, 1623, + 1657, 1660, 1624, 1625, 1660, 1626, 1627, 1632, 1633, 1634, + + 1659, 1637, 1640, 1661, 1641, 1663, 1664, 1643, 1645, 1665, + 1646, 1647, 1648, 1667, 1651, 1668, 1654, 1669, 1670, 1656, + 1659, 1657, 1660, 1671, 1673, 1674, 1675, 1677, 1678, 1680, + 1681, 1659, 1685, 1686, 1661, 1687, 1663, 1664, 1688, 1689, + 1665, 1690, 1689, 1691, 1667, 1692, 1668, 1693, 1669, 1670, + 1697, 1698, 1700, 1701, 1671, 1673, 1674, 1675, 1677, 1678, + 1680, 1681, 1703, 1685, 1686, 1690, 1687, 1707, 1708, 1688, + 1689, 1709, 1690, 1710, 1691, 1713, 1692, 1711, 1693, 1714, + 1716, 1697, 1698, 1700, 1701, 1717, 1718, 1719, 1723, 1728, + 1729, 1730, 1733, 1703, 1735, 1736, 1737, 1740, 1707, 1708, + + 1741, 1711, 1709, 0, 1710, 0, 1713, 0, 1711, 0, + 1714, 1716, 0, 0, 0, 0, 1717, 1718, 1719, 1723, + 1728, 1729, 1730, 1733, 0, 1735, 1736, 1737, 1740, 0, + 0, 1741, 1745, 1745, 1745, 1745, 1745, 1746, 1746, 1746, + 1746, 1746, 1747, 1747, 1747, 1747, 1747, 1748, 0, 1748, + 1748, 1748, 1749, 0, 1749, 1749, 1749, 1751, 1751, 1751, + 1751, 1751, 1752, 1752, 1752, 1752, 1752, 1753, 0, 1753, + 1753, 1753, 1754, 1754, 1754, 1754, 1754, 1755, 1755, 1755, + 1755, 1755, 1756, 1756, 1756, 1756, 1756, 1757, 1757, 1757, + 1757, 1757, 1758, 1758, 0, 1758, 1758, 1759, 0, 1759, + + 0, 1759, 1760, 1760, 1760, 1760, 1760, 1761, 1761, 1761, + 1761, 1761, 1762, 1762, 1762, 1762, 1762, 1763, 1763, 1763, + 1763, 1763, 1764, 1764, 1764, 1764, 1764, 1765, 1765, 1765, + 1765, 1765, 1766, 0, 1766, 1766, 1766, 1767, 1767, 1767, + 1767, 1767, 1768, 0, 1768, 1768, 1768, 1769, 1769, 1769, + 1769, 1769, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, + 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744 } ; static yy_state_type yy_last_accepting_state; @@ -2285,9 +2280,9 @@ int include_lineno[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; char path[MS_MAXPATHLEN]; -#line 2289 "src/maplexer.c" +#line 2283 "src/maplexer.c" -#line 2291 "src/maplexer.c" +#line 2285 "src/maplexer.c" #define INITIAL 0 #define EXPRESSION_STRING 1 @@ -2567,7 +2562,7 @@ YY_DECL break; } -#line 2571 "src/maplexer.c" +#line 2565 "src/maplexer.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2594,13 +2589,13 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1737 ) + if ( yy_current_state >= 1745 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_current_state != 1736 ); + while ( yy_current_state != 1744 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); @@ -4264,27 +4259,28 @@ YY_RULE_SETUP MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); + msStringUnescape(msyystring_buffer, ']'); return(MS_TOKEN_BINDING_DOUBLE); } YY_BREAK case 325: /* rule 325 can match eol */ YY_RULE_SETUP -#line 552 "src/maplexer.l" +#line 553 "src/maplexer.l" { /* attribute binding - string (single or double quotes) */ - msyytext+=2; - msyytext[msyyleng-2-2] = '\0'; + msyytext[msyyleng-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); - strcpy(msyystring_buffer, msyytext); + strcpy(msyystring_buffer, msyytext + 2); + msStringUnescape(msyystring_buffer, msyytext[0]); return(MS_TOKEN_BINDING_STRING); } YY_BREAK case 326: /* rule 326 can match eol */ YY_RULE_SETUP -#line 561 "src/maplexer.l" +#line 562 "src/maplexer.l" { /* attribute binding - time */ msyytext+=2; @@ -4292,12 +4288,13 @@ YY_RULE_SETUP MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); + msStringUnescape(msyystring_buffer, '`'); return(MS_TOKEN_BINDING_TIME); } YY_BREAK case 327: YY_RULE_SETUP -#line 571 "src/maplexer.l" +#line 573 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); @@ -4308,7 +4305,7 @@ YY_RULE_SETUP YY_BREAK case 328: YY_RULE_SETUP -#line 579 "src/maplexer.l" +#line 581 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); @@ -4320,7 +4317,7 @@ YY_RULE_SETUP case 329: /* rule 329 can match eol */ YY_RULE_SETUP -#line 587 "src/maplexer.l" +#line 589 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; @@ -4333,7 +4330,7 @@ YY_RULE_SETUP case 330: /* rule 330 can match eol */ YY_RULE_SETUP -#line 596 "src/maplexer.l" +#line 598 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-2] = '\0'; @@ -4346,7 +4343,7 @@ YY_RULE_SETUP case 331: /* rule 331 can match eol */ YY_RULE_SETUP -#line 605 "src/maplexer.l" +#line 607 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; @@ -4358,7 +4355,7 @@ YY_RULE_SETUP YY_BREAK case 332: YY_RULE_SETUP -#line 614 "src/maplexer.l" +#line 616 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; @@ -4370,7 +4367,7 @@ YY_RULE_SETUP YY_BREAK case 333: YY_RULE_SETUP -#line 623 "src/maplexer.l" +#line 625 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; @@ -4382,7 +4379,7 @@ YY_RULE_SETUP YY_BREAK case 334: YY_RULE_SETUP -#line 632 "src/maplexer.l" +#line 634 "src/maplexer.l" { msyystring_return_state = MS_STRING; msyystring_begin = msyytext[0]; @@ -4393,7 +4390,7 @@ YY_RULE_SETUP YY_BREAK case 335: YY_RULE_SETUP -#line 640 "src/maplexer.l" +#line 642 "src/maplexer.l" { if (msyystring_begin == msyytext[0]) { BEGIN(msyystring_begin_state); @@ -4422,7 +4419,7 @@ YY_RULE_SETUP YY_BREAK case 336: YY_RULE_SETUP -#line 666 "src/maplexer.l" +#line 668 "src/maplexer.l" { ++msyystring_size; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, @@ -4438,7 +4435,7 @@ YY_RULE_SETUP case 337: /* rule 337 can match eol */ YY_RULE_SETUP -#line 678 "src/maplexer.l" +#line 680 "src/maplexer.l" { int old_size = msyystring_size; msyystring_size += msyyleng; @@ -4450,7 +4447,7 @@ YY_RULE_SETUP case 338: /* rule 338 can match eol */ YY_RULE_SETUP -#line 686 "src/maplexer.l" +#line 688 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; @@ -4479,7 +4476,7 @@ YY_RULE_SETUP YY_BREAK case 339: YY_RULE_SETUP -#line 712 "src/maplexer.l" +#line 714 "src/maplexer.l" { msyystring_return_state = MS_TOKEN_LITERAL_STRING; msyystring_begin = msyytext[0]; @@ -4490,7 +4487,7 @@ YY_RULE_SETUP YY_BREAK case 340: YY_RULE_SETUP -#line 720 "src/maplexer.l" +#line 722 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); @@ -4501,12 +4498,12 @@ YY_RULE_SETUP case 341: /* rule 341 can match eol */ YY_RULE_SETUP -#line 727 "src/maplexer.l" +#line 729 "src/maplexer.l" { msyylineno++; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(CONFIG_FILE): -#line 729 "src/maplexer.l" +#line 731 "src/maplexer.l" { if( --include_stack_ptr < 0 ) return(EOF); /* end of main file */ @@ -4521,14 +4518,14 @@ case YY_STATE_EOF(CONFIG_FILE): case 342: /* rule 342 can match eol */ YY_RULE_SETUP -#line 740 "src/maplexer.l" +#line 742 "src/maplexer.l" { return(0); } YY_BREAK case 343: YY_RULE_SETUP -#line 744 "src/maplexer.l" +#line 746 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); @@ -4538,15 +4535,15 @@ YY_RULE_SETUP YY_BREAK case 344: YY_RULE_SETUP -#line 750 "src/maplexer.l" +#line 752 "src/maplexer.l" { return(msyytext[0]); } YY_BREAK case 345: YY_RULE_SETUP -#line 751 "src/maplexer.l" +#line 753 "src/maplexer.l" ECHO; YY_BREAK -#line 4550 "src/maplexer.c" +#line 4546 "src/maplexer.c" case YY_STATE_EOF(EXPRESSION_STRING): case YY_STATE_EOF(INCLUDE): case YY_STATE_EOF(MSSTRING): @@ -4847,7 +4844,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1737 ) + if ( yy_current_state >= 1745 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -4875,11 +4872,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1737 ) + if ( yy_current_state >= 1745 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 1736); + yy_is_jam = (yy_current_state == 1744); return yy_is_jam ? 0 : yy_current_state; } @@ -5555,7 +5552,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 751 "src/maplexer.l" +#line 753 "src/maplexer.l" /* diff --git a/src/maplexer.l b/src/maplexer.l index 8980475c8c..828425c891 100644 --- a/src/maplexer.l +++ b/src/maplexer.l @@ -539,31 +539,33 @@ char path[MS_MAXPATHLEN]; /* attribute binding - data cellsize */ return(MS_TOKEN_BINDING_DATA_CELLSIZE); } -\[[^\]]*\] { +\[(?:\]\]|[^\]])*\] { /* attribute binding - numeric (no quotes) */ msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); + msStringUnescape(msyystring_buffer, ']'); return(MS_TOKEN_BINDING_DOUBLE); } -\"\[[^\"]*\]\"|\'\[[^\']*\]\' { +\"\[(?:\"\"|[^\"])*\]\"|\'\[(?:\'\'|[^\'])*\]\' { /* attribute binding - string (single or double quotes) */ - msyytext+=2; - msyytext[msyyleng-2-2] = '\0'; + msyytext[msyyleng-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); - strcpy(msyystring_buffer, msyytext); + strcpy(msyystring_buffer, msyytext + 2); + msStringUnescape(msyystring_buffer, msyytext[0]); return(MS_TOKEN_BINDING_STRING); } -\`\[[^\`]*\]\` { +\`\[(?:\`\`|[^\`])*\]\` { /* attribute binding - time */ msyytext+=2; msyytext[msyyleng-2-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); + msStringUnescape(msyystring_buffer, '`'); return(MS_TOKEN_BINDING_TIME); } diff --git a/src/mapmssql2008.c b/src/mapmssql2008.c index 631731eacc..f87f88e46b 100644 --- a/src/mapmssql2008.c +++ b/src/mapmssql2008.c @@ -2486,7 +2486,7 @@ int msMSSQL2008LayerGetShapeRandom(layerObj *layer, shapeObj *shape, if (rc == SQL_ERROR || rc == SQL_SUCCESS_WITH_INFO) handleSQLError(layer); - if (retLen < (int)sizeof(oidBuffer)) { + if (retLen > 0 && retLen < (int)sizeof(oidBuffer)) { oidBuffer[retLen] = 0; record_oid = strtol(oidBuffer, NULL, 10); shape->index = record_oid; diff --git a/src/mapogcapi.cpp b/src/mapogcapi.cpp index b88ababf22..0f4ca3381c 100644 --- a/src/mapogcapi.cpp +++ b/src/mapogcapi.cpp @@ -625,7 +625,7 @@ static json getFeatureGeometry(shapeObj *shape, int precision, json polygon = json::array(); for (int i = 0; i < shape->numlines; i++) { if (i == k || - outerList[i] == + innerList[i] == MS_TRUE) { // add outer ring (k) and any inner rings json part = json::array(); for (int j = 0; j < shape->line[i].numpoints; j++) { @@ -1885,9 +1885,8 @@ static int processApiRequest(mapObj *map, cgiRequestObj *request, {"content", {{"application/json", {{"schema", - {{"$ref", "https://raw.githubusercontent.com/opengeospatial/" - "ogcapi-processes/master/core/openapi/schemas/" - "exception.yaml"}}}}}}}}; + {{"$ref", "https://schemas.opengis.net/ogcapi/common/part1/1.0/" + "openapi/schemas/exception.yaml"}}}}}}}}; json parameters; parameters["f"] = { diff --git a/src/mapogcfiltercommon.cpp b/src/mapogcfiltercommon.cpp index 7116707cb8..6e1d2dd971 100644 --- a/src/mapogcfiltercommon.cpp +++ b/src/mapogcfiltercommon.cpp @@ -34,6 +34,20 @@ #include +static std::string FLTEscapePropertyName(const char *pszStr, + char chEscapeChar) { + std::string ret; + for (; *pszStr; ++pszStr) { + if (*pszStr == chEscapeChar) { + ret += chEscapeChar; + ret += chEscapeChar; + } else { + ret += *pszStr; + } + } + return ret; +} + static std::string FLTGetIsLikeComparisonCommonExpression(FilterEncodingNode *psFilterNode) { /* From @@ -63,7 +77,7 @@ FLTGetIsLikeComparisonCommonExpression(FilterEncodingNode *psFilterNode) { std::string expr("(\"["); /* attribute */ - expr += psFilterNode->psLeftNode->pszValue; + expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue, '"'); /* #3521 */ if (bCaseInsensitive) @@ -177,7 +191,8 @@ FLTGetIsBetweenComparisonCommonExpresssion(FilterEncodingNode *psFilterNode, else expr += "(["; - expr += psFilterNode->psLeftNode->pszValue; + expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue, + bString ? '"' : ']'); if (bString) expr += "]\" "; @@ -268,7 +283,9 @@ FLTGetBinaryComparisonCommonExpression(FilterEncodingNode *psFilterNode, expr = "(\"["; else expr = "(["; - expr += psFilterNode->psLeftNode->pszValue; + + expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue, + bString ? '"' : ']'); if (bString) expr += "]\" "; @@ -543,13 +560,13 @@ FLTGetFeatureIdCommonExpression(FilterEncodingNode *psFilterNode, if (pszAttribute) { const auto tokens = msStringSplit(psFilterNode->pszValue, ','); if (!tokens.empty()) { + bool bString = false; for (size_t i = 0; i < tokens.size(); i++) { const char *pszId = tokens[i].c_str(); const char *pszDot = strrchr(pszId, '.'); if (pszDot) pszId = pszDot + 1; - bool bString = false; if (i == 0) { if (FLTIsNumeric(pszId) == MS_FALSE) bString = true; @@ -562,13 +579,13 @@ FLTGetFeatureIdCommonExpression(FilterEncodingNode *psFilterNode, if (bString) { expr += "(\"["; - expr += pszAttribute; + expr += FLTEscapePropertyName(pszAttribute, '"'); expr += "]\" == \""; expr += pszId; expr += "\")"; } else { expr += "(["; - expr += pszAttribute; + expr += FLTEscapePropertyName(pszAttribute, ']'); expr += "] == "; expr += pszId; expr += ")"; diff --git a/src/mapogr.cpp b/src/mapogr.cpp index c1f837f596..2c8c55f540 100644 --- a/src/mapogr.cpp +++ b/src/mapogr.cpp @@ -1981,7 +1981,7 @@ static char *msOGRGetToken(layerObj *layer, tokenListNodeObjPtr *node) { break; } case MS_TOKEN_BINDING_INTEGER: { - char *stresc = msOGRGetQuotedItem(layer, n->tokenval.bindval.item); + char *stresc = msLayerEscapePropertyName(layer, n->tokenval.bindval.item); nOutSize = strlen(stresc) + 20; out = (char *)msSmallMalloc(nOutSize); @@ -1989,15 +1989,15 @@ static char *msOGRGetToken(layerObj *layer, tokenListNodeObjPtr *node) { // Do not cast if the variable is of the appropriate type as it can // prevent using database indexes, such as for SQlite if (bIsNumeric) { - snprintf(out, nOutSize, "%s", stresc); + snprintf(out, nOutSize, "\"%s\"", stresc); } else { - snprintf(out, nOutSize, "CAST(%s AS integer)", stresc); + snprintf(out, nOutSize, "CAST(\"%s\" AS integer)", stresc); } msFree(stresc); break; } case MS_TOKEN_BINDING_STRING: { - char *stresc = msOGRGetQuotedItem(layer, n->tokenval.bindval.item); + char *stresc = msLayerEscapePropertyName(layer, n->tokenval.bindval.item); nOutSize = strlen(stresc) + 30; out = (char *)msSmallMalloc(nOutSize); @@ -2006,24 +2006,24 @@ static char *msOGRGetToken(layerObj *layer, tokenListNodeObjPtr *node) { // Do not cast if the variable is of the appropriate type as it can // prevent using database indexes, such as for SQlite if (bIsCharacter) { - snprintf(out, nOutSize, "%s", stresc); + snprintf(out, nOutSize, "\"%s\"", stresc); } else { - snprintf(out, nOutSize, "CAST(%s AS text)", stresc); + snprintf(out, nOutSize, "CAST(\"%s\" AS text)", stresc); } msFree(stresc); break; } case MS_TOKEN_BINDING_TIME: { // won't get here unless col is parsed as time and they are not - char *stresc = msOGRGetQuotedItem(layer, n->tokenval.bindval.item); + char *stresc = msLayerEscapePropertyName(layer, n->tokenval.bindval.item); nOutSize = strlen(stresc) + 10; out = (char *)msSmallMalloc(nOutSize); - snprintf(out, nOutSize, "%s", stresc); + snprintf(out, nOutSize, "\"%s\"", stresc); msFree(stresc); break; } case MS_TOKEN_BINDING_SHAPE: { - char *stresc = msOGRGetQuotedItem( + char *stresc = msLayerEscapePropertyName( layer, OGR_L_GetGeometryColumn(info->hLayer)); // which geom field?? nOutSize = strlen(stresc) + 10; out = (char *)msSmallMalloc(nOutSize); @@ -2490,9 +2490,6 @@ static int msOGRFileWhichShapes(layerObj *layer, rectObj rect, msFree(select); return MS_FAILURE; } - - // Update itemindexes / layer->iteminfo - msOGRLayerInitItemInfo(layer); } else { // case of 1) GetLayer + SetFilter @@ -3603,8 +3600,11 @@ msOGRTranslatePartialInternal(layerObj *layer, const msExprNode *expr, case MS_TOKEN_BINDING_INTEGER: case MS_TOKEN_BINDING_STRING: case MS_TOKEN_BINDING_TIME: { - char *pszTmp = msOGRGetQuotedItem(layer, expr->m_osVal.c_str()); - std::string osRet(pszTmp); + char *pszTmp = msLayerEscapePropertyName(layer, expr->m_osVal.c_str()); + std::string osRet; + osRet += '"'; + osRet += pszTmp; + osRet += '"'; msFree(pszTmp); return osRet; } @@ -4009,6 +4009,10 @@ int msOGRLayerWhichShapes(layerObj *layer, rectObj rect, int /*isQuery*/) { status = msOGRFileWhichShapes(layer, rect, psInfo); + // Update itemindexes / layer->iteminfo + if (status == MS_SUCCESS) + msOGRLayerInitItemInfo(layer); + if (status != MS_SUCCESS || layer->tileindex == NULL) return status; diff --git a/src/maporaclespatial.c b/src/maporaclespatial.c index 150b337ac4..776aa837a0 100644 --- a/src/maporaclespatial.c +++ b/src/maporaclespatial.c @@ -1217,7 +1217,7 @@ static char *osAggrGetExtent(layerObj *layer, char *query_str, size_t tmpFromSize = sizeof(char) * (7 + strlen(geom_column_name) + strlen(table_name) + 1); char *tmpFrom = msSmallMalloc(tmpFromSize); - snprintf(tmpFrom, tmpFromSize, "%s FROM %s", geom_column_name, table_name); + snprintf(tmpFrom, tmpFromSize, " %s FROM %s", geom_column_name, table_name); query_str2 = msStringConcatenate(query_str2, tmpFrom); diff --git a/src/mappostgis.cpp b/src/mappostgis.cpp index af02a4fada..77b9c78bb6 100644 --- a/src/mappostgis.cpp +++ b/src/mappostgis.cpp @@ -1978,9 +1978,9 @@ static std::string msPostGISBuildSQLWhere(layerObj *layer, const rectObj *rect, return std::string(); } - std::string strRectOtherSRID = "ST_Intersects(ST_Transform("; + std::string strRectOtherSRID = "ST_Intersects(ST_Transform(\""; strRectOtherSRID += layerinfo->geomcolumn; - strRectOtherSRID += ','; + strRectOtherSRID += "\","; strRectOtherSRID += std::to_string(otherSRID); strRectOtherSRID += "),"; strRectOtherSRID += strBox; @@ -2009,9 +2009,9 @@ static std::string msPostGISBuildSQLWhere(layerObj *layer, const rectObj *rect, return std::string(); } - std::string strRectOtherSRID = "ST_Intersects("; + std::string strRectOtherSRID = "ST_Intersects(\""; strRectOtherSRID += layerinfo->geomcolumn; - strRectOtherSRID += ','; + strRectOtherSRID += "\","; strRectOtherSRID += strBox; strRectOtherSRID += ')'; @@ -3262,7 +3262,7 @@ static int msPostGISLayerGetExtent(layerObj *layer, rectObj *extent) { auto layerinfo = (msPostGISLayerInfo *)layer->layerinfo; const std::string strSQL(addTableNameAndFilterToSelectFrom( - layer, "SELECT ST_Extent(" + layerinfo->geomcolumn + ") FROM ")); + layer, "SELECT ST_Extent(\"" + layerinfo->geomcolumn + "\") FROM ")); if (layer->debug) { msDebug("msPostGISLayerGetExtent executing SQL: %s\n", strSQL.c_str()); diff --git a/src/mapproject.c b/src/mapproject.c index 3fc90a7cf9..56ab7a484f 100644 --- a/src/mapproject.c +++ b/src/mapproject.c @@ -73,9 +73,10 @@ struct projectionContext { void *thread_id; PJ_CONTEXT *proj_ctx; unsigned ms_proj_data_change_counter; - int ref_count; + int refcount; pjCacheEntry pj_cache[PJ_CACHE_ENTRY_SIZE]; int pj_cache_size; + int cannotFindProjDb; }; /************************************************************************/ @@ -327,7 +328,9 @@ static PJ *getBaseGeographicCRS(projectionObj *in) { /************************************************************************/ static void msProjErrorLogger(void *user_data, int level, const char *message) { - (void)user_data; + projectionContext *ctx = (projectionContext *)user_data; + if (strstr(message, "Cannot find proj.db")) + ctx->cannotFindProjDb = MS_TRUE; if (level == PJ_LOG_ERROR && msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_VV) { msDebug("PROJ: Error: %s\n", message); } else if (level == PJ_LOG_DEBUG) { @@ -335,6 +338,25 @@ static void msProjErrorLogger(void *user_data, int level, const char *message) { } } +/************************************************************************/ +/* msProjGetProjErrorString() */ +/************************************************************************/ + +static const char *msProjGetProjErrorString(projectionObj *p) { + const int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx); +#if PROJ_VERSION_MAJOR >= 8 + const char *projErrorStr = + proj_context_errno_string(p->proj_ctx->proj_ctx, l_pj_errno); +#else + const char *projErrorStr = proj_errno_string(l_pj_errno); +#endif + if (p->proj_ctx->cannotFindProjDb) { + projErrorStr = "Cannot find proj.db"; + p->proj_ctx->cannotFindProjDb = MS_FALSE; + } + return projErrorStr; +} + /************************************************************************/ /* msProjectionContextCreate() */ /************************************************************************/ @@ -348,9 +370,9 @@ projectionContext *msProjectionContextCreate(void) { msFree(ctx); return NULL; } - ctx->ref_count = 1; + MS_REFCNT_INIT(ctx); proj_context_use_proj4_init_rules(ctx->proj_ctx, TRUE); - proj_log_func(ctx->proj_ctx, NULL, msProjErrorLogger); + proj_log_func(ctx->proj_ctx, ctx, msProjErrorLogger); return ctx; } @@ -361,8 +383,7 @@ projectionContext *msProjectionContextCreate(void) { void msProjectionContextUnref(projectionContext *ctx) { if (!ctx) return; - --ctx->ref_count; - if (ctx->ref_count == 0) { + if (MS_REFCNT_DECR_IS_ZERO(ctx)) { int i; for (i = 0; i < ctx->pj_cache_size; i++) { msFree(ctx->pj_cache[i].inStr); @@ -555,7 +576,7 @@ void msProjectionInheritContextFrom(projectionObj *pDst, if (pDst->proj_ctx == NULL && pSrc->proj_ctx != NULL) { if (pSrc->proj_ctx->thread_id == msGetThreadId()) { pDst->proj_ctx = pSrc->proj_ctx; - pDst->proj_ctx->ref_count++; + MS_REFCNT_INCR(pDst->proj_ctx); } else { pDst->proj_ctx = msProjectionContextClone(pSrc->proj_ctx); } @@ -569,7 +590,7 @@ void msProjectionInheritContextFrom(projectionObj *pDst, void msProjectionSetContext(projectionObj *p, projectionContext *ctx) { if (p->proj_ctx == NULL && ctx != NULL) { p->proj_ctx = ctx; - p->proj_ctx->ref_count++; + MS_REFCNT_INCR(p->proj_ctx); } } @@ -678,10 +699,8 @@ static int _msProcessAutoProjection(projectionObj *p) { args = msStringSplit(szProjBuf, '+', &numargs); if (!(p->proj = proj_create_argv(p->proj_ctx->proj_ctx, numargs, args))) { - int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx); - msSetError(MS_PROJERR, "proj error \"%s\" for \"%s\"", - "msProcessProjection()", proj_errno_string(l_pj_errno), - szProjBuf); + msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s\"", + "msProcessProjection()", msProjGetProjErrorString(p), szProjBuf); msFreeCharArray(args, numargs); return (-1); } @@ -750,9 +769,8 @@ int msProcessProjection(projectionObj *p) { /* Deal e.g. with EPSG:XXXX or ESRI:XXXX */ if (!(p->proj = proj_create_argv(p->proj_ctx->proj_ctx, p->numargs, p->args))) { - int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx); - msSetError(MS_PROJERR, "proj error \"%s\" for \"%s\"", - "msProcessProjection()", proj_errno_string(l_pj_errno), + msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s\"", + "msProcessProjection()", msProjGetProjErrorString(p), p->args[0]); return (-1); } @@ -792,14 +810,13 @@ int msProcessProjection(projectionObj *p) { fprintf(stderr, "\n"); #endif if (!(p->proj = proj_create_argv(p->proj_ctx->proj_ctx, numargs, args))) { - int l_pj_errno = proj_context_errno(p->proj_ctx->proj_ctx); if (p->numargs > 1) { - msSetError(MS_PROJERR, "proj error \"%s\" for \"%s:%s\"", - "msProcessProjection()", proj_errno_string(l_pj_errno), + msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s:%s\"", + "msProcessProjection()", msProjGetProjErrorString(p), p->args[0], p->args[1]); } else { - msSetError(MS_PROJERR, "proj error \"%s\" for \"%s\"", - "msProcessProjection()", proj_errno_string(l_pj_errno), + msSetError(MS_PROJERR, "PROJ error \"%s\" when instantiating \"%s\"", + "msProcessProjection()", msProjGetProjErrorString(p), p->args[0]); } free(args); diff --git a/src/mapraster.c b/src/mapraster.c index 61c9f8c67a..23a70c58ec 100644 --- a/src/mapraster.c +++ b/src/mapraster.c @@ -437,9 +437,11 @@ int msDrawRasterBuildRasterPath(mapObj *map, layerObj *layer, char szPath[MS_MAXPATHLEN] /* output */) { /* ** If using a tileindex then build the path relative to that file if SHAPEPATH - *is not set. + * is not set, provided that layer->tileindex does not refer to a layer (to + * save a useless file opening attempt) */ - if (layer->tileindex && !map->shapepath) { + if (layer->tileindex && !map->shapepath && + msGetLayerIndex(map, layer->tileindex) < 0) { char tiAbsFilePath[MS_MAXPATHLEN]; char *tiAbsDirPath = NULL; @@ -649,7 +651,6 @@ void *msDrawRasterLayerLowOpenDataset(mapObj *map, layerObj *layer, GDALOpenEx(*p_decrypted_path, GDAL_OF_RASTER | GDAL_OF_SHARED, (const char *const *)papszAllowedDrivers, (const char *const *)connectionoptions, NULL); - CSLDestroy(papszAllowedDrivers); CSLDestroy(connectionoptions); // Give a hint about which GDAL driver should be enabled, but only in @@ -676,6 +677,7 @@ void *msDrawRasterLayerLowOpenDataset(mapObj *map, layerObj *layer, } } } + CSLDestroy(papszAllowedDrivers); return hDS; } else { return GDALOpenShared(*p_decrypted_path, GA_ReadOnly); diff --git a/src/mapscript/python/CMakeLists.txt b/src/mapscript/python/CMakeLists.txt index c7cb8a6e47..8bfb39a868 100644 --- a/src/mapscript/python/CMakeLists.txt +++ b/src/mapscript/python/CMakeLists.txt @@ -60,32 +60,33 @@ endif() add_custom_target( pythonmapscript-wheel - DEPENDS mapscripttests.stamp + DEPENDS ${MAPSCRIPT_WORKING_DIR}/mapscripttests.stamp ) add_custom_command( DEPENDS ${SWIG_MODULE_pythonmapscript_REAL_NAME} - OUTPUT mapscriptvenv.stamp + OUTPUT ${MAPSCRIPT_WORKING_DIR}/mapscriptvenv.stamp WORKING_DIRECTORY ${MAPSCRIPT_WORKING_DIR} - COMMAND ${Python_EXECUTABLE} -m pip install pip --upgrade - COMMAND ${Python_EXECUTABLE} -m pip install virtualenv - COMMAND ${Python_EXECUTABLE} -m virtualenv mapscriptvenv - COMMAND ${Python_VENV_SCRIPTS}/pip install -r ${PROJECT_SOURCE_DIR}/src/mapscript/python/requirements-dev.txt > requires.log + COMMAND ${Python_EXECUTABLE} -m venv mapscriptvenv + COMMAND ${CMAKE_COMMAND} -E env PIP_NO_PYTHON_VERSION_WARNING=1 + ${Python_VENV_SCRIPTS}/pip install --no-warn-script-location -r ${PROJECT_SOURCE_DIR}/src/mapscript/python/requirements-dev.txt > requires.log + COMMAND ${CMAKE_COMMAND} -E touch ${MAPSCRIPT_WORKING_DIR}/mapscriptvenv.stamp COMMENT "Creating a Python virtual environment and installing the required packages" ) add_custom_command( - DEPENDS mapscriptvenv.stamp - OUTPUT mapscriptwheel.stamp + DEPENDS ${MAPSCRIPT_WORKING_DIR}/mapscriptvenv.stamp + OUTPUT ${MAPSCRIPT_WORKING_DIR}/mapscriptwheel.stamp WORKING_DIRECTORY ${MAPSCRIPT_WORKING_DIR} COMMAND ${Python_VENV_SCRIPTS}/python -m build --wheel > wheel_build.log + COMMAND ${CMAKE_COMMAND} -E touch ${MAPSCRIPT_WORKING_DIR}/mapscriptwheel.stamp COMMENT "Building the mapscript Python wheel" ) add_custom_command( WORKING_DIRECTORY ${Python_VENV_SCRIPTS} # make sure scripts aren't run when from the same folder as mapscript.py - DEPENDS mapscriptwheel.stamp - OUTPUT mapscripttests.stamp + DEPENDS ${MAPSCRIPT_WORKING_DIR}/mapscriptwheel.stamp + OUTPUT ${MAPSCRIPT_WORKING_DIR}/mapscripttests.stamp COMMAND ${Python_VENV_SCRIPTS}/pip install --no-index --find-links=${MAPSCRIPT_WORKING_DIR}/dist mapscript # ERROR: file or package not found: mapscript.tests (missing __init__.py?) is caused by # ImportError: DLL load failed while importing _mapscript: The specified module could not be found. @@ -94,6 +95,7 @@ add_custom_command( COMMAND ${Python_VENV_SCRIPTS}/python -m mapscript.examples.shpdump ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpdump.txt COMMAND ${Python_VENV_SCRIPTS}/python -m mapscript.examples.shpinfo ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpinfo.txt COMMAND ${Python_VENV_SCRIPTS}/python -m mapscript.examples.wxs ${PROJECT_SOURCE_DIR}/tests/test.map > response.xml + COMMAND ${CMAKE_COMMAND} -E touch ${MAPSCRIPT_WORKING_DIR}/mapscripttests.stamp COMMENT "Installing the Python wheel and testing it in the virtual environment, then running tests and examples" ) @@ -138,7 +140,7 @@ install( endif() execute_process( - COMMAND ${Python_EXECUTABLE} -m pip install \${PYTHON_ROOT} \${PYTHON_PREFIX} . + COMMAND ${Python_EXECUTABLE} -m pip install --no-build-isolation \${PYTHON_ROOT} \${PYTHON_PREFIX} . WORKING_DIRECTORY ${MAPSCRIPT_WORKING_DIR} ) " diff --git a/src/mapscript/python/requirements-dev.txt b/src/mapscript/python/requirements-dev.txt index 405e52c12e..2e8e4893af 100644 --- a/src/mapscript/python/requirements-dev.txt +++ b/src/mapscript/python/requirements-dev.txt @@ -2,4 +2,4 @@ pytest pillow wheel>=0.38.0 setuptools>=45.0.0 -build[virtualenv] \ No newline at end of file +build \ No newline at end of file diff --git a/src/mapscript/python/tests/cases/thread_test.py b/src/mapscript/python/tests/cases/thread_test.py index 675bcfcd55..34735b66bf 100644 --- a/src/mapscript/python/tests/cases/thread_test.py +++ b/src/mapscript/python/tests/cases/thread_test.py @@ -148,16 +148,15 @@ def draw_map_wms(name, save=0): # print("making map in thread %s" % (name)) mo = mapscript.mapObj(TESTMAPFILE) - # WFS layer + # WMS layer lo = mapscript.layerObj() - lo.name = "jpl_wms" + lo.name = "world_latlong" lo.setProjection("+init=epsg:4326") lo.connectiontype = mapscript.MS_WMS - lo.connection = "http://vmap0.tiles.osgeo.org/wms/vmap0?" + lo.connection = "https://demo.mapserver.org/cgi-bin/msautotest?" lo.metadata.set("wms_service", "WMS") - lo.metadata.set("wms_server_version", "1.1.1") - lo.metadata.set("wms_name", "basic") - lo.metadata.set("wms_style", "visual") + lo.metadata.set("wms_server_version", "1.3.0") + lo.metadata.set("wms_name", "world_latlong") lo.metadata.set("wms_format", "image/jpeg") lo.type = mapscript.MS_LAYER_RASTER lo.status = mapscript.MS_DEFAULT diff --git a/src/mapserver.h b/src/mapserver.h index 9581bfe0b5..6239f4e109 100644 --- a/src/mapserver.h +++ b/src/mapserver.h @@ -39,6 +39,7 @@ #define _GNU_SOURCE /* Required for strcasestr() defn */ #endif +#include #include #include #include @@ -2894,6 +2895,7 @@ MS_DLL_EXPORT int msUTF8ToUniChar(const char *str, MS_DLL_EXPORT char *msStringEscape(const char *pszString); MS_DLL_EXPORT int msStringInArray(const char *pszString, char **array, int numelements); +void msStringUnescape(char *pszString, char chEscapeChar); typedef struct msStringBuffer msStringBuffer; MS_DLL_EXPORT msStringBuffer *msStringBufferAlloc(void); diff --git a/src/mapshape.c b/src/mapshape.c index 4d1dd892cc..3704e52e8b 100644 --- a/src/mapshape.c +++ b/src/mapshape.c @@ -2939,6 +2939,11 @@ int msSHPLayerOpen(layerObj *layer) { } } + /* Update layer encoding if encoding is defined in CPG file */ + if (!layer->encoding && shpfile->hDBF->pszEncoding) { + layer->encoding = msStrdup(shpfile->hDBF->pszEncoding); + } + if (layer->projection.numargs > 0 && EQUAL(layer->projection.args[0], "auto")) { const char *pszPRJFilename = CPLResetExtension(szPath, "prj"); diff --git a/src/mapshape.h b/src/mapshape.h index c93a9d2283..bac547c00b 100644 --- a/src/mapshape.h +++ b/src/mapshape.h @@ -147,6 +147,8 @@ typedef struct { char *pszStringField; int nStringFieldLen; + + char *pszEncoding; #endif /* not SWIG */ } DBFInfo; diff --git a/src/mapstring.cpp b/src/mapstring.cpp index 9f076148f6..14e3e45470 100644 --- a/src/mapstring.cpp +++ b/src/mapstring.cpp @@ -2528,3 +2528,24 @@ int msStringBufferAppend(msStringBuffer *sb, const char *pszAppendedString) { sb->length += nAppendLen; return MS_SUCCESS; } + +/************************************************************************/ +/* msStringUnescape() */ +/************************************************************************/ + +/** Modify in place pszString such that a sequence of two consecutive + * chEscapeChar is replaced by a single one. + * Does the reverse of FLTEscapePropertyName() + */ +void msStringUnescape(char *pszString, char chEscapeChar) { + char *pszDest = pszString; + for (; *pszString; ++pszString, ++pszDest) { + if (pszString[0] == chEscapeChar && pszString[1] == chEscapeChar) { + *pszDest = chEscapeChar; + ++pszString; + } else { + *pszDest = *pszString; + } + } + *pszDest = 0; +} diff --git a/src/maptemplate.c b/src/maptemplate.c index 8abfa9eac6..4e61713052 100644 --- a/src/maptemplate.c +++ b/src/maptemplate.c @@ -4060,7 +4060,7 @@ static char *processLine(mapservObj *mapserv, const char *instr, FILE *stream, char *ol; #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) || defined(USE_WMS_LYR) || defined(USE_WFS_LYR) - ol = msOWSGetOnlineResource(mapserv->map, "O", "onlineresource", + ol = msOWSGetOnlineResource(mapserv->map, "MO", "onlineresource", mapserv->request); #else ol = msBuildOnlineResource(mapserv->map, mapserv->request); diff --git a/src/maptree.c b/src/maptree.c index 3f053d6ab6..88cf85a9b8 100644 --- a/src/maptree.c +++ b/src/maptree.c @@ -734,7 +734,7 @@ static void writeTreeNode(SHPTreeHandle disktree, treeNodeObj *node) { } int msWriteTree(treeObj *tree, char *filename, int B_order) { - char signature[3] = "SQT"; + char signature[3] = {'S', 'Q', 'T'}; char version = 1; char reserved[3] = {0, 0, 0}; SHPTreeHandle disktree; diff --git a/src/maputil.c b/src/maputil.c index 2777db0518..3dc5743a6d 100644 --- a/src/maputil.c +++ b/src/maputil.c @@ -574,6 +574,7 @@ int msValidateContexts(mapObj *map) { int msEvalContext(mapObj *map, layerObj *layer, char *context) { int i, status; char *tag = NULL; + tokenListNodeObjPtr token = NULL; expressionObj e; parseObj p; @@ -609,6 +610,24 @@ int msEvalContext(mapObj *map, layerObj *layer, char *context) { msTokenizeExpression(&e, NULL, NULL); + /* + * We'll check for binding tokens in the token list. Since there is no shape + * to bind to, the parser will crash if any are present. + * This is one way to catch references to non-existent layers. + */ + for (token = e.tokens; token; token = token->next) { + if (token->token == MS_TOKEN_BINDING_DOUBLE || + token->token == MS_TOKEN_BINDING_STRING || + token->token == MS_TOKEN_BINDING_TIME) { + msSetError(MS_PARSEERR, + "A non-existent layer is referenced in a LAYER REQUIRES or " + "LABELREQUIRES expression: %s", + "msEvalContext()", e.string); + msFreeExpression(&e); + return MS_FALSE; + } + } + p.shape = NULL; p.expr = &e; p.expr->curtoken = p.expr->tokens; /* reset */ diff --git a/src/mapwfslayer.c b/src/mapwfslayer.c index a61a9c10b7..9095f2cd68 100644 --- a/src/mapwfslayer.c +++ b/src/mapwfslayer.c @@ -1100,6 +1100,11 @@ int msWFSLayerWhichShapes(layerObj *lp, rectObj rect, int isQuery) { return MS_FAILURE; } + if (psInfo->nStatus != asReqInfo[0].nStatus) { + /* For drawQuery, we may use a copy layer which needs to be updated */ + msWFSUpdateRequestInfo(lp, &(asReqInfo[0])); + } + /* Cleanup */ msHTTPFreeRequestObj(asReqInfo, numReq); } diff --git a/src/mapwms.cpp b/src/mapwms.cpp index 98b7db960a..6bb6124ce1 100644 --- a/src/mapwms.cpp +++ b/src/mapwms.cpp @@ -500,17 +500,21 @@ static int msWMSApplyFilter(mapObj *map, int version, const char *filter, /* Apply filter to this layer */ - /* But first, start by removing any wfs_use_default_extent_for_getfeature - * metadata item */ - /* that could result in the BBOX to be removed */ - std::string old_value_wfs_use_default_extent_for_getfeature; - { - const char *old_value_tmp = msLookupHashTable( - &(lp->metadata), "wfs_use_default_extent_for_getfeature"); - if (old_value_tmp) { - old_value_wfs_use_default_extent_for_getfeature = old_value_tmp; - msRemoveHashTable(&(lp->metadata), - "wfs_use_default_extent_for_getfeature"); + /* But first, start by removing any use_default_extent_for_getfeature + * metadata items that could result in the BBOX to be removed */ + + hashTableObj *tmpTable = msCreateHashTable(); + + std::vector keys_to_temporarily_remove = { + "wfs_use_default_extent_for_getfeature", + "ows_use_default_extent_for_getfeature", + "oga_use_default_extent_for_getfeature"}; + + for (const auto &key : keys_to_temporarily_remove) { + const char *value = msLookupHashTable(&(lp->metadata), key.c_str()); + if (value) { + msInsertHashTable(tmpTable, key.c_str(), value); + msRemoveHashTable(&(lp->metadata), key.c_str()); } } @@ -520,12 +524,15 @@ static int msWMSApplyFilter(mapObj *map, int version, const char *filter, msRemoveHashTable(&(lp->metadata), "gml_wmsfilter_flag"); - if (!old_value_wfs_use_default_extent_for_getfeature.empty()) { - msInsertHashTable( - &(lp->metadata), "wfs_use_default_extent_for_getfeature", - old_value_wfs_use_default_extent_for_getfeature.c_str()); + const char *pszKey; + pszKey = msFirstKeyFromHashTable(tmpTable); + for (; pszKey != NULL; pszKey = msNextKeyFromHashTable(tmpTable, pszKey)) { + msInsertHashTable(&(lp->metadata), pszKey, + msLookupHashTable(tmpTable, pszKey)); } + msFreeHashTable(tmpTable); + if (ret != MS_SUCCESS) { errorObj *ms_error = msGetErrorObj(); @@ -1849,15 +1856,29 @@ this request. Check wms/ows_enable_request settings.", (lp->group && strcasecmp(lp->group, wmslayers[i].c_str()) == 0)) { bool found = false; - for (int k = 0; k < lp->numclasses; k++) { - if (lp->_class[k]->group && - strcasecmp(lp->_class[k]->group, tokens[i]) == 0) { - msFree(lp->classgroup); - lp->classgroup = msStrdup(tokens[i]); + +#ifdef USE_WMS_LYR + if (lp->connectiontype == MS_WMS) { + const char *pszWmsStyle = + msOWSLookupMetadata(&(lp->metadata), "MO", "style"); + if (pszWmsStyle != NULL && + strcasecmp(pszWmsStyle, tokens[i]) == 0) found = true; - break; + } +#endif // USE_WMS_LYR + + if (!found) { + for (int k = 0; k < lp->numclasses; k++) { + if (lp->_class[k]->group && + strcasecmp(lp->_class[k]->group, tokens[i]) == 0) { + msFree(lp->classgroup); + lp->classgroup = msStrdup(tokens[i]); + found = true; + break; + } } } + if (!found) { msSetErrorWithStatus(MS_WMSERR, MS_HTTP_400_BAD_REQUEST, "Style (%s) not defined on layer.", diff --git a/src/mapwmslayer.c b/src/mapwmslayer.c index 6f3a094d2f..76a42f28a9 100644 --- a/src/mapwmslayer.c +++ b/src/mapwmslayer.c @@ -438,6 +438,7 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, *pszSrsParamName = "SRS", *pszLayer = NULL, *pszQueryLayers = NULL, *pszUseStrictAxisOrder; rectObj bbox; + projectionObj layerRequestProjection; int bbox_width = map->width, bbox_height = map->height; int nVersion = OWS_VERSION_NOTSET; int bUseStrictAxisOrder = MS_FALSE; /* this is the assumption up to 1.1.0 */ @@ -642,45 +643,11 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, bFlipAxisOrder = MS_TRUE; } - /* ------------------------------------------------------------------ - * Set layer SRS. - * ------------------------------------------------------------------ */ - /* No need to set lp->proj if it's already set to the right EPSG code */ - { - char *pszEPSGCodeFromLayer = NULL; - msOWSGetEPSGProj(&(lp->projection), NULL, "MO", MS_TRUE, - &pszEPSGCodeFromLayer); - if (pszEPSGCodeFromLayer == NULL || - strcasecmp(pszEPSG, pszEPSGCodeFromLayer) != 0) { - char *ows_srs = NULL; - msOWSGetEPSGProj(NULL, &(lp->metadata), "MO", MS_FALSE, &ows_srs); - /* no need to set lp->proj if it is already set and there is only - one item in the _srs metadata for this layer - we will assume - the projection block matches the _srs metadata (the search for ' ' - in ows_srs is a test to see if there are multiple EPSG: codes) */ - if (lp->projection.numargs == 0 || ows_srs == NULL || - (strchr(ows_srs, ' ') != NULL)) { - if (strncasecmp(pszEPSG, "EPSG:", 5) == 0) { - char szProj[20]; - snprintf(szProj, sizeof(szProj), "init=epsg:%s", pszEPSG + 5); - if (msLoadProjectionString(&(lp->projection), szProj) != 0) { - msFree(pszEPSGCodeFromLayer); - msFree(ows_srs); - free(pszEPSG); - return MS_FAILURE; - } - } else { - if (msLoadProjectionString(&(lp->projection), pszEPSG) != 0) { - msFree(pszEPSGCodeFromLayer); - msFree(ows_srs); - free(pszEPSG); - return MS_FAILURE; - } - } - } - msFree(ows_srs); - } - msFree(pszEPSGCodeFromLayer); + msInitProjection(&layerRequestProjection); + if (msLoadProjectionString(&layerRequestProjection, pszEPSG) != 0) { + free(pszEPSG); + msFreeProjection(&layerRequestProjection); + return MS_FAILURE; } /* ------------------------------------------------------------------ @@ -697,8 +664,8 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, /* -------------------------------------------------------------------- */ /* Reproject if needed. */ /* -------------------------------------------------------------------- */ - if (msProjectionsDiffer(&(map->projection), &(lp->projection))) { - msProjectRect(&(map->projection), &(lp->projection), &bbox); + if (msProjectionsDiffer(&(map->projection), &layerRequestProjection)) { + msProjectRect(&(map->projection), &layerRequestProjection, &bbox); /* -------------------------------------------------------------------- */ /* Sometimes our remote WMS only accepts square pixel */ @@ -755,7 +722,8 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, &ows_srs); if (ows_srs && strchr(ows_srs, ' ') == NULL && - msOWSGetLayerExtent(map, lp, "MO", &layer_rect) == MS_SUCCESS) { + msOWSGetLayerExtent(map, lp, "MO", &layer_rect) == MS_SUCCESS && + !msProjectionsDiffer(&(lp->projection), &layerRequestProjection)) { /* fulloverlap */ if (msRectContained(&bbox, &layer_rect)) { /* no changes */ @@ -787,9 +755,6 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, msFree(ows_srs); } - /* Set layer extent to wms bbox */ - lp->extent = bbox; - /* -------------------------------------------------------------------- */ /* Potentially return the bbox. */ /* -------------------------------------------------------------------- */ @@ -980,7 +945,7 @@ static int msBuildWMSLayerURL(mapObj *map, layerObj *lp, int nRequestType, } free(pszEPSG); - + msFreeProjection(&layerRequestProjection); return MS_SUCCESS; #else @@ -1038,6 +1003,8 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, char *pszURL = NULL, *pszHTTPCookieData = NULL; const char *pszTmp; rectObj bbox = {0}; + projectionObj lyrRequestProjection; + const char *pszEPSG; int bbox_width = 0, bbox_height = 0; int nTimeout, bOkToMerge, bForceSeparateRequest, bCacheToDisk; wmsParamsObj sThisWMSParams; @@ -1049,8 +1016,7 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, msInitWmsParamsObj(&sThisWMSParams); /* ------------------------------------------------------------------ - * Build the request URL, this will also set layer projection and - * compute BBOX in that projection. + * Build the request URL * ------------------------------------------------------------------ */ switch (nRequestType) { @@ -1081,12 +1047,31 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, return MS_FAILURE; } + /* Load projection that we will request, it may differ from current layer + * projection */ + char *srsKeys[] = {"SRS", "CRS"}; + int i; + for (i = 0; i < 2; i++) { + pszEPSG = msLookupHashTable(sThisWMSParams.params, srsKeys[i]); + if (pszEPSG != NULL && strlen(pszEPSG) > 0) + break; + } + + msInitProjection(&lyrRequestProjection); + if (pszEPSG == NULL || msLoadProjectionStringEPSG(&lyrRequestProjection, + pszEPSG) != MS_SUCCESS) { + msFreeWmsParamsObj(&sThisWMSParams); + msFreeProjection(&lyrRequestProjection); + return MS_FAILURE; + } + /* ------------------------------------------------------------------ * Check if the request is empty, perhaps due to reprojection problems * or wms_extents restrictions. * ------------------------------------------------------------------ */ if ((nRequestType == WMS_GETMAP) && (bbox_width == 0 || bbox_height == 0)) { msFreeWmsParamsObj(&sThisWMSParams); + msFreeProjection(&lyrRequestProjection); return MS_SUCCESS; /* No overlap. */ } @@ -1119,10 +1104,10 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, /* Reproject latlonboundingbox to the selected SRS for the layer and */ /* check if it overlaps the bbox that we calculated for the request */ - msProjectRect(&(map->latlon), &(lp->projection), &ext); + msProjectRect(&(map->latlon), &lyrRequestProjection, &ext); if (!msRectOverlap(&bbox, &ext)) { /* No overlap... nothing to do */ - + msFreeProjection(&lyrRequestProjection); msFreeWmsParamsObj(&sThisWMSParams); return MS_SUCCESS; /* No overlap. */ } @@ -1158,6 +1143,8 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, msSetError(MS_WMSERR, "WEB.IMAGEPATH must be set to use WMS client connections.", "msPrepareWMSLayerRequest()"); + msFreeProjection(&lyrRequestProjection); + msFreeWmsParamsObj(&sThisWMSParams); return MS_FAILURE; } } @@ -1300,6 +1287,7 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, pasReqInfo[(*numRequests)].width = bbox_width; pasReqInfo[(*numRequests)].height = bbox_height; pasReqInfo[(*numRequests)].debug = lp->debug; + pasReqInfo[(*numRequests)].pszEPSG = msStrdup(pszEPSG); if (msHTTPAuthProxySetup(&(map->web.metadata), &(lp->metadata), pasReqInfo, *numRequests, map, "MO") != MS_SUCCESS) @@ -1323,6 +1311,8 @@ int msPrepareWMSLayerRequest(int nLayerId, mapObj *map, layerObj *lp, msFreeWmsParamsObj(&sThisWMSParams); } + msFreeProjection(&lyrRequestProjection); + return MS_SUCCESS; #else @@ -1349,6 +1339,8 @@ int msDrawWMSLayerLow(int nLayerId, httpRequestObj *pasReqInfo, int numRequests, char szPath[MS_MAXPATHLEN]; int currenttype; int currentconnectiontype; + projectionObj currentprojectionobject; + rectObj currentextent; int numclasses; char *mem_filename = NULL; const char *pszTmp; @@ -1472,12 +1464,35 @@ int msDrawWMSLayerLow(int nLayerId, httpRequestObj *pasReqInfo, int numRequests, * Prepare layer for drawing, reprojecting the image received from the * server if needed... * ------------------------------------------------------------------ */ + + // Aassign requested projection temporarily to layer + currentprojectionobject = lp->projection; + msInitProjection(&(lp->projection)); + if (pasReqInfo[iReq].pszEPSG == NULL || + msLoadProjectionString(&(lp->projection), pasReqInfo[iReq].pszEPSG) != + MS_SUCCESS) { + msSetError( + MS_WMSERR, "WMS GetMap failed to load projection for layer '%s': %s.", + "msDrawWMSLayerLow()", (lp->name ? lp->name : "(null)"), + (pasReqInfo[iReq].pszEPSG ? pasReqInfo[iReq].pszEPSG : "(null)")); + + // Restore layer projection + msFreeProjection(&(lp->projection)); + lp->projection = currentprojectionobject; + if (!bIsEssential) + return MS_SUCCESS; + else + return MS_FAILURE; + } + /* keep the current type that will be restored at the end of this */ /* function. */ currenttype = lp->type; currentconnectiontype = lp->connectiontype; + currentextent = lp->extent; lp->type = MS_LAYER_RASTER; lp->connectiontype = MS_RASTER; + lp->extent = pasReqInfo[iReq].bbox; /* set the classes to 0 so that It won't do client side */ /* classification if an sld was set. */ @@ -1569,6 +1584,10 @@ int msDrawWMSLayerLow(int nLayerId, httpRequestObj *pasReqInfo, int numRequests, /* restore prveious type */ lp->type = currenttype; lp->connectiontype = currentconnectiontype; + lp->extent = currentextent; + + msFreeProjection(&(lp->projection)); + lp->projection = currentprojectionobject; /* restore previous numclasses */ lp->numclasses = numclasses; diff --git a/src/mapxbase.c b/src/mapxbase.c index dd61df6463..d757a9ca6a 100644 --- a/src/mapxbase.c +++ b/src/mapxbase.c @@ -144,6 +144,8 @@ DBFHandle msDBFOpenVirtualFile(VSILFILE *fp) { psDBF->pszStringField = NULL; psDBF->nStringFieldLen = 0; + psDBF->pszEncoding = NULL; + /* -------------------------------------------------------------------- */ /* Read Table Header info */ /* -------------------------------------------------------------------- */ @@ -219,6 +221,59 @@ DBFHandle msDBFOpenVirtualFile(VSILFILE *fp) { return (psDBF); } +/** + * Attempt to read character encoding from a .CPG-file + */ +char *msReadCPGEncoding(char *cpgFilename) { + VSILFILE *fpCPG = VSIFOpenL(cpgFilename, "rb"); + if (fpCPG == NULL) + return NULL; + + char szEncoding[100] = ""; + size_t nRead = VSIFReadL(szEncoding, 1, sizeof(szEncoding) - 1, fpCPG); + VSIFCloseL(fpCPG); + + if (nRead == 0) + return NULL; + + // Null terminate and remove any line break + szEncoding[nRead] = '\0'; + szEncoding[strcspn(szEncoding, "\r\n")] = 0; + + if (szEncoding[0] == '\0') { + return NULL; + } + + /* See + * https://github.com/OSGeo/gdal/blob/release/3.11/ogr/ogrsf_frmts/shape/ogrshapelayer.cpp#L503 + */ + const int nCPG = atoi(szEncoding); + if ((nCPG >= 437 && nCPG <= 950) || (nCPG >= 1250 && nCPG <= 1258)) { + char szResult[20]; + snprintf(szResult, sizeof(szResult), "CP%d", nCPG); + return msStrdup(szResult); + } + + if (strncasecmp(szEncoding, "8859", 4) == 0) { + const char *suffix = szEncoding + 4; + if (*suffix == '-' || *suffix == '_') + suffix++; + + if (!isdigit((unsigned char)*suffix)) + return msStrdup(szEncoding); + + char szResult[40]; + snprintf(szResult, sizeof(szResult), "ISO-8859-%d", atoi(suffix)); + return msStrdup(szResult); + } + + if (strncasecmp(szEncoding, "ANSI 1251", 9) == 0) { + return msStrdup("CP1251"); + } + + return msStrdup(szEncoding); +} + /************************************************************************/ /* msDBFOpen() */ /* */ @@ -259,12 +314,30 @@ DBFHandle msDBFOpen(const char *pszFilename, const char *pszAccess) fp = VSIFOpenL(pszDBFFilename, pszAccess); } } - msFree(pszDBFFilename); + if (fp == NULL) { + msFree(pszDBFFilename); return (NULL); } - return msDBFOpenVirtualFile(fp); + DBFHandle dbfHandle = msDBFOpenVirtualFile(fp); + if (dbfHandle) { + char *pszCPGFilename = (char *)msSmallMalloc(strlen(pszDBFFilename) + 1); + strcpy(pszCPGFilename, pszDBFFilename); + + if (strcmp(pszDBFFilename + strlen(pszDBFFilename) - 4, ".dbf") == 0) { + strcpy(pszCPGFilename + strlen(pszCPGFilename) - 4, ".cpg"); + } else { + strcpy(pszCPGFilename + strlen(pszCPGFilename) - 4, ".CPG"); + } + + dbfHandle->pszEncoding = msReadCPGEncoding(pszCPGFilename); + + msFree(pszCPGFilename); + } + + msFree(pszDBFFilename); + return dbfHandle; } /************************************************************************/ @@ -319,6 +392,7 @@ void msDBFClose(DBFHandle psDBF) { free(psDBF->pszCurrentRecord); free(psDBF->pszStringField); + free(psDBF->pszEncoding); free(psDBF); }